Rewrite lowering prose to the live system after table retirement

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Weksa 2026-11-14 03:55:13 +00:00
commit dac67cebb7
5 changed files with 16 additions and 47 deletions

View file

@ -35,8 +35,8 @@ measured.
- `settings/`: setting-specific proving grounds for language projects.
**Live versus planned.** Live: docs, fixtures, examples, ontology data and the
packet crate `crates/weksa`, including `weksa lower` (the template lowerer for
proof fixtures) and `weksa score`, and the golf loop's round and edit-accept
packet crate `crates/weksa`, including `weksa pronounce` (the ruled IPA and phones
of the entities a packet cites), `weksa score`, and the golf loop's round and edit-accept
cycle (`weksa loop open|round|cycle`), which encodes and lowers through the
model (a prompted Claude subagent, per staged-distill).
Planned: Score and lowering documents and the other panel languages. No

View file

@ -85,8 +85,8 @@ thing.
An entity's citation form in a language may carry a ruled pronunciation
(`LanguageForms.pronunciation`): bare IPA with stress marks, who ruled it, the
date, the source, and an optional list of rejected variants kept so nobody
re-proposes them. `weksa lower <store> <key> --ipa` prints the stored IPA of each
entity the packet cites, one per line, and refuses with `NoPronunciation` for an
re-proposes them. `weksa pronounce <store> <key>` prints the stored IPA of each
entity the packet cites, one per line (`--phones` prints the phones line), and refuses with `NoPronunciation` for an
entity with none; rejected variants are never read. This is not the plan below:
it carries no timing, contour, length or invented prosody, and Weksa has no
English G2P, so an unruled name has no IPA.

View file

@ -196,10 +196,9 @@ and `features` carry source-side nuance on content (hedge, certainty, irony and
whatever the inventory grows). This is source-side communicative pressure, not
target-language register. `addressee_consent` is no feature: it names the
predication the addressee asked for or agreed to, a fact about what the
addressee did. The English lowerer's request row (`frame:3`, "{agent} asked
{patient} to stop") reads it: the consent must name that predication and its
agent must be the addressee, else `ConsentMissing` or `AskerNotAddressee`. A
consent naming any other predication is refused as unrendered.
addressee did. `V14` and `V15` check the field: it may be set only by authoring or game
telemetry, and it must name a predication of the packet. Nothing lowers a
request clause from it today (follow-up `table-retirement-consent-owner`).
### `stance`

View file

@ -81,6 +81,8 @@ ceiling of an author who saw the reference:
frame minted from Train, scored lowest (chrF 44.18). The scores rise with
how bespoke the frame is, the reverse of generalisation. The Validation and
Test numbers measure the lowerer table, not what the interlingua can carry.
That table is deleted: the Dao numbers below were measured on it, and the
loop now lowers through the model (`Prompt::lower`).
- n = 5, one translation as reference, one embedding model, no variance.
## What the scorer cannot see

View file

