Epic: extract the ward merge flow into something lower-complexity, starting from the agent-identity gate that blocks it #1665

Open
opened 2026-08-15 20:27:37 +00:00 by coilyco-ops · 0 comments
Member

Filed by Delphi (design seat) at Kai's direction, 2026-08-15. Origin: coilyco-gaming/sirens-echo#483, where the flow blocked a merge and the diagnosis pointed here rather than there.

Kai's framing

This is a part of an extraction of the ward flow into something more flexible and lower complexity - we'll want to capture the flow as described and performed into an epic on the ward repo so we can dig into it on that end.

So this epic is the flow as it actually is, recorded from a case where it failed, as the input to simplifying it. Not a defect report.

The concrete failure that produced this

Every sirens-echo agent seat posts as @coilyco-ops - the shared robotic identity, not a person. The campaign protocol requires an agent to claim work with a comment. So the newest comment on any issue an agent is working is, by protocol, a @coilyco-ops comment posted minutes before the pull request exists.

ward agent director merge reads that as unacknowledged human feedback and refuses:

ward agent director merge: skipping coilyco-gaming/sirens-echo#480:
  human comment by @coilyco-ops at 2026-08-13T14:15:16Z has no newer ward
  acknowledgement yet

The protocol that coordinates four agents is the thing that stops their work from merging.

It does not fail uniformly. The gate is satisfied by a ward-posted acknowledgement, and ward posts it itself - when it can. A seat holding a FORGEJO_TOKEN acknowledges and merges; a seat without one is stuck behind its own comment. Same protocol, opposite outcome, decided by credential placement rather than by anything about the work.

The flow as performed, which is the thing to simplify

Merging one agent-authored change currently requires all of:

  1. An issue thread ending with WARD-WORKFLOW: merge-ready, or a URL-headed reviewed-and-ready handoff.
  2. A final comment reading workflow: pull-request-and-merge.
  3. A passed review summary.
  4. No human comment newer than ward's last acknowledgement - where "human" is inferred from the commenting account.
  5. A credential in the merging seat so ward can post that acknowledgement itself.

Ordinary agent work produces none of the first three. Measured on sirens-echo: ward agent director merge --dry-run reported merged 0 PR(s), skipped 0 against an open, green, mergeable pull request. Zero skipped, not zero merged of N considered - the pull request was never a candidate.

What the extraction should probably address

Recorded as observations from the failure, not as a design.

  • Identity is inferred from the account, and the account is shared. The gate's purpose is to stop a merge stepping over a person. Kai posts as @coilysiren. A gate watching that identity survives the claim protocol; a gate watching "not-ward" does not.
  • Five conditions, and the common path satisfies none. A gate that ordinary work never passes is not gating, it is stopping.
  • Behaviour varies by credential placement. Two seats running the same flow on the same repo get different outcomes, and neither is wrong about its own state.
  • Scope handling is silently wrong. ward agent director merge 480 accepts a positional argument, ignores it, scans director.default-scope, and reports merged 0 PR(s), skipped 20 - a confident answer about twenty pull requests that are not the one named. An unexpected positional should be an error, not a redirect to a different repository set. Small, separable, and worth fixing regardless of the extraction.

Downstream, so the dependency is visible

coilyco-gaming/sirens-echo#445 records that Kai's standing policy for that repo is "PRs should all just merge when CI goes green", and that nothing implements it. Kai decided on 2026-08-15 to give the ops seat a merge verb rather than route through this flow. That is a deliberate bypass of the ward lane for one repo, and it is a data point about the flow's fit rather than a criticism of it.

Done when

The flow is captured here in enough detail to redesign against, and a simpler shape is chosen. Not when the sirens-echo blockage clears - that has its own path.

Related - coilyco-gaming/sirens-echo#483 (the blocked case), coilyco-gaming/sirens-echo#445 (the bypass).

Filed by Delphi (design seat) at Kai's direction, 2026-08-15. Origin: coilyco-gaming/sirens-echo#483, where the flow blocked a merge and the diagnosis pointed here rather than there. ## Kai's framing > This is a part of an extraction of the ward flow into something more flexible and lower complexity - we'll want to capture the flow as described and performed into an epic on the ward repo so we can dig into it on that end. So this epic is **the flow as it actually is**, recorded from a case where it failed, as the input to simplifying it. Not a defect report. ## The concrete failure that produced this Every sirens-echo agent seat posts as `@coilyco-ops` - the shared robotic identity, not a person. The campaign protocol requires an agent to claim work with a comment. So the newest comment on any issue an agent is working is, by protocol, a `@coilyco-ops` comment posted minutes before the pull request exists. `ward agent director merge` reads that as unacknowledged human feedback and refuses: ``` ward agent director merge: skipping coilyco-gaming/sirens-echo#480: human comment by @coilyco-ops at 2026-08-13T14:15:16Z has no newer ward acknowledgement yet ``` **The protocol that coordinates four agents is the thing that stops their work from merging.** It does not fail uniformly. The gate is satisfied by a ward-posted acknowledgement, and ward posts it itself - when it can. A seat holding a `FORGEJO_TOKEN` acknowledges and merges; a seat without one is stuck behind its own comment. Same protocol, opposite outcome, decided by credential placement rather than by anything about the work. ## The flow as performed, which is the thing to simplify Merging one agent-authored change currently requires all of: 1. An issue thread ending with `WARD-WORKFLOW: merge-ready`, or a URL-headed reviewed-and-ready handoff. 2. A final comment reading `workflow: pull-request-and-merge`. 3. A passed review summary. 4. No human comment newer than ward's last acknowledgement - where "human" is inferred from the commenting account. 5. A credential in the merging seat so ward can post that acknowledgement itself. **Ordinary agent work produces none of the first three.** Measured on sirens-echo: `ward agent director merge --dry-run` reported `merged 0 PR(s), skipped 0` against an open, green, mergeable pull request. Zero *skipped*, not zero merged of N considered - the pull request was never a candidate. ## What the extraction should probably address Recorded as observations from the failure, not as a design. * **Identity is inferred from the account, and the account is shared.** The gate's purpose is to stop a merge stepping over a person. Kai posts as `@coilysiren`. A gate watching that identity survives the claim protocol; a gate watching "not-ward" does not. * **Five conditions, and the common path satisfies none.** A gate that ordinary work never passes is not gating, it is stopping. * **Behaviour varies by credential placement.** Two seats running the same flow on the same repo get different outcomes, and neither is wrong about its own state. * **Scope handling is silently wrong.** `ward agent director merge 480` accepts a positional argument, ignores it, scans `director.default-scope`, and reports `merged 0 PR(s), skipped 20` - a confident answer about twenty pull requests that are not the one named. An unexpected positional should be an error, not a redirect to a different repository set. Small, separable, and worth fixing regardless of the extraction. ## Downstream, so the dependency is visible **coilyco-gaming/sirens-echo#445** records that Kai's standing policy for that repo is "PRs should all just merge when CI goes green", and that nothing implements it. Kai decided on 2026-08-15 to give the ops seat a merge verb rather than route through this flow. That is a deliberate bypass of the ward lane for one repo, and it is a data point about the flow's fit rather than a criticism of it. ## Done when The flow is captured here in enough detail to redesign against, and a simpler shape is chosen. Not when the sirens-echo blockage clears - that has its own path. **Related** - coilyco-gaming/sirens-echo#483 (the blocked case), coilyco-gaming/sirens-echo#445 (the bypass).
Sign in to join this conversation.
No milestone
No project
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/ward#1665
No description provided.