Skip to main content

Skip docs navigation
manual page/ Reference

Checks

sourceSource: suspec/docs/reference/checks.mdModified: 2026-08-26

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, change-plan, and campaign have deterministic checker faces. inventory, audit, and research are recognized and return checked: false. A missing or unknown type is a blocking usage error. type: review is unknown.

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; change-plan sources and preserves; and campaign sources are lists. Their other defined fields are scalars. Declared option values are exact and case-sensitive. Spec status is draft or ready; task status uses the closed set 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
C015citation-resolves[[KEY]] citations resolve to anchors in the named sources.md, itself resolved against the spec's own directory.warning
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
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
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
C029campaign-shapeA campaign has scalar type, ID, status, and ledger; list sources; draft or ready status; and exactly one non-empty Objective, Completion contract, Authorities, Operating loop, and Stops section.hard-error
C030campaign-authorityLocal ledger and source refs resolve artifact-relative, absolute local refs fail, and the campaign contains no Markdown task-list checkbox that duplicates ledger state.hard-error
C031campaign-readyA ready campaign contains no TBD, TODO, ???, or non-empty canonical blocking label.hard-error

C005, C006, C012, C013, C014, C016, C017, C018, C020, C026, and C027 are reserved and never reused.

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.
  • 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 only when its source spec's status is exactly ready. Draft, missing, and unknown statuses are blocking.

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