Normalize merge-gate outcomes when review is skipped #982

Closed
opened 2026-07-10 09:12:50 +00:00 by coilyco-ops · 9 comments
Member

A director surface just saw coilyco-flight-deck/agentic-os#419 produce PR #420 with this issue-thread outcome:

WARD-OUTCOME: merge-ready

The details also said:

workflow: pull-requests-and-merge; review summary: skipped (review gate skipped by ~/.ward/config.yaml default)

That is ambiguous for the merge lane. The repo contract says pull-request-and-merge work should merge only after the issue thread shows a completed worker outcome and a passed review summary. A skipped review is not a passed review, but the headline still says merge-ready, so the director has to reverse-engineer policy from free text.

Observed frictions:

  • merge-ready is used even when review was skipped.
  • The outcome details use pull-requests-and-merge, while the documented workflow token is pull-request-and-merge.
  • A read-only director surface cannot safely decide whether to merge from the headline alone.

Expected behavior:

  • The worker outcome should not say merge-ready when a required review gate was skipped.
  • The machine-readable outcome should distinguish worker-done, review-skipped, review-passed, and merge-ready, or otherwise expose enough structured state for the director to make the same decision every time.
  • The workflow token spelling should be normalized across PR bodies, issue comments, and docs.
  • Add coverage for a skipped-review pull-request-and-merge run so it cannot be accidentally treated as mergeable.
A director surface just saw `coilyco-flight-deck/agentic-os#419` produce PR `#420` with this issue-thread outcome: `WARD-OUTCOME: merge-ready` The details also said: `workflow: pull-requests-and-merge; review summary: skipped (review gate skipped by ~/.ward/config.yaml default)` That is ambiguous for the merge lane. The repo contract says `pull-request-and-merge` work should merge only after the issue thread shows a completed worker outcome and a passed review summary. A skipped review is not a passed review, but the headline still says `merge-ready`, so the director has to reverse-engineer policy from free text. Observed frictions: * `merge-ready` is used even when review was skipped. * The outcome details use `pull-requests-and-merge`, while the documented workflow token is `pull-request-and-merge`. * A read-only director surface cannot safely decide whether to merge from the headline alone. Expected behavior: * The worker outcome should not say `merge-ready` when a required review gate was skipped. * The machine-readable outcome should distinguish `worker-done`, `review-skipped`, `review-passed`, and `merge-ready`, or otherwise expose enough structured state for the director to make the same decision every time. * The workflow token spelling should be normalized across PR bodies, issue comments, and docs. * Add coverage for a skipped-review `pull-request-and-merge` run so it cannot be accidentally treated as mergeable.
Author
Member

WARD-DISPATCH: deferred ⏸

deferred details

This forwarded dispatch was deferred after the issue was already reserved.

Attempted harness: codex
Attempted run: ward agent engineer coilyco-flight-deck/ward#982 --harness codex --details Fix the merge-gate outcome ambiguity from ward#982. A pull-request-and-merge worker can currently report WARD-OUTCOME: merge-ready even when the review summary says skipped. Normalize the outcome contract so skipped review is not treated as merge-ready, align the workflow token spelling, and add coverage for the skipped-review case.
Container: engineer-codex-ward-982
Container created: no running engineer was observed.
Host log: /Users/kai/.ward/agent-logs/dispatch/20260710T091256Z-director-codex-zv99-coilyco-flight-deck-ward-982.log
Capacity: ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run ward agent reap for stale engineers

Retry: the issue stays queued and the director will try again when a slot opens.

— Codex, via ward agent

<!-- ward-agent-reservation-released --> <!-- ward-needs-redispatch --> WARD-DISPATCH: deferred ⏸ <details><summary>deferred details</summary> This forwarded dispatch was deferred after the issue was already reserved. Attempted harness: `codex` Attempted run: `ward agent engineer coilyco-flight-deck/ward#982 --harness codex --details Fix the merge-gate outcome ambiguity from ward#982. A pull-request-and-merge worker can currently report WARD-OUTCOME: merge-ready even when the review summary says skipped. Normalize the outcome contract so skipped review is not treated as merge-ready, align the workflow token spelling, and add coverage for the skipped-review case.` Container: `engineer-codex-ward-982` Container created: no running engineer was observed. Host log: `/Users/kai/.ward/agent-logs/dispatch/20260710T091256Z-director-codex-zv99-coilyco-flight-deck-ward-982.log` Capacity: `ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run `ward agent reap` for stale engineers` Retry: the issue stays queued and the director will try again when a slot opens. </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

More live evidence from the same director pass:

  • coilyco-flight-deck/ward#979 produced PR #983, and the issue thread says WARD-OUTCOME: merge-ready while the details say review summary: skipped (review gate skipped by ~/.ward/config.yaml default).
  • coilyco-flight-deck/ward#977 produced PR #984, and the issue thread has the same skipped-review merge-ready shape.
  • Both PR bodies use ward.workflow: pull-requests-and-merge, while the documented workflow token is pull-request-and-merge.

