Skip to main content

Skip docs navigation
manual page/ Reference

Checks

sourceSource: suspec/docs/reference/checks.mdModified: 2026-07-19

Checks catch common Suspec mistakes.

Use this page as a review checklist.

suspec check implements the deterministic subset. See the CLI contract for commands, companions, path resolution, and exits.

Honesty levels

LevelMeaning
conventionexpected practice; not checked
checklistreviewer inspects it
toolablea tool can check it
enforceda shipped tool rejects it (blocking exit)

This docs repo enforces nothing by itself.

Artifact recognition

type: is required. spec, task, review, and change-plan have deterministic checker faces. inventory, audit, and research are recognized and return checked: false. A missing or unknown type is a blocking usage error.

Each checked JSON report repeats its checked artifact type with level, path, and diagnostics. An unchecked report repeats its type and carries checked: false. Only the optional (file set) C002 report has no artifact type.

Frontmatter accepts one strict subset: an optional UTF-8 BOM; required opening and closing ---; top-level keys matching [A-Za-z0-9_-]+; string scalars; flat inline or block string lists; and comments outside quotes. Strings are never coerced to booleans, numbers, or null. Duplicate keys, malformed quotes or brackets, nesting, maps, multiline scalars, anchors, aliases, tags, empty list heads, and scalar/list field-shape mismatches are blocking parse errors. Unknown extra keys are allowed when they obey the subset.

Field shapes are exact: type and id are scalars on every recognized artifact; spec sources; task source and scope; review waivers; and change-plan sources and preserves are lists. Their other defined fields are scalars. Declared option values are exact and case-sensitive. Spec status is draft or ready; task status, review decision, and coverage assessment use the closed sets below. A present value outside its declared set is a blocking contract error.

Core checks

IDNameCheckSeverity
C001unique-idsRequirement IDs are unique within a file.hard-error
C002duplicate-idNo other file checked in the same invocation uses the same frontmatter id:. Requirement IDs are spec-scoped.hard-error
C003verify-withEvery requirement has a non-empty Verify with:.hard-error
C004one-strength-wordEach requirement's Then value uses exactly one binding word.hard-error
C007no-tbd-at-readystatus: ready has no TBD, TODO, ???, or blocking open question.hard-error
C008sources-namedFrontmatter sources: names at least one origin.warning
C009broken-source-linkPath-shaped source refs resolve against the spec's own directory (artifact-relative). Bare tracker IDs are exempt.hard-error
C010preserves-refs-resolveChange-plan preserves: entries resolve to requirements or PG-NNN; SPEC-id#AC-NNN refs resolve against the plan's sibling specs.hard-error
C011waves-presentMigration, rewrite, and schema-change plans have waves with verify steps.warning
C012coverageRequirement coverage rows match the task scope and ready source spec. Change-plan coverage is outside C012.warning
C013verify-evidence-bindingStructured verify blocks in Requirement coverage match the requirement command and row assessment — a consistency check (nothing re-runs the command). Change-plan coverage is outside C013. A command mismatch is blocking; the other faces stay advisory.warning (command mismatch: hard-error)
C015citation-resolves[[KEY]] citations resolve to anchors in the named sources.md, itself resolved against the spec's own directory.warning
C016supported-needs-evidenceA Supported row with empty evidence is invalid.hard-error
C019malformed-requirement-headingA ### heading shaped like a requirement id but with a lowercase split-suffix (AC-004a) — it parses as prose and silently vanishes from scope and coverage.warning
C020unresolvable-refThe review's task: ref does not resolve to the task packet handed via --task (the packet identifies as a different task, or none).hard-error
C021intent-presentA spec has a non-empty ## Intent.hard-error
C022task-shapeTask type, non-empty ID/source/scope, field shapes, status, exactly-once required H2 sections, and non-empty dependency handoff match the contract.hard-error
C023task-evidenceNo evidence check runs at ready or running. At review-ready or closed, ## Verify contains a numeric exit plus non-empty fenced raw output, a visible CI: or CI link: URL, or justified n/a. A fence is claim-only when its entire trimmed body matches <code>^(all )?(tests?|checks?) (pass(ed)?|succeeded).?$</code> case-insensitively. Any placeholder fence fails even beside valid output; visible placeholders fail case-insensitively.hard-error
C024closed-task-resolvedA closed task contains no TBD, TODO, ???, or non-empty canonical blocker labeled Blocked questions:, Blocking:, or Open question (blocking): after an unordered or ordered list marker; none and n/a are resolved. Fences and comments are excluded; inline code is live text.hard-error
C025spec-shapeA spec has a non-empty ID, draft or ready status, exactly one Intent and Requirements section, and at least one parsed requirement.hard-error
C026evidence-receipt-resolvesExplicit local Markdown evidence links with E-NNN fragments resolve artifact-relative to files carrying the matching HTML id anchor.hard-error
C027review-spec-refThe review's spec: ref matches the spec packet handed via --spec.hard-error
C028requirement-shapeEach requirement contains non-empty When and Then items followed by one Verify with item, with no other live body line. C003 owns an empty verification value.hard-error

