Watch
2
Workflow lanes are self-contradictory about who merges, have no slug for the tpm merge lane, and name merge as the only PR outcome #1189
Open
opened 2026-08-22 22:14:36 +00:00 by coilyco-ops
·
5 comments
No Branch/Tag specified
main
release
ops/393-retire-doc-size-alias
ops/393-drop-em-dash-check
feat/vendored-tree-exclude
aos/claude/xlarge-band
aos/claude/ue65
aos/claude/identity-color-wins
aos/claude/ap47
aos/claude/zr44
aos/claude/xk58
aos/claude/aw85-skill-size-owner
aos/claude/ym96-docs-bands
aos/claude/wt57-pin-aos-bundle
aos/claude/wt57-image-inputs-filter
aos/claude/ym96-label-taxonomy
ops/dev-base-pin-rust-1.90.0
aos/claude/mg96-clean
aos/claude/mg96
backup/fix/bake-precommit-hooks
rescue/aos-test-timeout
aos/claude/issues-977-979-agents-base
aos/claude/sx87
refactor/remove-context-budget-json
issue-946
aos/codex/20260806t050901z-50407-6291ab0a
aos/codex/standalone-shadow-workspace
backup/aos/codex/20260806t061240z-10127-754d7de2
aos/codex/standalone-local-service-route
aos/codex/aosterm-aoscompose-wrapper
aos/codex/agents-launch-profile-source
aos/codex/launch-profiles-yaml
aos/codex/20260806t031603z-7731-c76c17f2
backup/aos/codex/20260805t183628z-5916-617bb239
backup/aos/codex/20260805t025242z-30811-fbb135ff
aos/codex/aos-v2-roster-852
aos/codex/20260801t164712z-64119-69ee8bb6
backup/aos/codex/20260801t164900z-67616-2ad2d0e3
issue-834
aos/codex/pr-829-1130
issue-824-agent-proxy-model-routing
task-merge-pr818
fix/aos-ci-20260730
issue-671
issue-734
issue-484
issue-498
issue-622
issue-512
issue-679
issue-454
backup/issue-785-first-person
issue-785-first-person
director-pr784
restore-language-images
recovery/2026-07-28-triaged-branch-archive
recovery/2026-07-27-local-work
recovery/aos-local-build-20260727
codex/land-pr-733
codex/aos-ci-watch
issue-642
issue-682-goose-yaml
issue-656-goose-context
safety/aos-local-main-09347d0
issue-611-specialist-images
fix-action-run-list-page
issue-454-v2
experiment/no-ops-forgejo
feat/dev-base-image
aos-eval-v0.7.0
v0.276.0
aos-precommit-v0.47.0
aos-precommit-v0.46.0
aos-v0.221.0
aos-precommit-v0.45.0
aos-v0.220.0
aos-eval-v0.6.0
aos-precommit-v0.44.0
aos-v0.219.0
aos-v0.218.0
v0.275.0
aos-precommit-v0.43.0
aos-v0.217.0
aos-precommit-v0.42.0
aos-precommit-v0.41.0
aos-eval-v0.5.0
aos-precommit-v0.40.0
aos-precommit-v0.39.0
aos-v0.216.0
aos-precommit-v0.38.0
aos-precommit-v0.37.0
aos-precommit-v0.36.0
aos-v0.215.0
aos-precommit-v0.35.0
aos-v0.214.0
aos-precommit-v0.34.0
aos-precommit-v0.33.0
aos-precommit-v0.32.0
aos-precommit-v0.31.0
v0.274.0
aos-eval-v0.4.0
aos-eval-v0.3.0
aos-precommit-v0.30.0
aos-precommit-v0.29.0
aos-precommit-v0.28.0
aos-precommit-v0.27.0
aos-eval-v0.2.0
aos-precommit-v0.26.0
aos-eval-v0.1.0
aos-precommit-v0.25.0
aos-precommit-v0.24.0
aos-v0.213.0
aos-v0.212.0
aos-v0.211.0
aos-v0.210.0
aos-v0.209.0
aos-v0.208.0
aos-v0.207.0
aos-v0.206.0
aos-v0.205.0
aos-v0.204.0
aos-v0.203.0
aos-precommit-v0.23.0
v0.273.0
v0.272.0
aos-v0.202.0
aos-precommit-v0.22.0
v0.271.0
aos-v0.201.0
aos-v0.200.0
aos-precommit-v0.21.0
aos-v0.199.0
aos-v0.198.0
aos-precommit-v0.20.0
v0.270.0
aos-precommit-v0.19.0
aos-v0.197.0
aos-v0.196.0
v0.269.0
aos-v0.195.0
aos-v0.194.0
aos-v0.193.0
aos-precommit-v0.18.0
v0.268.0
v0.267.0
aos-precommit-v0.17.0
v0.266.0
aos-v0.192.0
aos-v0.191.0
aos-precommit-v0.16.0
aos-v0.190.0
aos-v0.189.0
aos-v0.188.0
aos-v0.187.0
aos-v0.186.0
aos-precommit-v0.15.0
aos-v0.185.0
aos-v0.184.0
aos-precommit-v0.14.0
aos-v0.183.0
v0.265.0
aos-v0.182.0
aos-v0.181.0
aos-v0.180.0
aos-v0.179.0
aos-precommit-v0.13.0
aos-v0.178.0
aos-precommit-v0.12.0
aos-v0.177.0
aos-precommit-v0.11.0
aos-v0.176.0
aos-v0.175.0
aos-v0.174.0
aos-precommit-v0.10.0
aos-v0.173.0
aos-v0.172.0
aos-v0.171.0
aos-v0.170.0
aos-v0.169.0
aos-v0.168.0
aos-v0.167.0
aos-precommit-v0.9.0
v0.264.0
aos-v0.166.0
aos-v0.165.0
aos-v0.164.0
aos-v0.163.0
aos-v0.162.0
aos-v0.161.0
v0.263.0
aos-v0.160.0
aos-v0.159.0
aos-precommit-v0.8.0
aos-v0.158.0
aos-v0.157.0
aos-precommit-v0.7.0
aos-v0.156.0
aos-v0.155.0
aos-v0.154.0
aos-v0.153.0
v0.262.0
aos-precommit-v0.6.0
aos-precommit-v0.5.0
aos-precommit-v0.4.0
aos-v0.152.0
aos-precommit-v0.3.0
aos-v0.151.0
aos-v0.150.0
aos-v0.149.0
aos-precommit-v0.2.0
aos-v0.148.0
aos-v0.147.0
aos-v0.146.0
aos-v0.145.0
aos-v0.144.0
aos-v0.143.0
aos-precommit-v0.1.0
aos-v0.142.0
aos-v0.141.0
aos-v0.140.0
aos-v0.139.0
aos-v0.138.0
aos-v0.137.0
aos-v0.136.0
aos-v0.135.0
aos-v0.134.0
aos-v0.133.0
aos-v0.132.0
aos-v0.131.0
aos-v0.130.0
aos-v0.129.0
aos-v0.128.0
aos-v0.127.0
aos-v0.126.0
aos-v0.125.0
v0.261.0
aos-v0.124.0
v0.260.0
aos-v0.123.0
aos-v0.122.0
aos-v0.121.0
aos-v0.120.0
aos-v0.119.0
aos-v0.118.0
aos-v0.117.0
aos-v0.116.0
aos-v0.115.0
aos-v0.114.0
aos-v0.113.0
aos-v0.112.0
aos-v0.111.0
aos-v0.110.0
aos-v0.109.0
aos-v0.108.0
aos-v0.107.0
aos-v0.106.0
aos-v0.105.0
aos-v0.104.0
v0.259.0
aos-v0.103.0
v0.258.0
aos-v0.102.0
aos-v0.101.0
aos-v0.100.0
aos-v0.99.0
aos-v0.98.0
aos-v0.97.0
aos-v0.96.0
aos-v0.95.0
aos-v0.94.0
aos-v0.93.0
aos-v0.92.0
aos-v0.91.0
aos-v0.90.0
aos-v0.89.0
v0.257.0
aos-v0.88.0
aos-v0.87.0
aos-v0.86.0
v0.256.0
aos-v0.85.0
aos-v0.84.0
aos-v0.83.0
aos-v0.82.0
aos-v0.81.0
aos-v0.80.0
aos-v0.79.0
aos-v0.78.0
aos-v0.77.0
aos-v0.76.0
aos-v0.75.0
aos-v0.74.0
aos-v0.73.0
aos-v0.72.0
aos-v0.71.0
aos-v0.70.0
aos-v0.69.0
aos-v0.68.0
aos-v0.67.0
aos-v0.66.0
aos-v0.65.0
aos-v0.64.0
aos-v0.63.0
aos-v0.62.0
aos-v0.61.0
aos-v0.60.0
aos-v0.59.0
aos-v0.58.0
aos-v0.57.0
aos-v0.56.0
aos-v0.55.0
aos-v0.54.0
aos-v0.53.0
aos-v0.52.0
aos-v0.51.0
aos-v0.50.0
aos-v0.49.0
aos-v0.48.0
aos-v0.47.0
aos-v0.46.0
aos-v0.45.0
aos-v0.44.0
aos-v0.43.0
aos-v0.42.0
aos-v0.41.0
aos-v0.40.0
aos-v0.39.0
aos-v0.38.0
aos-v0.37.0
aos-v0.36.0
aos-v0.35.0
aos-v0.34.0
aos-v0.33.0
aos-v0.32.0
aos-v0.31.0
aos-v0.30.0
aos-v0.29.0
aos-v0.28.0
aos-v0.27.0
aos-v0.26.0
aos-v0.25.0
aos-v0.24.0
aos-v0.23.0
aos-v0.22.0
aos-v0.21.0
aos-v0.20.0
aos-v0.19.0
aos-v0.18.0
aos-v0.17.0
aos-v0.16.0
aos-v0.15.0
aos-v0.14.0
aos-v0.13.0
aos-v0.12.0
aos-v0.11.0
aos-v0.10.0
aos-v0.9.0
aos-v0.8.0
aos-v0.7.0
aos-v0.6.0
aos-v0.5.0
aos-v0.4.0
aos-v0.3.0
aos-v0.2.0
aos-v0.1.0
v0.255.0
v0.254.0
v0.253.0
v0.252.0
v0.251.0
v0.250.0
v0.249.0
v0.248.0
v0.247.0
v0.246.0
v0.245.0
v0.244.0
v0.243.0
v0.242.0
v0.241.0
v0.240.0
v0.239.0
v0.238.0
v0.237.0
v0.236.0
v0.235.0
v0.234.0
v0.233.0
v0.232.0
v0.231.0
v0.230.0
v0.229.0
v0.228.0
v0.227.0
v0.226.0
v0.225.0
v0.224.0
v0.223.0
v0.222.0
v0.221.0
v0.220.0
v0.219.0
v0.218.0
v0.217.0
v0.216.0
v0.215.0
v0.214.0
v0.213.0
v0.212.0
v0.211.0
v0.210.0
v0.209.0
v0.208.0
v0.207.0
v0.206.0
v0.205.0
v0.204.0
v0.203.0
v0.202.0
v0.201.0
v0.200.0
v0.199.0
v0.198.0
v0.197.0
v0.196.0
v0.195.0
v0.194.0
v0.193.0
v0.192.0
v0.191.0
v0.190.0
v0.189.0
v0.188.0
v0.187.0
v0.186.0
v0.185.0
v0.184.0
v0.183.0
v0.182.0
v0.181.0
v0.180.0
v0.179.0
v0.178.0
v0.177.0
v0.176.0
v0.175.0
v0.174.0
v0.173.0
v0.172.0
v0.171.0
v0.170.0
v0.169.0
v0.168.0
v0.167.0
v0.166.0
v0.165.0
v0.164.0
v0.163.0
v0.162.0
v0.161.0
v0.160.0
v0.159.0
v0.158.0
v0.157.0
v0.156.0
v0.155.0
v0.154.0
v0.153.0
v0.152.0
v0.151.0
v0.150.0
v0.149.0
v0.148.0
v0.147.0
v0.146.0
v0.145.0
v0.144.0
v0.143.0
v0.142.0
v0.141.0
v0.140.0
v0.139.0
v0.138.0
v0.137.0
v0.136.0
v0.135.0
v0.134.0
v0.133.0
v0.132.0
v0.131.0
v0.130.0
v0.129.0
v0.128.0
v0.127.0
v0.126.0
v0.125.0
v0.124.0
v0.123.0
v0.122.0
v0.121.0
v0.120.0
v0.119.0
v0.118.0
v0.117.0
v0.116.0
v0.115.0
v0.114.0
v0.113.0
v0.112.0
v0.111.0
v0.110.0
v0.109.0
v0.108.0
v0.107.0
v0.106.0
v0.105.0
v0.104.0
v0.103.0
v0.102.0
v0.101.0
v0.100.0
v0.99.0
v0.98.0
v0.97.0
v0.96.0
v0.95.0
v0.94.0
v0.93.0
v0.92.0
v0.91.0
v0.90.0
v0.89.0
v0.88.0
v0.87.0
v0.86.0
v0.85.0
v0.84.0
v0.83.0
v0.82.0
v0.81.0
v0.80.0
v0.79.0
v0.78.0
v0.77.0
v0.76.0
v0.75.0
v0.74.0
v0.73.0
v0.72.0
v0.71.0
v0.70.0
v0.69.0
v0.68.0
v0.67.0
v0.66.0
v0.65.0
v0.64.0
v0.63.0
v0.62.0
v0.61.0
v0.60.0
v0.59.0
v0.58.0
v0.57.0
v0.56.0
v0.55.0
v0.54.0
v0.53.0
v0.52.0
v0.51.0
v0.50.0
v0.49.0
v0.48.0
v0.47.0
v0.46.0
v0.45.0
v0.44.0
v0.43.0
v0.42.0
v0.41.0
v0.40.0
v0.39.0
v0.38.0
v0.37.0
v0.36.0
v0.35.0
v0.34.0
v0.33.0
v0.32.0
v0.31.0
v0.30.0
v0.29.0
v0.28.0
v0.27.0
v0.26.0
v0.25.0
v0.24.0
v0.23.0
v0.22.0
v0.21.0
v0.20.0
v0.19.0
v0.18.0
v0.17.0
v0.16.0
v0.15.0
v0.14.0
v0.13.1
v0.13.0
v0.12.0
v0.11.1
v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.0
v0.4.0
v0.3.0
v0.2.12
v0.2.11
v0.2.10
v0.2.9
v0.2.8
v0.2.7
v0.2.6
v0.2.5
v0.2.4
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0
Labels
Clear labels
burndown-2026-06
Backlog burndown June 2026
autonomy
async-consult
A human needs to consult on the issue to upgrade it to headless
autonomy
epic
This issue has many units of sub work - its size makes it meaningfully exclusive with other autonomy types
autonomy
headless
The agent can perform the work on its own
autonomy
live-collab
The agent and the human need to work together in realtime
coherence-core
Core review set for the warded control plane coherence milestone. These issues form the release spine; adjacent milestone issues are stretch or supporting work.
priority
P0
priority tier
priority
P1
priority tier
priority
P2
priority tier
priority
P3
priority tier
priority
P4
priority tier
qa-fixture
Disposable issue admitted to the bounded Ward QA verification lane.
role/ai
requires work from the AI Engineer role
role/creator
requires work from Content Creator role
role/design
requires work from the design role
role/director
requires work from the director role
role/engineer
requires work from the engineer role
role/exec
requires work from the exec role
role/human
requires a person, and specifically not an agent seat
role/ops
requires work from the ops role
role/qa
requires work from the QA role
No labels
burndown-2026-06
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/agentic-os#1189
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Requested by Kai on 2026-08-22. Charter half is filed at
coilyco-flight-deck/agent-compose#321; this is the tooling and doctrine half.The gap
The seat that gates pull requests should exercise close and revert, not merge alone. Two separate problems block that, and only one of them is a missing verb.
Problem 1: the doctrine never mentions close, though the verb already exists
aosguard ops forgejo pr closeandpr reopenalready ship, landed by #488 as the stranded-PR cleanup verbs. The lifecycle is complete:files,commits,create,edit,close,reopen,update,merge.But the workflow doctrine in
AGENTS.mddescribes only merge. The four lane slugs are:merge-remote-mainpull-requestpull-request-and-mergeremote-branch-onlyEvery one of them describes landing work. None describes declining it. The rules under "Git workflow" say "ALWAYS merge your own pull request on
pull-request-and-merge" and "NEVER merge onpull-requestorremote-branch-only" - merge, merge, merge. An agent reading that doctrine has no sanctioned action for a pull request that should not land, so the pull request stays open forever.That is the same litter the doctrine already legislates against, relocated.
AGENTS.mdsays "A branch with no PR is litter: nothing points at it, no review is pending on it." An open PR that nobody will merge or close is the identical failure with an extra step.This is a documentation defect against a capability that already exists, which makes it the cheap half.
Problem 2: there is no revert verb, and there cannot be a simple one
aosguard ops forgejohas nopr revert, and adding one is not symmetric withpr close:PATCH state=closed- one call, exactly reversible bypr reopen. The verb's own help says a wrong close is not a wall.git revertcommit againstmainplus a follow-up pull request. It mutates the shared branch, and there is no inverse call.So
pr revertwould be a composite operation, not an API wrapper, and it sits in a different consequence class from every otherprverb. Three options worth weighing rather than assuming:main. Fastest, and the one that most deserves scrutiny, sinceAGENTS.mdalready treats force-push and history rewriting as the walls that stay closed. A direct revert is not a force-push, but it is a mutation ofmainthat no review gate sees.Option 1 looks right, but this issue should not presume it.
Problem 3: the lane slugs undersell the lane
AGENTS.mdis explicit that "Every lane slug names what the AGENT does, never what someone else does" and that readingpull-request-and-mergeas "someone else merges it later" inverts the lanes.By that same rule, a lane whose seat can merge, close, and revert is not fully described by a slug that names only merging. Either the slug widens, or the doctrine states plainly that
-and-mergeis shorthand for the full gate authority. The second is probably less disruptive - renaming lanes ripples throughward.workflowfrontmatter across every repo - but the ambiguity should be resolved deliberately rather than left for a reader to guess.Where this lands in the reflow
directorandexecmerge intotpmin the v3 Core Roster reflow, andqais cut with its code review moving totpm- see #1176 andagent-compose#317. So the seat this doctrine governs istpm, and it is simultaneously the reviewing seat and the landing seat.That is precisely why the one-exit gate matters here: a reviewer who can only approve is a rubber stamp by construction. Write the doctrine against
tpmrather thandirector.Note that #1176 already carries the
roles.kdlreconciliation for this reflow, including movingtooling-code-reviewontotpm. This issue should land after or alongside it, not before, or it will describe a seat that does not exist yet.Acceptance
AGENTS.mdworkflow doctrine states the full pull-request action surface for the gating seat: merge, close, and revert - with close presented as ordinary and reversible, and revert as consequential.pr revertoptions above, with reasoning, whether or not a verb ships.aosguard ops forgejodescribes it with the same consequence framing the other destructive verbs get, and the existingcoily*owner scoping and branch protection still apply.tpmrather than a slug that is being retired.Not in scope
The
tpmrole charter itself - what the seat owns and the bar for each action - isagent-compose#321. This issue is the doctrine and the verbs.Scope expansion, 2026-08-22: the slugs do not encode who merges, and AGENTS.md already contradicts itself about it
Kai's observation, and it is the larger defect. Verified by reading
AGENTS.mdonmainrather than a composed rendering.Two lanes are each defined twice, incompatibly
pull-request-and-merge:workflow: pull-request-and-merge,WARD-OUTCOME: done, and a passed review summary."One says another seat gates it behind a review summary. The other says the author merges it as soon as CI is green. Those cannot both be the rule.
pull-request:pull-requestfrom there."Human-gated, or director-gated. Also cannot both be the rule.
Line 88 warns against exactly what line 71 says
Line 71 states that reading as the definition. The file diagnoses its own defect and does not notice.
This is live in this repository. Line 3 declares
workflow: pull-request-and-mergein the frontmatter, so any agent working here reads both definitions and picks one.The third merger has no slug
"The director merge lane" is named three times - lines 71, 88, 96 - and no slug exists for it. Kai's intent, stated plainly:
pull-request-and-mergepull-requestremote-branch-onlymerge-remote-mainThe naming rule itself blocks the fix
This is the part worth deciding rather than patching. Line 88 states:
That rule is why the distinction cannot currently be expressed. From the authoring agent's perspective, human-merge and tpm-merge are the same action - push a branch, open a PR, stop. The difference is entirely about who picks it up, which the rule forbids the slug from naming. So the taxonomy is structurally incapable of carrying the thing Kai wants it to carry, and adding a fourth slug under the existing rule will not fix that.
Three ways out, and this issue should record which is chosen:
pull-request-human-mergeandpull-request-tpm-merge. Most explicit, most readable at a glance, and it costs the elegance of the current rule - which was written to prevent a specific misreading and is otherwise doing real work.pull-requestmeaning "author stops at the PR" and add a separate frontmatter field, e.g.ward.merge_authority: human | tpm | self. Preserves the naming rule intact, makes the axis explicit, and costs a second field to read and keep in sync.pull-request-request-tpm-reviewor similar. Honest under the rule but clumsy, and it only works if the author genuinely does something different.Option 2 looks cleanest against the existing rule. Option 1 is what a reader would guess. Not presuming either.
Sequencing
The slug work and the close/revert work edit the same paragraphs - lines 69-96 - so they should land together rather than as competing diffs. Both still sequence behind #1176 so they name
tpm.One practical note: any slug rename ripples into
ward.workflowfrontmatter across every repo in the fleet, and into whatever validates that field. That cost argues for option 2 and should be measured before choosing option 1.Added to acceptance
ward.workflowis checked, since a rename is a fleet-wide edit and a redefinition silently changes what existing declarations mean.Workflow lanes name merge as the only PR outcome, so pr close goes unused and pr revert has no verb at allto Workflow lanes are self-contradictory about who merges, have no slug for the tpm merge lane, and name merge as the only PR outcomeDecision, 2026-08-22: option 1, with role-agnostic slugs
Kai's call. Option 1 - the slug names the gate holder - and the naming rule at line 88 bends to accommodate it. Verbosity is explicitly acceptable for this family.
Literal
tpmis rejected as non-durable. The roster has already reflowed once (nine seats to seven,directorandexecintotpm), and a slug carrying a seat name rots at the next reflow. The slugs name the relationship to the work, not the seat.Kai's proposed set:
author-author-mergeagent-reviewer-mergehuman-reviewer-mergeThese replace
pull-requestandpull-request-and-merge.merge-remote-mainandremote-branch-onlyare untouched - neither is a PR-merge lane.The migration is far cheaper than this issue previously warned
I flagged earlier that a rename "ripples into
ward.workflowfrontmatter across every repo in the fleet" and used that cost to argue against option 1. That was wrong, and the actual declarations retire the objection. Surveyed across 22 repos:merge-remote-mainpull-request-and-mergepull-requestremote-branch-onlyThe ambiguous slug is declared by nobody.
pull-request- the one that means human-merge in line 70 and director-merge in lines 88 and 96 - has zero declarations. So splitting it intohuman-reviewer-mergeandagent-reviewer-mergerequires no per-repo decision and no migration. It is purely additive, and the ambiguity has never actually bitten a repo because no repo has ever used it.That leaves 5 mechanical edits:
pull-request-and-mergebecomesauthor-author-mergein five frontmatter blocks. Only one meaning is in play there, so it is a find-and-replace rather than a judgment call. The 16merge-remote-mainrepos are untouched.Acceptance item 10 is correspondingly cheap. It is five edits plus whatever validates the field.
One naming asymmetry to settle before anything is written
The three slugs do not follow one pattern:
agent-reviewer-mergeandhuman-reviewer-mergeare<merger>-mergeauthor-author-mergedoubles the word, which under the same pattern would beauthor-mergeTwo consistent readings, and the choice should be deliberate since these go into five frontmatter blocks and a validator:
(a)
<merger>-merge-author-merge,agent-reviewer-merge,human-reviewer-merge. Each slug names exactly one thing: who merges. Shortest, and reads cleanly as a set.(b)
<opener>-<merger>-merge-author-author-merge,author-agent-reviewer-merge,author-human-reviewer-merge. Carries both parties, which is more information, and honours "verbose is fine" more literally. The opener is always the author on all three, so the first token is constant and arguably dead weight.Recommendation: (a). The opener never varies across these three lanes, so naming it adds a token that never discriminates.
author-mergesits naturally beside the other two, and the whole family still reads as "who merges."Kai to settle. Nothing should be written until it is, because a slug is expensive to rename twice.
Second-order note, not for this issue
The new family names the merger;
merge-remote-mainnames the destination. That is a mixed taxonomy, and a fully consistent set might make it something likeauthor-direct-merge. Not recommended here - it is declared by 16 repos, the rename buys clarity rather than correctness, and it would turn a 5-edit change into a 21-edit one. Worth its own issue if it ever bothers anyone; worth not smuggling into this one.Separate finding: umbra declares no lane
coilyco-flight-deck/umbrahas noward.workflowin itsAGENTS.mdfrontmatter, while every other surveyed repo declares one. Under this doctrine that means an agent working umbra has no defined merge authority and has to infer one. Not caused by this change and not in scope, but it should not be discovered later by an agent guessing - worth its own issue.Settled: the semantics, and why the original triple is already consistent
Kai's natural-language statement of the three lanes, which is the authoritative definition:
This retires my
author-mergerecommendationI argued for
<merger>-mergeon the grounds that "the opener is always the author, so naming it adds a token that never discriminates." The semantics show the second token is not the opener at all - it is the reviewer, and the reviewer is exactly what varies:author-author-mergeagent-reviewer-mergehuman-reviewer-mergeRead that way the family is
<gate-holder>-merge, where the gate holder is a two-token identity:author-author,agent-reviewer,human-reviewer. The doubling in the first is not redundancy - it marks the collapse of two roles into one party, which is precisely the property that distinguishes lane 1 from the other two.author-mergewould erase that.Keep Kai's slugs exactly as proposed. The naming question is closed.
The shared concept the slugs should carry into the prose
Lanes 2 and 3 share "defers the merge." That is one behaviour with two destinations, and it is already the strictest rule in the current doctrine - line 96's "NEVER merge on
pull-request." The rewritten prose should state deferral once as the shared property of both reviewer lanes rather than restating a prohibition per lane.Lane 1 is the exception: the author does not defer, and line 95's "ALWAYS merge your own pull request" applies there and only there.
Confirms the rejection of literal
tpmKai's lane 2 reads "a reviewer agent (tpm, another engineer, etc)." The gate holder is any agent seat, not specifically
tpm. Soagent-reviewer-mergeis correct and a hypotheticaltpm-mergewould have been wrong on two counts - non-durable across roster reflows, and too narrow even today.Revised acceptance
Replacing items 7 through 9:
author-author-merge,agent-reviewer-merge, andhuman-reviewer-merge, defined by Kai's three sentences above.merge-remote-mainandremote-branch-onlyare unchanged.pull-request-and-mergebecomesauthor-author-mergein agentic-os, ward, infrastructure, deploy, and sirens-echo. Nothing else moves, sincepull-requestandremote-branch-onlyhave zero declarations.Correction:
author-author-mergebecomesagent-author-mergeThe previous comment defended
author-author-mergeon the grounds that the doubling "marks the collapse of two roles into one party." That was a rationalisation constructed around a probable typo, not Kai's reasoning, and it should not have been written as a settled justification. Withdrawn.Kai's three sentences give the actual pattern. Every one opens with "agent author creates the PR," and the slugs vary on two axes - who acts, and in what role:
agent-author-mergeagent-reviewer-mergehuman-reviewer-mergeSo the family is
<actor>-<role>-merge:agent-author-merge- the agent, in its author role, merges its own pull requestagent-reviewer-merge- an agent, in a reviewer role, mergeshuman-reviewer-merge- a human, in a reviewer role, mergesagent-reviewerandhuman-reviewerare both actor-plus-role.author-authoris not - "author" is a role with no actor, so its first token carries no information.agent-authorcompletes the grid.The empty cell is meaningful rather than an oversight:
human-author-mergedoes not exist because humans do not author on these lanes. Every lane in this family starts with an agent writing the code. If that ever stops being true, the grid already has the slot.This also reads correctly in frontmatter.
workflow: agent-author-mergestates that an agent wrote it and an agent landed it.author-author-mergestates neither.Superseding acceptance item 7
agent-author-merge,agent-reviewer-merge, andhuman-reviewer-merge, defined by Kai's three sentences. The naming pattern is<actor>-<role>-merge, and the pattern itself should be stated in the doctrine so a future lane is named by rule rather than by precedent.Item 12's five frontmatter edits now write
agent-author-mergeinto agentic-os, ward, infrastructure, deploy, and sirens-echo - subject to the per-repo lane review currently in progress, which may move some of those five to a different lane entirely.Per-repo lane assignment, decided by Kai 2026-08-22
All 32 active repos assigned. Survey and decisions complete.
human-reviewer-merge- 5coilysiren/website·coilysiren/coilysiren·coilyco-bridge/.github·coilyco-flight-deck/.github·coilyco-gaming/.githubThe public identity surface. An agent cannot check whether something sounds like Kai.
agent-reviewer-merge- 4coilyco-bridge/deploy·coilyco-flight-deck/infrastructure·coilyco-bridge/agentic-os-kai·coilyco-flight-deck/agent-proxyLive systems and personal operating context. The gate here is judgment, not CI.
agent-author-merge- 5coilyco-flight-deck/agentic-os·coilyco-flight-deck/ward·coilyco-flight-deck/umbra·coilyco-flight-deck/agent-compose·coilyco-gaming/sirens-echoStrong automated gates already hold the line - pre-commit catalog, CI, evals.
merge-remote-main- 18mcp-beaver·node-stats-mcp·bluesky-mcp·lunch-money-k8s·homebrew-tap·scoop-bucket·eco-app·eco-mods·eco-ops·factorio-mods·factory-game-v3·galaxy-gen·steam-ops·inbox·lore·voice-corpus·agentic-os-hardware·agentic-os-xxxLow blast radius, mostly private or trivially reversible. The publish targets are automated formula updates where a PR gate would fight the automation.
remote-branch-only- 0Still declared by nobody.
The principle behind the split, worth writing into doctrine
Kai's choices are consistent with one rule: author-merge where an automated gate already holds the line, reviewer-merge where the gate is human judgment.
agentic-os,ward,agent-compose,sirens-echo,umbra- pre-commit catalog, CI, and evals verify correctness mechanicallydeploy,infrastructure- CI cannot tell you a rollout was a bad ideaagentic-os-kai,agent-proxy- nothing automated checks whether operating context or model routing is rightStating that rule in the doctrine means the next repo gets assigned by principle rather than by copying a neighbour. Recommended as a new acceptance item.
What actually changes
14 repos change, 18 stay put. Of the 14, only three are pure renames:
pull-request-and-mergeagent-author-mergepull-request-and-mergeagent-author-mergepull-request-and-mergeagent-author-mergepull-request-and-mergeagent-reviewer-mergepull-request-and-mergeagent-reviewer-mergemerge-remote-mainagent-reviewer-mergemerge-remote-mainagent-reviewer-mergemerge-remote-mainagent-author-mergeagent-author-mergemerge-remote-mainhuman-reviewer-mergemerge-remote-mainhuman-reviewer-mergemerge-remote-mainhuman-reviewer-mergeAcceptance item 12 is superseded: it is 14 frontmatter edits, not five, and eleven of them change how work actually lands.
Blocking dependency:
agent-reviewer-mergehas no mechanismThis is the one thing that should stop a naive implementation.
Four repos are about to declare a lane that requires a reviewer agent to pick up a pull request and merge it. Nothing dispatches that reviewer today. The current doctrine names "the director merge lane" three times and never says who invokes it, on what trigger, or how the authoring agent signals that a PR is ready for review.
Two of those four -
deployandinfrastructure- are the highest-issue repos in the estate at 131 open each. Declaring the lane before the mechanism exists means work in them stops at an open PR nobody collects, which is precisely the litter this whole issue set exists to prevent.Sequencing that avoids it:
agent-author-merge. Safe immediately - no behaviour change.human-reviewer-mergerepos. Also safe - Kai is the mechanism, and those five carry 18 open issues between them.agent-reviewer-mergerepos until reviewer dispatch exists. They stay on their current lanes until then.umbraandagent-composecan takeagent-author-mergeat step 1 - neither needs a reviewer.That reviewer-dispatch mechanism is not scoped anywhere yet and needs its own issue. It should answer: what triggers a review, which seat is selected, how the author signals readiness, and what happens when no reviewer is available.
agent-compose#321gives the reviewing seat its close and revert authority but does not say how it gets invoked.Added acceptance
agent-reviewer-mergerepos are not migrated until reviewer dispatch exists. Sequencing above.