This is now blocking multiple otherwise mergeable director-lane PRs from being safely moved by a read-only director surface.

More live evidence from the same director pass: * `coilyco-flight-deck/ward#979` produced PR `#983`, and the issue thread says `WARD-OUTCOME: merge-ready` while the details say `review summary: skipped (review gate skipped by ~/.ward/config.yaml default)`. * `coilyco-flight-deck/ward#977` produced PR `#984`, and the issue thread has the same skipped-review merge-ready shape. * Both PR bodies use `ward.workflow: pull-requests-and-merge`, while the documented workflow token is `pull-request-and-merge`. This is now blocking multiple otherwise mergeable director-lane PRs from being safely moved by a read-only director surface.
Author
Member

WARD-DISPATCH: deferred ⏸

deferred details

This forwarded dispatch was deferred after the issue was already reserved.

Attempted harness: codex
Attempted run: ward agent engineer coilyco-flight-deck/ward#982 --harness codex --details Fix ward#982 using the additional examples now on the issue: ward#979/PR #983 and ward#977/PR #984 both report WARD-OUTCOME: merge-ready while review was skipped, and the workflow token spelling differs from docs. Make skipped review non-merge-ready, normalize workflow spelling, and add regression coverage.
Container: engineer-codex-ward-982
Container created: no running engineer was observed.
Host log: /Users/kai/.ward/agent-logs/dispatch/20260710T091938Z-director-codex-zv99-coilyco-flight-deck-ward-982.log
Capacity: ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run ward agent reap for stale engineers

Retry: the issue stays queued and the director will try again when a slot opens.

— Codex, via ward agent

<!-- ward-agent-reservation-released --> <!-- ward-needs-redispatch --> WARD-DISPATCH: deferred ⏸ <details><summary>deferred details</summary> This forwarded dispatch was deferred after the issue was already reserved. Attempted harness: `codex` Attempted run: `ward agent engineer coilyco-flight-deck/ward#982 --harness codex --details Fix ward#982 using the additional examples now on the issue: ward#979/PR #983 and ward#977/PR #984 both report WARD-OUTCOME: merge-ready while review was skipped, and the workflow token spelling differs from docs. Make skipped review non-merge-ready, normalize workflow spelling, and add regression coverage.` Container: `engineer-codex-ward-982` Container created: no running engineer was observed. Host log: `/Users/kai/.ward/agent-logs/dispatch/20260710T091938Z-director-codex-zv99-coilyco-flight-deck-ward-982.log` Capacity: `ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run `ward agent reap` for stale engineers` Retry: the issue stays queued and the director will try again when a slot opens. </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

Additional live example: coilyco-flight-deck/ward#978 produced PR #992 and the issue thread reports WARD-OUTCOME: merge-ready while the details say review summary: skipped (review gate skipped by ~/.ward/config.yaml default).

A manual director review passed PR #992, but the machine-readable worker outcome still has the same skipped-review-as-merge-ready ambiguity this issue tracks.

Additional live example: `coilyco-flight-deck/ward#978` produced PR `#992` and the issue thread reports `WARD-OUTCOME: merge-ready` while the details say `review summary: skipped (review gate skipped by ~/.ward/config.yaml default)`. A manual director review passed PR `#992`, but the machine-readable worker outcome still has the same skipped-review-as-merge-ready ambiguity this issue tracks.
Author
Member

WARD-DISPATCH: deferred ⏸

deferred details

This forwarded dispatch was deferred after the issue was already reserved.

Attempted harness: codex
Attempted run: ward agent engineer coilyco-flight-deck/ward#982 --harness codex --details Fix ward#982. Normalize worker/director merge-gate outcomes so pull-requests-and-merge work cannot report WARD-OUTCOME: merge-ready when review is skipped. Use the live examples on the issue from ward#979/#983, ward#977/#984, and ward#978/#992. Also normalize workflow token spelling in machine-readable output. Close ward#982 when landed.
Container: engineer-codex-ward-982
Container created: no running engineer was observed.
Host log: /Users/kai/.ward/agent-logs/dispatch/20260710T094033Z-director-codex-zv99-coilyco-flight-deck-ward-982.log
Capacity: ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run ward agent reap for stale engineers

Retry: the issue stays queued and the director will try again when a slot opens.

— Codex, via ward agent

