Speclinecanon 3.1.0HandbookFor agents ↗
Reference · Config

The specline.yml config

A repo's tunables — the numbers and names it calibrates to its own scale — live in specline.yml at the repo root, read deterministically by Specline. It is the source of truth for pins and thresholds. specline.yml tunes the grain, not the methodology: it does not configure rules, schema, or partitions. Absent → Specline falls back to canon defaults.

Configuration and frontmatter use YAML mappings. Known enum fields must be scalar strings; relations accept a string or a list, including annotated slug: rationale entries. Duplicate keys are invalid. Unknown fields, including nested values, are preserved for compatibility.

# specline.yml
canon: 3.1
unattended: false     # experimental — Part 3. default false
deciders: [jonathan]
deputy: null
staleness:            # the staleness windows (durations), per state — experimental
  building: 30 days   # frontmatter stale_after is computed from these
  blocked:  14 days
focus_limit:          # decider WIP — the decider-budget ceiling (per decider) — experimental
  building: 3
  active:   6
coupling_ceiling: 50%        # experimental — spec + forced loads, as % of context_window
context_window: 400000       # chars in the weakest in-use model's window (the coupling denominator)
suggest_slicing_past: 6      # acceptance/Behavior count above which Specline nudges to slice (while size: small) — experimental
review_rounds_before_human: 2  # outer-loop verifier↔implementer bounce budget — experimental
models:               # capability tier → real model
  light:    claude-haiku
  standard: claude-sonnet
  frontier: claude-opus
merge_target: main    # optional; where impl PRs merge and graduation lands; absent → repo default branch
KeyValuesWhat it tunes
canonMAJOR.MINORThe canon version this repo pins. This contract changes first; repo conventions follow. Compared to the tool's canon at MAJOR.MINOR — a patch bump never forces a pin update.
unattendedboolean (default false)The one switch for Part 3 (unattended builds) — experimental. Off: Part-3 rules aren't listed or checked, and its keys/states are recognised silently. On: the same tested contract, tagged experimental. upgrade maps a legacy tier: 2 to unattended: true and drops tier: 0 | 1.
deciderslist of namesThe named POs who may approve and accept.
deputya name | nullWho decides when a decider is unavailable. With no deputy, the agent applies the entry's stated default and parks blocked.
staleness.buildingduration (default 30 days)Experimental. The window before a building spec is presumed abandoned. stale_after is computed from this.
staleness.blockedduration (default 14 days)Experimental. The window before a blocked spec is presumed abandoned.
focus_limit.buildingint (default 3)Experimental. Max specs a decider may have in building at once.
focus_limit.activeint (default 6)Experimental. Max specs a decider may have in active states (building|blocked) at once.
coupling_ceiling% (default 50%)Experimental. spec.md + transitively forced loads, as a percentage of context_window. Specline warns on breach.
context_windowchars (default 400000)Chars in the weakest in-use model's window — the denominator for the coupling ceiling.
suggest_slicing_pastint (default 6)Experimental. Acceptance/Behavior count above which Specline nudges to slice, while size: small.
review_rounds_before_humanint (default 2)Experimental. The outer-loop verifier↔implementer bounce budget before the human gate.
modelstier → model mapBinds each capability tier (light/standard/frontier) to a real model, so specs stay agent-agnostic.
merge_targetbranch nameOptional. The branch impl PRs merge into and graduation lands on. Repo-level on purpose — a spec doesn't choose its integration branch. Absent → the repo's default branch.
▸

Per-repo, set once. specline.yml is the repo's calibration — the thresholds and pins every spec is measured against. Contrast it with frontmatter, which is per-spec and set at the decider's go. Tune the numbers here; the rules are the canon's.