Compose selection fills spare slots earliest-first, so a session's ending and its dense stretches lose out #603
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found while measuring #600. Owner approved the fix on 2026-09-11.
What happens
beat_service.select_beats_for_compose(#589) splits the session intolimittime buckets and takes one beat from each non-empty bucket. It then fills the leftover slots fromsorted(rest, key=rank), whererank = (kind tier, t_start, t_end, position). So spare slots go to story kinds first, then the earliest in the session. Two consequences:othercomes last, whatever the cap. On run 7 (b0613da6), a read-only replay of the real selector showed the Thieves' Cant (01:08:55) and the mid-sized city (01:11:26) were not picked at 30 or at 36. Both are real reveals that the model labelledother.Raising the cap (#600) only extended the same earliest-first queue. The extra slots bought chatter such as "The players engage in off-topic chatter about the game Phasmophobia".
A second, separate cause of that chatter: the extraction prompt tells the model to leave out talk that isn't about the game, and it records it anyway, as a story kind. This is #596's lesson again: labelling holds where omission doesn't.
Fix
table_admininstead of being expected to disappear. The kind means "not part of the story", so compose, dedupe and the event log already handle it. The event log's folded line says "table notes" so it fits both.How it's measured
scratchpad/summ/replay_selection.py). Are the Cant and city picked, and how are picks spread between the first and second half of the session?Picking this up (2026-09-11), as one backend-only branch (
fix/compose-fill-and-chatter) with two parts, measured separately.table_admin("not part of the story"), instead of expecting it to be left out. This changes what the model produces, so it's measured with one live rerun against run 7.Deferred: the event log's "table notes" wording is a frontend change, left until #602 (which rewrites that component) has merged, to avoid a conflict. It's a one-line follow-up.
Merged (PR #605, main
137bfe0), deployed to dev, and measured live: run 8 (00e7962d, Gemma 4 26B, 2026-09-11 15:46 UTC), against run 7 (b0613da6).other)table_admin, kept outIt's the first run whose prose carries both targets: "Through the use of Thieves' Cant and other methods, various characters were able to discern details from the journal, including the location of a mid-sized city situated a few miles from an exit on the map." The hook now reaches the city too, although it still repeats the Ironroot slip. That one is left to #424's correction.
What's left is table admin given a story label: "7 beats look like table admin but were labelled other". That's the model's labelling, not the picker.
Closing: the picker bias this issue describes is fixed and measured.