Rule catalog
Every check Specline can emit, in one place. The engine and specline rules
read from the same registry, so a finding can never carry a rule_id the
catalog lacks — and the catalog can never drift from what actually fires.
Severity is the line (canon 2.7). error means
integrity — 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.
Scope — repo findings consider the whole tree;
spec integrity errors quarantine to --changed.
| rule_id | severity | scope | tier | fires when |
|---|---|---|---|---|
STRUCT-MISSING-SPEC | error | spec | 1 | a specs/ folder has no spec.md — the constitutive file; the folder is not a spec without it. |
FRONTMATTER-UNPARSEABLE | error | spec | 1 | spec.md frontmatter is missing or doesn't parse. |
FRONTMATTER-SLUG-MISMATCH | error | spec | 1 | frontmatter slug doesn't match the directory. |
ENUM-INVALID | error | spec | 1 | blast_radius / target_model holds a value outside the allowed set. |
RELATION-DANGLING | error | repo | 1 | a relations.md edge points to a slug that exists nowhere. |
LINK-DANGLING | error | repo | 1 | a relative link under docs/ doesn't resolve. |
SLUG-DUPLICATE | error | repo | 1 | a slug appears in more than one of specs/, knowledge/, or archive/ — each slug is a unique identity. |
KNOWLEDGE-HAS-STATUS | error | repo | 1 | knowledge/ contains a lifecycle artifact (status.md, open-questions.md). |
ARCHIVE-EDITED | error | repo | 1 | an archived spec is modified (adding one is graduation, allowed) — the audit trail is immutable. |
STRUCT-MISSING-RELATIONS | warning | spec | 1 | a specs/ folder has no relations.md — an auxiliary file. |
STATUS-SCHEMA | warning | spec | 1 | status.md is missing or duplicates a required section. |
UNKNOWN-FRONTMATTER-KEY | warning | spec | 1 | an unrecognized frontmatter key — preserved, not failed (newer canon). |
UNKNOWN-SECTION | warning | spec | 1 | an unrecognized body section — preserved, not failed. |
RELATION-CROSS-REPO | warning | repo | 1 | a repo:slug edge — validated weakly, warn only. |
RELATION-KILLED | warning | repo | 1 | an edge points to a killed slug — warn only. |
GOAL-MISSING | warning | spec | 1 | a spec has no `## Goal` — the build loop has no single falsifiable target. |
LOOP-BUDGET-INVALID | warning | spec | 1 | loop_budget is present but not a positive integer (the autonomy grant). |
JUDGEABLE-NO-SECTION | warning | spec | 1 | a judgeable acceptance check names no spec section to judge against (B5). |
CHECK-RUN-MALFORMED | warning | spec | 1 | an agent-loopable item carries `— run:` but not a single backtick-fenced command (v2.8). Absence of the suffix never fires. |
SCOPE-EXCEEDS-SIZE | warning | spec | 1 | size: small but measured size is over suggest_slicing_past — slice it, or declare size: large. |
PARENT-HAS-MECHANICS | warning | spec | 1 | a type: parent carries Behavior or acceptance — a parent is a map, not a plan. |
PARENT-NO-SCOPES | warning | spec | 1 | a type: parent lists no child scopes — a misfiled scope. |
CORRECTIONS-MALFORMED | warning | spec | 1 | a status.md ## Corrections entry doesn't carry the `<what> — <altitude> — <who caught it>` shape. |
CANON-PIN-MISMATCH | warning | repo | 1 | the repo's pinned canon (specline.yml / doc-architecture.md) differs from the tool's served canon. |
RATIFIED-NO-BLAST-RADIUS | warning | spec | 1 | a building spec has no blast_radius — build-readiness advice; the risk judgment that routes effort. |
RATIFIED-ACCEPTANCE-UNPARTITIONED | warning | spec | 1 | a building spec has no agent-loopable acceptance set — the loop has no mechanical exit. |
ARCHIVE-NO-ACCEPTANCE | warning | repo | 1 | a shipped, archived spec carries no linked acceptance_results — graduation may have skipped its run. |
OPEN-QUESTION-INCOMPLETE | warning | spec | 1 | an open question is missing a decider or default. |
OPEN-QUESTION-OVERDUE | warning | spec | 1 | a building/blocked spec has an open question past its deadline. |
STALE-QUARANTINE | warning | spec | 2 | a building/blocked spec is past stale_after — flagged for a human (B4). |
DECIDER-OVER-BUDGET | warning | repo | 2 | a decider is over the focus_limit for building or active specs (B7). |
COUPLING-CEILING | warning | spec | 2 | spec + transitively forced loads exceeds coupling_ceiling% of context_window — too entangled (B2). |
This table mirrors specline rules --format json — that command, not this page, is the authoritative machine-readable catalog. Only the nine integrity rules block; everything else is advice the decider weighs. A few canon checks that need git history (specline diff) or aren't built yet (relations-index --fix) are marked planned in the canon.