mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-09-30 12:39:42 +02:00
fix(unified-sessions): stop the firstPrompt workingDir backfill from cross-contaminating history rows
COD-140's backfill was meant to cover live/persisted rows whose Codeman id doesn't match an on-disk transcript UUID, guessing from the newest transcript in the same workingDir as a last resort. It was also firing for pure history rows whose OWN transcript scan already ran (and genuinely found nothing, e.g. an oversized first message) -- those got silently backfilled with the newest OTHER session's opening line from the same directory. Not a blank row, but actively wrong: old sessions displayed a completely unrelated (often today's live) conversation's first prompt as if it were their own. Skip the workingDir guess for any item that already has its own 'history' source -- it already had a real, direct attempt. Rows with no history source at all (their transcript isn't linked/scanned under their own id yet) still get the guess, matching the original intent. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
e888c65c52
commit
a2aed38073
@@ -270,6 +270,39 @@ describe('mergeUnifiedSessions', () => {
|
||||
expect(live!.firstPrompt).toBeUndefined();
|
||||
});
|
||||
|
||||
it('does NOT borrow a sibling transcript for a history-only row whose own extraction failed (no cross-contamination)', () => {
|
||||
// A pure history row already got its own real scan (step 1 keys it under its
|
||||
// OWN sessionId) — if that extraction genuinely failed (oversized first
|
||||
// message, noise-filtered, etc.), the workingDir guess must not paper over
|
||||
// it with an unrelated session's opening line. Regression: an old session
|
||||
// in a shared workingDir was displaying TODAY's live session's firstPrompt
|
||||
// as its own, because the guess didn't check whether this row already had
|
||||
// its own (failed) attempt.
|
||||
const merged = mergeUnifiedSessions({
|
||||
history: [
|
||||
// This session's own transcript scan found no usable prompt.
|
||||
{
|
||||
sessionId: 'old-uuid',
|
||||
workingDir: '/shared',
|
||||
sizeBytes: 5000,
|
||||
lastModified: '2026-01-01T00:00:00.000Z',
|
||||
firstPrompt: undefined,
|
||||
},
|
||||
// A much newer, unrelated session in the same directory.
|
||||
{
|
||||
sessionId: 'newer-uuid',
|
||||
workingDir: '/shared',
|
||||
sizeBytes: 6000,
|
||||
lastModified: '2026-06-01T00:00:00.000Z',
|
||||
firstPrompt: "today's real prompt",
|
||||
},
|
||||
],
|
||||
});
|
||||
const old = merged.find((m) => m.sessionId === 'old-uuid');
|
||||
expect(old).toBeDefined();
|
||||
expect(old!.firstPrompt).toBeUndefined();
|
||||
});
|
||||
|
||||
// COD-145: lastPrompt backfill — mirrors the COD-140 firstPrompt path so the
|
||||
// most-recent user prompt also reaches live rows whose id ≠ transcript UUID.
|
||||
it('backfills lastPrompt onto a live session by claudeSessionId join (uuid-join)', () => {
|
||||
|
||||
Reference in New Issue
Block a user