Skip to content

fix(sdd): preflight emits its checks as a ledger table and rules on what it surfaces - #2080

Merged
arittr merged 2 commits into
devfrom
fix/x7a-sdd-evidence-bearing-preflight
Aug 4, 2026
Merged

fix(sdd): preflight emits its checks as a ledger table and rules on what it surfaces#2080
arittr merged 2 commits into
devfrom
fix/x7a-sdd-evidence-bearing-preflight

Conversation

@obra

@obra obra commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Who is submitting this PR? (required)

Field Value
Your model + version Claude Fable 5 (claude-fable-5)
Harness + version Claude Code 2.1.220
All plugins installed superpowers 6.2.0, episodic-memory, linear, context7, superpowers-chrome, agent-sdk-dev, code-simplifier, github-triage, plugin-dev
Human partner who reviewed this diff Jesse Vincent (@obra) — directed the treatment, the eval program, and this submission; reviewing the diff here (opened as DRAFT pending that review)

What problem are you trying to solve?

Subagent-driven-development's pre-Task-1 conflict scan is unfalsifiable as written: a controller can report "the scan is clean" having run nothing, and nothing in the ledger shows otherwise. In our mined-session corpus that is exactly what happens — plan conflicts (delete-vs-modify across tasks, contradictory interface specs) surface mid-execution instead, where they cost a blocked task or a blocking question to the human. In controlled evals on a seeded-conflict plan, unpatched controllers either missed conflicts at preflight or surfaced them without evidence of a systematic pass.

What does this PR change?

skills/subagent-driven-development/SKILL.md (+13/−6, one file): the scan must emit its work as a table — one row per pair of tasks sharing a file or interface (produces vs consumes, what was found), one row per task's self-consistency — written to the ledger, with a ruling recorded beside each surfaced conflict before Task 1 dispatches. "The scan is clean" without rows is defined as not having scanned. The ruling authority line is explicit: the spec is binding, the plan is its argument.

Is this change appropriate for the core library?

Yes — core SDD controller behavior, project-agnostic, no dependencies.

What alternatives did you consider?

  • Keep the batched-question form (current text): tested as control across multiple batteries; conflicts routinely go unsurfaced or unevidenced at preflight.
  • A mechanical plan-conflict scanner instead of a controller table: we built and tested one; mechanical scanning at final review gets its findings dismissed ("the plan mandates it") — evidence that conflict handling must happen at plan time with the controller holding ruling authority, which is what this text does. A scanner may later complement this as tooling; it does not replace the evidence-bearing table.
  • Nothing until execution surfaces conflicts: the review loop does catch some, but at the cost of mid-plan blocking asks — the failure mode fix(sdd): rule and continue — non-catastrophic conflicts get ledgered rulings, not blocking questions #2077 addresses downstream. This change removes the conflicts before they can become stalls.

Does this PR contain multiple unrelated changes?

No — one file, one mechanism.

Existing PRs

Write the table to the ledger. Rule on everything you find before execution begins — each finding against the plan text that mandates it — and record each ruling in the ledger. If the scan is clean, proceed without comment. Rule on each conflict it surfaces — the spec is the binding authority, the plan is its argument — record the ruling beside its row, and dispatch Task 1. The review loop remains the net for conflicts that only emerge from implementation.

Environment tested

Harness (e.g. Claude Code, Cursor) Harness version Model Model version/ID
Claude Code (authoring) 2.1.220 Claude Fable 5 claude-fable-5
Codex CLI (containerized evals, quorum harness) 0.46 lineage GPT-5.6 family (unpinned) recorded served models: gpt-5.6-sol (X7-A battery), gpt-5.6-terra (composed x7x9 battery); subscription-selected, no --model pin

New harness support (required if this PR adds a new harness)

N/A.

