From 548ddac8bd47a3cf92c5c5b24e3ec1cf39a65072 Mon Sep 17 00:00:00 2001 From: Eureka Date: Thu, 29 Oct 2026 12:20:54 +0100 Subject: [PATCH] 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 --- docs/targets/interlingua-lowering-map.md | 36 ++++++++++++++---------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/docs/targets/interlingua-lowering-map.md b/docs/targets/interlingua-lowering-map.md index 219a767..0f6d65d 100644 --- a/docs/targets/interlingua-lowering-map.md +++ b/docs/targets/interlingua-lowering-map.md @@ -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` nodes, `encoder:<16 hex>`, canonical `:`) | 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` nodes, `encoder:<16 hex>`, canonical `:`) | 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` 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 `:`, `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 `:`, `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:`, 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::`; 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, prompt_digest: Option }`, `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`.