@ -606,57 +606,25 @@ measurable with this corpus either.
Training pairs are Train only, at a frozen revision; the export is 12b.
## Lowerer first cut (`golf-loop-lowerer-cut`)
## Lowering authorities (`golf-loop-lowerer-cut`, `table-retirement`)
Authority map for the smallest lowerer, written before its code (Imagination
pass by the Weksa Self run, 2026-11-01). The cut exists to give the golf loop a
measurable baseline from a packet: `lower` gives text, `score` gives numbers.
Authority map of who decides what about a packet's wording. The first cut gave
the loop a baseline from an English template table; cut `table-retirement`
deleted that table, `lower()` and the CLI lowering command, so no deterministic path
produces lowered text and the model's answer to `Prompt::lower` is the only
wording owner. `lower.rs` keeps the entity port, `pronounce` and `phones`
(`weksa pronounce`).
| Decision | Owner | Inputs | Outputs | Not the owner |
|---|---|---|---|---|
| Whether a packet exists | `validate` / `PacketStore::admit` (unchanged) | packet, inventory, corpus, entities | admitted packet or typed refusal | the lowerer |
| Wording of a scored item in English (golf loop, `golf-loop-model-lowerer`) | the ModelPort's answer to `Prompt::lower` (`context.rs`), read as `LoweringDraft` (`encode.rs`) and held in `run::score_round`'s locals | the admitted view, the inventory at its revision, en-US entity forms | `{"text"}`, scored once, never stored | the corpus item, the scorer, the editor |
| Wording of a packet in English (`weksa lower`, proof fixtures) | `crates/weksa/src/lower.rs`: `lower(&LoweringInput, &Inventory) -> Result<String, LowerError>` | the validated lowering view and the inventory at its revision | text, or a typed refusal naming the missing template | the corpus item, the scorer, the golf loop |
| English template table (concept words, frame templates, speech-act openers) | the same module, as rows `(inventory id, gloss it speaks for, surface)` | none; it is data in code | rows the lowerer looks up | the inventory (it owns the ids and glosses, not the English) |
| The inventory's concepts and frames | an inventory revision; here `inventory::proof_revision()` (rev 2), hand-seeded as `seed()` is | none | the 6 concepts and 3 frames `nibu-proof-001` and the consent-gated request packet name | the lowerer |
| What a score counts | `Scorer::score` (unchanged) | output text, reference text | `ItemScore` | `weksa score`, which only reads text and calls it |
| The proof packet | `packet::proof_packet()`, typed ids of rev 2, admitted by `weksa packet proof <store>` through `PacketStore::admit`. Not JSON: `Packet`'s serde is CultCache's positional tuple, and JSON in is the xenos boundary the cut 7 encoder owns | none | admitted packet | the CLI decides nothing about validity |
Decisions this map makes, and why:
- **`lower` takes `&LoweringInput`, not `&Packet`.** A `Packet` carries `trace`
and `provenance.corpus_item`; the model page says the lowerer sees the packet
without its trace and never the corpus item (`lowering-traced`,
`leak-owned-by-flow-and-scorer-3`). `validate` already yields the view, so the
CLI runs `validate` and hands it over. Cut 4 narrows the door to
`PacketStore::admit`; this cut does not wait on it.
- **The frame owns the verb phrase; a predication's concept must resolve but is
not rendered.** Referent concepts supply nouns. A frame template names its
roles by inventory gloss (`{agent}`), resolved against the inventory at the
packet's revision, so a retired or re-glossed role cannot be silently
mis-keyed. A row whose gloss differs from the inventory's entry for its id is
a `LowerError`, so a table row cannot speak for a different meaning than its
id now carries.
- **Rendering rules, all deterministic and all from packet fields:** the
discourse addressee renders "you" ("yourself" when it already filled a role
in the same predication), other referents render "the <concept word>", a
predication filling a role renders "that", the speech-act row supplies an
optional opener, sentences are capitalised and end in a full stop.
Entity-bearing referents render by concept word: the lowerer does not read
the entity store in this cut (follow-up: entity forms in the lowerer).
- **No style, no register, no features.** Hedge, certainty, modality and
polarity are not rendered, so the baseline scores what meaning alone buys.
A lowerer that ignores `polarity: negative` would assert the opposite, so
`lower` refuses any packet that carries a feature, relation or extension it
does not render rather than render it wrong (`packet-owns-meaning`); features arrive as templates
learn them.
- **Deleted by later cuts, not this one:** the table in `lower.rs` and
`proof_revision()` are temporary owners. Cut 5 (`language-ontology`) moves
the table to `weksa.ontology_entry` documents selected by the target
profile; cut 7 replaces `proof_revision()` with the loop's minting round.
Nothing is deleted today because no earlier lowerer exists; the YAML
`examples/english-lowering/` hand-lowerings are fixtures, not owners, and
stay.
- **`weksa score` is a thin reader of `Scorer::score`**: `weksa score <item>...
[--output FILE]` embeds the output text once against every named item. It
stores nothing (Score documents arrive with cut 7) and gates nothing.