design: TDDs 0044-0047 — coverage map (FR-78) + review/build/tdd-author refinements#123
Merged
cahenesy merged 1 commit intoJun 9, 2026
Conversation
…or refinements Four draft TDDs from one /tdd-author pass after the FR-78 PRD merge (PRD-rev 0aa1e28). One covers the new requirement; three are gap-closure refinements of the *how* of existing FRs (no PRD change), like 0038/0043. - 0044 Per-requirement test-coverage map (FR-78): the final review pass emits a COVERAGE_MAP block (pinned/proposed/justified-no-surface/unverified-gap) ALONGSIDE — outside — its REVIEW_RESULT verdict, so it is structurally reported-not-gated (ADR 0005); the runner writes a "## Per-requirement coverage" section to report.md + a PR-comment pointer. Anti-false-green is model-independent: coverage_map_normalize downgrades a `pinned` row to `unverified-gap` unless its evidence both matches a <file>::<name>/<file>:<line> citation shape AND the cited file is in the runner-derived `git diff --name-only` list (ADR 0006 grounding). - 0045 Review-gate lenses (FR-10, FR-15): intent-conformance (documented-but-unenforced is a finding; cite both sides; scoped to the TDD's in-scope FR/ADR set) + policy-shadow (a test of an extracted helper is not proof the framework calls it; no finding without a named real enforcement path). Lenses WITHIN gate 4, not a new gate (ADR 0005). - 0046 Surgical-changes build norm (FR-66, FR-74): every changed line traces to the requirement; no adjacent improvements; minimum code — with a carve-out that exempts the build's already-mandated same-commit stale-doc updates, failing-test-first commits, and ADR supersessions. Echoed on the rework path (the ADR-0008 Opus-rework wander risk). - 0047 tdd-author interrogation upgrades (FR-76): red-team ranking of load-bearing assumptions (impact x likelihood x cheapness, each "fails if ___") + a Real/Overblown/Unspoken(elephant) failure-mode taxonomy (recommended structure within the existing section, not a new linter heading). T5 (prd-author objective-level success-metrics) was considered and DROPPED as redundant with the per-requirement observable acceptance criterion + the FR-77 co-created evaluation rubric (YAGNI). All four carry an identical co-created ## Evaluation rubric (FR-77). Structural lint + scope-bound pre-passes exit 0. Also checks off a stale BLOCKERS.md 0038 rework-budget-exhausted entry (moot — 0038 landed; resumed review passed without rework). Design-critique gate (independent design-reviewer, fresh context, different model): DESIGN_REVIEW: PASS. One minor finding addressed before opening this PR — 0044's coverage_map_normalize now carries the scoped-diff file-presence check into the function spec + verification plan (previously shape-only), making the stronger anti-false-green half model-independent. Reviewer nits (rubric criterion wording is 0044-specific but identical per FR-77; NFR-3 noted not-in-scope for 0045) accepted as-is. Cascade: none stale — all three refinement TDDs are additive gap-closure; the existing implemented TDDs remain accurate build records. Open assumptions & waivers: - FR-78 model false-green on `pinned` — resolved: `pinned` requires a cited asserting test (file::name or file:line) reproducible from the diff; the runner also re-checks the cited file is in the scoped diff, else downgrade. Falsifiable per ADR 0006. - T5 prd-author success-metrics redundant — waived: T5 dropped entirely (YAGNI); per-requirement acceptance + the FR-77 rubric already cover measurable success. - T2 intent-conformance over-blocks — resolved: lens scoped to the TDD's in-scope FR/ADR set only; severity by boundary-crossing; no new gate (ADR 0005). - T2 policy-shadow false positive — resolved: a finding must name the real enforcement path (file:line) and show the test misses it; no concrete gap → no finding. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
Four draft TDDs from one /tdd-author pass after the FR-78 PRD merge (PRD-rev
0aa1e28). One covers the new requirement; three are gap-closure refinements of
the how of existing FRs (no PRD change), like 0038/0043.
COVERAGE_MAP block (pinned/proposed/justified-no-surface/unverified-gap)
ALONGSIDE — outside — its REVIEW_RESULT verdict, so it is structurally
reported-not-gated (ADR 0005); the runner writes a "## Per-requirement
coverage" section to report.md + a PR-comment pointer. Anti-false-green is
model-independent: coverage_map_normalize downgrades a
pinnedrow tounverified-gapunless its evidence both matches a ::/:citation shape AND the cited file is in the runner-derived
git diff --name-onlylist (ADR 0006 grounding).(documented-but-unenforced is a finding; cite both sides; scoped to the TDD's
in-scope FR/ADR set) + policy-shadow (a test of an extracted helper is not
proof the framework calls it; no finding without a named real enforcement
path). Lenses WITHIN gate 4, not a new gate (ADR 0005).
the requirement; no adjacent improvements; minimum code — with a carve-out
that exempts the build's already-mandated same-commit stale-doc updates,
failing-test-first commits, and ADR supersessions. Echoed on the rework path
(the ADR-0008 Opus-rework wander risk).
load-bearing assumptions (impact x likelihood x cheapness, each "fails if
___") + a Real/Overblown/Unspoken(elephant) failure-mode taxonomy (recommended
structure within the existing section, not a new linter heading).
T5 (prd-author objective-level success-metrics) was considered and DROPPED as
redundant with the per-requirement observable acceptance criterion + the FR-77
co-created evaluation rubric (YAGNI).
All four carry an identical co-created ## Evaluation rubric (FR-77). Structural
lint + scope-bound pre-passes exit 0. Also checks off a stale BLOCKERS.md 0038
rework-budget-exhausted entry (moot — 0038 landed; resumed review passed without
rework).
Design-critique gate (independent design-reviewer, fresh context, different
model): DESIGN_REVIEW: PASS. One minor finding addressed before opening this PR —
0044's coverage_map_normalize now carries the scoped-diff file-presence check
into the function spec + verification plan (previously shape-only), making the
stronger anti-false-green half model-independent. Reviewer nits (rubric criterion
wording is 0044-specific but identical per FR-77; NFR-3 noted not-in-scope for
0045) accepted as-is.
Cascade: none stale — all three refinement TDDs are additive gap-closure; the
existing implemented TDDs remain accurate build records.
Open assumptions & waivers:
pinned— resolved:pinnedrequires a citedasserting test (file::name or file:line) reproducible from the diff; the runner
also re-checks the cited file is in the scoped diff, else downgrade. Falsifiable
per ADR 0006.
per-requirement acceptance + the FR-77 rubric already cover measurable success.
FR/ADR set only; severity by boundary-crossing; no new gate (ADR 0005).
enforcement path (file:line) and show the test misses it; no concrete gap → no
finding.
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com