C005, C006, C014, and C017 are retired and never reused. C018 is reserved.

Notes:

  • AC-NNN IDs are unique within a spec, not across files. Cross-spec references use SPEC-id#AC-NNN.
  • A named Verify with method that does not exist yet is not a spec defect. The requirement is Unverified until evidence exists.
  • Diff size remains reviewer judgment; no packet-size threshold is asserted.
  • The review-packet checks run against the companions the reviewer hands the checker — the review is never checked shallowly by accident, because a missing required companion is a blocking usage error, not a silent skip. C012 keys on the task's declared scope when the review names a task, and on the spec's full requirement set when it doesn't. C027 always binds the review to the handed spec; C020 binds split reviews to the handed task. Comparing changed files with Do not change needs the live diff and remains a reviewer checklist item.
  • References resolve artifact-relative everywhere. A spec citing a file two folders up writes the relative path from its own directory (../../sources/sup-204.md); no root is ever inferred.
  • A task is dispatched, and any review begins, only when its source spec's status is exactly ready. Draft, missing, and unknown statuses are blocking; C012 and C013 therefore never use a draft exemption.

Unnumbered review checks

The core checks above own every numbered rule. Reviews also enforce:

CheckRule
Review structure (unnumbered)The source spec is exactly ready; review ID, spec ref, reviewer provenance, and Requirement coverage are non-empty; each coverage section uses one contiguous GFM table whose exact header is followed immediately by its three-column delimiter; decision and assessment values use their declared enums. Change-plan coverage, when present, uses the same shape.
no-open-criticalAn accepted review has no non-empty Open decisions section.
accepted-no-blockedAn accepted review has no Blocked assessment in requirement or change-plan coverage; Blocked cannot be waived.
accepted-change-plan-supportedEvery Change-plan coverage row is Supported before acceptance.
accepted-waiversRequirement coverage only: waivers appears only at acceptance and, when needed, exactly equals the Unsupported and Unverified requirement IDs without duplicates; it is absent when there are no such rows. Supported and Blocked rows are not waivable.

Writing watchlist

These words are allowed only when the same line makes them checkable.

FamilyExamplesBetter form
subjectiverobust, clean, simple, intuitivestate observable behavior
quality without measurefast, secure, reliablegive threshold or named test
vague verbshandle, support, improvename actor, action, object
loopholeswhere feasible, if practicalmake it required or remove it
ambiguous qualifierssignificant, minimalquantify
comparativesbetter, fastername baseline and margin
broad quantifiersall, any, every, somename the exact set
bundlingand, or, and/orsplit requirements
vague referencesit, this, abovename the thing

Need a starting point? Install the skills