* fix(#3102): render edge-probe coverage report so the resolution loop consumes it Step 5.5 captured the edge-probe report into $COVERAGE, shape-checked it, and reduced it to coverage.applicable — the engine's per-requirement items[] never reached the model, so the resolution loop re-derived edge categories from prose (the data-flow twin of #2733's control-flow discard). The block's own comment claimed the opposite. Render $COVERAGE RAW into context after the well-formedness guard (schema-agnostic so an ADR-550 D7a-style re-cut cannot desync a bespoke renderer), and bind the rows in the resolution loop as a deterministic FLOOR the model unions with its own classification — floor, never ceiling, since the classifier has a measured recall gap (ADR-857 §98 / ADR-550 D7b). --auto consumes the same floor. Comment corrected to match. Regression test asserts a bare render of $COVERAGE, not a count-only cross. * chore(#3102): add changeset for the Step 5.5 edge-coverage render fix * chore(#3102): re-arm spec-phase.md emitted-drift ack for the Step 5.5 render growth The render + floor-binding prose grows spec-phase.md ~1818 bytes (32238 -> 34056, under the 40960 cap). Re-arms the existing spent spec-phase.md ack rather than adding a new fragment (a second key would collide with the base-relative duplicate check).
This commit is contained in:
@@ -251,9 +251,11 @@ if ! node -e 'const a=require(process.argv[1]);if(!Array.isArray(a)||a.length===
|
||||
exit 1
|
||||
fi
|
||||
# Invoke the compiled engine and CAPTURE its report — it computes which categories apply per
|
||||
# requirement. The resolved/dismissed/unresolved rows in $COVERAGE (resolved items carry
|
||||
# verification: explicit|backstop) drive the
|
||||
# resolution loop below (canonical taxonomy compute, NOT LLM re-derivation from prose).
|
||||
# requirement. The report is RENDERED into context below (#3102); its resolved/dismissed/
|
||||
# unresolved rows (resolved items carry verification: explicit|backstop) are the deterministic
|
||||
# FLOOR the resolution loop consumes and unions with its own classification — the loop no longer
|
||||
# re-derives the taxonomy from prose unaided. Floor, never ceiling: the classifier has a measured
|
||||
# recall gap (ADR-857 §98 / ADR-550 D7b), so the model still ADDS any category the engine missed.
|
||||
# The engine FAILS CLOSED (exit 2) on an invalid authored shape or bad input — so the capture
|
||||
# MUST be exit-checked. A bare `COVERAGE=$(node …)` swallows that exit code, leaves $COVERAGE
|
||||
# empty, and lets the workflow fall through to prose re-derivation: fail-OPEN at the boundary
|
||||
@@ -270,6 +272,16 @@ if ! printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d
|
||||
echo "ERROR: edge-probe produced an unparseable or malformed coverage report — refusing to proceed with the resolution loop." >&2
|
||||
exit 1
|
||||
fi
|
||||
# Render the validated report into the model's visible context (#3102). Until here $COVERAGE was
|
||||
# captured, shape-checked, and reduced to coverage.applicable — the engine's per-requirement
|
||||
# items[] never reached the model, so the resolution loop below re-derived edge categories from
|
||||
# requirement PROSE (the data-flow twin of #2733's control-flow discard). These rows are the
|
||||
# deterministic FLOOR the resolution loop consumes. Printed RAW (not a bespoke table) so this
|
||||
# step holds NO knowledge of the item schema: an ADR-550 D7a-style re-cut of the item/coverage
|
||||
# shape cannot silently desync a hand-rolled renderer here — the engine stays the single source.
|
||||
echo "### Edge-probe coverage report (deterministic proposals — the FLOOR for the resolution loop below):"
|
||||
printf '%s\n' "$COVERAGE"
|
||||
echo "### (end edge-probe coverage report)"
|
||||
# Zero-applicable guard: a report where the engine proposed NO applicable edge across ANY
|
||||
# requirement is far more likely a shape-classification miss (or malformed requirements) than
|
||||
# a genuinely edge-free spec — the same fail-open shape as an invalid shape yielding
|
||||
@@ -287,9 +299,14 @@ edge-free spec, or should we revisit the requirement wording / authored shapes?"
|
||||
an empty `## Edge Coverage` section after explicit confirmation.
|
||||
|
||||
For each Requirement gathered so far:
|
||||
1. Classify its shape and raise only applicable edge categories (relevance filter — see
|
||||
the taxonomy in the reference). Reuse any edges the Round-4 Failure Analyst already
|
||||
surfaced as pre-resolved.
|
||||
1. Start from the edge-probe rows RENDERED above — the deterministic `items[]` are the FLOOR:
|
||||
every proposed `(requirement_id, category)` MUST be resolved below (Specify / Dismiss-with-
|
||||
reason / Backstop / Defer), none silently dropped. Then raise any applicable category the
|
||||
engine MISSED — the rows are a floor, never a ceiling: the classifier has a measured recall
|
||||
gap on terse prose (ADR-857 §98 / ADR-550 D7b), e.g. a CSV-export requirement whose
|
||||
`encoding` edge the shape cue under-fires. Union the engine's rows with your own
|
||||
classification (relevance filter — see the taxonomy in the reference); do not narrow to them.
|
||||
Reuse any edges the Round-4 Failure Analyst already surfaced as pre-resolved.
|
||||
2. For each raised category, propose a CONCRETE candidate edge (not "consider
|
||||
boundaries" — e.g. "R2 merges intervals; what about `[[1,2],[2,3]]` that only touch?").
|
||||
3. Resolve each with the user (AskUserQuestion; text mode → numbered list):
|
||||
@@ -313,9 +330,11 @@ For each Requirement gathered so far:
|
||||
- On "anyway": write SPEC.md with those rows marked `⚠ Edge unresolved — planner must
|
||||
treat as assumption`.
|
||||
|
||||
**`--auto` mode:** auto-`resolved` (verification: explicit) where a defensible acceptance
|
||||
criterion can be written; otherwise auto-`resolved` (verification: backstop) (never
|
||||
auto-dismiss — a wrong dismissal is the exact silent failure being eliminated). Log:
|
||||
**`--auto` mode:** resolve over the **same rendered floor** (#3102) — every engine-proposed row
|
||||
from Step 5.5's report (step 1) plus any category the classifier missed, never a narrower set.
|
||||
For each: auto-`resolved` (verification: explicit) where a defensible acceptance criterion can be
|
||||
written; otherwise auto-`resolved` (verification: backstop) (never auto-dismiss — a wrong
|
||||
dismissal is the exact silent failure being eliminated). Log:
|
||||
`[auto] edge coverage: E explicit, B backstop, U unresolved`.
|
||||
|
||||
**`unclassified` exception (#1110):** `--auto` leaves an `unclassified` candidate
|
||||
|
||||
Reference in New Issue
Block a user