<!-- ward-agent-reservation-released --> <!-- ward-needs-redispatch --> WARD-DISPATCH: deferred ⏸ <details><summary>deferred details</summary> This forwarded dispatch was deferred after the issue was already reserved. Attempted harness: `codex` Attempted run: `ward agent engineer coilyco-flight-deck/ward#982 --harness codex --details Fix ward#982. Normalize worker/director merge-gate outcomes so pull-requests-and-merge work cannot report WARD-OUTCOME: merge-ready when review is skipped. Use the live examples on the issue from ward#979/#983, ward#977/#984, and ward#978/#992. Also normalize workflow token spelling in machine-readable output. Close ward#982 when landed.` Container: `engineer-codex-ward-982` Container created: no running engineer was observed. Host log: `/Users/kai/.ward/agent-logs/dispatch/20260710T094033Z-director-codex-zv99-coilyco-flight-deck-ward-982.log` Capacity: `ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run `ward agent reap` for stale engineers` Retry: the issue stays queued and the director will try again when a slot opens. </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-RESERVATION: held 🔒

reservation details

Holder: container engineer-codex-ward-982 on host kais-macbook-pro-2.local.

Reserved by ward agent --harness codex (reserved 2026-07-10T17:06:23Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL). --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#982 · branch issue-982 · harness codex · workflow pull-requests-and-merge
  • Run: engineer-codex-ward-982 · ward v0.584.0 · dispatched 2026-07-10T17:06:23Z
  • Comment thread: 5 included in the pre-flight read, 0 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> WARD-RESERVATION: held 🔒 <details><summary>reservation details</summary> Holder: container `engineer-codex-ward-982` on host `kais-macbook-pro-2.local`. Reserved by `ward agent --harness codex` (reserved 2026-07-10T17:06:23Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL). `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh**. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#982` · branch `issue-982` · harness `codex` · workflow `pull-requests-and-merge` - **Run:** `engineer-codex-ward-982` · ward `v0.584.0` · dispatched `2026-07-10T17:06:23Z` - **Comment thread:** 5 included in the pre-flight read, 0 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-10T09:12:59Z), @coilyco-ops (2026-07-10T09:19:38Z), @coilyco-ops (2026-07-10T09:19:41Z), @coilyco-ops (2026-07-10T09:31:46Z), @coilyco-ops (2026-07-10T09:40:35Z) Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0). </details> </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: submitted

details

workflow: pull-request-and-merge; review summary: skipped (review gate skipped by ~/.ward/config.yaml default)

felt: straightforward after the token cleanup. confidence: high. surprises: the machine-readable workflow token had to be normalized in both prompts and comments. follow-ups: none.

WARD-OUTCOME: submitted <details><summary>details</summary> workflow: pull-request-and-merge; review summary: skipped (review gate skipped by ~/.ward/config.yaml default) felt: straightforward after the token cleanup. confidence: high. surprises: the machine-readable workflow token had to be normalized in both prompts and comments. follow-ups: none. </details>
Author
Member

WARD-RESERVATION: held 🔒

reservation details

Holder: container engineer-codex-ward-982 on host kais-macbook-pro-2.local.

Reserved by ward agent --harness codex (reserved 2026-07-10T18:15:08Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL). --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#982 · branch issue-982 · harness codex · workflow pull-requests-and-merge
  • Run: engineer-codex-ward-982 · ward v0.584.0 · dispatched 2026-07-10T18:15:08Z
  • Comment thread: 6 included in the pre-flight read, 1 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> WARD-RESERVATION: held 🔒 <details><summary>reservation details</summary> Holder: container `engineer-codex-ward-982` on host `kais-macbook-pro-2.local`. Reserved by `ward agent --harness codex` (reserved 2026-07-10T18:15:08Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL). `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh**. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#982` · branch `issue-982` · harness `codex` · workflow `pull-requests-and-merge` - **Run:** `engineer-codex-ward-982` · ward `v0.584.0` · dispatched `2026-07-10T18:15:08Z` - **Comment thread:** 6 included in the pre-flight read, 1 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-10T09:12:59Z), @coilyco-ops (2026-07-10T09:19:38Z), @coilyco-ops (2026-07-10T09:19:41Z), @coilyco-ops (2026-07-10T09:31:46Z), @coilyco-ops (2026-07-10T09:40:35Z), @coilyco-ops (2026-07-10T17:24:22Z) - stripped: @coilyco-ops (2026-07-10T17:06:25Z) Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0). </details> </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: merge-ready

details

workflow: pull-request-and-merge; review summary: review gate skipped by ~/.ward/config.yaml default

felt: narrower than the conflict count suggested.

confidence: high

surprises: main moved twice, so the branch needed a second sync before mergeable flipped true.

follow-ups: none.

WARD-OUTCOME: merge-ready <details><summary>details</summary> workflow: pull-request-and-merge; review summary: review gate skipped by ~/.ward/config.yaml default felt: narrower than the conflict count suggested. confidence: high surprises: main moved twice, so the branch needed a second sync before mergeable flipped true. follow-ups: none. </details>
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#982
No description provided.