Beat extraction reads a GM's answer to a table question as present-tense narration ("The party is currently located in Ironroot Hold") #584
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?
Seen on every summariser tried on the 2026-09-09 session (Qwen 9B, Gemma 4 26B, hosted Sonnet): the summary places the party in Ironroot Hold, when the session's point is that they have been teleported far from it. The stored events explain why: Gemma's run holds a verified beat at 49:28,
The party is currently located in Ironroot Hold.(kind reveal, no problems), citing the GM's line "You're in Ironroot Hold." That line answered a player asking "where were you?" (before the caves); the validator confirms the words were spoken, not what tense they carried, and every composer then repeats a wrong event faithfully. Only the two largest hosted models read past it.Why it will recur. GMs answer table questions tersely and in the present tense all the time ("you're in the tavern", "it's level 3", "you're at Bobsville"), and half of them are about the past or hypothetical. The extract prompt tells the model that GM lines are narration; it does not tell it that a GM line replying to a player's out-of-fiction question is context.
Proposed change, small and testable in the eval harness:
EXTRACT_SYSTEM_PROMPT, one rule: a GM line that answers a player's question about earlier events, rules, or the map describes context, not something that happened now; record it only if the surrounding lines show the fiction changing.Related: #423 (extraction passes), #349 (eval harness), #568 (what compose is asked to keep).
Reopening: the fix did not take on a real run. Re-summarised the 2026-09-09 session on dev at 06:31 UTC with #585 deployed (Gemma 4 26B, 97 beats extracted, 81 verified). Two verified beats now assert the location, where there was one before:
and the summary says "the GM clarified that the party's current location is Ironroot Hold". A
LIKE '%in Ironroot Hold%'check passes, which is a good reminder that the phrase was never the thing to test for.Why the detector did not catch it, which is the useful part.
answer_shaped_beatslogged nothing at all, so it found no candidates. The reason is the one its own author flagged as a footnote: the pipeline detects against the compacted transcript (#341), where consecutive same-speaker lines merge into one line carrying the run's first timestamp. The exchange looks like this raw:After compaction the GM's replies merge into one long line, so the "≤ 8 words" test that gives the predicate its precision can never fire, and the player question that precedes the answer is no longer adjacent to it. The detector is structurally blind to exactly the shape it was written for.
Suggested next step. Detect against the raw transcript rather than the compacted one, resolving a beat's cited stamp to the span of raw lines that the merged line covers (from the cited stamp up to the next merged line's stamp), and applying the word-count and preceding-question tests to the raw lines inside it. The stored
sessions.transcriptis the uncompacted text and is already in hand wheresummariseis called. Then re-measure the 1-of-71 precision figure on raw lines, since that number was also taken on the compacted form and is likely optimistic.And the prompt rule alone is not enough, at least for a 26B local model: it is in the extract prompt for this run and the beat was produced anyway, twice.
Correcting two things I wrote in the comment above, both found by measuring rather than reasoning:
Also worth recording: the mapping from a merged line back to its raw lines is built by walking the two line lists in step and matching on second and speaker, not by the stamp arithmetic I proposed. On the golden transcript that arithmetic produces an empty window for four lines that collide on the same second, which would have put a fresh blind spot inside the fix for a blind spot.
And the honest limitation: the golden fixture cannot demonstrate this bug at all. It is authored as strict turn-taking, so only 9 of its 209 lines merge two raw lines and none merge three, and the raw and compacted measurements agree for that reason rather than because the change is a no-op. On real speech, where compaction removes a quarter of the lines, the predicate now matches shapes it structurally could not — and its false-positive rate there is still unmeasured. That is why it continues to report rather than reject.
Fix is in the PR opened alongside this comment. Leaving this issue open: the prompt rule from #585 demonstrably did not stop a 26B local model producing the beat twice, so the underlying problem is not closed.