Specline canon 2.3.0-draft Handbook For agents ↗
Doctor · Rules

Rule catalog

Every check doctor can emit, from a single registry that the engine and specline rules share — so a finding can never carry a rule_id the catalog lacks, and the catalog can never drift from what fires.

Scoperepo findings fail everywhere; spec findings fail only when that spec is in --changed (quarantine), else warn. Downgradable — in author mode a downgradable rule that fires for a missing element becomes distance_to_ratifiable (info), not an error.

rule_idseverityscopetierdowngradablefires when
STRUCT-MISSING-SPECerrorspec1trueA specs/ folder has no spec.md.
STRUCT-MISSING-RELATIONSerrorspec1trueA specs/ folder has no relations.md.
FRONTMATTER-UNPARSEABLEerrorspec1falsespec.md frontmatter is missing or doesn't parse.
FRONTMATTER-ID-MISMATCHerrorspec1falsefrontmatter id or slug doesn't match the directory.
FRONTMATTER-MISSING-RATIFIEDerrorspec1falseratified/building spec lacks ratified_by or ratified_at (B3).
STATUS-SCHEMAerrorspec1falsestatus.md is missing or duplicates a required section.
ENUM-INVALIDerrorspec1falseblast_radius / target_model holds a value outside the allowed set.
UNKNOWN-FRONTMATTER-KEYwarningspec1falsean unrecognized frontmatter key — preserved, not failed (newer canon).
UNKNOWN-SECTIONwarningspec1falsean unrecognized body section — preserved, not failed.
RELATION-DANGLINGerrorrepo1falsea relations.md edge points to an id that exists nowhere.
RELATION-CROSS-REPOwarningrepo1falsea repo:NNNN-slug edge — validated weakly, warn only.
RELATION-KILLEDwarningrepo1falsean edge points to a killed id — warn only.
LINK-DANGLINGerrorrepo1falsea relative link under docs/ doesn't resolve.
KNOWLEDGE-HAS-STATUSerrorrepo1falseknowledge/ contains a lifecycle artifact (status.md, open-questions.md).
ARCHIVE-EDITEDerrorrepo1falsean archived spec is modified (adding one is graduation, allowed) — the audit trail is immutable.
ID-DUPLICATEerrorrepo1falsean id appears in more than one spec-bearing location.
ID-COUNTER-GAPerrorrepo1falsean id ≤ .id-counter is accounted for nowhere.
GOAL-MISSINGwarningspec1falsea spec has no `## Goal` — the build loop has no single falsifiable target.
ACCEPTANCE-NOT-RUNNABLEwarningspec1falseagent-loopable acceptance checks carry no runnable command — the loop must interpret prose.
LOOP-BUDGET-INVALIDwarningspec1falseloop_budget is present but not a positive integer (the autonomy grant).

This mirrors specline rules --format json, which is the authoritative, machine-readable catalog. Currently 20 rules at tier 1 (the canon 2.3 structural subset, plus loop-orientation nudges). Lifecycle/state rules are deferred to a later spec.