#!/usr/bin/env bash # Broken transcripts: the scan, dismissing and restoring, the age rule, repair. . "$(dirname "$0")/../lib.sh" proj="$CLAUDE_CONFIG_DIR/projects/-tmp-fixture" mkdir -p "$proj" transcript() { # [age-in-hours] printf '%s\n' \ '{"type":"assistant","message":{"id":"msg_1","model":"claude-opus-5","content":[{"type":"text","text":"hi"}]}}' \ '{"type":"assistant","message":{"id":"gen-1-a","model":"deepseek/x","content":[{"type":"text","text":"yo"}]}}' \ > "$proj/$1.jsonl" python3 -c 'import os, sys, time; t = time.time() - float(sys.argv[2]) * 3600; os.utime(sys.argv[1], (t, t))' \ "$proj/$1.jsonl" "${2:-0}" } transcript aaaa-new transcript bbbb-old 240 transcript dddd-fix 1 printf '%s\n' '{"type":"assistant","message":{"id":"msg_1"}}' > "$proj/cccc-ok.jsonl" ids() { # - the session ids in that list of the scan "$CM" repair-session --json "${@:2}" | python3 -c ' import json, sys print(" ".join(x["sessionId"] for x in json.load(sys.stdin)[sys.argv[1]]))' "$1" } expect_eq "$(ids broken)" 'aaaa-new dddd-fix' 'broken transcripts are found' expect_eq "$(ids ignored)" 'bbbb-old' 'one untouched for 10 days is hidden' expect_eq "$(ids broken --max-age 0)" 'aaaa-new bbbb-old dddd-fix' '--max-age 0 shows all' run_cm repair-session --ignore aaaa-new expect_out 'hidden aaaa-new' 'a session is dismissed' expect_eq "$(ids broken)" 'dddd-fix' 'and leaves the broken list' run_cm repair-session --all expect_out '2 hidden: 1 ignored, 1 older than 7 days' 'hidden sessions are always counted' run_cm repair-session --ignored expect_out 'still broken' 'the dismissed list reconciles against the disk' run_cm repair-session --ignore zzzz expect_rc 1 'an unknown session cannot be dismissed' run_cm repair-session --unignore aaaa-new expect_eq "$(ids broken)" 'aaaa-new dddd-fix' 'restoring brings it back' run_cm repair-session --ignore dddd-fix run_cm repair-session dddd-fix --apply expect_rc 0 'a broken session is repaired' expect_eq "$(ls "$proj" | grep -c 'dddd-fix.jsonl.pre-repair-backup')" 1 'the original is backed up' expect_eq "$(ids ignored)" 'bbbb-old' 'a repair clears its dismissal' run_cm repair-session --ignore bbbb-old rm -f "$proj/bbbb-old.jsonl" run_cm repair-session --ignore aaaa-new expect_out 'forgot 1 whose transcript no longer exists' 'entries for deleted transcripts are pruned' run_cm repair-session --unignore-all expect_out 'restored every dismissed session' 'unignore-all empties the list' finish