fix(build): gate full-route patches on demonstrated evidence, widen defer - #2729
Draft
alexeyv wants to merge 1 commit into
Draft
fix(build): gate full-route patches on demonstrated evidence, widen defer#2729alexeyv wants to merge 1 commit into
alexeyv wants to merge 1 commit into
Conversation
…efer
Port the one-shot triage redesign to both step-04 review files. The
patch category was gated on ease alone ("trivially fixable"), so every
cheap fix qualified, including guards for states nothing reaches; defer
was scoped to pre-existing issues, leaving real-but-unwanted findings no
exit except shipped code.
- patch now requires demonstrated substance (a defect that occurs,
missing coverage for a specific case, or a broken gate or convention)
and a smallest fix that is trivial, adds no public surface, and guards
no undemonstrated state. Demonstrated findings whose smallest fix
fails a condition drain to intent_gap when the spec does not settle
the fix, otherwise bad_spec — the route's existing escalation lanes.
- The parent carries the demonstration duty: reviewers report claims
without codebase context by design, so triage verifies each trigger
itself and judges findings by trigger, never by the proposed remedy.
A loud failure on a state the parent cannot demonstrate is handling,
not a defect.
- defer widens to every other real finding, improvement ideas included;
reject is restricted to noise. The confidence tiebreaker stays.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The full route's
Classifyblock has the same gap PR #2697 closed for one-shot, in different clothes — and the full route amplifies it.patchis gated on ease alone ("trivially fixable without human input"), so it filters nothing. Every cheap fix qualifies.deferis scoped to provenance ("pre-existing issue not caused by this story"), so a true finding caused by this change but not worth fixing has no lawful exit except shipped code.guard_snippetwith every finding — a pre-packaged, trivially-applicable remedy — withtrigger_conditionas a description, not a demonstration. Combined with the ease-only gate, every speculative unhandled-path claim arrives dressed as a qualifying patch.The full route makes this worse than one-shot, not merely equal:
## Verificationsection by construction — added guards and surface fail no check — so the loop's only automated gate never fires on this failure mode. The loop cap detects divergence (spec thrash, a loud failure); guard accretion is monotonic drift that reports convergence on every pass.bmad-build-autoruns this step unattended, so speculative guards ship with no human eyes at all.The compounding dynamic: a guard for an undemonstrated state is unreachable, so nothing can ever demonstrate its behavior right or wrong — but it is code, and code generates legitimate findings. The next pass finds the guard branch uncovered, or the fallback violating an invariant, and those second-generation findings are honestly about real code. Triage-time filtering only works at generation zero; the seed is the sole cheap intervention point.
Change
Both
step-04-review.mdfiles (bmad-build,bmad-build-auto), Classify block only. No new categories, no new mechanism — the disallowed-fix class drains into the escalation lanes the route already has.intent_gapwhen the spec does not settle the fix (e.g., new public surface the spec never authorized), otherwisebad_spec. Unlike one-shot, no new HALT is needed —intent_gapis this route's HALT (human loopback), andbad_specputs the contract change where it is structurally reviewed: in the spec, via the change log and re-derivation.The design rule is the same as #2697: the model checks substance, the human judges worth. Every predicate is mechanically checkable — is the trigger reachable, does the fix add public symbols, is the gate red. The cost-benefit judgment ("the solution must solve more problems than it creates") is compiled into the fix conditions at design time, not simulated per-finding at runtime; where the conditions can't settle it, the finding lands on a human channel —
intent_gaploopback interactively,blockedstatus in auto.Deliberate consequences
bmad-build-auto, a demonstrated finding whose fix the spec doesn't settle now blocks the iteration (intent_gap→ HALTblocked) instead of shipping silently. An unattended loop growing public API without eyes on it is exactly the failure this trades throughput against.Validation
Draft until the one-shot A/B (#2697) reports. Same frozen-findings method applies here, with one addition: score second-generation findings — findings whose subject is code a previous pass's patch introduced — as their own metric, since this route's loop is where the avalanche compounds.