Prompt::lower takes the language; RunRecord carries the panel; RoundRecord and
Decision hold per-language readings (pooled keys retired); decide_panel is
Pareto non-regression over decide(); recall splits at UAX #29 word bounds.
Integration tests follow in the next commit.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The split guard failed open on any new split name; it now allows Train and
split-less items only. The page printed Debug of Refusal/StoreError and the
EntityRead store message; it prints Display and a fixed line. edition_year
held the first-appearance year of the work or translation, not the page read:
the doc comment and published schema say so.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Both bad-form refusals in orig-5 put the speaker entity (entity:keeper) in
context.participants. One sentence, pinned by a plain test; no new rule.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Soul s1 findings: an empty mean printed 0.00 beside n=0 (now Option, printed
none, like SplitMean); the printed line and whole ablate output are pinned by
exact string, with drop and permute each carrying their own n; a missing
recorded round answer is RunError::Unrecorded and says the prompt digest
drifted or the head inventory moved, not that a store would not read; the
unusable count is pinned for variant and item sides.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
LOWER_INSTRUCTIONS gains 'a grade is permille, 0 to 1000' (the encode brief
already states it). The pinned lowering test requires the sentence and asserts
the item's speaker entity id and group are in no prompt text.
This edits context.rs, a PROMPT_SOURCE_DIGEST input: the digest moves and runs
opened before this commit stop opening; open a fresh run to ablate under the
new brief.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
One dao packet admitted with its own stance, an anger-and-restraint stance and
none: three digests, each packet line ending in exactly that stance's JSON, the
rest of the text byte-equal, the stance features glossed in the one inventory
listing. No prompt change; the lowerer already reads the stance.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
RecordedAnswers is the one reader of <digest>.answer files (AnswerFiles reads
through it). RunStores::stance_ablation asks a fresh lowerer the round's own
lowering prompt again (replay), with the stance emptied (drop) and with the
next item's stance in its split (permute), for live Train and Validation
packets only, and reads how far the lowering moves and what the item's own
stance adds to fidelity. A diagnostic in <root>/ablation-<n>: records nothing,
never writes round-<n>. `weksa loop ablate <root> --round n`; exits 3 until
answered. Touches no pinned prompt-source file.
The source tripwire now allows the ablation as a second Prompt::lower call site.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Eight one-sentence English excerpts from Dhammapada (Muller), Walden, Emerson,
Bacon, Aesop (Townsend), Mill, Plato (Jowett), Darwin, each taken from the
exact Project Gutenberg page named in edition_url and checked verbatim against
the fetched text. Groups hash into Test (buckets 83-97); split.rs untouched, the
ModelWritten-never-in-Test rule stands. Items 1..28 are byte-identical (digest
pinned). Tests: counts Train/Validation 14/14, Test 8 all PublicDomain; no Test
text in any round-1 or recall prompt or RoundRecord over data/original; a
ModelWritten item in a Test group is read in no split.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Items original:7..28, written for the non-memorised target; groups chosen so
the V1 split derives Train or Validation. Test is not filled: a model-written
item of a test group is in no split (split.rs), so none can be held out.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Both parse refusals in the original-corpus round (runs/orig-3) were a null
referents[].concept; the prompt gave 'or null' to entity, setting, medium and
addressee and never said concept could not be. One sentence, pinned by a test.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The example's match lacked UnknownPhone, DanglingStress, ConsentMissing and
AskerNotAddressee (E0004). build.py dumped every split into data.json, which
would have published a Validation item; it now keeps the fixtures' cited items
and fails if the written data.json holds any other item key.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
serde_json exposes no kind for a data error, so the prefix reader stays as
DraftClass::of_data; the test feeds each class a real answer and an unknown
message to Other.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Mixed-family corpus fixture (Anthropic, OpenAi, Unrecorded, PublicDomain,
cast, a Test-group model item, a withdrawn item) and a CLI test reading the
run record after `loop open`.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
DraftClass (closed set from serde's category and leading words, never the
message) rides on DraftError; the round counts parse_reasons by code
('unreadable' for an answer that did not read as text) beside admit_rules.
RunRecord keeps the answerer's ModelFamily (loop open --answerer-family);
the round counts offered ModelWritten items of that family and the line
says own-family N. The corpus rule is documented as binding model judges:
the loop labels, it does not forbid. New fields and admit_rules are
cultcache default, so older run.cc records decode; schemas regenerated.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Five of six encoders in the first original-corpus round wrote bare integer ids and
were refused at parse (encoder-prompt-concept-ids). The prompt now says ids are
written in full with their family prefix. Soul s1 on the original corpus: unrelated
English scores chrF 13 to 18, not near 0, so the recall line says so; a test runs the
probe over the real original items.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Six short original sentences, model-written (Anthropic, claude-sonnet-5-5) and so
labelled, three Train and three Validation, over the Dao revision-3 inventory and
one live entity. The recall probe now covers every offered item, naming the work
only for a public-domain one, so it can show the original set reads near the
guessing floor.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Each live public-domain Train and Validation item is offered to a model by its
opening alone and the completion is scored by chrF against the item's second
half (lowering-recall-diagnostic). Answers live in <root>/recall; the reading is
printed, recorded nowhere, never a gate. The round schema stops requiring
admit_rules, which older records lack.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
admit_rules (key 18) counts, over both splits, each rule an admission refusal
broke: validator codes (V2, V5) or a store refusal's variant name. Rule codes
only, no identifiers or text. The printed line gains admit-rules=... before the
lowerer-reach label.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
RoundRecord and Decision no longer expose an unlabelled summary_line; the only
public spellings are RunStores::round_line and cycle_line, which label with the
run's lowerer reach. The lowering bound tests now kill the chars-for-bytes and
CR-allowed mutants.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
RunRecord key 12 LowererReach set by a required --lowerer-reach flag and
shown in round and cycle lines. PROMPT_SOURCE_DIGEST covers packet.rs.
Lowering text is refused when blank, over 4096 bytes or holding a control
character. Unanswered lowering digests are listed once. Tests for the
Prompt::lower build refusal and the packets.cc discard after a port error.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
run::score_round no longer calls lower::lower. Prompt::lower prints the
meaning of an admitted view, en-US entity forms and the inventory at the
view's revision, and no item text, key, group, speaker or packet key. The
answer is a LoweringDraft {text}, held in score_round's locals and scored,
never written to run.cc, a RoundRecord, a Decision or EditFeedback. A round
or cycle asks every encode prompt, then every lowering prompt, all or
nothing. An entry an edit adds can now be lowered.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>