Record the Huginn half of Cut 8

The organ opens a mind fail-closed over CultCache's owned store, lands a
batch whole with a receipt naming its bytes, and admits through one
ordered path with every cross-document rule in it. Twenty mutations,
twenty killed, inside the build budget. One finding for Cut 10: the leaf
must derive serialisation on the document and refusal types before a
batch can cross a wire.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-16 17:21:09 +02:00
commit dfbc5700bc

View file

@ -1907,7 +1907,42 @@ per-sidecar body is one `try`/`catch` so no raw exception escapes; Soul's
XA-XK reproduced) and `aef0e1bf` (doc comments: no organ described as
existing; `decode` says it is a typed read, not validation). 27 tests, 0
warnings, lock and schemas unchanged. No separate Soul pass: the next Soul
on Huginn runs this harness. The Huginn half is in Hands in its own tree.
on Huginn runs this harness.
**The Huginn half of Cut 8 landed** on `eureka/memory-organ` at `946758f`
(store, mind, opener; 4 tests), `a4c5b79` (receipt and commit primitive; 4
tests), `0bd7133` (admission, refusal, the rule table; 26 tests, 0
warnings) and `ca30d3e` (entries H1-H20, all killed through Epiphany's
harness with `-Repo`, four targets, M0 green). `cargo check --workspace`
clean; one `cultcache-rs`, no `epiphany-core`; one inherited `syn`
duplicate the leaf's graph already carries. Target dir +656 paths, +0.39
GB, inside the budget. +3,491 lines over 11 files, +8 direct dependencies,
lock 3 → 93 packages, two Huginn document types, no binaries or targets.
Soul in flight.
Hands' discrepancies, all kept and recorded:
34. **The leaf's `PipelineRefusal` and `PipelineDocument` derive neither
`Serialize` nor `JsonSchema`**, so `MindRefusal::Document` mirrors the
refusal through a `#[serde(remote)]` definition compiled against the
leaf's shape (drift breaks the build), and `PipelineAdmissionBatch`
cannot derive either. **Cut 10's wire cannot serialise a batch until the
leaf derives them.** That is an additive leaf change and a Cut 10
prerequisite; recorded here so Cut 10's refresh carries it.
35. **`FindingWithoutRange` is unreachable**: a rangeless envelope fails the
leaf's decode first. Variant kept; the test asserts the real refusal.
36. **The epoch record is derived when the batch carries the `instance`
document**, not when the image is empty, so a replay of the first batch
is `AlreadyAdmitted` and not a collision.
37. **`Mind::open` recognises the owned store's lock failure by its error
text**, because the store gives no typed signal. One string match,
commented; Soul is asked whether any other store failure can be misread.
38. **`receipt.rs` is 277 lines against a 220 cap**, by its tests and the
two provenance shapes that live beside their only consumer.
39. **`prepare_entry_named` appears once outside `receipt.rs`**, in
`mind.rs` for the epoch record. The spec's grep is narrowed to that.
40. **`Cargo.lock` was already LF**, so the whole-file rewrite Cut 7's Soul
predicted did not happen; the lock gained 809 lines.
## Cut 7. Retire Huginn's TypeScript body