From 2583fb91c3f01aedf62621c9026847b125ca9607 Mon Sep 17 00:00:00 2001 From: Eureka Date: Thu, 29 Oct 2026 10:10:21 +0100 Subject: [PATCH] Map: interlingua lowering model page, scoring, convergence and cut sequence Prose map for campaign weksa-lowering, written by Imagination for the Eureka-area Self (session self-2026-10-29-eureka). Co-Authored-By: Claude Opus 5.5 --- docs/targets/interlingua-lowering-map.md | 121 +++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 docs/targets/interlingua-lowering-map.md diff --git a/docs/targets/interlingua-lowering-map.md b/docs/targets/interlingua-lowering-map.md new file mode 100644 index 0000000..e8907d9 --- /dev/null +++ b/docs/targets/interlingua-lowering-map.md @@ -0,0 +1,121 @@ +# Map: interlingua lowering (campaign `weksa-lowering`) + +Prose map for the campaign whose target is +[interlingua-lowering.md](interlingua-lowering.md). Rulings, questions, +follow-ups and cut specs live in the Eureka mind under `weksa-lowering:`; this +page is the model page and the cut sequence, and cites them by label. Written +by Imagination for the Eureka-area Self, 2026-10-29. + +## The design in one paragraph + +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 +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`. + +## Model page + +Every persistent kind, what names it, its life, and who decides. "Derived" +means no store holds it and nothing writes it. + +| Kind | What names it | Lifecycle | Who decides | +|---|---|---|---| +| Packet | Key `packet::r:`; CultCache type `weksa.interlingua_packet`, carrying `schema_version` and `inventory_rev` | 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 the validator | The encoder writes; the validator refuses malformed packets at the door (`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 `:` (families: concept, frame, role, relation, speech_act, feature); type `weksa.inventory_entry`, with gloss, value kind, `introduced_rev`, 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; Self on merge to main | +| 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`) | +| Split assignment | Derived: `split(scheme, item.group)` | Fixed for a scheme; a new scheme is a new constant, never a reassignment. Model-written items never land in test | The hash function. Nobody assigns by hand, so there is no writer to forbid | +| Loop round | Key `run: