Skip to content

feat(planning): restate every open item in full when async work lands mid-round - #11913

Merged
kyle-sexton merged 7 commits into
mainfrom
feat/planning-restate-open-items-11888
Nov 1, 2026
Merged

kyle-sexton merged 7 commits into
mainfrom
feat/planning-restate-open-items-11888

Conversation

@kyle-sexton

Copy link
Copy Markdown
Member

Closes #8466

Summary

Replaces #11888, the work-resolve-issue lane's PR for this issue, which stopped because its open review finding needs edits to the plugin-shipped recommendation-basis copies the fix lane cannot make. This branch merges #11888's head (eb440e4fa82f69611fcdb06fc4721389775b6b1b) unchanged and adds that fix.

From #11888: adds the cross-plugin contract docs/contracts/async-round-presentation/README.md. When a skill has shown open items and dispatched work returns before the user answers, the next message that presents anything ends with one block restating every open item in full, with the changed item marked. Items that wait on a pending result may be held, and status lines are allowed. /planning:interview's out-of-band drift rule now uses this full restate in place of "Re-present narrowly", and keeps "This does not hold the round". discovery research, discovery explore and review fanout each point to the contract. The contract lives in docs/contracts/ (ADR 0064 Decision 6, amended 2026-10-27), with no stub under docs/conventions/. The recommendation-basis contract's re-emit section defers to the new contract for dispatched-work returns (contract 3.0.0), and the convention registry lists the new contract.

Fix

From #11888:

  • docs/contracts/async-round-presentation/README.md: new contract with the rule, the hold and status-line allowances, the reason, what it does not require, and the adopters
  • plugins/planning/skills/interview/context/loop.md and SKILL.md: "Re-present narrowly" becomes "Restate every open row in full", pointing to the contract; "never hold the round" is kept
  • plugins/planning/tests/interview-defenses.test.sh: phrase pin and four digest pins updated
  • plugins/planning/skills/interview/evals/evals.json: new case 43 late-return-restates-every-open-question-in-full; case 25 now requires the full restate
  • plugins/discovery/skills/research/SKILL.md, plugins/discovery/skills/explore/SKILL.md, plugins/review/skills/fanout/SKILL.md: pointer lines to the contract
  • docs/contracts/recommendation-basis/README.md and CHANGELOG.md: re-emit section defers to the new contract; 3.0.0 entry
  • docs/plugin-philosophy.md: convention registry row
  • .changes/planning/, .changes/discovery/, .changes/review/: fragments

