Map: surface leak owned by the loop's context builder and the scorer, not door text rules (ruling leak-owned-by-flow-and-scorer, spec cut-packet-store.r3)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Eureka 2026-10-29 12:20:54 +01:00
commit 548ddac8bd

View file

@ -12,14 +12,15 @@ The interlingua spec has two layers. The **schema** is Rust types: packet
families, node ids, role slots, value kinds. It changes rarely and by commit.
The **inventory** is data in CultCache: the concepts, frames, roles, relation
types, speech acts and nuance features (hedge, certainty, warmth, irony and
whatever the loop finds missing) that the schema's slots name by id. Every
open slot in a packet is an inventory id, never free text, so a packet carries
no target-language wording (`no-surface-leak`). The golf loop improves the spec
whatever the loop finds missing) that the schema's slots name by id. Every open slot in a packet is an inventory id; a packet's only free text is
form-bounded referent names and the trace. No door judges text for leakage:
what each model call may see, and what a score may count, own that
(`weksa-lowering:ruling:leak-owned-by-flow-and-scorer`). The golf loop improves the spec
mostly by growing and refining the inventory, which is fast; schema changes are
the slow path. Concepts are open-class and grow forever; the other families are
closed-class, and convergence is measured on them
(`weksa-lowering:ruling:convergence-test`). This split is
`weksa-lowering:ruling:spec-is-schema-plus-inventory`.
(`weksa-lowering:ruling:convergence-test`). This split was
`spec-is-schema-plus-inventory`, now carried by `leak-owned-by-flow-and-scorer`.
## Model page
@ -28,9 +29,9 @@ means no store holds it and nothing writes it.
| Kind | What names it | Lifecycle | Who decides |
|---|---|---|---|
| Packet | Key `packet:<16 hex>`, an opaque digest of item, inventory revision and encoder (the item key lives in `provenance.corpus_item`, which the lowerer never sees); CultCache type `weksa.interlingua_packet`, carrying `schema_version` and `inventory_rev`. Every id inside is an opaque form type (`n<k>` nodes, `encoder:<16 hex>`, canonical `<family>:<n>`) | Minted by an encoder for one corpus item under one spec version; immutable; a new spec version means a new packet, never an edit. Admitted only through `PacketStore::admit`, which validates against the inventory store at the packet's revision and checks names against the item | The encoder writes; the form types refuse malformed ids at construction and load, the validator refuses broken references (`typed-packet`); nothing else writes packets |
| Packet | Key `packet:<16 hex>`, an opaque digest of item, inventory revision and encoder (the item key lives in `provenance.corpus_item`, which the lowerer never sees); CultCache type `weksa.interlingua_packet`, carrying `schema_version` and `inventory_rev`. Every id inside is an opaque form type (`n<k>` nodes, `encoder:<16 hex>`, canonical `<family>:<n>`) | Minted by an encoder for one corpus item under one spec version; immutable; a new spec version means a new packet, never an edit. Admitted only through `PacketStore::admit`, which validates against the inventory store at the packet's revision | The encoder writes; the form types refuse malformed ids at construction and load, the validator refuses broken references and over-capacity packets: a feature at most once per slot, at most 64 nodes (`typed-packet`); nothing else writes packets |
| Schema version | `weksa.interlingua_packet.v<N>` constant in `crates/weksa`; published JSON Schema at `schemas/cultnet/` | Bumped by a commit that changes the Rust types; the published schema is regenerated in the same commit and a test fails on drift | A cut (Hands, under a spec); never the loop |
| Inventory entry | Key `<family>:<n>`, `n` canonical decimal >= 1 (families: concept, frame, role, relation, speech_act, feature, referent_kind, extension); type `weksa.inventory_entry`, with a bounded gloss, value kind (option labels bounded), `introduced_rev`, optional `retired_rev`, and `minted_for` (the Train item it was minted for, none for the seed) | Added or retired by an inventory revision; never edited in place (a changed meaning is a retire plus an add); a retired id still resolves for packets of earlier revisions | The loop's accepted rounds; Self on merge to main. Admission refuses a gloss or option label that shares a word 3-gram with its `minted_for` item, and an entry minted for a held-out item |
| Inventory entry | Key `<family>:<n>`, `n` canonical decimal >= 1 (families: concept, frame, role, relation, speech_act, feature, referent_kind, extension); type `weksa.inventory_entry`, with a bounded gloss, value kind (option labels bounded), `introduced_rev` and optional `retired_rev` | Added or retired by an inventory revision; never edited in place (a changed meaning is a retire plus an add); a retired id still resolves for packets of earlier revisions | The loop's accepted rounds, whose minting call the context builder assembles from Train items only; Self on merge to main. Admission checks form, not text |
| Inventory revision | Key `rev:<n>`, type `weksa.inventory_revision`, with parent, change list and `frozen` | Appended per accepted round; exactly one revision is ever marked frozen, by the convergence test | The loop's accept rule appends; the convergence test freezes; Self records the freeze as a ruling |
| Target profile | Locale or language-project id (`en-US`, `ja-JP`, a conlang's slug) plus a revision | Authored, revised by commit or by an accepted round that changed the lowering; each lowering names the revision it used | Profile authors and accepted rounds (`profile-owns-register`); never the lowerer's defaults |
| Corpus item | Key `item:<source-slug>:<n>`; type `weksa.corpus_item` with text, language, speaker, split group, prior turns, source | Admitted once; the text is immutable (a correction is a new item that `supersedes` the old); withdrawn, never deleted, so old scores stay explainable | Importers and `weksa corpus add`, under `corpus-cast-plus-public-domain`; the source enum has no variant for Discord or any training-forbidden source (`corpus-clean`) |
@ -74,11 +75,16 @@ means no store holds it and nothing writes it.
lexicon adherence for a conlang: the share of tokens that parse against its
lexicon and morphology.
- A style axis follows as its own cut, behind the same scorer port.
- Leak check: an inventory entry minted in a round is refused at admission if
its gloss or an option label shares a word 3-gram with the corpus item it was
minted for. A packet's ids are opaque form types; its free text is bounded
proper names (checked against the item by case) and the trace, which the
lowerer never sees (cut-packet-store.r2, after Soul s1 found five slots).
- Leak (`leak-owned-by-flow-and-scorer`): two owners, no door. The loop's
context builder gives inventory-minting calls Train items only, the encoder
emits only a packet, and prompts are fixed within a run. The scorer masks
every token of the packet's referent names from reference and output before
chrF and cosine, and reports, beside the scores and not as gates, chrF of
minted glosses and labels against Validation and Test and the share the mask
removed. Rejected path: text rules at the inventory and packet doors
(per-entry 3-gram, name case). Soul s2 beat them with chunked glosses,
hyphenated or caseless names and an undeclared `minted_for`, and a door
cannot know what a writer saw.
## Where things live and run (`rust-single-crate`, `loop-runs-on-yggdrasil`)
@ -110,11 +116,11 @@ the training set is the whole corpus re-encoded under the frozen revision.
One line per cut; only the first two have specs.
1. `park-node-body`: park the Node daemon, MiMo command, RUDP shims, launchers and the Discord-sourced Metame harness at tag `parked/weksa-node-body`; README front door tells the truth. Waits on nothing. (spec)
2. `packet-store`: Rust crate with packet, inventory and corpus types, the validator, the derived split, the stores and the `weksa` CLI; the standard reconciled to the types. Waits on nothing; sibling of 1. (spec r2: the s1 fix pass)
2. `packet-store`: Rust crate with packet, inventory and corpus types, the validator, the derived split, the stores and the `weksa` CLI; the standard reconciled to the types. Waits on nothing; sibling of 1. (spec r3: the s2 fix pass, deleting the door's leak rules and adding capacity rules V11, V12)
2b. `packet-store-corpus`: corpus labels tell the truth. `Source::ModelWritten { family: ModelFamily, generator: Option<String>, prompt_digest: Option<String> }`, `ModelFamily` an enum of vendor families (Anthropic, OpenAi, Google, Alibaba, Meta, Mistral, Unrecorded) so the scorer can refuse a model-backed metric of the item's own family (Unrecorded matches every family); `item:nibu:1` ModelWritten (Unrecorded) until the operator attests it; `item:brokkr:1` and its fixture carry the true generator `codex-local-source-aware-draft`, family OpenAi; corpus.cc reseeded; the codex/openai negative grep narrowed to code. Waits on 2 and a Self ruling recording the label decision.
3. `scorer`: chrF, meaning cosine behind an `Embedder` port (Ollama on Yggdrasil), the leak check wired, `weksa score`. Waits on 2.
3. `scorer`: chrF, meaning cosine behind an `Embedder` port (Ollama on Yggdrasil), the name mask and leak diagnostics (follow-up `scorer-name-mask-and-leak-diagnostics`), `weksa score`. Waits on 2.
4. `pd-importer`: public-domain play and fiction dialogue into the corpus with speaker, scene group and edition provenance. Waits on 2 and follow-up `gutenberg-terms`.
5. `golf-loop-en`: the loop driver, `ModelPort` with the `claude -p` adapter, encoder and lowerer prompts, round records, the accept rule, the detached unit on Yggdrasil. Waits on 3, 4 and follow-up `claude-on-yggdrasil`.
5. `golf-loop-en`: the loop driver, the Train-only context builder (follow-up `loop-context-builder-train-only`), the packet store bound to one inventory store (`packet-store-inventory-binding`), `ModelPort` with the `claude -p` adapter, encoder and lowerer prompts, round records, the accept rule, the detached unit on Yggdrasil. Waits on 3, 4 and follow-up `claude-on-yggdrasil`.
6. `style-axis`: a style-embedding score behind the scorer port. Waits on 3.
7. `ja-panel`: ja-JP into the loop's panel. Waits on 5.
8. `conlang-lexicon`: the first conlang's lexicon placed at concept embeddings, its morphology data and the gloss reader. Waits on 3 and question `first-conlang`.