Speclinecanon 3.1.0HandbookFor agents ↗
Specline · Rules

Rule catalog

Every check Specline can emit, in one place — 33 rules. The engine andspecline rules read from the same registry, so a finding can never carry arule_id the catalog lacks — and the catalog can never drift from what actually fires.

Severity is the line. error meansintegrity — a fact that's broken regardless of any opinion about good specs; it fails the gate. warning means advisory — a judgment about whether a spec is good (completeness, sizing, mechanics, build-readiness); it's surfaced for the decider and never blocks. Specline runs inone mode: it reports every finding and exits nonzero when any of them is an error. Scope — repo findings consider the whole tree;spec integrity errors quarantine to --changed. Parts 1 and 2 always run. Part 3 runs, and is listed by specline rules, only when specline.yml sets unattended: true.

Part 1 — the spec (9)

rule_idseverityscopefires when
STRUCT-MISSING-SPECerrorspeca specs/ folder has no spec.md — the constitutive file; the folder is not a spec without it.
FRONTMATTER-UNPARSEABLEerrorspecspec.md frontmatter is missing or doesn't parse.
FRONTMATTER-SLUG-MISMATCHerrorspecfrontmatter slug doesn't match the directory.
ENUM-INVALIDerrorspeca known enum (type, status, or — when unattended — build/blast_radius/size/target_model) has an invalid value.
UNKNOWN-FRONTMATTER-KEYwarningspecan unrecognized frontmatter key — preserved, not failed (likely a newer canon).
UNKNOWN-SECTIONwarningspecan unrecognized body section — preserved, not failed.
GOAL-MISSINGwarningspeca spec has no `## Goal` — one falsifiable line, the highest hydration value per character in the format.
PARENT-HAS-MECHANICSwarningspeca type: parent carries Behavior or Acceptance — a parent is a map, not a plan.
PARENT-NO-SCOPESwarningspeca type: parent lists no child scopes (nothing declares part_of: it) — a misfiled scope.

Part 2 — the record (12)

rule_idseverityscopefires when
SLUG-DUPLICATEerrorrepoan active spec's slug collides with knowledge/ or archive/; the graduated knowledge + archive pair is legal.
RELATION-DANGLINGerrorrepoa relations.md edge points to a slug that exists nowhere in specs/, knowledge/, or archive/.
RELATION-UNPARSEABLEerrorreporelations.md in a spec or knowledge folder has invalid YAML or field shapes.
LINK-DANGLINGerrorrepoa relative link under docs/ doesn't resolve.
KNOWLEDGE-HAS-STATUSerrorrepoknowledge/ contains a lifecycle artifact (status.md, open-questions.md).
ARCHIVE-EDITEDerrorrepoan archived spec is modified (adding one is graduation, allowed) — the audit trail is immutable.
STRUCT-MISSING-RELATIONSwarningspeca specs/ folder has no relations.md — an auxiliary file.
RELATION-CROSS-REPOwarningrepoa repo:slug edge — validated weakly, warn only.
RELATION-KILLEDwarningrepoan edge points to a killed slug — warn only.
OPEN-QUESTION-INCOMPLETEwarningspeca building spec's open question is missing a decider or default.
OPEN-QUESTION-OVERDUEwarningspecan active spec has an open question past its deadline.
CANON-PIN-MISMATCHwarningrepothe repo's pinned canon (specline.yml, compared at MAJOR.MINOR) differs from the tool's served canon.

Part 3 — unattended builds (12)

Experimental — in force only when specline.yml setsunattended: true. Off by default; nothing here is checked or listed until you turn it on.

rule_idseverityscopefires when
UNATTENDED-INCOMPLETEwarningspecbuild: unattended lacks blast_radius, loop_budget, status.md, or (once active) stale_after.
STATUS-SCHEMAwarningspecstatus.md is missing or duplicates a required section.
CORRECTIONS-MALFORMEDwarningspeca status.md ## Corrections entry doesn't carry the `<what> — <altitude> — <who caught it>` shape.
LOOP-BUDGET-INVALIDwarningspecloop_budget is present but not a positive integer (the autonomy grant).
JUDGEABLE-NO-SECTIONwarningspeca judgeable acceptance item names no spec section to judge against — not falsifiable.
CHECK-RUN-MALFORMEDwarningspecan acceptance item carries `— run:` but not a single backtick-fenced command. Absence of the suffix never fires.
SCOPE-EXCEEDS-SIZEwarningspecsize: small but measured size is over suggest_slicing_past — slice it, or declare size: large.
ACCEPTANCE-UNPARTITIONEDwarningspecan unattended spec has no `### agent-loopable` acceptance partition — the build loop has no labelled exit condition.
ARCHIVE-NO-ACCEPTANCEwarningrepoa shipped, archived spec carries no linked acceptance_results — graduation may have skipped its run.
STALE-QUARANTINEwarningspeca building/blocked spec is past stale_after — flagged for a human.
DECIDER-OVER-BUDGETwarningrepoa decider is over the focus_limit for building or active specs.
COUPLING-CEILINGwarningspecspec + transitively forced loads exceeds coupling_ceiling% of context_window — too entangled.

This table mirrors specline rules --format json — that command, not this page, is the authoritative machine-readable catalog. With unattended off, Part 3 is neither listed nor checked. A few canon checks that need git history (specline diff) or aren't built yet (relations-index --fix) are marked planned in the canon.