From 05ef79af6a161506f38fc41f6eb331770c5b5d06 Mon Sep 17 00:00:00 2001 From: Weksa Date: Fri, 13 Nov 2026 05:17:53 +0000 Subject: [PATCH 1/4] corpus: 42 blind-written Validation items, vgrow and vgrow-ja, 21 per language Names bucketed before text (SplitScheme::V1, 40..=79); written by six blind Claude writer agents (Anthropic fallback; no cross-family writer reachable). Co-Authored-By: Claude Sonnet 5.5 --- data/original/corpus.cc | Bin 28720 -> 45018 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/original/corpus.cc b/data/original/corpus.cc index 9c53141206b52a394c56f05303a5e2b7230c6d54..6e8b471ab8e2b0afbe32cc205d98cd4813c4cc47 100644 GIT binary patch literal 45018 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 delta 14 Wcmcb0pJ~Gb#tG*cJvLrQ$Oiy9xCcc5 -- 2.47.3 From 0d2a51014c5603940013ecffa91bdbbcf4f6cf2f Mon Sep 17 00:00:00 2001 From: Weksa Date: Fri, 13 Nov 2026 05:19:22 +0000 Subject: [PATCH 2/4] speaker-state: 42 model-annotated keeper scenes for the vgrow groups at inventory rev 4 Annotator A committed; annotator B only measured agreement. Co-Authored-By: Claude Sonnet 5.5 --- data/original/speaker-state.cc | Bin 19417 -> 32508 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/original/speaker-state.cc b/data/original/speaker-state.cc index c4f563d1a4d37b3448236825ecbb96c147a60095..2503674ddbe09cd0598caeb70e5130c618d4ccd8 100644 GIT binary patch literal 32508 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 QvZO)Ib4(w~^psow3wAautpET3 delta 197 zcmezKm+|Iw#tBOq-8bK2Oy!*HD=M(~Eg$3L{WSuc^#$$NK#a*xC4Wukvl8AMBP-54 zS>I21Gq*A$<78eR;my&iyiAkrxdkR~(D*aiF-mx|whk-fWLaO~&94oVnZZf~EhU*j zN;a3-nz2mYtSG$M+{GRwC9?U9halr-Vee}^K&_&i?IM{OH`hlCF#+uo*nB Date: Fri, 13 Nov 2026 05:22:06 +0000 Subject: [PATCH 3/4] original_corpus tests: pins for 114 items, 98 live; shared leaks fn; grown-items test with DIGEST_OF_THE_42 Co-Authored-By: Claude Sonnet 5.5 --- crates/weksa/tests/original_corpus.rs | 162 ++++++++++++++++++++++---- 1 file changed, 139 insertions(+), 23 deletions(-) diff --git a/crates/weksa/tests/original_corpus.rs b/crates/weksa/tests/original_corpus.rs index 99e7e30..a3eae63 100644 --- a/crates/weksa/tests/original_corpus.rs +++ b/crates/weksa/tests/original_corpus.rs @@ -1,6 +1,6 @@ -//! The original corpus (`data/original`), in en-US and ja-JP: per language, 28 +//! The original corpus (`data/original`), in en-US and ja-JP: per language, 49 //! passages written for the non-memorised golf-loop target (Train and -//! Validation, all model-written) and 8 public-domain Test sentences, each with +//! Validation, all model-written: 28, then 21 more Validation items grown blind) and 8 public-domain Test sentences, each with //! its full provenance. Test is only read at a checkpoint: no round or recall //! prompt over this store holds it. The ja-JP passages are written in Japanese, //! not translated; the ja-JP Test sentences are Aozora Bunko excerpts. @@ -32,7 +32,7 @@ fn stores() -> (CorpusStore, EntityStore) { fn every_original_item_records_its_author_and_the_public_domain_ones_their_provenance() { let (corpus, entities) = stores(); let items = corpus.all().unwrap(); - assert_eq!(items.len(), 72); + assert_eq!(items.len(), 114); let (mut model, mut public) = ([0; 2], [0; 2]); for item in &items { let lang = PANEL.iter().position(|l| *l == item.language).unwrap(); @@ -43,7 +43,8 @@ fn every_original_item_records_its_author_and_the_public_domain_ones_their_prove model[lang] += 1; assert!( item.id - .starts_with(["item:original:", "item:original-ja:"][lang]), + .starts_with(["item:original:", "item:original-ja:"][lang]) + || item.id.starts_with(["item:vgrow:", "item:vgrow-ja:"][lang]), "{}", item.id ); @@ -116,7 +117,7 @@ fn every_original_item_records_its_author_and_the_public_domain_ones_their_prove item.id ); } - assert_eq!((model, public), ([28, 28], [8, 8])); + assert_eq!((model, public), ([49, 49], [8, 8])); } #[test] @@ -140,7 +141,7 @@ fn the_original_items_spread_over_train_and_validation_and_test_is_public_domain }; assert_eq!( (of(Split::Train), of(Split::Validation), of(Split::Test)), - (14, 14, 8), + (14, 35, 8), "{lang}" ); } @@ -165,6 +166,85 @@ fn the_original_items_spread_over_train_and_validation_and_test_is_public_domain } } +/// The 42 Validation items grown after the 56: written blind, one new group +/// each, every group bucketed Validation by its name alone, none sharing text +/// with a Test item in either direction. +#[test] +fn grown_items_hold_no_test_text_and_every_group_buckets_validation() { + let (corpus, _) = stores(); + let all = corpus.all().unwrap(); + let mut grown: Vec<_> = all + .iter() + .filter(|i| i.id.starts_with("item:vgrow")) + .collect(); + grown.sort_by(|a, b| a.id.cmp(&b.id)); + assert_eq!(grown.len(), 42); + let test: Vec<_> = all + .iter() + .filter(|i| SplitScheme::V1.live(i) == Some(Split::Test)) + .collect(); + assert_eq!(test.len(), 16); + let mut groups = std::collections::BTreeSet::new(); + for item in &grown { + match &item.source { + Source::ModelWritten { + family, generator, .. + } => { + assert_eq!(*family, ModelFamily::Anthropic, "{}", item.id); + assert!( + generator + .as_deref() + .is_some_and(|g| g.contains("claude-sonnet-5-5")), + "{}", + item.id + ); + } + other => panic!("{}: {other:?}", item.id), + } + assert_eq!(item.speaker.as_str(), "entity:keeper", "{}", item.id); + assert_eq!( + SplitScheme::V1.live(item), + Some(Split::Validation), + "{}", + item.id + ); + assert!(groups.insert(item.group.clone()), "{}", item.group); + assert!( + all.iter() + .filter(|o| o.id != item.id) + .all(|o| o.group != item.group), + "{} shares its group", + item.group + ); + for t in &test { + assert!( + !leaks(std::slice::from_ref(&item.text), t), + "{} holds Test text", + item.id + ); + // The reverse: the Test item contains the new text. + assert!( + !t.text.contains(&item.text), + "{} is inside Test text", + item.id + ); + } + } + let lines: Vec = grown + .iter() + .map(|i| format!("{}\n{}\n{}\n{:?}", i.id, i.text, i.group, i.source)) + .collect(); + let parts: Vec<&[u8]> = lines.iter().map(|l| l.as_bytes()).collect(); + assert_eq!( + weksa::split::fnv1a64_of(&parts), + DIGEST_OF_THE_42, + "a grown item changed" + ); +} + +/// Taken over the 42 grown items at admission, 2026-11-13. +const DIGEST_OF_THE_42: u64 = 15237292705431734093; + /// The 28 model-written items are byte-for-byte what they were before Test /// was added: id, text, group and source, folded in key order. #[test] @@ -460,10 +540,10 @@ fn the_recall_probe_covers_every_live_original_item_and_names_no_work() { }; assert_eq!(reading.languages.len(), 2); for r in &reading.languages { - assert_eq!((r.n, r.answered), (28, 28), "{}", r.language); + assert_eq!((r.n, r.answered), (49, 49), "{}", r.language); assert!(r.chrf < 25.0, "{} {}", r.language, r.chrf); } - assert_eq!(model.0.len(), 56); + assert_eq!(model.0.len(), 98); // No item outside Train and Validation is shown to the model. let all = CorpusStore::open(&c).unwrap().all().unwrap(); for item in &all { @@ -544,14 +624,14 @@ fn original_round(family: ModelFamily) -> (weksa::run::RunStores, weksa::run::Ro fn own_family_counts_and_labels() { // The original corpus is Anthropic-written items, all offered. let (run, r) = original_round(ModelFamily::Anthropic); - assert_eq!(r.own_family(), 56); + assert_eq!(r.own_family(), 98); assert_eq!( r.parse_reasons().iter().map(|c| c.count).sum::(), - 56, + 98, "every item was refused at Parse and says why" ); let line = run.round_line(&r); - assert!(line.contains(" own-family 56"), "{line}"); + assert!(line.contains(" own-family 98"), "{line}"); // A different answerer family, or none recorded, labels nothing. for family in [ModelFamily::OpenAi, ModelFamily::Unrecorded] { @@ -664,6 +744,20 @@ impl weksa::model::ModelPort for Record { } } +/// A Test item's text, or any run of five of its words (twelve characters of a +/// text written without spaces), in a prompt. +fn leaks(prompts: &[String], item: &weksa::corpus::CorpusItem) -> bool { + let w: Vec<&str> = item.text.split_whitespace().collect(); + let c: Vec = item.text.chars().collect(); + prompts.iter().any(|t| { + t.contains(&item.text) + || w.windows(5).any(|k| t.contains(&k.join(" "))) + || (w.len() == 1 + && c.windows(12) + .any(|k| t.contains(&k.iter().collect::()))) + }) +} + /// The public-domain Test items are held out: no prompt of round 1 over /// `data/original`, no recall prompt, and no round record names one. #[test] @@ -717,9 +811,9 @@ fn no_test_item_is_offered_to_a_round_or_recall_or_recorded() { let RoundOutcome::Recorded(r) = round(&mut run, &mut model, &scorer).unwrap() else { panic!("answered"); }; - // The check bites: the round did show live items, 56 of them, and the + // The check bites: the round did show live items, 98 of them, and the // probe sees a shown Train item of each language. - assert!(model.0.len() >= 56, "{}", model.0.len()); + assert!(model.0.len() >= 98, "{}", model.0.len()); for lang in PANEL { assert!( items @@ -740,7 +834,7 @@ fn no_test_item_is_offered_to_a_round_or_recall_or_recorded() { panic!("answered"); }; for rr in &reading.languages { - assert_eq!((rr.n, rr.answered), (28, 28), "{}", rr.language); + assert_eq!((rr.n, rr.answered), (49, 49), "{}", rr.language); } for item in &held { assert!(!leaks(&recall.0, item), "recall prompt held {}", item.id); @@ -783,7 +877,7 @@ fn ja_test_text_carries_no_aozora_markup() { .into_iter() .filter(|i| i.language == "ja-JP") .collect(); - assert_eq!(ja.len(), 36); + assert_eq!(ja.len(), 57); for item in &ja { for bad in ["《", "》", "|", "[#", "※"] { assert!(!item.text.contains(bad), "{} holds {bad}", item.id); @@ -810,7 +904,7 @@ fn every_cited_speaker_has_a_form_in_its_items_language() { } /// The panel [en-US, ja-JP] over `data/original`: both languages are read, each -/// with 14 Validation items, and no Test item is in any call. +/// with 35 Validation items, and no Test item is in any call. #[test] fn a_panel_round_reads_both_languages() { let (run, r) = original_round(ModelFamily::Unrecorded); @@ -821,7 +915,7 @@ fn a_panel_round_reads_both_languages() { let refused = &l.validation_refused; assert_eq!( refused.parse + refused.admit + refused.lower, - 14, + 35, "{}", l.language ); @@ -941,24 +1035,46 @@ fn committed_scenes_cover_original_groups() { .filter(|i| matches!(SplitScheme::V1.live(i), Some(Split::Train | Split::Validation))) .map(|i| i.group) .collect(); - assert_eq!(live.len(), 56); + assert_eq!(live.len(), 98); let held: BTreeSet = scenes.iter().map(|s| s.group.clone()).collect(); assert_eq!(held, live, "a scene for each live Train or Validation group, none other"); // Revisions append: a group's later revisions re-derived its relation. assert!(scenes.iter().all(|s| s.n <= 2)); + const S7: &str = "claude-sonnet-5-5 (Weksa Hands, model-annotated original scenes)"; + const GROWTH: &str = "claude-sonnet-5-5 (Weksa Hands, model-annotated validation-growth scenes; annotator is not the writer)"; + let grown: BTreeSet = CorpusStore::open(&data.join("corpus.cc")) + .unwrap() + .all() + .unwrap() + .into_iter() + .filter(|i| i.id.starts_with("item:vgrow")) + .map(|i| i.group) + .collect(); + assert_eq!(grown.len(), 42); + let mut by_growth = BTreeSet::new(); for s in &scenes { match &s.annotator { Annotator::Model { family, generator } => { assert_eq!(*family, ModelFamily::Anthropic, "{}", s.group); - assert_eq!( - generator, "claude-sonnet-5-5 (Weksa Hands, model-annotated original scenes)", - "{}", - s.group - ); + assert!(generator == S7 || generator == GROWTH, "{}", s.group); + if generator == GROWTH { + by_growth.insert(s.group.clone()); + // One relation, keeper to unnamed, the three Scene features. + assert_eq!(s.n, 1, "{}", s.group); + assert_eq!(s.relations.len(), 1, "{}", s.group); + let rel = &s.relations[0]; + assert_eq!(rel.from.as_str(), "entity:keeper", "{}", s.group); + assert_eq!(rel.to, weksa::speaker::Party::Unnamed, "{}", s.group); + assert_eq!(rel.features.len(), 3, "{}", s.group); + } } other => panic!("{} is {other:?}", s.group), } } + assert_eq!( + by_growth, grown, + "the growth scenes are exactly the vgrow groups" + ); } /// The sweep both seed-pair tests share: over a grid of grades per feature (each -- 2.47.3 From fb6f21c84f170530f46129917ddcb1efc746ecfc Mon Sep 17 00:00:00 2001 From: Weksa Date: Fri, 13 Nov 2026 05:22:19 +0000 Subject: [PATCH 4/4] map: validation growth is built; recalibration is a separate step Co-Authored-By: Claude Sonnet 5.5 --- docs/targets/interlingua-lowering-map.md | 67 +++++++++++++----------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/docs/targets/interlingua-lowering-map.md b/docs/targets/interlingua-lowering-map.md index d226184..0182cc0 100644 --- a/docs/targets/interlingua-lowering-map.md +++ b/docs/targets/interlingua-lowering-map.md @@ -406,37 +406,44 @@ of 1120 trials, NoGain 71%, Regressed 0%: a net gain of 0.079 against a mean noise term of 0.079. At 14 items per language the rule is therefore a low-power filter for a gain of this size; by 1/sqrt(n), about 35 or more items per language would bring the noise term near 0.05 (an extrapolation, not measured). -### Validation growth plan (`validation-growth`, not built) +### Validation growth (`validation-growth`, built; recalibration not run) -Power needs about 35 or more Validation items per language (14 now). The -corpus is `data/original`: model-written original prose for Train and -Validation (written to be non-memorised; public domain text was rejected for -them), eight public-domain sentences per language for Test with full -provenance. The split is derived from an item's group alone -(`SplitScheme::V1`: FNV-1a of `weksa-split-v1:` mod 100, under 40 Train, -under 80 Validation, else Test; a model-written item in a Test group is in no -split), and every item so far is its own group (`original-`). Growth is -therefore: about 21 new model-written items per language, each its own new -group, the group name chosen before the text is written (the bucket is then a -property of the name, not of the text), keeping names whose bucket is -Validation, with source `ModelWritten` (family, generator, prompt digest), -a speaker and a Scene as the existing items have, and the inventory and -ontology beds unchanged for the measure. No Test text is read by the writer: -the writer's prompt holds a noun list, the register note and the language, -never a Test sentence or `weksa corpus dump` output. -Costs and hazards, all real: (a) the corpus digest changes, so a run record -pins a new corpus and every calibration number above is redone on it (eight -prompted draws of 35 items per language, about 2.5 times the 14-item cost); -(b) the inventory was drafted with Validation informing it (ja inventory rev -5), so fresh Validation items also measure inventory coverage, and some -will refuse at encode (counted 0) until concepts are added, which is a result, -not a defect; (c) the writer and the lowerers are one model family, so a -lowerer may be favoured by its own prose (self-preference, Panickssery et al. -2024); a cross-family writer for the new Validation items removes that -(question `validation-growth-writer`). -Not built here because the writer fork is open, the scenes and entities for -~42 items are a real authoring cut, and the digest change invalidates the -runs in flight. +Power needs about 35 or more Validation items per language. `data/original` +now holds 35 per language (it held 14; Train 14 and Test 8 are unchanged): +42 model-written items, `item:vgrow:1..21` (en-US) and `item:vgrow-ja:1..21` +(ja-JP), live Train+Validation 56 to 98. The slug is new on purpose: the +`item:original:` prefix filter of `DIGEST_OF_THE_28` still selects the first 28 +and passes; `DIGEST_OF_THE_42` freezes the new prose. + +The split is derived from an item's group alone (`SplitScheme::V1`: FNV-1a of +`weksa-split-v1:` mod 100, under 40 Train, under 80 Validation, else +Test). The names were chosen before any text existed: 90 candidate nouns per +language, dropped by script when the group already existed or the noun +occurred in a Test text, then the first 24 whose bucket fell in 40..=79 (the +bucket came from `SplitScheme::V1` itself, cross-checked on the 72 existing +items). Each language was written by three blind writer agents (8 nouns each, +a brief of language, register note, noun and speech act, no Test text and no +existing item), 24 texts per language written, the first 21 in name order +admitted through `weksa corpus add`; each group is its own group. The scenes +are `weksa scene put` documents (keeper to `unnamed`, inventory rev 4), +annotated by a separate agent; a second annotator measured agreement only and +is not committed. + +The writer is Claude (family Anthropic recorded): no cross-family generator was +reachable from the body that ran this cut. The self-preference effect (a Claude +lowerer favouring Claude prose, Panickssery et al. 2024) is therefore not +measured. The writers' blindness is by brief content, not sandbox. + +Expect encode refusals: the existing 56 were written onto the Dao r3 concepts +and the inventory was drafted from them, while the new items were written free +of the inventory (question `validation-growth-vocabulary` stays open). Some new +packets will be refused at encode (inventory coverage) and score 0 as the means +do; they stay in the corpus. That is a result about inventory generalization, +not a defect. + +Every calibration number above (92/0/8 prompted rates, the 29% power, the 0.079 +noise term) is for the 14-item corpus; the corpus digest changed, and the +numbers are redone on the grown corpus in a separate recalibration step. ### Smallest measurable distil slice (`distil-incontext`, not built) -- 2.47.3