Spec coverage assessment
Skill davidlee/doctrine/plugins/doctrine/skills/spec-coverage-assessment
bathe your agents in engineering rigour and flames
npx -y skills add davidlee/doctrine --skill spec-coverage-assessmentAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when a named subsystem, capability, or code surface needs governance coverage assessed before authoring a spec — deciding what is already governed by an existing PRD / tech spec / ADR, what is dark, and where new spec boundaries should fall by product altitude and C4 level. Use before creating or scoping a product or technical spec for an unfamiliar or partially-governed surface. Use when a request asks to "assess coverage", "find governance gaps", "what's already specified", "where should this spec's boundary sit", "one spec or several", "what needs a PRD vs a tech spec", or "is this subsystem properly documented". Produces a reviewable coverage-map artifact that feeds `/spec-product` and `/spec-tech`. Do not use when the target spec and its boundary are already known and unambiguous — go straight to `/spec-product` or `/spec-tech`. Do not confuse with `doctrine coverage` — unrelated CLI verb for requirement verification.
SKILL.md
10.6 KB, as published. Nobody here has run it
Spec Coverage Assessment
Bounded census of a named surface's governance extent, upstream of authoring. Answers three questions an agent otherwise answers by unguided judgement: what is already covered, what is dark, and where should new spec boundaries fall. Output is a reviewable coverage-map artifact — it is not itself a spec, an ADR, or a doctrine-tracked entity.
Name collision — read before writing anything down
doctrine coverage (coverage record | verify | forget) is
requirement-verification evidence — whether a REQ-NNN has been observed
to hold. It has nothing to do with this skill. Never call this skill's output
bare "coverage" in prose, a commit, or a doctrine entity — always qualify it:
"spec coverage", "governance coverage", or "the coverage map". Never invoke
doctrine coverage verbs expecting this skill's semantics, and never let a
reviewer conflate the two — they are different axes (requirement-proof vs.
surface-vs-spec extent) that happen to share a word.
Boundary
Use this skill when the surface is a subsystem, crate, capability, or code area whose existing governance is unclear — you don't yet know which specs touch it, whether they're current, or how a new spec should be carved.
Do not use it when:
- the target spec and its boundary are already known and unambiguous — go
straight to
/spec-productor/spec-tech. - the task is authoring or revising one already-scoped spec — that's
/spec-product//spec-techdirectly; this skill's output is an input to those, not a replacement. - the task is proving a requirement is met — that's
doctrine coverage(verification evidence), a different kind entirely. - the task is a full corpus audit or exhaustive line-by-line review — this is
a bounded census (see Stopping conditions), not
/inquisitionor/audit.
Stopping conditions
Decide these before starting, out loud, per /preflight discipline:
- Census depth: which specs/ADRs/policies you'll check for surface-touching claims (by tag, title, or keyword match) — not the whole corpus unless the surface is genuinely corpus-wide.
- Inventory depth: module/crate-level line counts and file lists, not a read of every file. Sample suspicious modules; don't read them end to end.
- Stop once the top-ranked gaps and a boundary recommendation are legible and reviewable. Do not chase every anchor, every unattributed module, or every tangential ADR to exhaustion — that's an audit, not this.
- If the surface turns out to be small and already well-anchored, say so early and stop; don't manufacture gaps to fill the method's shape.
Method
1. Governance census
Enumerate what already claims to touch the surface:
doctrine spec list(filter by tag/title/keyword substring matching the surface) plusdoctrine search "<surface keyword>"(BM25) to catch specs that mention it without an obvious tag.- Anchor harvest: grep the raw TOML for
[[source]]blocks across candidate spec files (rg -A2 '\[\[source\]\]' <spec-dir>/**/spec-*.toml) — faster and more complete than paging through renderedspec showoutput one spec at a time. Spot-check the rendered view withdoctrine spec show <ID>once candidates are short-listed. - Tag/title mapping: cross-reference each candidate spec's
tagsandresponsibilities[](TOML) against the surface's real module names — a spec's prose can claim a surface ("this owns the X crate") with zero anchor backing it; that claim still counts as a coverage signal, but a weaker one than a live anchor. - ADR/policy/standard sweep:
doctrine adr list,doctrine policy list,doctrine standard list(substring/tag filtered) for governance that touches the surface without being a spec — a policy or ADR can be the only governance a component has. - Optionally
doctrine explore relation census/doctrine explore concept-mapto see how the candidate specs already relate to each other — useful for the descent/parent decision in step 5.
2. Surface inventory
Enumerate the surface's real extent, independent of what governance claims:
- List modules/crates/scripts/web directories under the named surface
(
rg --files <path>, standard directory listing). - Size each with a line count (
tokei,wc -l, or equivalent) — this feeds the size factor in step 4. Precision doesn't matter; order of magnitude does. - Note structural seams that matter for boundary-setting later: is there a separable frontend/backend split, a crate boundary, a clearly distinct script family?
3. Coverage mapping — with the anchor-liveness caveat
Join the census (1) against the inventory (2) per module/crate/area:
- Covered — has a live anchor into a current spec.
- Partial — referenced by tag/title/prose but not anchored, or anchored but the anchor is stale (see caveat).
- Dark — zero governance touch of any kind.
Anchors are not a trustworthy substrate on their own — verify liveness
before counting an anchor as coverage. They are descriptive, not enforced:
nothing currently checks that an anchored path still exists. Empirically,
live specs have been found anchoring a file path long after the code moved
elsewhere — the spec looked "covered" and was actually rotted. For every
anchor you rely on to call something "covered", confirm the path still
exists (test -e, or equivalent) before trusting it. Also watch for: anchor
density inversely correlating with subsystem size (big subsystems are often
less anchored, not more — don't assume large means covered), and slug
symlinks beside numeric spec dirs double-counting a naive recursive grep.
4. Rank gaps
Score dark and partial areas by size × centrality, not by discovery order:
- Size: the step-2 line/file count.
- Centrality: how load-bearing the area is — how many other components depend on it, how core it is to the product line, whether it's on a path other specs already describe as a dependency.
Surface the top few gaps, not an exhaustive ranked list of everything dark — this is where the stopping condition bites.
5. Propose spec boundaries
For each top-ranked gap, work out — don't just flag the gap, propose a shape:
- Product altitude (domain | capability | feature | story) — does this need new product intent (a PRD) at all, or does an existing PRD already cover the why and only the tech spec is missing?
- C4 level (context | container | component | code) for any new tech
spec — component/container is the normal stopping altitude; code-level is
exceptional (
/spec-tech's own guidance) and should be justified, not defaulted to. - PRD-vs-SPEC split — is the fix "add anchors to an existing spec that already claims this" (no new entity), a new tech spec under an existing PRD, or both a new PRD and a new tech spec (no product intent exists at all)?
- One spec or several — does the gap hang together as one cohesive component, or does it split along a structural seam noticed in step 2 (e.g. a backend engine and its separately-shipped web frontend are usually two containers, not one)?
- Descent and parent placement — where does the proposed spec sit in the
parent/descends_fromspine? Sibling to an existing component, child of an existing container, new container under the system context spec? - Drafting sources — which existing RFCs, design docs, or slice history
should the eventual
/spec-product//spec-techpass draft from, so authoring isn't starting from a blank page.
6. Emit the coverage-map artifact
Write up the findings as a single reviewable markdown artifact (see shape below) and stop. This skill does not author the spec itself — it hands off.
Coverage-map artifact shape
# Coverage census — <surface name>
## Governance census
Specs / ADRs / policies / standards found touching the surface, with anchor
status per claim (live / stale / prose-only-no-anchor).
## Surface inventory
Modules/crates/areas with approximate size (loc/file count).
## Coverage map
Covered / partial / dark per area, with the anchor-liveness check applied —
not assumed.
## Ranked gaps
Top gaps by size × centrality, each with a one-line rationale for its rank.
## Boundary proposal
Per ranked gap: product altitude, C4 level, PRD-vs-SPEC split, one-or-several,
descent/parent placement, drafting sources.
## Out of scope / not assessed
What the bounded census deliberately did not chase down, so a reviewer knows
the edges of what was checked.
Store it wherever the project's runtime-state convention puts working
artifacts (e.g. .doctrine/state/) — it is provisional input to authoring,
not an authored entity in its own right, unless/until a durable kind is
built for it.
Guardrails
- Do not trust an anchor without checking the path exists — see step 3.
- Do not treat this as a full audit; a bounded, stated-up-front census beats an exhaustive one that never finishes. Say what you didn't check.
- Do not invent a spec boundary the census doesn't support — an ambiguous
boundary is an Open Question for
/spec-product//spec-tech, not a guess made here. - Do not call the output "coverage" unqualified — see the name-collision warning.
- Do not let this skill's output silently become the spec — it is reviewed input, handed off explicitly.
Handoff
The coverage-map artifact is input to:
/spec-product— for any proposed PRD-level gap (missing product intent)./spec-tech— for any proposed tech-spec-level gap or anchor-repair.- the backlog, if a proposed boundary is worth capturing before someone acts
on it (
backlog new).
This skill's job ends at a reviewed coverage map; it does not draft spec prose or requirement entities itself.