Synthetic-session harness: marker scorer denominator, vocabulary-gap severity, hotwords #506
Closed
opened 2026-09-05 06:56:33 +00:00 by claude-bot
·
6 comments
No Branch/Tag specified
main
feat/1328-fill-it-in
feat/1328-fill-frontend
feat/1328-fill-backend
feat/9-foundry-push
fix/9-foundry-live
feat/9-foundry-push-frontend
renovate/celery-5.x
feat/5-foundry-connect
feat/9-foundry-push-backend
feat/9-foundry-push-module
feat/5-foundry-frontend
feat/5-foundry-backend
feat/5-foundry-module
release/v4.8.0-rc1
docs/d341-convert-draft
feat/958-update-to-version
feat/958-convert-sheet
feat/958-pathbuilder-import-frontend
fix/1360-heading-order
feat/958-pathbuilder-import-backend
feat/11-weekly-digest
feat/1341-auto-update
docs/d332-superseded
chore/1345-names-cleanup
feat/1342-mentioned-pages
feat/1328-recipes
fix/1346-pgdg-key
perf/1247-shared-recording-stream
chore/132-gitleaks-allowlist
release/v4.7.1
spike/foundry-module
release/v4.7.1-rc1
docs/decisions-d332-d337
fix/bot-certifi
chore/release-4.7.0
chore/release-4.7.0-rc4
chore/deps-4.7.0
chore/release-4.7.0-rc3
fix/1280-quote-must-say-it
fix/1257-names-row-squeeze
chore/release-4.7.0-rc2
fix/1245-pg-upgrade-count
chore/release-4.7.0-rc1
feat/1257-names-in-prep
feat/1257-be
feat/1257-fe
feat/1257-rating-fixes
design/1328-fill-it-in
feat/1257-name-splits
fix/1326-redis-503
feat/1280-fact-suggestions
feat/1280-be
feat/1280-fe
design/1280-fact-suggestions
feat/1279-infobox
feat/1279-be
feat/1279-fe
feat/1321-shelf-copies
design/1279-infobox
feat/1243-table-find
feat/1257-who-rated
feat/1243-prep-drawer
feat/1243-sheet-pickers
design/1243-browse-in-place
feat/1315-hotwords-default
feat/1242-system-filters
feat/1257-more-name-styles
feat/506-leg3-hotwords
design/1242-system-filters
fix/1302-packs-polish
feat/1241-rules-library
design/1241-rules-library
feat/1245-postgres-18
integ/4.6.2
fix/1263-map-ui-2
fix/1263-map-server
fix/1263-map-ui-1
fix/1261-editor-link-menu
fix/1229-axe-4.14-name-mismatch
renovate/axllent-mailpit-1.x
renovate/eslint-monorepo
renovate/authlib-1.x
chore/release-4.6.0
chore/release-4.6.0-rc2
fix/460-rc2-screens
fix/460-rc2-server
fix/release-prerelease-exit
chore/release-4.6.0-rc1
feat/125-campaign-templates
feat/126-calendar
feat/1181-pictures-and-files
feat/1190-event-people
integ/4.6.0
feat/1191-line-of-the-night
feat/1200-starter-packs
chore/bot-multidict-and-playwright-group
fix/1202-this-week-answered-count
fix/122-124-leftovers
fix/1178-get-routes-that-write
fix/1203-journeys-check-names
design/125-campaign-templates
feat/126-calendar-engine
design/126-in-world-calendar
fix/1189-cited-stamp-in-range
fix/1189-v4-looser-check
fix/1189-richer-beats
fix/1113-export-bind-lists
fix/1154-release-notes-by-file
chore/release-4.5.0
chore/release-4.5.0-rc12
fix/1135-wiki-markup-as-text
fix/demo-usage-cost-in-window
chore/release-4.5.0-rc11
fix/1121-sheet-consistency
fix/1121-sheet-5e-terms-and-card-hp
copy/1122-busiest-pages
fix/1121-relevant-choices
fix/1121-wiki-create-npc-save-sheet-links
fix/1029-menu-stays-on-screen
docs/prototype-transcript-bin-wording
fix/1023-editor-save-row-back-scroll
fix/1020-search-exact-first
fix/1020-table-prep
fix/1020-shell-wordmark-footer-bell
fix/1020-wiki-article-party
fix/872-admin-kept-until-phone-tables
feat/l13-milestone-level-waiting
fix/1000-1001-bell-older-setup-context
fix/999-pronouns-in-prompts
fix/l19-other-class-feats
fix/1010-transcript-window-ordinary-confirm
docs/d254-d269-decisions
fix/702-member-search
fix/680-transcript-bin
fix/993-unidentified-prompts
fix/841-redis-timeouts
fix/990-binned-not-exported
fix/830-export-prep-shelf
fix/deps-audit-2026-10-01
fix/877-title-reads
fix/798-audio-received-at
build/lane11-17-j7
build/lane11-16-levelup
build/lane11-14-seams
build/lane11-14-seed
build/lane11-15-start
build/lane11-13-old-block-out
fix/980-review-r3
build/lane11-12-block
build/lane11-8-packs
fix/demo-seed-canonical-names
build/lane11-11-hot-half
docs/l11-decisions
build/lane11-7-convert
build/lane11-10-editing
fix/npm-audit-brace-expansion
build/lane11-9-sheet-page
fix/bot-pyjwt
build/lane11-6-content
fix/lane11-rank-names
build/lane11-2b-language
build/lane11-4-js-evaluator
build/lane11-3-server
build/lane11-5a-pf2e
build/lane11-5b-5e
feat/design-admin
build/lane11-2-evaluator
build/lane11-1-sheet-pieces
build/lane11-0-drawing
fix/943-quest-objectives-fk
fix/prepsheet-shelf-flake
fix/945-leftovers
build/demo-gm-copy
fix/901-email-landings
build/lane10-8-journeys
build/demo-seed-lanes-8-10
fix/887-gm-own-confirmation
build/lane9-5-j1-admin
fix/918-audience-click
fix/useasync-overtaken
ci/939-critical-path
test/937-backend-suite-speed
chore/claude-orchestration
fix/924-xp-gm-only
fix/session-stale-poll
docs/decisions-d239-d242
fix/930-pypdf
build/lane8-journeys
build/925-quest-editor
fix/894-private-page-pictures
build/lane8-p4-drafts
build/lane8-p7-map
build/lane8-p6-handouts-rules
fix/wiki-fixture-names
build/lane10-d227-test-usage
fix/rsvp-horizon-test-tuesday
fix/media-volume-owner
build/lane8-p3-editor
fix/912-unidentified-rename
build/lane8-p5-party-quests
build/lane8-handout-takeback
build/lane10-pickers
build/lane8-p2-article
build/lane8-6-map
build/lane10-7b-email-pages
build/lane8-5-handouts
build/lane10-7a-test-the-bot-pages
build/lane8-p1-pages
build/lane8-4-quests
build/lane8-2b-feeds
build/lane8-3-parties
build/lane8-2a-links
build/lane10-5-commands
build/lane9-6-seed
build/lane10-4b-reactions
build/lane9-4d-pages
build/lane9-4c-pages
build/lane10-4a-posts
build/lane10-3-email
fix/891-web-fonts
build/lane9-4b-pages
build/lane10-6-test-the-bot
build/lane10-2-notify-out
build/lane8-1-wiki-text
build/lane9-4a-frame
design/lane10-drawings
fix/j6-budget
fix/j5-phone-flake
fix/869-test-leaks
fix/843-record-start-followups
build/lane7-all
build/lane6-all
build/lane9-b2-server
chore/changelog-fragments
docs/decisions-d218
build/lane9-a-owner-overview
fix/rule-card-level-label
fix/834-retention-semantics
fix/o3c-record-without-announcement
docs/decisions-d179
docs/decisions-d131-d170
fix/851-commit-before-response
build/lane6-j3-seed
build/lane9-b1-d67-identity
fix/841-blocking-loop
build/lane9-c-backups-audit
fix/vote-race-and-start-commit
fix/recording-announcement
fix/proposal-read-leak
fix/last-admin-guard
build/lane6-p4c-planning
build/lane6-p4b-margin
build/lane6-p4a-sheet
build/lane5-j4-seed
build/lane6-base
build/lane7-pages-talk
build/lane5-pages
build/lane7-pages-safety
build/lane7-p3-safety
build/lane7-p2-notify
build/lane6-p3-planning
build/lane6-p2-history
build/lane6-p1b-items
build/lane7-p1-threads
build/lane5-p6-faces
build/lane6-p1a-sheet
build/lane5-p5-find
build/lane5-p4a-board
build/lane5-p4b-scenes
build/lane5-p3-live
build/lane5-base
build/lane5-p2-cards
docs/lane5-decisions
build/review-r2-wide
fix/review-r1
build/lane5-p1-scenes
build/demo-seed
build/lane4-journeys-j5
build/lane4-page-review-b
build/lane4-page-review-a
build/lane4-page-read
build/lane4-journeys
build/lane4-page-sess2
build/lane4-page-sess1
build/lane4-notes
build/lane4-discord-on-approval
build/lane4-scheduling
build/lane4-versions
build/760-session-number
build/lane4-decisions
build/797-erase-no-regenerate
build/test-race-audit
build/lane3-completions
build/794-dark-only
build/796-titles-scroll
build/791-retention-anchor
build/a11y-sweep
build/shell-followups
build/retention-preview
build/753-backup-readback
docs/d91-d93
build/lane3-j1
build/ci-harness-paths-selftest
fix/useauth-test-race
build/ci-harness-paths
build/777-ai-settings-read
build/lane3-settings-c
build/lane3-settings-b
build/lane3-j6
build/lane3-sessionform
build/lane3-settings-a
build/lane3-members
build/lane3-thisweek
build/lane3-story
chore/87-align-python-3.12
v4.8.0-rc1
v4.7.1
v4.7.1-rc1
v4.7.0
v4.7.0-rc4
v4.7.0-rc3
v4.7.0-rc2
v4.7.0-rc1
v4.6.2
v4.6.2-rc4
v4.6.2-rc3
v4.6.2-rc2
v4.6.2-rc1
v4.6.1
v4.6.1-rc1
v4.6.0
v4.6.0-rc2
v4.6.0-rc1
v4.5.3
v4.5.3-rc1
v4.5.2
v4.5.2-rc1
v4.5.1
v4.5.1-rc2
v4.5.1-rc1
v4.5.0
v4.5.0-rc12
v4.5.0-rc11
v4.5.0-rc10
v4.5.0-rc9
v4.5.0-rc8
v4.5.0-rc7
v4.5.0-rc6
v4.5.0-rc5
v4.5.0-rc4
v4.5.0-rc3
v4.5.0-rc2
v4.5.0-rc1
v4.4.1
v4.4.0
v4.3.0
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.2
v4.1.1
v4.1.0
v4.0.1
v4.0.0
v3.11.4
v3.11.3
v3.11.2
v3.11.1
v3.11.0
v3.10.0
v3.9.1
v3.9.0
v3.8.0
v3.7.0
v3.6.1
v3.6.0
v3.5.0
v3.4.1
v3.4.0
v3.3.0
v3.2.0
v3.1.0
v3.0.0
v2.1.0
v2.0.0
v1.1.0
v1.0.0
v0.12.0
v0.11.0
v0.10.0
v0.9.1
v0.3.3
v0.9.0
v0.8.0
v0.3.2
v0.3.1
v0.3.0
v0.7.0
v0.6.0
v0.5.0
v0.4.0
v0.2.1
v0.2.0
v0.1.1
v0.1.0
Labels
Clear labels
backend
Issue related to the backend
bot
Issue related to the bot
bug
Something is not working
duplicate
This issue or pull request already exists
enhancement
New feature
frontend
Issue related to the frontend
help wanted
Need some help
invalid
Something is wrong
question
More information is needed
recording
Issue related to the recording system
security
Security hardening / vulnerability work
wontfix
This won't be fixed
No labels
backend
bot
bug
duplicate
enhancement
frontend
help wanted
invalid
question
recording
security
wontfix
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
rbrooks/Quest-Board#506
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?
Follow-ups surfaced by the vocabulary-bias measurement (PR #505, #355, #360). None of them change the numbers already reported, but each should be fixed before the harness is used for a cross-assembly or cross-provider comparison.
score_markersuses the wrong denominator for the in-character-only assembly. The scorer divides by the full marker count (54) for both assemblies, but only 50 of the markers occur in theic_onlyscript, so that assembly's detection rate is understated by ~7 % relative. Aroundevals/synthetic_session/scorers.py:308. Count the markers that actually occur in the scored script instead.GAP_NO_VOCABULARYis probably under-severe. The capability gap for "this provider ignores the vocabulary list" is currently low severity. The measurement shows the list is worth 9–24 pp of proper-noun recall, which is the largest single effect measured in v4.2.0, soSEVERITY_MEDIUMfits better. Also check the copy on the Admin capability panel says what the GM loses.hotwordsis unexplored. WhisperX API v2 honours bothinitial_prompt(what the vocabulary list becomes today) andhotwords. Run the same three-condition matrix with hotwords, and with both, and record which one the adapter should prefer.5.
seed_db.pycreatesPlatformLinkrows withoutverified_at, so the attendance path is never exercised. Found validating v4.2.0 on dev: the end-to-end run loggedattendance autofill {'spoke': 0, 'in_channel_silent': 0, 'unmatched': 5, 'auto_applied': 0}and wrote zeroattendance_proposals. Root cause is that_resolve_discord_ids_to_members(attendance_service.py, around line 150) deliberately requiresverified_at IS NOT NULL— an unclaimed link must never drive attendance — whileseed_db.py(around line 216) never sets it. Speaker resolution does not require verification, which is why the transcript labels were still right; only attendance went blind. The product behaviour is correct, the fixture is wrong.Fix: set
verified_aton the seeded links, then assert in the harness's check that the presence-only member (Kesh) and the silent-track owner (Dunmar) are reported as uncaptured, and that the five speakers match. That turns the #114 uncaptured-member path into something the harness actually tests.Picking up items 1, 2 and 5 for v4.2.1 (the scorer denominator, the
GAP_NO_VOCABULARYseverity, andseed_dbsettingverified_at). Items 3 (hotwords) and 4 (leg 3 automation) are measurement and harness work rather than fixes, and stay open here.Items 1, 2 and 5 are merged in PR #510 and ship in v4.2.1. Items 3 (hotwords) and 4 (leg 3 automation) remain open here.
1.
score_markersdenominator.ic_onlyrenders only theicandproposedregisters, and four of the manifest's 54 marker occurrences (all 24 distinct markers still appear in IC lines) are spoken exclusively in out-of-character lines:astrid_040Silverbeck,bryn_114Ravenstoke,bryn_176Nettleford,wren_196Blackwillow. They were being scored as markers the transcriber lost, so a flawlessic_onlytranscript could not score above 50/54.score_markersnow takes the assembly and filters expected occurrences by its registers, exactly asscore_werdoes, and returns the excluded occurrences alongside numerator and denominator so a denominator that moves is visible rather than inferred.fullkeeps every register and is unchanged at 54. Foreign markers are deliberately still checked across the whole lexicon; the order check's expected side is filtered with everything else.The recorded figures in
calibration.jsonand the harness README are annotated, not restated: the numerator is not re-derivable from the record (it stores counts, not segments) and re-measuring needs the GPU box. What can be said without a rerun is bounded. Detection per marker ismin(occurrences, hits), so the correction can only lower a numerator, which puts the control'sic_onlybetween 31/50 and 35/50 (62.0–70.0 %) and the worst speaker between 4/11 and 5/11. Both bands hold at the pessimistic end, so the floors stay where the measurement put them. On the next GPU rerun, rewrite the tables from the new run rather than patching;calibration.jsoncarries a note saying so.2.
GAP_NO_VOCABULARYseverity. Raised low → medium. The #355 A/B measured +9 to +24 points of proper-noun recall with WER flat, the largest single effect in v4.2.0; ranking that below "the provider was guessed from the URL" told operators the wrong thing to fix first. The consequence copy now says what is lost (character and place names coming back mis-heard, unrepairable downstream because everything after transcription reads the transcript and not the audio) with the measured range in plain words. The OPERATIONS gap table is updated; the frontend renders severity generically, so nothing there changed. Runs already stampedlowkeep it, which is what a provenance record is for.5.
seed_dbnever setverified_at.attendance_serviceresolves Discord ids through verified links only, on purpose, so the fixture seeded a roster the attendance path could not see and the uncaptured-member check (#114) was unreachable through it. Links are now seeded with a fixed timestamp,--print-sqlrenders it, and--verifygrew a cheap second check that every seeded link is verified.Confirmed against a real database rather than argued: seeded → labels and links both clean →
{'spoke': 4, 'in_channel_silent': 2, 'unmatched': 1, 'auto_applied': 0}withunmatched: ['Corvin']. That is 4 spoke rather than 5 because Corvin is the deliberately unlinked guest (#344's third label path); Dunmar reachesin_channel_silentvia the dropped silent track and Marn via presence. Nullingverified_aton the same rows reproduces the old{'spoke': 0, 'in_channel_silent': 0, 'unmatched': 5}exactly, so this was the cause and not a symptom. The expected counts are tabulated in the harness README's live-run section.Backend suite 2323 passed / 13 skipped, ruff clean.
Not blocked (2026-10-30): the dev host
docker-testreaches the GPU box. WhisperXhttp://10.3.0.28:8091/healthanswers 200, and the LLM is on:8090. So items 3 (the hotwords matrix) and 4 (automating leg 3) can both be run from there. Queued in v4.7.0 after the current fixes.Picking up items 4 (automate leg 3) and 3 (the hotwords matrix) for 4.7.0, in that order, so the hotwords conditions can be scored end to end with the same command. Both run from docker-test against the GPU box (WhisperX :8091, LLM :8090).
Items 3 and 4 are done in PR #1313. Details and the full table are on the PR.
summary-legruns audio → ASR → summary → scores in one command, reusing leg 2's code, with 14 offline tests.hotwordsbeatsinitial_prompt:full, and 90.0% against 80.0% onic_only;hotwordswhen declared, fall back toinitial_prompt, never send both. The product default is left alone: whether to switch it is a question for the owner.Caveats:
--recorded;--repeatflag is the follow-up.