9184915c42
The inflight-turn journal can outlive the turn it recorded (reclaim, reconnect or restart races skip the settle that clears it). On session resume the fold then re-appends journaled assistant rows to a transcript that already holds the committed replies, so the conversation ends with duplicate answers in scrambled order. The fold also carried the stale entry's streamId onto the resumed state on an idle resume, which kept the journal entry alive (persistInFlightTurnState only clears when streamId is null) and re-folded the same tail on every open. Detect text-level staleness before the append path: when every recoverable journaled assistant row already exists as committed text in the base transcript, treat the entry as caught up and clear it. Only keep a stream target when the resumed session is genuinely running (keepPending), so an idle resume self-heals instead of re-folding.
Contributor email → GitHub login mappings
This directory replaces appending entries to AUTHOR_MAP in
scripts/release.py. The old dict caused constant merge conflicts when
several salvage PRs landed at once — every PR edited the same lines of the
same file. Here, each mapping is its own file, and file additions never
conflict.
Adding a mapping
One file per commit-author email, under emails/:
python3 scripts/add_contributor.py <email> <github-login>
# or by hand:
echo "<github-login>" > contributors/emails/<email>
- File name = the exact commit-author email (as shown by
git log --format='%ae'). - File content = the GitHub login on the first non-comment line.
Lines starting with
#are comments (use them for the PR reference).
Example — contributors/emails/jane.doe@example.com:
janedoe
# PR #12345 salvage (gateway: fix session key routing)
Rules
- Do NOT add new entries to
AUTHOR_MAPinscripts/release.py. That dict is frozen legacy data; the release tooling merges it with this directory (directory entries win on duplicates). - GitHub noreply emails (
<id>+<login>@users.noreply.github.comand<login>@users.noreply.github.com) auto-resolve — no file needed. - The
Contributor Attribution CheckCI job fails a PR whose commits carry an unmapped email; the failure message prints the exact command to run.