Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

FAQ — the questions a cold read asks

These are the questions three independent cold reads of this project (two external AI models in 2026-10, plus a third whose export is still pending) actually asked while onboarding. Every answer either states an editorial judgment or links to the authoritative page — answers never restate machine-generated truth (spk explain topics, lint-rule semantics, corpus-derived views), because a hand-copied restatement becomes an unconsulted claim the first time the format revises.

For the design-oriented questions (“why do the layers impose these constraints at all?”), see specs as the design substrate. For “which command when?”, see the decision guide.

Basics

What is specodelic in one sentence?

A specification format and CLI toolchain for AI agents: specs are plain markdown with a closed four-layer schema, checked by a linter that never reads your prose. The introduction and the glossary expand every term in that sentence.

Is this a documentation format or a testing tool?

Neither, exactly — it is a format with a checking pipeline. The structured tables are linted, compiled, model-checked, and verified; the prose stays free for humans. What a green check attests — and what it does not — is the subject of verification boundaries.

Should I use this for my hand-maintained codebase?

Probably not. The format presumes spec-first, agent-authored, regenerable code — its value comes from something mechanical consuming the structured rows (compiled properties, the TLA+ model, the contract gate). Under hand-maintained code the coverage/anchoring discipline is pure tax: every third-party evaluation of the format reached this verdict independently. The positioning section of USAGE.md states the assumption, the honest one-line test (“will anything mechanical consume the structured rows?”), and the cases where an ordinary design doc wins.

Why can’t I write prose and have the linter check it?

Deliberately not. The linter never parses prose, so prose is free to argue, motivate, and explain. Anything the toolchain reasons about must live in a structured row — a prose-only invariant stays explicitly unchecked and is never counted as verified (verification boundaries, rung 4), and spk conform reports prose-covered traces as unknown rather than silently passing them (conform).

Why is the schema closed? Why can’t I add a fifth table?

A closed schema is what makes every other guarantee stateable: row kinds are closed sets, every [[wiki-link]] is typed, and format evolution is additive-only through numbered revisions — the theory behind this is in theory.md, the mechanism in specodelic.md. Domain-specific structure goes through domain packs, which extend the format without a format revision.

Checks and guarantees

What does a green check actually mean?

It depends on which rung of the guarantee ladder you are standing on: lint-clean, well-modeled, checked-within-bounds, matches-oracle, better-design. Each rung presupposes the ones below it, and each is honest about what it does not assure.

Is my spec “done”?

A file’s honest status is the highest rung it has evidence for, never a single undifferentiated PASS. Lint-clean means format-valid; verified means the compiled property blocks executed and every opted-in invariant claim checked — and still not application correctness. Walk the ladder in verification boundaries.

model-check returned a counterexample — is the tool broken?

Usually the opposite: a refuted claim names the violated invariant, and the counterexample is often the design lesson rather than a tool failure. The worked example records the precedent — the checker found a two-step trace to a state the author swore was unreachable, and the over-claiming row turned out to be the bug.

What can the checkers NOT find?

Known limitations are stated up front, each backed by a runnable command — for example, coverage cannot detect a missing constraint. See verification boundaries — known limitations.

Workflows

Which command should I run when?

The decision guide routes “what do I have, what do I want” to the right verb — including the honest maturity notes on advisory verbs like spk refactor.

I have an existing system or oracle but no specodelic implementation — how do I check specs against it?

spk conform is the one verb that brings evidence from outside the spec: it classifies traces recorded from a legacy system, a curated case set, or a reference implementation against what the spec declares. The verdict taxonomy (permitted / forbidden / underspecified / unknown / unsupported) and the open- vs closed-world choice are in conform.

How do I get large numbers of scenarios out of a spec?

Two complementary verbs: spk model-check explores the compiled model’s reachable state space within a bound (model_check), and spk verify executes the compiled property blocks whose generators produce concrete cases (verify). For scenarios coming from outside the spec, use conform instead.

Can one spec be implemented in different languages or paradigms?

The layers are implementation-neutral by construction — the pattern of “several interchangeable implementations of one contract” is documented in USAGE.md §2.3. One honesty note: **rust:** predicate fragments are compiled and executed natively by model-check/verify; **py:** and **ts:** fragments are illustrative and are not executable (known limitations).

Format mechanics

A lint finding says linter.<something> — what does it mean?

Every finding carries its own rule id and one-line semantics string. spk explain lint-rules prints the catalog from the same table the linter emits from, and each rule has a page under Lint Rules in this book — start at the linter overview.

How do I safely rename an id, or merge two diverged branches?

spk rename rewrites the defining row, every referencing [[link]], and checklist mapped_ids as one in-memory-verified transaction (rename); spk merge --branch checks id collisions, dangling renames, and intersecting blast radii before you join the trees (merge).

Where are the docs agents read without repo access?

spk explain serves the distilled format guide from inside the binary — nine topics (format, ears, kinds, references, lifecycle, lint-rules, dual-format, packs, graph-views) — and llms.txt at the site root is the machine summary (For agents).

Ecosystem

How does specodelic relate to OpenSpec?

OpenSpec changes are the engineering-truth workflow; specodelic specs share the same grammar via the dual-format protocol, and ah/ espectacular enforces spec↔test correspondence read-only. The full division of ownership is in tool relationships.

Can I extend the format for my domain?

Through a domain pack: a kind: profile manifest declaring typed sections, fiber kinds, and reference fields — discovered by corpus scan, no config file. The using packs guide walks the whole loop. Six packs ship in-repo — five standard packs (data.lineage, numeric.predicates, empirical.registry, quant.finance, svc.contracts — the last still draft) plus the first cross-pack ## Requires pilot (bioimage.data).