Added here (the open review finding on #11888):

  • plugins/discipline/context/recommendation-basis.md (canonical copy): the Re-emit bullet now defers to async-round-presentation, by absolute URL, when the evidence is dispatched work that returned while open items wait on the user
  • The 12 byte-identical copies registered in scripts/cross-plugin-source-registry.txt (architecture, code-tidying, debugging, developer-experience, github, harness-ops, naming, planning, session-flow, source-control, user-experience, work-items): synced from the canonical copy, the registry's stated fix for this cluster, which has no dedicated sync script
  • docs/contracts/recommendation-basis/CHANGELOG.md: the 3.0.0 entry no longer says the copies "have not yet been updated"
  • .changes/<plugin>/feat-planning-restate-open-items-11888-*.md: a minor fragment for each of the 12 carrying plugins; the planning fragment gains a bullet

Verification

Run locally on the merged head:

  • scripts/check-cross-plugin-source-drift.sh --check: no unregistered or drifted clusters; all 13 copies share one hash
  • scripts/check-changelog-fragments.sh --check: all 85 fragments valid
  • scripts/check-changelog-fragments.sh --check-required origin/main: every fragment-mode plugin the change set changes (15) has a fragment
  • plugins/planning/tests/interview-defenses.test.sh: PASS=178 FAIL=0
  • plugins/discovery/scripts/contract.test.sh: all contract assertions passed
  • markdownlint-cli2 on the canonical copy and the contract CHANGELOG: 0 issues

Related

🤖 Generated with Claude Code

melodic-automation-lanes Bot and others added 4 commits November 1, 2026 06:56
Lane-Activity: work-resolve-issue/resolve-issue
…pped recommendation-basis copies

The recommendation-basis contract moved to 3.0.0, but every plugin-shipped
context/recommendation-basis.md still gave only the one-line re-emit form.
The canonical discipline copy now defers to the async-round-presentation
contract by absolute URL when the evidence is dispatched work that returned
while open items wait, and the twelve registered copies are synced from it.
The 3.0.0 CHANGELOG entry no longer says the copies are pending, and each
carrying plugin has a changelog fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kyle-sexton
kyle-sexton marked this pull request as ready for review November 1, 2026 09:38
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-01T09:40:09.752038Z 5dbdaa0 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

claude-security-review reviewed 78d4e48ab9ccb2d30050f5c7a2132e2da9577b2f: read 3 of 3 changed file(s); 0 finding(s), 0 as inline comments.

Security review (incremental, f23ddf1 → 78d4e48)

No security issues found.

Scope: I read every hunk of .claude-lane/incremental.diff, which covers three files:

  • plugins/planning/skills/interview/SKILL.md and plugins/planning/skills/interview/context/loop.md: the rule that restates every open row in full after an out-of-band return now applies only to the first message that presents a question before the user's next separate reply. The same-turn clause and the released-question clause stay. After a later separate reply, the existing drift check takes over, and it still restates any open row the reply did not address.
  • plugins/planning/tests/interview-defenses.test.sh: two section-digest pins are refreshed to match the edited prose, each with a rationale comment. No assertion is removed or loosened.

Instruction-surface lens: This diff narrows a skill-body instruction, so it was not eligible for the prose-only skip. I checked the narrowed rule against the protected classes in docs/contracts/instruction-exception-register/README.md, which are the Gate 0 classes: irreversible-action, secret-handling, data-integrity, external-publication, legal-compliance and agent-authority. The rule only governs when interview questions are shown to the user again. Without it, the ordinary drift check still runs on the next user reply. The no-silent-resolve rule, the "never hold the round" rule and the gap/blocker defenses are unchanged. No protected class matches, and no action now goes unchecked.

No trust controls, workflows, tokens, plugin manifests or merge holds are touched in this incremental change. The PR context file contains no embedded directives aimed at the review lane.

critical-findings: 0

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5dbdaa0d66

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on 5dbdaa0d6612408f833f1e0f177063c156f714a7; the summary is in this lane's pull request comment.

claude-lane: claude-review

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

claude-review reviewed 78d4e48ab9ccb2d30050f5c7a2132e2da9577b2f: read 3 of 3 changed file(s); 0 finding(s), 0 as inline comments.

Code review (incremental: f23ddf1 → 78d4e48)

No findings. I read the whole change in all 3 files in scope.

What changed: the out-of-band full restate now has a bound. It applies to the first message that presents a question before the user's next separate reply. The edit makes this change in two places:

  • plugins/planning/skills/interview/SKILL.md, the "Out-of-band output gets the same check" paragraph.
  • plugins/planning/skills/interview/context/loop.md, "Restate every open row in full".

In interview-defenses.test.sh, the edit re-pins two section digests (the SKILL.md Stance section and the loop.md open-question register section) and adds a justification comment to each.

What I checked:

  • Agreement with the contract. The new bound matches the wording of docs/contracts/async-round-presentation/README.md and the three discovery/review pointer lines: "returns before the user answers… the next message". The same-turn clause and the released-held-question clause are still there.
  • Agreement with the rest of the section. The bound fits with "The floor is the next user reply" and the queued-output-first rule in loop.md (L401-403). If the harness gives no turn when a return lands, the return arrives in the same turn as the user's next reply, and the same-turn clause still requires the full restate. A later separate reply goes back to the ordinary drift check, so no open row is left without a check.
  • Phrase pins. The phrase pin **Restate every open row in full.** (test L909-910) and the SKILL.md pin **Out-of-band output gets the same check, keyed on relevance.** (L917-918) match only the bold lead-ins, so the new wording does not break them.
  • Digest pins. No other digest pin covers these two sections. The eval-case pins are untouched because no case changed in this increment.
  • Closing issue feat(planning): present every open item once when async work could change the round #8466. Its acceptance criteria still hold for these files: "Re-present narrowly" is gone, "does not hold the round" and "never hold the round" remain, and the full-restate sentence is pinned.

Not verified: I had no shell, so I could not recompute the two new SHA-256 digests (24dbb59e…, 39aa4fbc…) or run the test suite. Whether they are correct rests on the PR's CI run. The PR body's "PASS=178 FAIL=0" was written before this commit; it is the author's claim and I have not confirmed it.

Embedded text: none found in the PR context.

kyle-sexton and others added 2 commits November 1, 2026 04:44
The re-emit hand-off linked the async-round-presentation contract by an
absolute URL naming the organization, which the github plugin's copy
fails on its org-agnosticism check. It now cites the repository path,
the same form the file uses for its own contract, in all 13 copies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review on #11913: the full restate fired only when outcome 2 or 3 moved
a row, and only before the user replied. A return that releases a held
question moves no row, and a return processed on the next user reply
(the floor) shares the turn with that reply; both fell back to one-line
pointers. loop.md "Restate every open row in full" and its SKILL.md
pointer now key the restate on the first message that presents a
question after a return, either way. Eval case 44 covers the
release-only path.

Re-pins (each widens when the restate is required, resolves no row the
user did not answer; no-silent-resolve, gap and blocker defenses
unchanged):
- SKILL.md Stance section: 564de96c22 -> 01d2ecc221
- loop.md open-question register section: fcd6bc75e1 -> 720a50f16c
- eval-case roster: c6aa3fa28b -> 1d1c3ad6ca (adds case 44)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on f23ddf1b9699ca19f71af60d59792a804d0ecdfe; the summary is in this lane's pull request comment.

claude-lane: claude-review

@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

The pr-verify verifier failed head f23ddf1b9699ca19f71af60d59792a804d0ecdfe. What it wrote, as data:

What it wrote (36 lines)
Summary: Issue #8466: the behaviour change is delivered, but the PR leaves out one file the spec
  requires. The interview's narrow re-present rule now restates every open row in full, "does not
  hold the round" and "never hold the round" are kept, the test pin is swapped, the eval case is
  added, the discovery and review skills point to the new rule, changelog fragments exist, and every
  CI suite passed. However, the issue body, the owner's 2026-11-01 Decision-recorded criteria and
  the refinement all require `docs/conventions/async-round-presentation/README.md`, and all five
  adopting files must name that path. The PR instead adds
  `docs/contracts/async-round-presentation/README.md` and every pointer names that path. Its only
  stated reason is an ADR amendment quoted in the PR body. That body is not spec text, and the
  owner's criteria were written after the amendment's date.
- docs/contracts/async-round-presentation/README.md: the spec requires
  `docs/conventions/async-round-presentation/README.md` to exist (issue Fix step 1, Verification,
  and the owner's 2026-11-01 acceptance criteria), and this PR creates no file under
  docs/conventions/. Fix: add the rule at docs/conventions/async-round-presentation/README.md, or a
  README there that the repo's conventions allow, and have every adopter name it. If the convention
  location is really meant to change, the owner must amend #8466's criteria first. The PR body's
  claim about ADR 0064 Decision 6 is not spec text.
- plugins/planning/skills/interview/context/loop.md:397: per the spec, the section must cite
  docs/conventions/async-round-presentation/README.md. It cites the docs/contracts path instead.
  Update it once the convention file exists.
- plugins/planning/skills/interview/SKILL.md:195: same problem. The full-restate sentence names the
  docs/contracts path, not the docs/conventions path the spec gives.
- plugins/discovery/skills/research/SKILL.md:90, plugins/discovery/skills/explore/SKILL.md:165,
  plugins/review/skills/fanout/SKILL.md:141: the pointer lines must name
  docs/conventions/async-round-presentation/README.md (spec step 5). They name the docs/contracts
  path.
- docs/contracts/recommendation-basis/README.md, docs/contracts/recommendation-basis/CHANGELOG.md,
  plugins/*/context/recommendation-basis.md (13 copies), .changes/<12
  plugins>/feat-planning-restate-open-items-11888-*.md: the spec did not ask for these. They make
  recommendation-basis a 3.0.0 major contract bump and add minor version bumps to 12 extra plugins.
  The change is consistent with the new rule, but it is out of scope and worth a human look.
- plugins/planning/skills/interview/evals/evals.json: the spec asks for one new eval case. This PR
  adds case 43, which meets the requirement, plus case 44 and a rewritten case 25. The extra cases
  are consistent with the rule. Note them for a human.
- docs/plugin-philosophy.md:891: adds a convention-registry row the spec did not ask for. It is
  harmless, but it points at the docs/contracts path.

This pull request leaves the merge queue, and ci-status holds it out while it carries pr-verify-failed. A pr-verify pass at a new commit removes the label.

@github-actions github-actions Bot added the pr-verify-failed pr-verify failed this head; a pass at a new commit removes it. label Nov 1, 2026
… reply

Review on #11913: dropping "before the user replies" let the full
restate reach a follow-up after a later, separate reply, where the
reply drift check asks for the one-line "Still open" form. loop.md and
the SKILL.md pointer now bound the restate to the first message that
presents a question before the user's next separate reply, keeping the
same-turn and released-question clauses.

Re-pins (the restate's bound matches the async-round-presentation
contract's "returns before the user answers"; no row is resolved and
the no-silent-resolve, gap and blocker defenses are unchanged):
- SKILL.md Stance section: 01d2ecc221 -> 24dbb59e86
- loop.md open-question register section: 720a50f16c -> 39aa4fbc09

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot removed the pr-verify-failed pr-verify failed this head; a pass at a new commit removes it. label Nov 1, 2026
@kyle-sexton
kyle-sexton added this pull request to the merge queue Nov 1, 2026
Merged via the queue into main with commit b5ebc24 Nov 1, 2026
44 checks passed
@kyle-sexton
kyle-sexton deleted the feat/planning-restate-open-items-11888 branch November 1, 2026 11:04
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.

feat(planning): present every open item once when async work could change the round

1 participant