Evaluation

  • Method: containerized quorum evals, fresh clone per rep, pinned scripted user replies, blinded seeded-conflict scenarios, pre-registered criteria, mechanical scoring + adversarial adjudication on contested reps.
  • Results: original battery (cost-pathologies campaign): preflight table present with conflicts surfaced pre-dispatch in 3/3 treatment reps vs unevidenced/absent scans in control. Composed with fix(sdd): rule and continue — non-catastrophic conflicts get ledgered rulings, not blocking questions #2077's text (the two changes bracket the same section): 3/3 preflight-table + 3/3 no-stall — the composition is the graded configuration backing the resolution text above.
  • Disclosure: this branch carries the standalone text rebased onto current dev; the rebased standalone text was graded as part of the composed arm rather than in isolation. The supporting negative result (mechanical scan findings dismissed under plan authority at final review — motivating plan-time handling) is published in the same repo.
  • Model disclosure correction (2026-08-05): the eval lane did not pin a model; per-rep recorded served models are in the public logs (census correction entry, 2026-08-05).
  • Full records (public): https://github.com/prime-radiant-inc/superpowers-autoresearchlogs/2026-07-31-cost-pathologies.md (X7-A battery), logs/2026-08-01-queue-campaign.md (Task 11 composed battery + adjudication), logs/2026-08-02-backlog-campaign.md (X10 authority-gap verdict), reports/2026-08-backlog-campaign.md §2.

https://claude.ai/code/session_0185AJr98gHx5EmwqNeft4Sy

…ules on what it surfaces

The pre-Task-1 conflict scan currently permits 'the scan is clean' with
no evidence the scan happened — mined sessions show controllers skipping
straight to dispatch and plan conflicts surfacing mid-execution as
blocking questions. Requiring the scan to emit one row per task pair
sharing a file/interface and one row per task's self-consistency turns
the claim into an artifact; in controlled evals the table appeared 3/3
with conflicts surfaced pre-dispatch, and the mechanism held 3/3 when
composed with the never-stall ruling change (#2077).

Claude-Session: https://claude.ai/code/session_0185AJr98gHx5EmwqNeft4Sy
@arittr
arittr marked this pull request as ready for review August 4, 2026 21:16

@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: 61f669ebc9

ℹ️ 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".

Comment on lines +159 to +161
Write the table to the ledger. Rule on each conflict it surfaces — the spec
is the binding authority, the plan is its argument — record the ruling beside
its row, and dispatch Task 1. The review loop remains the net for conflicts

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Escalate preflight plan defects instead of ruling locally

When the preflight scan finds a plan-mandated defect or contradiction, this new instruction tells the controller to rule on it and dispatch Task 1, which bypasses the human decision path that the unchanged fix-loop still requires for plan conflicts (SKILL.md lines 321-325) and that the task reviewer template requires for plan-mandated defects (task-reviewer-prompt.md lines 131-135). In sessions where a plan explicitly asks for something the review rubric treats as defective, SDD will now proceed with the controller's local ruling instead of asking which source governs, breaking the designed escalation behavior for this behavior-shaping skill.

AGENTS.md reference: AGENTS.md:L95-L100

Useful? React with 👍 / 👎.

… 2077+2080 text

Both PRs rewrote the same preflight paragraph. Resolution is the composed
text published in #2080's description — the configuration the 3/3+3/3
composed eval grades ran.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@arittr arittr left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

@arittr
arittr merged commit be76350 into dev Aug 4, 2026

@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: 419dec7755

ℹ️ 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".

Comment on lines +166 to +170
The scan's output is a table, not a verdict. One row for every pair of tasks
that share a file or an interface: the two tasks, what one produces against
what the other consumes, and what you found. One row for every task: whether
its own text agrees with itself — the tests it specifies against the code it
specifies, the files it creates against the files it later touches. "The scan

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Include global constraints in each preflight row

For a task that violates a Global Constraint but is internally consistent and does not share a file or interface with another task, the required table can now be “complete” without recording any task-vs-global-constraints check. That leaves one of the two preflight checks enumerated just above unfalsifiable again, so controllers can dispatch Task 1 after missing plan/global contradictions. Because this is behavior-shaping skill content, the row schema needs to make that check explicit rather than relying on inference.

AGENTS.md reference: AGENTS.md:L95-L100

Useful? React with 👍 / 👎.

@arittr

arittr commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Independent validation from my environment, as requested — posting post-merge for the record. Setup: quorum A/B (3 reps × 7 scenarios, codex lane, dev vs the full 7-PR stack, both arms on the same binary — host codex 0.144.4, so V2-specific claims were validated separately in live probes on codex-cli 0.146.0 with subscription auth), plus a fresh 2-task SDD run on 0.146. Full numbers below for this PR.

Validation performed by Claude Fable 5 (Claude Code) at my direction.

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.

2 participants