docs(coverage): cookbook guide + feature generator scaffolds coverage:

Adds the day-to-day cookbook for the 4-layer coverage architecture
(ADR-020) and threads it into the discovery path:

docs/guides/coverage.md (new):
  - 4 layers at a glance + when each fires
  - Single-source-of-truth pattern (feature.manifest.ts coverage:
    section) and the three readers (vitest, assertFeatureConformance,
    coverage:diff)
  - Daily workflow: pnpm test --coverage -> aggregate -> diff
  - How to read a failure (stderr human + stdout JSON examples)
  - How to fix uncovered slices (TDD walkthrough)
  - The full allowlist (test files, configs, docs, scripts, dev
    tooling, per-feature excludes)
  - Adjusting bands (manifest-first, when to override vitest)
  - CI behavior (two workflows: validate + coverage-snapshot)
  - Reading the committed trend via git log -- coverage/summary.json
  - Mutation testing primer (L3, opt-in, scope, lands in next story)
  - Troubleshooting

CLAUDE.md Read First gets the new guide pinned between audit and
template-tiers, with the L0-L3 layer summary inline so agents see the
shape at a glance.

Feature generator updates (turbo/generators/templates/feature/):
  - feature.manifest.ts.hbs: new `coverage:` block at <gen:coverage>
    anchor scaffolded with the documented defaults + mutationTargets
  - vitest.config.ts.hbs: now uses vitestThresholdsFromBands(
    DEFAULT_COVERAGE_BANDS) instead of the duplicated literal — new
    features ship conformance-compliant by default

Next features generated via `pnpm turbo gen feature` are coverage-
aware from the first commit: bands declared in manifest, vitest
config consumes the helper, no duplication to drift.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 14:15:01 +02:00
parent 15db9c48cb
commit f4254aae48
4 changed files with 253 additions and 24 deletions

View File

@@ -24,6 +24,21 @@ export const {{camelCase name}}Manifest = defineFeature({
},
realtimeChannels: [],
jobs: [],
// <gen:coverage>
// Coverage bands — single source of truth (ADR-020). Read by:
// - vitest.config.ts (test-time thresholds, L0)
// - assertFeatureConformance (boot-time, fails dev/prod on drift)
// - pnpm coverage:diff (cover-the-diff gate, L1)
// Edit here; the helper in vitest.config picks up the new numbers.
coverage: {
bands: {
baseline: { statements: 80, branches: 75, functions: 80, lines: 80 },
entities: { statements: 100, branches: 100, functions: 100, lines: 100 },
"use-cases": { statements: 100, branches: 95, functions: 100, lines: 100 },
controllers: { statements: 100, branches: 95, functions: 100, lines: 100 },
},
mutationTargets: ["entities", "use-cases"],
},
} as const);
export type {{pascalCase name}}Manifest = typeof {{camelCase name}}Manifest;