Repository navigation
Sweep fix: speaker lab shared DB no longer leaks voices between runs - #2105
Conversation
meeting-series kept <work>/shared-db forever, so a --force rerun (or a fresh run over a work root an earlier run used) started with every voice the last run learned, and fresh_db=false meetings silently matched people they should have met for the first time. shared-db now carries a lab-shared-db.json marker: set, work root, shared meeting order, DB file, every flag except --only/--limit/--force (order free), sha256 of the --embedder-thresholds and lab knobs files, the finished meetings, and the meeting in progress. A run resumes only on a full match with nothing interrupted. A new run or --force empties it (only under the run's own work root). Any other mismatch while finished meetings exist stops the run and asks for --force instead of running the rest of the series on an empty DB. Promise checks run in autoeval-self-test.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f0446be827
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…, env overrides, stale results, marker writes)
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1f890c7e2b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A forced run empties the shared DB, then beginMeeting still required the first series meeting, so the documented --force --only m3 deleted the old run and aborted. Forced runs may now begin any shared meeting; a DB built that way is out of series order, so it is never resumed.
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5b4e93a347
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 95e9de8669
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Split out of #2101 (one PR per bug). Confirmed bug from the Haiku sweep.
What was wrong
meeting-serieskept<work>/shared-dbforever. A--forcererun, or a fresh run over a work root an earlier run used, started with every voice the last run learned. fresh_db=false meetings then matched people they were supposed to meet for the first time, and lab_result.json / naming rows looked better than they were.Fix
New
MeetingLabSharedDB.swift. Before the first meeting,prepare()reads alab-shared-db.jsonmarker in shared-db.--only/--limit/--force(flag order doesn't matter), and sha256 of the--embedder-thresholdsfile and theTRANSCRIPTED_LAB_KNOBS_FILEknobs file.inProgress: <id>.recordApplied()clears it and adds the meeting once its lab_result.json is written.How a run decides:
--force, the marker matches this run, nothing is marked in progress, and the meetings in the DB are exactly the finished ones (first N in series order, no gap).--force. It deletes only after checking the path is under the run's own work root (refuses..escapes and the root itself).--force, leaving the DB untouched, for any other mismatch while finished meetings exist. Examples: a meeting killed mid-run, retrying a failed mid-series meeting after later ones finished, a different--work, changed flags (--calendar-naming,--separation,--sep-*,--speaker-hint,--embedder-*,--backend), edited thresholds or knobs files, or an old DB with no marker. The error says why. It no longer runs the rest of the series on an empty DB.resumedorstarting empty (<reason>).Behavior change to know:
--force --only m3now runs m3 against an empty shared DB, not one holding m1/m2's voices. To rerun one mid-series meeting properly, rerun the series from the start with--force.Failing test
runMeetingLabSharedDBSelfTests(), run byspeaker-eval-harness autoeval-self-test. The package has no XCTest target. It drivesprepare/beginMeeting/recordApplied/fingerprintArgs/fileHashesagainst real files in a temp work root and lists every failed promise.--force,--calendar-naming, and the thresholds/knobs hashes.Checks
bash build-deps.sh --force,swift build --package-path Tools/SpeakerEvalHarness: passspeaker-eval-harness autoeval-self-test: PASS, run by hand only. The test-matrix command is BLOCKED (invalid-command) byagent-check.py, which won't run a bare-path command (already true on main), and SpeakerEvalHarness is inTOOLS_WITHOUT_CI. Neithercheck.shnor CI runs it.bash check.sh: everything else passed; only that BLOCKED entry.Independent review: approve with nits (3 rounds, reviewed as part of #2101). Nits, all still open:
--seriesand--workgo into the fingerprint as typed, so the same folder given as a relative path one time and an absolute path the next refuses a resume.--forcegets past it.--force. The gap itself predates this PR, and refusing is the safe outcome.runMeetingSeriescall sites (prepare before the loop, beginMeeting before the pipeline, recordApplied after lab_result.json, stopping on refusal) aren't covered by any test, because they need Parakeet and the diarizer models.🤖 Generated with Claude Code