feat(planning): audit-answers skill — agent-validated interview finish (#1043)#1051
Conversation
Interview rounds could present as a wall of dense prose. These levers fix legibility at the producer without changing the frontier protocol (a hard per-round question cap was considered and rejected — it contradicts frontier doctrine and adds latency without information). - Session-hop anchor: the round-header restate re-grounds a resumed reader before any question; per-question context capped at one line, used only when the header restate doesn't reach the question or after a session gap. - Single verdict marker: the `My recommendation:` line is the sole marker — no stacked `(RECOMMENDED)` badge, no repeated tag in the Alternatives list. - Session-shorthand glossary: session-local shorthand defined once at first use and parked in the ledger (distinct from the project's ubiquitous language). - Artifact escape hatch: a dense round can render its whole frontier as an HTML decision-table artifact (rows numbered to the terminal Q<N>, answers still by number, degrading to a fenced markdown table) — a rendering surface, never a round split or question cap. - AskUserQuestion guidance sharpened to simple selections / binary confirms. Guidance-only; no new skill, action, or config. Patch bump 0.24.5. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
#1043) A new planning skill: an optional agent-validated finish to /planning:interview. Instead of hand-answering every round, the orchestrator accepts each open question's recommended answer, then fresh-context validators adversarially re-examine each accepted answer and only the doubtful ones return to the human. - Accept-to-completion holds a mechanical never-auto floor: USER-RESERVED deferred questions and the interview's auto-guard class always route to the human, never to a validator, and no CONFIRMED verdict can collapse one. - 1-3 fresh-context (non-fork) validators receive the filled ledger + Brief with the recommendation's rationale WITHHELD (audit the decision, not the pitch) and return a per-answer verdict: CONFIRMED / CHALLENGED / RECLASSIFIED-TO-HUMAN, plus shaky dependency-chain flags. - Triaged confirm: CONFIRMED collapse to one line; CHALLENGED + RECLASSIFIED become real questions in the interview round format; the human confirmation round is mandatory. - Validation, never derivation: subagent-invented answers are out of scope (fresh-context independence is real only for checking an answer, not producing one). - devils-advocate's evidence discipline is cited, not duplicated; the dispatch + per-answer verdict contract are purpose-built because the input (pre-enumerated ledger) and output (per-answer verdicts fed back as questions) differ from devils-advocate's plan-artifact stress-test. Registration: interview gains one Composition-table seam row; README skill row; plugin keyword + marketplace tag. Minor bump 0.25.0. Removal contract: delete the skill dir + the one interview seam row. Provisional name from a reasoned verb-table fit (audit = read-only findings the human acts on); a blind naming pass is reconciling and may rename pre-merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 3m 7s —— View job PR Review:
|
|
Claude finished @kyle-sexton's task in 2m 32s —— View job Security Review — PR #1051
FindingsIMPORTANT · Confidence: HIGH — Unguarded cross-vendor data egress without per-invocation consentFile: The Step 2 paragraph instructs the orchestrator to prefer routing to a third-party AI system by default when one is installed:
The data sent to that third-party system is the filled interview ledger (accepted answers) and the PLAN.md Brief (line 50) — which may contain confidential business decisions, proprietary constraints, acceptance criteria, and architecture choices. Three specific problems:
Recommendation: Remove the cross-vendor routing suggestion from this skill entirely, or gate it behind an explicit No other security issues foundThe remaining changes ( |
…uto-accepted Kyle's approval note: the skill is correct regardless of whether the human hand-answered the rounds or the recommendations were auto-accepted — it runs over any filled ledger. Reframe the description, Purpose, and Step 1 from an auto-accept-only "finish" to neutral validation of a completed interview's answers; accept-to-completion is now the conditional path for an unfinished ledger, not the skill's identity. Adds an eval covering the hand-answered path. No behavior change to the validation loop itself. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 58s —— View job Re-review: New Push to PR #1051Tasks
What the new commit doesThe
This is a correct and meaningful improvement. The Status of prior review findingsCode Review — Finding 1: Missing session-loss gotcha ❌ Not addressedThe Gotchas section still does not document what happens if the session ends after Step 4 (triage visible) but before the human confirms in Step 5. The provisional answers are in-session only — silent rerun is the failure mode, and it's not called out anywhere. Current last gotcha at
Code Review — Finding 2: Cross-vendor path underspecified ❌ Not addressed
There is still no heuristic for how to discover whether "its documented surface can take this input." Without one, Claude has to guess — which is the failure mode the fallback clause is there to prevent. Security Review — IMPORTANT: Unguarded cross-vendor data egress ❌ Not addressedThe same line 48 still instructs the orchestrator to prefer routing the filled ledger (containing potentially confidential business decisions, constraints, architecture choices) to a third-party plugin by default when one is detected — without per-invocation user consent. Options ranked by preference:
SummaryThe |
|
Claude finished @kyle-sexton's task in 1m 41s —— View job Security Review — PR #1051 (re-run after synchronize)Tasks
FindingsIMPORTANT · Confidence: HIGH — Cross-vendor data egress still unaddressedFile: The synchronize commit (
The data routed to that third-party system is the filled interview ledger plus the The three specific problems from the first pass remain:
Recommendation: Remove the cross-vendor routing preference, or gate it behind an explicit No other security issues foundThe synchronize commit's changes are documentation-only: description reframing, Step 1 clarification (auto-accept is now a conditional path for an unfinished ledger, not the skill's identity), and one new eval for the hand-answered path. None of these introduce new security surfaces. The shell command ( |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a6ea9bf3f5
ℹ️ 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".
…the reword The neutrality reword dropped 'have subagents second-guess the recommendations' and 'auto-answer then verify the ledger' from the description's Use-when list. Restore both verbatim so auto-invocation trigger coverage is preserved. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 13s —— View job Re-review: New Push to PR #1051Tasks
What the new commit does
This is a correct, targeted fix — these phrases are meaningful auto-invocation triggers that distinguish the accept-then-check flow from a bare "audit answers" invocation. The change is minimal and introduces nothing new. Status of prior review findingsCode Review — Finding 1: Missing session-loss gotcha ❌ Not addressedThe Gotchas section still ends at line 97 without documenting what happens if the session ends after Step 4 (triage visible) but before the human confirms in Step 5. The provisional accepted answers are in-session only — the user must rerun from scratch with no indication this is coming. Suggested addition to Gotchas (after line 97):
Security / Code Review — Finding 2+3: Cross-vendor data egress ❌ Not addressedLine 48 is unchanged across all three commits:
Both the underspecification problem (no heuristic for "its documented surface can take this input") and the egress problem (sends confidential ledger + Brief to a third-party plugin on installation-level consent alone, no per-invocation gate, no The same-vendor fresh-context subagent already achieves correlated-blind-spot protection. The cross-vendor preference adds egress risk without adding a meaningfully different independence guarantee — the fresh-context property (different context window, no shared reasoning chain) is what matters, not the vendor. Options, ranked:
Codex P2 — General interview artifacts (assessment)The Codex finding is valid. The Preconditions section (lines 30–31) requires both:
But This is a real documentation gap, but scoping it correctly — "engineering interviews only" — is the minimal fix, not restructuring the skill to accept both artifact shapes (the general summary has no Deferred-question arbiter tags, so the never-auto-floor logic doesn't translate). A one-line scope note in the Preconditions and a trigger-phrase qualifier in the description would close it cleanly. Suggested Preconditions note (after line 31):
And in the SummaryThe |
|
Claude finished @kyle-sexton's task in 1m 34s —— View job Security Review — PR #1051 (re-run after synchronize)Tasks
What the latest commit does
FindingsIMPORTANT · Confidence: HIGH — Cross-vendor data egress still unaddressed (4th pass)File: Line 48 is unchanged from the PR's initial state:
The data sent to that third-party system is the filled interview ledger (accepted answers) and the PLAN.md Brief (line 50) — which may contain confidential business decisions, proprietary constraints, acceptance criteria, and architecture choices. This has been flagged in three consecutive rounds of security review (covering commits The three specific problems are unchanged:
Options, ranked by preference:
No other security issues foundThe |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 81b56ddb16
ℹ️ 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".
#1048 (P15a) squash-merged to main, so the un-squashed P15a commits in this branch conflicted with main's squashed + Codex-fixed versions. Resolution: take main's Codex-fixed interview/SKILL.md and loop.md, keep this branch's 0.25.0 version bump + CHANGELOG entry, and re-apply the one audit-answers Composition seam row. Net diff vs main is the P18 skill only. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 52s —— View job Re-review: Merge commit
|
| # | Finding | Source | Status |
|---|---|---|---|
| 1 | Session-loss gotcha | Code review | ❌ Open |
| 2 | Cross-vendor egress (security) | Security review | ❌ Open |
| 3 | Cross-vendor path underspecified | Code review | ❌ Open |
| 4 | General-session scope gap | Codex P2 | ❌ Open |
| 5 | Brief-only (no-checklist) scope gap | Codex P2 | ❌ Open |
| 6 | Large-ledger shard merge semantics | Codex P2 | ❌ Open |
Detailed status
Finding 1 — Session-loss gotcha ❌
SKILL.md line 97 ends the Gotchas section with "do not treat the collapsed CONFIRMED block as the finish." It still does not state what happens if the session ends between Step 4 and Step 5: provisional answers are in-session only, the user restarts from scratch with no warning.
Suggested addition (after line 97):
The human confirmation round (Step 5) is the only persistence gate. If the session ends between seeing the triage and confirming, the provisional answers are lost — rerun the skill. Step 4's CONFIRMED collapse is not a checkpoint.
Finding 2+3 — Cross-vendor egress + underspecified path ❌ (5th pass)
SKILL.md line 48 is unchanged through all five passes:
"prefer a cross-vendor advisor for a validator when one is installed and set up — e.g. the OpenAI Codex plugin, when its documented surface can take this input, invoked per its own docs"
The two problems remain co-located:
- Security (egress): "When one is installed" is installation-level consent, not per-use authorization. The data sent — filled ledger + PLAN.md Brief — may contain confidential business decisions, proprietary constraints, acceptance criteria. CLAUDE.md is unambiguous: "Deny by default on unjustified egress or trust delegation." No
userConfigkey gates this; it fires on plugin presence alone. - Correctness (underspecified): The phrase "when its documented surface can take this input" provides no heuristic for discovery. Without one, Claude must guess — which is the failure mode the fallback clause is there to prevent.
The same-vendor fresh-context subagent already achieves the independence goal (different context window, no shared reasoning chain) with no egress. The cross-vendor path adds risk without a qualitatively different guarantee.
Options ranked:
- Remove the cross-vendor preference — make fresh-context same-vendor the sole path.
- Gate behind
userConfig—allow_cross_vendor_validation: falseby default, with a note that enabling it sends planning data to the configured third-party plugin.
Finding 4 — General-session scope gap ❌ (Codex P2)
interview/SKILL.md lines 147 and 184 are explicit: a general (non-engineering) session never creates a PLAN.md Brief. The audit-answers preconditions (lines 30–31) require one, so invoking after a valid general interview hits the missing-ledger STOP with no explanation that this skill is engineering-only.
Smallest fix: one scope sentence in Preconditions and a Not-for qualifier in the description.
Finding 5 — Brief-only (no-checklist) scope gap ❌ (Codex P2)
interview/SKILL.md line 36: the checklist is only emitted for sessions with ≥2 open questions OR explicit me mode. A completed engineering interview in lock mode or auto with clear intent produces a Brief but no checklist. Audit-answers requires the checklist as a precondition (line 30), so it stops with "nothing to validate" even when the Brief exists.
The practical question is whether a Brief-synthesized-without-Q&A deserves audit-answers treatment — if intent was crystal-clear, the ledger of open decisions is empty and there's nothing to validate per-answer. But the preconditions should be explicit about this boundary rather than leaving the user to infer it from a generic STOP. A "Brief exists but no checklist" path should either explain the case and stop cleanly, or accept it and note that only the Deferred questions in the Brief are in scope.
Finding 6 — Large-ledger shard merge semantics ❌ (Codex P2)
SKILL.md line 48 says "up to three to split coverage of a large one," implying non-overlapping answer subsets per validator. But Step 4 line 66 requires merging verdicts using "CONFIRMED by all" as the collapse condition. For any answer that only one validator examined, "CONFIRMED by all" is vacuously true for the other validators — they simply didn't see it. This silently undermines the cross-check guarantee: sharded answers collapse as if independently verified, but they weren't.
Fix: either require every validator to examine every answer (and "split focus/depth" rather than "split coverage"), or add explicit shard-merge semantics that distinguish "validated by one" from "validated by all."
Summary
The merge commit is a clean base update — no content changes to SKILL.md. All six open findings from prior review rounds carry forward unaddressed. Finding 2 (cross-vendor egress) is the highest-priority block — it's a CLAUDE.md design rule violation. Findings 1, 4, 5, 6 are targeted documentation edits. Finding 3 (underspecified discovery) is resolved by whichever option fixes Finding 2. Findings 4–6 are each small, independent fixes.
|
Claude finished @kyle-sexton's task in 1m 27s —— View job Security Review — PR #1051 (post-merge synchronize)Tasks
FindingsIMPORTANT · Confidence: HIGH — Unguarded cross-vendor data egress (5th pass; still open)File: This line has been flagged in every prior security review pass (commits
The data sent to the third-party system on this path is named on line 50: the filled interview ledger (accepted answers) and the The three specific problems are unchanged:
Recommended fix — option 1 (preferred): Remove the cross-vendor preference entirely and make fresh-context same-vendor the sole stated path. Fresh-context (non-fork) subagents already deliver the correlated-blind-spot protection the cross-vendor path is motivated by (different context window, no shared reasoning chain), with zero data egress. Recommended fix — option 2: Gate behind an explicit userConfig:
allow_cross_vendor_validation:
type: boolean
default: false
description: >
When true, the audit-answers skill may route the filled interview ledger and
PLAN.md Brief to a configured third-party AI plugin for validation. Enabling
this sends potentially confidential project data to an external vendor.No other security issues foundThe latest push ( |
|
🔒 babysit-prs lane claiming this PR for on-branch fix work this cycle (amendment-round: 16, safe tier). Will fix clear branch-owned findings and push; will not resolve threads or merge (safe tier). |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1d5a35bca6
ℹ️ 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".
Four P2 findings: - Precondition no longer requires a PLAN.md Brief + checklist ledger. It now validates whatever the interview persisted — an engineering Brief, a Brief-only (auto/lock, no checklist) session, the decision-tree ledger, or a general session's shared-understanding summary — and only stops when NO interview output exists for the topic. - Validators each review the WHOLE answer set; the 1-3 count scales independent redundancy, never shards coverage — so "confirmed by all" stays meaningful and can't be confused with "unseen by some." - USER-RESERVED deferred questions stay deferred (carry-forward to /planning:plan with their arbiter tag), never turned into audit questions resolved now, which would strip plan-time context and rewrite the Brief prematurely. Only auto-guard-class choices become human questions. - Persistence writes back to whichever artifact the interview used (Brief or general summary, plus the ledger when kept), leaving USER-RESERVED in place. Eval 2 updated to the corrected never-auto-floor behavior. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 13s —— View job Re-review: Commit
|
|
Claude finished @kyle-sexton's task in 1m 45s —— View job Security Review — PR #1051 (HEAD
|
| Prior finding | Status |
|---|---|
| Codex P2: General-session scope gap (no Brief produced) | ✅ Fixed — preconditions now accept all output shapes |
| Codex P2: Brief-only (no checklist) scope gap | ✅ Fixed — explicitly handled |
| Codex P2: USER-RESERVED deferrals turned into audit questions | ✅ Fixed — carry-forward untouched, not audited |
| Codex P2: Large-ledger shard merge semantics (vacuous CONFIRMED) | ✅ Fixed — whole-answer-set per validator, sharding prohibited |
No other security issues found
The b74fa96 changes are documentation — precondition restructuring, Step 1 and Step 4/5 prose updates, and an eval fix. No new injection surfaces, no credential handling, no path traversal, no workflow changes. The shell command (git branch --show-current 2>/dev/null || echo "unknown") is read-only and safe; $ARGUMENTS is consumed by the model for slug derivation, not passed to a shell.
The cross-vendor egress issue (line 49) is the sole remaining block. It is a design-rule violation and the only finding warranting a fix before merge.
|
All four P2 findings addressed in b74fa96: (1) precondition now accepts any interview output — engineering Brief, Brief-only (no checklist) sessions, the ledger, or a general session's shared-understanding summary — stopping only when nothing is persisted; (2) validators each review the whole answer set (the 1-3 count scales independent redundancy, no sharding), so 'confirmed by all' stays meaningful; (3) USER-RESERVED deferrals stay deferred to /planning:plan with their arbiter tag, never turned into audit questions; (4) persistence writes back to whichever artifact the interview used. Thanks. |
|
🔒 babysit-prs safe-tier classification — head
CI is green except the in-progress |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b74fa96e75
ℹ️ 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".
| @@ -0,0 +1,99 @@ | |||
| --- | |||
| name: audit-answers | |||
| description: "Adversarially validate a completed /planning:interview's answers with independent fresh-context agents — runs over any filled decision ledger, whether the human hand-answered the rounds or the recommendations were auto-accepted. Validators re-examine each answer with its rationale withheld and return a per-answer verdict (confirmed / challenged / reclassified-to-human), so only the doubtful answers come back as real questions and user-reserved decisions always do; if open branches remain, it accepts the recommended answers to fill them first, holding the never-auto floor. Use when: 'audit my interview answers', 'validate the interview answers', 'have agents check the answers', 'accept all and have agents check them', 'agent-validated interview', 'have subagents second-guess the recommendations', 'auto-answer then verify the ledger'. Not for stress-testing a plan artifact (that is '/planning:devils-advocate') or asking the human the questions the first time ('/planning:interview'); needs a filled interview ledger." | |||
There was a problem hiding this comment.
Keep USER-RESERVED deferrals out of the summary
Fresh evidence: the skill body now says USER-RESERVED Deferred questions stay carry-forward and are not turned into audit questions, but this description still tells the model/user that user-reserved decisions “come back as real questions.” Because frontmatter is the trigger/summary Claude sees before applying the detailed steps, invocations with a USER-RESERVED deferred pricing/scope decision can still route that plan-gate item into this audit confirmation round instead of preserving its arbiter for /planning:plan.
Useful? React with 👍 / 👎.
| "expected_output": "With no filled interview ledger for the topic, the skill stops with a message that there is nothing to validate and points the user at /planning:interview to produce the ledger first.", | ||
| "files": [], | ||
| "expectations": [ | ||
| "Output recognizes the precondition: a filled interview ledger (interview-checklist.md decision-tree ledger + PLAN.md Brief) must exist", |
There was a problem hiding this comment.
Align the no-output eval with valid Brief-only inputs
Fresh evidence: after the skill's Preconditions accept a Brief-only interview and a summary-only general interview, this eval still asserts that a filled interview-checklist.md plus PLAN.md must exist. Model-graded evals using this case can reward the obsolete “no ledger ⇒ stop” behavior and penalize the intended behavior for valid completed interviews that only persisted a Brief or summary; adjust the scenario to mean no persisted interview output at all.
Useful? React with 👍 / 👎.
Closes #1043.
What
A new
planningskill:/planning:audit-answers— an optional agent-validatedfinish to
/planning:interview. Instead of hand-answering every round, theorchestrator accepts each open question's recommended answer, then fresh-context
validators adversarially re-examine each accepted answer and only the doubtful
ones return to the human.
nothing is written to the tracked ledger/Brief on bare invocation. A
mechanical never-auto floor (USER-RESERVED deferred questions + the
interview's auto-guard class) is held out of the auto-accept and always routes
to the human; no CONFIRMED verdict can collapse one.
with the recommendation's rationale withheld (audit the decision, not the
pitch) and return a per-answer verdict — CONFIRMED / CHALLENGED /
RECLASSIFIED-TO-HUMAN — plus shaky dependency-chain flags.
become real questions in the interview round format. Persistence happens
only after the human confirmation round — the human-confirmation is the
explicit override the
auditverb contract sanctions.(fresh-context independence is real only for checking an answer, not producing
one).
Boundary with devils-advocate (cite, don't duplicate)
The adversarial evidence discipline is
/planning:devils-advocate's and iscited, not re-implemented. The dispatch + per-answer verdict contract are
purpose-built because the input and output genuinely differ: devils-advocate
extracts assumptions from one plan artifact → severity findings + revised-plan
recs; this skill validates a pre-enumerated per-answer ledger → per-answer
verdicts fed back as interview questions. Same-plugin, so the interview seam
sentence is a direct reference (seam-phrasing is cross-plugin only).
Where
skills/audit-answers/— new skill (SKILL.md + evals + gotchas).skills/interview/SKILL.md— one Composition-table seam row (the removalcontract: delete the skill dir + this one row).
README.md,CHANGELOG.md,plugin.json(keyword),marketplace.json(tag)— registration. Minor bump 0.25.0.
Naming
Provisional pick
audit-answerswas confirmed by a blind, verb-table-awarefresh-context naming pass (three lenses): it fits the fixed-verb table (
audit=read-only findings; mutation only behind an explicit override — the
human-confirmation round is that override), needs no PLUGIN-PHILOSOPHY exception,
and lands top-2 across lenses. Shortlist carried to Kyle: audit-answers
(recommended), audit-recommendations (table-fit, sharper), cross-examine
(vivid, but a coined verb needing a documented table exception). Renameable
pre-merge if Kyle prefers a shortlist alternative.
Verification
markdownlint-cli2clean;skill-quality:check audit-answers→ PASS (0errors, 0 warnings); SKILL.md 97 lines. Interview still PASS (pre-existing
WARNs only).
plugin.json/marketplace.json/evals.jsonvalid; versionparity 0.25.0; both planning shell tests pass.
Related
on (base of this PR). Not closed by this PR; retarget to
mainafter feat(planning): interview round-format legibility levers (#1042) #1048merges.
🤖 Generated with Claude Code