7.6 KiB
Scene annotation
How the keeper scenes of data/original/speaker-state.cc are labelled. A scene
label has a committed rule that produced it; this file is that rule.
Why
Two findings forced a written rule.
annotation-rank-from-register: an annotator who reads the line's register (politeness forms, honorifics, endings) to decide the speaker's rank hands the lowering its own answer back, because register is what the lowering must produce from the scene.- The addressee gate (
with_sceneincrates/weksa/src/validate.rs): a scene is read only when the packet names a discourse addressee. A line that addresses no one readsNoAddresseeand no Scene entry selects, so labels on narration are inert and the only labels that bite are those on lines said to someone.
The earlier labels followed two briefs that were never committed and that disagreed with each other (the relation to the reader, and a situation read with the register ignored). The rubric below replaces both for every live group.
Provenance
Cut weksa-lowering:cut_spec:cut-scene-in-group.r1, ruling
weksa-lowering:ruling:scene-rubric-whole-bed: all 98 live Train and Validation
groups of data/original receive a new scene revision from annotator A under
rubric r1, generator claude-sonnet-5-5 (Weksa Hands, scene rubric r1, docs/scene-annotation.md). Earlier revisions stay as provenance. The rubric uses
no corpus line as an example on purpose: a labelled example would make the blind
check against the old labels circular.
A later rubric revision gets a new section and a new generator string; r1 is never edited.
Rubric r1
The speaker of every line is the keeper, a quiet caretaker of a house and garden. First decide whether the line addresses a listener: it asks them something, asks them to do something, tells them about themselves, wishes something for them, or speaks to them as you. A line that addresses no one (narration, description, a remark about the world or about other people, a thought or wish with no one addressed) is told to the reader, a stranger: answer addressed false, relative_status level, intimacy 500, in_group false. People named inside a line are not its listener.
For a line that addresses a listener, answer addressed true and judge the keeper's relation to that listener from the situation the line states or implies, never from its register: politeness forms, honorifics, sentence endings, contractions, please and casual particles are what the lowering must produce from the scene, so they cannot decide it. relative_status: above when the situation gives the keeper standing over the listener (instructing, advising or permitting as elder, host, employer or teacher); below when it gives the listener standing over the keeper (the keeper serves, thanks, or asks a favour of a guest, employer, elder or official); level when it shows neither.
intimacy, 0 to 1000: 500 when the line shows nothing; up to 800 when it shows shared daily life (the listener's body, sleep or habits, the household's routine); above 800 only for a stated close bond; down to 200 for a stated first meeting or a service relation. in_group: true only when the line shows the listener belongs to the keeper's household, family or working circle, stated or plainly implied; a request, a question or a kind wish alone is not enough; otherwise false. Answer one JSON line per group, in the order given and nothing else: {"group": G, "addressed": true|false, "relative_status": S, "intimacy": N, "in_group": true|false}.
Procedure
- Annotator A (committed) and annotator B (measurement only) are separate fresh
model agents, one pair per language (49 live groups each). Each sees only the
text of Rubric r1 above and that language's sentences as
group<TAB>"text", shuffled by a fixed seed. Neither sees an existing scene, the other annotator's answer, the ontology, which items are old or new, or any Test text. - An output that does not parse or misses a group is re-drawn once and logged.
- A's labels are written with
weksa scene put(one revision per group,--to unnamed --inventory-rev 4).addressedis not stored: no Scene feature carries it. - Disagreements are reported, never adjudicated.
Agreement at r1 (this cut, 98 live groups, 49 per language)
Four fresh agents drew the labels (A-en, A-ja, B-en, B-ja); the briefs were the
rubric section plus one language's shuffled sentences (SHA-256 of the brief
bodies: en-US db087476...dbc04e, ja-JP c5b81b27...97488c; no Test text in
either). No draw was repeated. Annotator model: claude-sonnet-5-5.
A against B (B measures only): pooled addressed equal 96/98 (kappa 0.96),
in_group equal 93/98 (kappa 0.79), relative_status equal 89/98, intimacy
within 150 on 98/98. en-US: addressed 47/49, in_group 47/49 (0.86),
relative_status 45/49. ja-JP: addressed 49/49, in_group 46/49 (0.64),
relative_status 44/49.
Blind check, A against the 56 older labels: relative_status equal 49/56,
in_group equal 53/56 (kappa 0.64), intimacy within 150 on 55/56. Three
in_group differences: original-ja-shimoyado-2 and original-ja-sakana (both
narrations, true to false) and original-ja-asa (an instruction to a household
member, false to true).
In_group true across the 98: 42 before, 15 after; every unaddressed line is now false (it was true on 17 of the 21 unaddressed vgrow groups). Disagreements are reported, not adjudicated.
Reproducing the cut
scripts/scene-annotation/ holds the standard-library scripts of this cut, run
from the repo root with WEKSA (the binary) and SCENE_SCRATCH (a directory
that is never committed): build_briefs.py writes the two annotator briefs from
the Rubric r1 section and prints each brief's Test-leak count (must be 0) and
sha256 (it reproduces the briefs of this cut byte for byte); put_labels.py
puts A's A-en.jsonl and A-ja.jsonl; agreement.py prints the tables above and
must run before the puts, against the store at 76fa685, because the older labels
are then its latest revisions (it also reads the round-1 encoder answers of
runs/growth-base through ROUND1). DIGEST_OF_THE_RUBRIC and
DIGEST_OF_THE_EARLIER_SCENES in crates/weksa/tests/original_corpus.rs pin the
rubric text and the 113 earlier revisions.
Known limits of r1 labels
Found by Soul's pass on this cut (weksa-lowering:verdict:cut-scene-in-group.s1).
They are not fixed in r1; a reviewer's pass over the labels is follow-up
weksa-lowering:follow_up:scene-labels-reader-review.
- The new labels change which ontology entries are selected for 37 groups. Eight addressed lines move onto the casual in-group entries (en-US:12: lantern, broom, mirror, seedling; ja-JP:12: furo, asa, irori, yurikago), while their references are polite requests. The reader default (level, 500, false) is exactly the condition of ja-JP:11.
relative_statustracks request form for some lines: imperatives read above, favour questions read level or below, so the same household request gets different standing in two forms (hane above/650/true, kabin below/500/false; B gave both level/false). Form is what signals the speech act, which is what part 2 asks for, and register is what part 2 forbids.in_groupis true on some requests alone (lantern, mulch, stool, hane) and on a line whose only family member is named inside it (original-ja-ane), though r1 says a request or a person named inside the line is not enough. A and B agreeing does not clear this.- A run opened on the old speaker-state refuses to continue after merge:
runs/growth-basepins the store of/var/lib/mind-weksa-self/Weksa-growth(main), and that checkout must not be pulled while the run is wanted.