Skip to content

DRAFT docs(recipe): Needs review is not shipped without a tip-native proof - #7296

Closed
owieschon wants to merge 4 commits into
ParadevAI:mainfrom
owieschon:docs/proof-gate-needs-review-receipt
Closed

owieschon wants to merge 4 commits into
ParadevAI:mainfrom
owieschon:docs/proof-gate-needs-review-receipt

Conversation

@owieschon

@owieschon owieschon commented Sep 8, 2026 •

Copy link
Copy Markdown
Contributor

Draft. Do not merge; do not undraft.

What

Adds one docs page: docs/proof-gate-needs-review-receipt.md. It states an operator rule — a workspace in the Needs review board column is not shipped until there is a tip-native proof artifact.

Tip-native proof = the pipeline produced it and it is pinned to the exact commit SHA at the branch tip: check runs that CI actually ran at that SHA (gh checks <sha>, all green), or a receipt that names the SHA.

The rule adds no board column. It cites only the columns the app already has (Needs review, Needs attention, Merged, Deleted) and leaves agentStatus untouched — that stays the single source of truth in its own work (#7007).

Why — first-person stakes

I am the operator who merges. If I read "Needs review" as "ready", I ship whatever the agent left: possibly failing CI, possibly a commit I never verified. A bot saying "looks good" is an opinion. A check run pinned to a concrete SHA is proof, because I can read it back and pin it to the same commit I will merge.

Not in scope

No product code, no new columns, no agentStatus changes, no hook changes.


Summary by cubic

Fixes premature completion announcements by deferring a parent's Stop until all its subagents finish. Adds a docs page stating that a workspace in "Needs review" requires a tip-native proof before shipping.

Behavior changes

  • Parent Stop is held while subagents run and released exactly once when the last child clears.
  • Child events that straggle after a stop no longer revive the child, except for Codex, which genuinely resumes via send_input.
  • Permission requests still broadcast while children run; a new parent event supersedes the held Stop.
  • Held Stops are dropped if the terminal dies or the status escape hatch fires.

Written for commit 8c61d20. Summary will update on new commits.

Review in cubic

…ll run

A parent agent can end its turn while children it spawned are still
working. Today that Stop chimes, fires a native notification, and flips
the terminal green — the product says "done" while the task is still
going (ParadevAI#6929).

ParadevAI#7231 gave the host a live subagent roster and made sure child events
never drive parent status; the residual it named is this one. Gate the
parent's Stop on that roster: when children are still live the store
holds the Stop, the terminal keeps its working state, and nothing fans
out. The last child's exit releases the held Stop as a single
completion.

Permission requests are untouched — needing input while children run is
still attention. A parent event that arrives before the roster drains
(the user replied) supersedes the held Stop, so it never double-fires.
A terminal that dies under a held Stop drops it.

A child whose stop hook never arrives would otherwise hold the
completion forever, so the release check prunes the roster first: the
existing stale window bounds the delay. `terminalAgents.listByWorkspace`
runs the same check, which is where the sidebar's poll picks it up.

Claude-Session: https://claude.ai/code/session_01Pc1qgTpz2j8nW6BET2CqCW
…gle in

Claude fires the parent's `Task` PostToolUse — carrying the child's
`agent_id` — after that child's own SubagentStop. The roster treated any
non-stop event as liveness and put the child back, so a terminal's roster
never drained.

That was harmless before the parent's completion started waiting on it.
Now it means a held Stop is never released: in a native fan-out all three
children were revived that way and SessionEnd dropped the held Stop
0.2s later, so the turn announced nothing at all. Losing the completion
is worse than announcing it early.

Keep a stopped child stopped, and let a harness opt back in. Codex does:
`send_input` genuinely resumes a finished child, so a post-stop event
there is the child working again rather than a straggler. The straggler's
transcript path is still merged, so the subagent pane keeps what it
revealed.

Claude-Session: https://claude.ai/code/session_01Pc1qgTpz2j8nW6BET2CqCW
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@owieschon

Copy link
Copy Markdown
Contributor Author

Superseded by thin docs-only DRAFT (this head accidentally included host-service terminal-agents files).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant