Checklists

requirements.md

Specification Quality Checklist: Per-PR Sonar reuses CI Modules coverage

Purpose: Validate specification completeness and quality before proceeding to planning Created: 2026-09-14 Revised: 2026-09-14 (post-squad fold) Feature: spec.md

Content Quality

  • ✅ No implementation details (languages, frameworks, APIs)
  • ✅ Focused on user value and business needs
  • ✅ Written for non-technical stakeholders
  • ✅ All mandatory sections completed

Requirement Completeness

  • ✅ No [NEEDS CLARIFICATION] markers remain
  • ✅ Requirements are testable and unambiguous
  • ✅ Requirement types are separated (Functional / Non-Functional / Constraints)
  • ✅ IDs are unique across FR-###, NFR-###, and C-### entries (33 ids, 0 duplicates)
  • ✅ All requirement rows include a non-empty Status value
  • ✅ Non-functional requirements include measurable thresholds
  • ✅ Success criteria are measurable
  • ✅ Success criteria are technology-agnostic (no implementation details)
  • ✅ All acceptance scenarios are defined
  • ✅ Edge cases are identified
  • ✅ Scope is clearly bounded
  • ✅ Dependencies and assumptions identified

Feature Readiness

  • ✅ All functional requirements have clear acceptance criteria
  • ✅ User scenarios cover primary flows
  • ✅ Feature meets measurable outcomes defined in Success Criteria
  • ✅ No implementation details leak into specification

Notes

Validation iterations: 3. Iteration 3 is the post-squad fold; the substantive record is work/4334-sonar-coverage-reuse/squad-post-spec.md (471 lines, 4 lenses, adjudicated).

Iteration 3 — what the adversarial squad changed

A post-spec squad (architect-alphonso, debugger-debbie, reviewer-renata, paula-patterns) returned two NOT-READY verdicts. Both were justified. The v1 spec had a coherent failure mode: a job that never runs, or fails in twenty seconds, satisfied almost every criterion.

Five factual claims in the source research were refuted and are corrected here:

Claim (v1)Corrected
duplicate costs 13m27smedian 22m32s (n=12, 09-10→14); v1 cited the population minimum, from a run-level-cancelled run
waste "went live today" with the tokenlive since ≥2026-09-10; the cited 3s-skip runs were fork PRs
Automatic Analysis fails every scan≥3 distinct exit-3 causes; one scan passed cleanly 2026-09-14
the retiring step is the only CI run of those dirsthe scheduled interpreter sweep covers them by marker; only 52 tests in one file are truly unrun
SC-001 "today: two checks run the suite"false — a platform-specific workflow also runs tests per change

Requirements added because the v1 spec stated a property with no mechanism:

and becomes condition-enforced under the new one. Three lenses independently found that v1 asserted the old mechanism while choosing a topology that deletes it. This is the mission's principal security-relevant change and now carries an explicit rule-asserted condition.

requirement and named no mechanism, while the chosen topology makes the default behaviour violate it.

inventory additions recover 1,583. v1's SC-004 was vacuously satisfiable (both surfaces read the same artefacts, so they agree by construction). Now a per-file no-regression criterion.

pinned literal is unsatisfiable there, so a verbatim port would pass a rule over a job that never executes.

a different tree and produce a plausible, silently mis-attributed report.

  • FR-011 / A-004 rewrite — the fork guarantee is platform-enforced under the present trigger
  • FR-012 — publication settings must resolve from trusted content; v1's NFR-005 stated the
  • FR-013 / NFR-009 / SC-004 — measurement breadth. Reuse loses 4,391 statements; the
  • FR-014 — the trigger condition must be expressed in the new trigger's vocabulary; the existing
  • NFR-008 — the analysed revision must match the measured revision, or line numbers project onto

Criteria de-faked:

mission — a job that never fires, or errors in 20s — passed the old "under 2 minutes" bar.

was not supported: the critical path is the matrix, not this workflow.

battery** over every evasion spelling, plus the non-blocking-declaration removal. The repo's own duplicate-detection substrate is documented as blind to the retiring step's invocation form, so the obvious rule would have been vacuous by construction.

carrying per-rule dispositions**, and resolved a v1 contradiction that forbade the disposition which is often correct — retiring a rule whose subject genuinely ceased to exist.

  • NFR-001 / SC-002 moved from wall-clock to a structural assertion. Every failure mode of this
  • SC-003 now says runner-minutes explicitly, with a measurement method. The wall-clock reading
  • SC-007 / NFR-007 replaced "a mutation that is reverted" with a **permanent in-tree fault-injection
  • FR-010 / C-005 replaced "every project rule" (not machine-derivable) with a **derived inventory

Blast radius corrected. The v1 inventory was ~4× understated and contained four false positives (synthetic tests and docstring prose). Real additions include an exact-job-set pin, the aggregate verdict surface that can turn a PR red, a registry/scrub bijection gate, and a raw-substring naming tripwire (C-009).

Deliberately recorded, not defects:

are both in scope. The cheaper alternatives were viable and are recorded in the tracer files so the trade stays auditable.

survive the publication blocker.

outcome the nightly now delivers; its live content is quality-gate backlog. C-001 stands.

red→green proof is behavioural where behaviour is extractable and a declared post-integration observation otherwise — recorded rather than claimed.

  • Scope grew on operator ruling (2026-09-14): measurement breadth and the full inventory cascade
  • *A-001 now enumerates what acceptance is***, not only what it is not — three observables that
  • #825 is reconciled, not treated as a conflict. It predates the scheduled report and asks for an
  • C-006 carries a declared limit. The production trigger cannot execute before integration, so the