You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+11-1Lines changed: 11 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,16 +4,25 @@ All notable changes to this project are documented here. The format follows [Kee
4
4
5
5
## [Unreleased]
6
6
7
+
## [0.2.0a0] — 2026-05-08
8
+
7
9
### Added
8
10
11
+
-**`Posture` closed enum** (`spine_lite.posture`) with members `INTERACTIVE`, `AUTONOMOUS`, `DRY_RUN`, `LOCKED`. `Posture` added to `spine_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.
12
+
-**Pydantic v2 manifest schema** (`spine_lite.manifest`) with `ToolDefinition` and `Manifest` (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, wrapping `pydantic.ValidationError` as `ManifestError` with the original error attached as `__cause__`. `Manifest`, `ToolDefinition`, and `parse_manifest` added to `__all__`.
13
+
-**Classifier** (`spine_lite.classifier`) with `ToolCall`, `Decision`, and `classify(tool_call, manifest) -> Decision`. Pure function, deterministic, no I/O. `Decision` carries a canonical effects tuple, the dominant effect under `PRECEDENCE`, and a byte-stable rationale string. `ToolCall`, `Decision`, and `classify` added to `__all__`.
14
+
-**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.
15
+
-**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.
9
16
-`SECURITY.md` with vulnerability-reporting process, supported-version policy, and the runtime trust model.
10
17
- 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.
11
18
- Iron-clad README with status grid, repository layout, and links into the docs site.
12
19
13
20
### Changed
14
21
22
+
-**Mission reframed.**`MacFall7/M87-Spine-lite` is now documented as a **sibling project** rather than a parity target. The blueprint's stale "TS reference" framing is dropped from `CLAUDE.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 in `RECEIPTS.md` as the Phase 2 Day 1 opening entry.
15
23
-`docs/architecture.md`, `docs/design-rationale.md`, `docs/porting-notes.md`, `docs/integration-claude-code.md`, and `docs/api.md` moved under `docs/explanation/`, `docs/how-to/`, and `docs/reference/`.
16
24
-`CONTRIBUTING.md` reduced to a quick-start that points at the long form in the docs site.
25
+
-`mypy` config: `disallow_untyped_decorators = false` for `tests.*` so hypothesis decorators don't require local `# type: ignore` carve-outs. Runtime modules stay strict; zero `Any` carve-outs in `src/`.
17
26
18
27
## [0.1.0a0] — 2026-05-08
19
28
@@ -27,5 +36,6 @@ All notable changes to this project are documented here. The format follows [Kee
27
36
- MkDocs documentation with `mkdocstrings`, deployable to GitHub Pages.
28
37
- Repo governance file (`CLAUDE.md`) and build-progress receipt log (`RECEIPTS.md`).
Copy file name to clipboardExpand all lines: CLAUDE.md
+4-5Lines changed: 4 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ Operating manual for Claude Code sessions in this repo.
4
4
5
5
## Mission
6
6
7
-
Python port of M87-Spine-lite (TypeScript). Deterministic policy and effects runtime for LLM tool calls. Public API and observable semantics must mirror the TypeScript reference within the closed six-class taxonomy.
7
+
Deterministic policy and effects runtime for LLM tool calls. Public API and observable semantics are defined by the architectural invariants below; the sibling project at [MacFall7/M87-Spine-lite](https://github.com/MacFall7/M87-Spine-lite) is informational and not a parity target. See `docs/explanation/porting-notes.md` for the relationship.
8
8
9
9
## Authority
10
10
@@ -19,7 +19,6 @@ Mac decides — halt and ask:
19
19
- Anything in `src/spine_lite/__init__.py`'s `__all__`.
20
20
- New dependencies beyond `pyproject.toml`.
21
21
- Phase boundary transitions (1→2, 2→3).
22
-
- Semantic divergence from the TypeScript reference.
Copy file name to clipboardExpand all lines: README.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@
7
7
8
8
Deterministic policy and effects runtime for LLM tool calls.
9
9
10
-
A Python port of [M87-Spine-lite](https://github.com/MacFall7/M87-Spine-lite). Same closed effects taxonomy, same precedence rules, same posture state machine — typed, tested, packaged.
10
+
Six-class effects taxonomy on state × boundary × reversibility axes. Ordinal precedence. Content-addressable receipts. Wires into Claude Code as a PreToolUse hook (Phase 3); usable anywhere you can shell out to a subprocess. Sibling project to [M87-Spine-lite](https://github.com/MacFall7/M87-Spine-lite) — see [Porting Notes](docs/explanation/porting-notes.md) for the relationship.
11
11
12
12
## What it does
13
13
@@ -20,8 +20,8 @@ The runtime is offline by design — no clocks, no randomness, no network, no LL
See [`RECEIPTS.md`](RECEIPTS.md) for build progress and [docs/history/phase-1.md](https://macfall7.github.io/spine-lite-python/history/phase-1/) for the Phase 1 narrative.
- None. Phase 2 (manifest + classifier, ~5 working days, target `v0.2.0a0`) is gated on operator go per `CLAUDE.md`.
113
113
114
114
**Next:** Halt for Mac at the Phase 1 → Phase 2 transition. Per blueprint §11, completion of Phase 1 unblocks the Braintrust application thread on the operator's side.
115
+
116
+
---
117
+
118
+
### Phase 2 Day 1 Opening — 2026-05-08
119
+
120
+
Phase 2 opened with a §9 halt. The halt and the operator's resolution are recorded here verbatim for the run-registry trail.
121
+
122
+
**§9 HALT (verbatim):**
123
+
124
+
```
125
+
HALT: Reference repo's spec diverges from Phase 1's invariants in ways that make
126
+
a straight parity port mechanically impossible.
127
+
128
+
Context:
129
+
- The blueprint and CLAUDE.md describe a "TS reference" at MacFall7/M87-Spine-lite.
130
+
- WebFetch confirms the repo exists and is public, but it's implemented in Python
131
+
(hooks/guard.py, hooks/governor.py), not TypeScript. The "TS reference" framing
132
+
in the blueprint is stale.
133
+
- Bigger issue: the reference's six-class taxonomy is *categorically different*
5-step pipeline) was reviewed and explicitly not adopted
217
+
218
+
Coverage 100% on manifest.py, classifier.py, posture.py (enum scope only).
219
+
Six-commit Conventional Commits shape preserved (the blueprint correction is
220
+
commit 1, then 5 functional commits).
221
+
222
+
Begin from blueprint correction commit. Halt at exit gate.
223
+
```
224
+
225
+
**What landed in commit 1 of Phase 2:**
226
+
227
+
-`CLAUDE.md` mission rewritten to drop "TS reference" framing; sibling project recorded as informational, not a parity target.
228
+
-`docs/explanation/porting-notes.md` reframed from "translation log" to "design history" with a Sibling Project section, a Phase 2 opening entry recording this halt and resolution, and a Phase 1 entry pinning the taxonomy as `spine-lite-python`'s spec.
229
+
-`docs/concepts/posture-and-hooks.md` updated to remove the "subject to refinement" caveat from the posture table and pin the four members (`INTERACTIVE`, `AUTONOMOUS`, `DRY_RUN`, `LOCKED`) with their string values.
230
+
-`docs/explanation/architecture.md` reference-implementation paragraph rewritten as a sibling-project note.
231
+
-`docs/explanation/faq.md` "Why Python after TypeScript?" question replaced with "How does this relate to M87-Spine-lite?", plus three other in-place corrections.
232
+
-`docs/concepts/effects-taxonomy.md`, `docs/concepts/overview.md`, `docs/how-to/contribute.md`, `docs/how-to/use-the-api.md`, `docs/reference/glossary.md`: surgical edits to drop TS-reference framing.
233
+
-`README.md` and `docs/index.md` headlines reworded: `spine-lite-python` is described directly, sibling project credited but not framed as a port target.
**Repo:** spine-lite-python branch `claude/setup-project-structure-3YeiT`, six commits ahead of `main`. Target tag: `v0.2.0a0`.
243
+
**Duration:**~2 hours (continuation of the same Claude Code Web session).
244
+
245
+
**Tasks completed:**
246
+
247
+
-**Blueprint correction (`111f34c`).**`MacFall7/M87-Spine-lite` reframed as a sibling project, not a parity target. CLAUDE.md mission rewritten; porting-notes.md restructured from "translation log" to "design history" with a Phase 2 opening entry recording the §9 halt and operator resolution; surgical edits across nine doc pages drop the stale TS-reference framing.
248
+
-**Posture enum (`600d870`).** Closed StrEnum with four members pinned by `docs/concepts/posture-and-hooks.md`: `INTERACTIVE`, `AUTONOMOUS`, `DRY_RUN`, `LOCKED`. Added to `__all__`. Phase 3 will add the transition functions; the enum lands now so the manifest schema can validate posture constraints against a closed set.
249
+
-**Manifest schema (`9ed313d`).** Pydantic v2 models `ToolDefinition` and `Manifest` (frozen, `extra="forbid"`). Effects and postures canonicalised on construction (deduplicated and sorted by enum-declaration order) for byte-stable JSON round-trip. `parse_manifest()` accepts dicts, JSON strings, or JSON bytes; wraps `ValidationError` as `ManifestError` with the original attached as `__cause__`. Tests cover canonicalisation, frozen-model immutability, schema rejection, and round-trip stability.
250
+
-**Classifier (`67470ff`).**`classify(tool_call, manifest) -> Decision` is a pure function. `ToolCall` and `Decision` are frozen + slotted + kw-only dataclasses. `Decision` carries the canonical effects tuple, the dominant effect under `PRECEDENCE`, and a byte-stable rationale string. Tool-not-declared raises `ManifestError`. Phase 2 doesn't refine on the tool call's arguments — manifest is the spec.
251
+
-**Fixtures + parity + hypothesis (`ef32a5f`).** Four authored fixtures in `tests/fixtures/`: `manifest_minimal.json`, `manifest_basic.json`, `manifest_full.json`, `decisions_basic.json`. Parametrized tests confirm every fixture loads and round-trips JSON byte-stably. Decision parity test walks each case in `decisions_basic.json` against `manifest_basic.json`. Hypothesis property tests at 1,000 examples each cover determinism, dominance, manifest fidelity, byte-stable rationale, manifest round-trip stability, and argument independence.
252
+
-**Release (this commit).**`pyproject.toml` and `__init__.py` bumped to `0.2.0a0`. CHANGELOG `[0.2.0a0]` section added. README status grid updated. Phase 2 history page added. mkdocs nav extended.
| 8 | CI green on all 9 matrix cells | (pending push verification) |
276
+
| 9 | CHANGELOG entry for `v0.2.0a0`| ✓ |
277
+
| 10 | All commits in Conventional Commits format | ✓ |
278
+
| 11 | This receipt | ✓ |
279
+
280
+
10 of 11 verifiable in sandbox; CI verification on push remains operator-side per the established workflow.
281
+
282
+
**Open items / halts:**
283
+
284
+
- None. Phase 3 (posture transitions, receipt, hook, full CLI; target `v0.3.0a0`) is gated on operator go.
285
+
- The PyPI publish that the blueprint marks for end of Phase 3 remains an explicit operator decision; no auto-publish.
286
+
287
+
**Next:** Halt for Mac at the Phase 2 → Phase 3 transition. Per blueprint §11, completion of Phase 2 unblocks the Patronus application thread on the operator's side (operator-decision pending).
0 commit comments