All notable changes to this project are documented here. The format follows Keep a Changelog and the project adheres to Semantic Versioning.
0.3.0a0 — 2026-05-09
- Posture state machine.
transition(current, target)enforces an explicit transition table (INTERACTIVEis the hub;LOCKEDonly unlocks toINTERACTIVE; identity transitions are always allowed).evaluate(posture, definition, decision)is a pure function that maps a classified call under a posture to aDisposition. Dispositionclosed enum. Members:ALLOW,DENY,ESCALATE.ESCALATEis only returned underINTERACTIVE;AUTONOMOUSfails closed (denies) on any tool flaggedrequire_confirmation=True.Receiptdataclass (frozen, slotted, kw-only). Carries the tool, arguments, canonical effects, dominant effect, rationale, posture, disposition, and the echoedrequire_confirmationflag. Three methods make it content-addressable:to_canonical_dict(),to_canonical_json()(sort_keys, ensure_ascii=False, compact separators), andcontent_hash()(SHA-256 of the canonical JSON). Same input → same hash, byte-stable across runs and platforms.- PreToolUse hook adapter (
spine_lite.hook).run_hook(manifest, payload, *, posture)is the testable core: acceptsstrorbytespayloads, returns(Receipt, exit_code).main(manifest, *, stdin, stdout, stderr, posture)is the I/O wrapper: reads stdin, writes the receipt's canonical JSON to stdout (or a structured error JSON on failure), returns the exit code per the documented contract (0/1/2/64/65). - Full CLI surface.
validate-manifest,classify, andhooksubcommands ship alongside the existingversion.Annotated-style typer params throughout. Console-script invocation viapython -m spine_lite.cliis the supported entry for Claude Code's PreToolUse hook. - Integration and E2E tests. Typer's
CliRunnerexercises every subcommand × posture × disposition combination; subprocess-based E2E tests runpython -m spine_lite.cliagainst the authored fixtures, the closest equivalent in the build sandbox to the blueprint's "fresh-venv install + Claude Code wiring" smoke. Receipt,Disposition,transition,evaluateadded tospine_lite.__all__.attr_listmkdocs extension enabled — required by the badge buttons on the docs landing page.
mypyper-file ignore:src/spine_lite/cli.pyignoresTC003because typer introspectsPathannotations at runtime to do path validation.tests/**ignoresS603(subprocess calls constructed in-process from fixtures, not user input).
0.2.0a0 — 2026-05-08
Postureclosed enum (spine_lite.posture) with membersINTERACTIVE,AUTONOMOUS,DRY_RUN,LOCKED.Postureadded tospine_lite.__all__. Phase 3 will add the transition functions; Phase 2 ships only the enum so the manifest schema can validate posture constraints against a closed set.- Pydantic v2 manifest schema (
spine_lite.manifest) withToolDefinitionandManifest(frozen,extra="forbid"). Effects and postures are canonicalised on construction (deduplicated and sorted by enum-declaration order) so JSON round-trip is byte-stable across runs and platforms.parse_manifest()accepts dicts, JSON strings, and JSON bytes, wrappingpydantic.ValidationErrorasManifestErrorwith the original error attached as__cause__.Manifest,ToolDefinition, andparse_manifestadded to__all__. - Classifier (
spine_lite.classifier) withToolCall,Decision, andclassify(tool_call, manifest) -> Decision. Pure function, deterministic, no I/O.Decisioncarries a canonical effects tuple, the dominant effect underPRECEDENCE, and a byte-stable rationale string.ToolCall,Decision, andclassifyadded to__all__. - Authored test fixtures in
tests/fixtures/:manifest_minimal.json,manifest_basic.json,manifest_full.json,decisions_basic.json. Parametrized parity tests confirm round-trip JSON byte-stability per fixture and decision parity per case. - Hypothesis property tests for the classifier — 1,000 examples each across determinism, dominance, manifest-fidelity, byte-stable rationale, manifest round-trip stability, and argument independence.
SECURITY.mdwith vulnerability-reporting process, supported-version policy, and the runtime trust model.- Documentation site restructured into Diátaxis quadrants (Tutorial / How-To / Reference / Explanation) plus a History section. New pages: getting-started, concepts/{overview,effects-taxonomy,posture-and-hooks}, how-to/{use-the-api,wire-claude-code,contribute,release}, reference/{cli,exceptions,glossary}, explanation/{invariants,faq}, history/phase-1.
- Iron-clad README with status grid, repository layout, and links into the docs site.
- Mission reframed.
MacFall7/M87-Spine-liteis now documented as a sibling project rather than a parity target. The blueprint's stale "TS reference" framing is dropped fromCLAUDE.md,README.md,docs/index.md,docs/explanation/architecture.md,docs/explanation/porting-notes.md, and seven other doc pages. The §9 halt and operator resolution that produced this change are recorded verbatim inRECEIPTS.mdas the Phase 2 Day 1 opening entry. docs/architecture.md,docs/design-rationale.md,docs/porting-notes.md,docs/integration-claude-code.md, anddocs/api.mdmoved underdocs/explanation/,docs/how-to/, anddocs/reference/.CONTRIBUTING.mdreduced to a quick-start that points at the long form in the docs site.mypyconfig:disallow_untyped_decorators = falsefortests.*so hypothesis decorators don't require local# type: ignorecarve-outs. Runtime modules stay strict; zeroAnycarve-outs insrc/.
0.1.0a0 — 2026-05-08
- Closed six-class effects taxonomy:
READ,WRITE,NETWORK,EXECUTE,SPAWN,DESTRUCTIVE. Canonical precedence ordering andmost_restrictive()collapse function. - Public exception hierarchy rooted at
SpineLiteErrorwithManifestError,ClassificationError,PostureError, andHookErrorsubclasses. - Scaffolds for
classifier,manifest,posture,receipt, andhookmodules — implementations land in Phases 2 and 3. spine-liteconsole script with aversionsubcommand.- CI matrix across Python 3.11/3.12/3.13 on Linux, macOS, and Windows.
- MkDocs documentation with
mkdocstrings, deployable to GitHub Pages. - Repo governance file (
CLAUDE.md) and build-progress receipt log (RECEIPTS.md).