Spec Coverage Ledger
Every feature in AiMOneHealth is supposed to ship with a matching specs/NNN-*/ folder containing three files: spec.md, plan.md, tasks.md. The speckit pipeline enforces this when /speckit.* slash-commands are used interactively. Agent-authored code that bypasses the slash commands can drift behind the 3-file contract.
This page is the living record of the 2026-04-24 spec-coverage audit + the catchup effort that closes the gaps it surfaced.
2026-04-24 audit — headline
- Total specs: 64
- With full 3-file coverage: 55 (86%)
- Shipped-without-spec gaps: 0 — every module in
apps/,packages/,scripts/,infrastructure/traces to aspecs/NNN-*/spec.md - Shipped-without-tasks gaps: 5 (specs 017, 018, 057, 063, 064)
- Draft-without-plan gaps: 3 (specs 004, 005, 024)
Full report: spec-coverage-audit-2026-04-24T091518Z.md.
2026-04-26 verification — post push-forward run
After the 42-PR Spec 066 + BAA-approval push-forward run (#259–#299):
- Total specs: 66 (+2 since 2026-04-24 —
064-numeric-freshness-scorer-phase-3-uiplan-only follow-up,066-reasoning-flow-trackerextended through Phase 4b.2-b + the entire self-improvement loop arc). - Shipped-without-tasks gaps: 5 — unchanged. Specs 017, 018, 057, 063, 064 still missing
tasks.md. Catchup Phase 2 remains pending; not blocked by the 042526 work. - Draft-without-plan gaps: 3 — unchanged.
- Spec 066 coverage: full 3-file plus extras (analyze.md, hipaa-review.md, ux-review.md, phase-4-preflight.md). The self-improvement loop arc (#259–#298) extended Phase 1c → Phase 4b.2-b implementation under the existing spec without needing a new
specs/NNN-*/folder, which is correct per the spec-amendment policy (FR additions to an existing spec land in that spec'sspec.md).
The catchup ledger phase counts below reflect 2026-04-24 state; phases 2-5 will track in their respective backfill PRs.
Catchup ledger
The CatchupDocumentation/ folder at the repo root is the rollup artifact carrying the catchup's own requirements.md + spec.md + plan.md + tasks.md. It exists outside the specs/NNN-*/ tree because it spans multiple specs.
Five phases:
| Phase | Scope | Target |
|---|---|---|
| 1 — Ledger | Catchup folder + 4 artifacts authored | ✅ done |
| 2 — Shipped-without-tasks backfill | 5 PRs, one per target spec (017, 018, 057, 063, 064) | 2026-05-01 |
| 3 — Draft-spec decisions | Plans for 004 + 005 (blocked on spec 002); archive-or-promote call for 024 | 2026-05-05 |
| 4 — Testing + CI gate | scripts/spec-coverage-check.mjs fail-closed gate + testing plan doc | 2026-05-08 |
| 5 — Docs site | This page + sidebar entry + live status table | ✅ in progress |
Shipped-without-tasks specs
Each target gets a single backfill PR that lands specs/NNN-*/tasks.md citing:
- PR number(s) where the code shipped
- Primary files the T-number produced
- Test(s) that exercise the T-number
Draft-without-plan specs
| Spec | Status | Blocker | Target action |
|---|---|---|---|
| 004 — MFA Onboarding | Draft | Parent spec 002 (MFA) still in flight | Author plan within 2 weeks of 002 merge |
| 005 — MFA Update | Draft | Same as 004 | Same as 004 |
| 024 — Knowledge Infra Alignment | Draft | Research-only; needs archive-or-promote call | Solo-maintainer decision by 2026-05-05 |
Why this happened
The audit identified three contributing factors:
- Agent-authored code skips
/speckit.tasks— the harness-level hook fires only on interactive/speckit.*invocations. A subagent writing files directly creates notasks.mdentry. pattern-consistency+docs-coveragegates catch pattern + doc drift, but not file-count drift — they don't fail a PR just because a spec folder has 2 files instead of 3.- No CI-level
spec-coverage-check— the 3-file invariant is not actively enforced at merge time.
Phase 4 of the catchup adds the enforcement layer: a new scripts/spec-coverage-check.mjs gate that refuses merge when a PR ships code under a specs/NNN-*/ folder missing tasks.md (with a respect-archived-manifest bypass for legacy specs).
How this is kept current
- Quarterly re-audit: re-run the 2026-04-24 audit prompt against
main; report lands in.claude/reports/with the same filename pattern. - Per-PR gate (Phase 4):
spec-coverage-checkbecomes a mandatory merge gate; any regression fails the PR at CI time. - Ledger update cadence: this page is regenerated from
CatchupDocumentation/tasks.md+ the quarterly audit report. Backfills as they land drop the shipped-without-tasks count; Draft-spec decisions flip rows from blocked to done or archived.
Living status — 2026-04-24
| Phase | Count | Status |
|---|---|---|
| 1 — Ledger | 5/5 | ✅ authored |
| 2 — Backfill PRs | 0/6 | 🟡 pending |
| 3 — Draft decisions | 0/3 | 🟡 blocked on 002 + pending 024 call |
| 4 — Testing + CI gate | 0/6 | 📋 scheduled |
| 5 — Docs surface | in progress | 🟢 this page |
Re-check this page after each backfill lands — the count column is the live tracker.
Related
CatchupDocumentation/README.md— ledger entry point- Audit report:
.claude/reports/spec-coverage-audit-2026-04-24T091518Z.md - Future testing plan:
CatchupDocumentation/testing-plan.md(T-CATCHUP-030, target 2026-05-03) - Audit chain → — how we verify the catchup itself is tamper-evident
- HIPAA overview → — how spec coverage feeds the compliance posture