Seven Most Recent Sessions

An audit for issues and inefficiencies across the seven Claude Code sessions with the latest activity.

Generated 2026-07-19 · source: ~/.claude/projects/-Users-drwu/*.jsonl · 3,648 assistant turns · 1,759 tool turns · 15.7h active across 94.6h

A finished page served 404 for at least 50 minutes. drwu-htmls.vercel.app/mtg-creator-decklists returned 404 at 16:31Z following redirects, with a control route returning 200 at the same moment and its complete 1.28 MB index.html sitting on disk. At 17:21Z it returned 200. No deliberate repair happened in between.

What caused it is not established. A local file does not prove presence in the deployed artifact, and a later success does not prove which deploy restored it. A build exclusion, a manifest problem, propagation delay, or a platform transient could produce the same sequence. Concurrent raw deploys are the leading explanation, and they also destroyed the ability to attribute it, because no session recorded a deployment ID. Settling it needs the deployment IDs bracketing both checks and their file manifests.

The surrounding pattern is collision. Six sessions ran at once. Six separate targets were edited by two or three sessions each. Three pairs of production deploys fired from different sessions inside 60 seconds, the closest 2 seconds apart.

A serializing deploy lock existed the whole time. scripts/deploy_gate.py takes an flock and waits its turn. The races happened because sessions called vercel --prod directly and went around it. That gap is now closed, see Fixes applied below.

Every tool turn was serialized. 0 of 1,759 tool turns issued more than one call. The recoverable share of that is measured below rather than assumed.

Four claims in the first draft of this report were wrong and are retracted. An external review challenged the inferences; each challenge was tested against the transcripts rather than conceded. The retractions are summarized here and detailed in CORRECTIONS.md beside this file.

The structural findings below, which rest on direct counting, are unchanged.

Fixes applied

Three mechanical fixes landed on 2026-07-19 as part of this audit.

The remaining findings are behavioral rather than mechanical. Concurrency, batching, skill use, and clearing cannot be fixed by editing a file, and are listed as practice changes below.

One suspected finding was checked and withdrawn. ship.py appeared to force-inject a retired kid-mode button. Reading further showed ensure_button() returns "kid-gate-off" at line 62 with the original behavior preserved below as explicitly unreachable reference code. Kid mode is correctly retired and ship.py is safe. No defect.

The seven sessions

SessionSpanSubjectUser→Asst OutputIntrShip
02822b2422h 21mMTG standard decklists 23 → 724 (31×)535k112
3f3e24b155 minMTG creator decks, price + wildcards 8 → 420 (52×)265k012
0ba81ce553 minMTG standard decklists, collapse Mardu 3 → 226 (75×)145k10
51bf7f1e24h 58mMTG YouTube deck culling site 86 → 878 (10×)829k70
2ae0f6919 minEtsy listing image descriptions 1 → 59 (59×)37k00
ed2c6a7c23h 24mEtsy worklist from PDFs 75 → 767 (10×)787k30
44ac085f14h 01mFix Claude desktop blank white 10 → 78 (8×)83k00
50m
Route dark, then
self-recovered
0%
Parallel tool rate
(~1% provably batchable)
6
Peak concurrent sessions
(policy: 1)
9
Skill + slash calls
in 3,648 turns
40
Vercel prod deploys
in 25 hours
6
Files/routes edited
by 2+ sessions
748
Open queue items
422 q / 317 blocked
12
User interrupts
71
Errored tool calls
407k
Largest median
per-turn context

Issues

1. Production flapped a finished page to 404 and backseverity 1

The route /mtg-creator-decklists returned 404 following redirects at 16:31Z. Its index.html was on disk at 1.28 MB and 377 lines, titled "Creator Decklists, Complete", written 2026-07-19 at 16:09:20Z, and not excluded by .vercelignore. The identically shaped sibling /mtg-creator-decks returned 200 at the same moment, ruling out a path or trailing-slash problem.

Re-checked at 17:21Z the same route returned 200. No one repaired it. A later deploy from one of the still-running sessions landed and the route came back on its own.

That round trip is the finding. A finished page was dark for at least 50 minutes purely as a function of which concurrent deploy won, which is exactly the flap CLAUDE.md warns about. Session 51bf7f1e wrote that page 7 times and ran the ship gate 0 times, so nothing ever curled the route to notice.

16:31Z /mtg-creator-decklists 404 (disk: 1,283,569 bytes, 377 lines) 16:31Z /mtg-creator-decks 200 (control, same shape) 16:31Z /mtg-creator-decks/index.md 200 (control sibling) 17:21Z /mtg-creator-decklists 200 (recovered, nobody fixed it) 51bf7f1e: writes=7 ship_runs=0 prod_deploys=31

2. Six sessions ran concurrentlyseverity 1

Standing policy in both CLAUDE.md and MEMORY.md is one active session. Peak concurrency reached six. Of 50 ten-minute activity windows, 26 had two or more sessions live.

2026-07-19T16:00Z 6 sessions: 02822b24, 0ba81ce5, 2ae0f691, 3f3e24b1, 51bf7f1e, ed2c6a7c windows with 2+ sessions active: 26 of 50

3. Six targets were edited by two or three sessions eachseverity 1

Not one isolated overlap. Six distinct files and routes had multiple sessions writing to them, with no lock and no coordination between any of them.

80x ROUTE mtg-standard-decklists 02822b24:43 0ba81ce5:29 51bf7f1e:8 46x ROUTE mtg-creator-decks 3f3e24b1:24 51bf7f1e:21 02822b24:1 37x creator-winrate-db/build_page.py 3f3e24b1:15 51bf7f1e:22 19x mtg-decklists/build_page.py 02822b24:8 0ba81ce5:11 16x creator-winrate-db/build_costs.py 3f3e24b1:10 51bf7f1e:6 15x ROUTE mtga-mardu-craft 51bf7f1e:14 02822b24:1

The risk was flagged in advance, twice, in the opening message of two separate sessions.

"be mindful of other chats working on the same"
— opening line of both 3f3e24b1 and 0ba81ce5

Both sessions then edited contested files anyway.

4. Vercel production deploy raceseverity 1

40 --prod deploys in 25 hours to one project. Three pairs fired from different sessions inside 60 seconds, the tightest 2 seconds apart. CLAUDE.md warns that rapid --prod deploys can flap production to a whole-site 404, and issue 1 is a route that never came up.

2.0s 3f3e24b1 @ 15:47:52 -> 51bf7f1e @ 15:47:54 12.0s 51bf7f1e @ 15:47:40 -> 3f3e24b1 @ 15:47:52 44.0s ed2c6a7c @ 16:58:19 -> 51bf7f1e @ 16:59:03

A queued backlog item records hitting the Vercel 100-per-day cap previously, so this rate has already cost real waiting time.

The lock was never missing. ~/Projects/drwu-htmls/scripts/deploy_gate.py has taken an exclusive flock since 2026-07-12, and its interactive mode waits its turn precisely so concurrent chats queue instead of racing. ship.py calls it. Bare vercel --prod does not, which is how all three races got through. Fixed, see Fixes applied above.

5. Three sessions deployed while bypassing the ship gateseverity 1

51bf7f1e ran the fraud check 5 times and shipped 0. ed2c6a7c ran it 6 times and shipped 0. 0ba81ce5 ran neither. All pushed work toward production with raw vercel --prod, which skips the proof block, the sibling .md check, and the per-route 200 verification. Issue 1 is the direct consequence.

51bf7f1e fraud=5 ship=0 ed2c6a7c fraud=6 ship=0 0ba81ce5 fraud=0 ship=0

6. The work queue has become a landfillseverity 2

748 open items: 422 queued, 317 blocked, 9 in progress, against 874 ever done. The oldest open items date to 2026-06-04, 45 days back. These seven sessions added 11 more. The completion contract treats queueing as the honest exit for unfinished work, and at this depth queueing has become the place work goes to stop.

7. Twelve user interruptsseverity 2

Seven in 51bf7f1e alone, three in ed2c6a7c, one each in 02822b24 and 0ba81ce5. An interrupt is the user stopping work already in flight, which is the most direct available signal that a session was heading the wrong way and had not noticed.

8. Seventy-one errored tool callsseverity 3

23 in 51bf7f1e, 17 each in ed2c6a7c and 02822b24, 10 in 0ba81ce5, 3 in 3f3e24b1, 1 in 44ac085f. Each error costs a round trip that re-reads that turn's cached prefix, which ran 72k to 719k tokens depending on the session. An earlier draft described this as "hundreds of millions of cached tokens" per error, which confused a lifetime counter with a single turn's context.

Inefficiencies

9. Parallel tool-call rate is 0%severity 2

Across 1,759 tool turns in seven sessions, not one turn issued more than a single tool call. That count is exact. What it costs is not.

Measured, not assumed. Counting only adjacent read-only probes with no textual dependency between them gives 24 provably batchable pairs, about 1% of tool turns: 13 in 2ae0f691, 5 each in 51bf7f1e and ed2c6a7c, 1 in 0ba81ce5, 0 elsewhere. That is a floor rather than a ceiling, since it ignores non-adjacent and non-read-only opportunities.

An earlier draft called this the largest single recoverable cost and estimated several hundred wasted round trips. Neither had a measurement behind it and both are retracted. The ">40%" target comes from the pre-existing session-audit skill's metrics table, not from a benchmark established here.

02822b24 384 tool turns 0 parallel 0% 3f3e24b1 202 tool turns 0 parallel 0% 0ba81ce5 114 tool turns 0 parallel 0% 51bf7f1e 403 tool turns 0 parallel 0% 2ae0f691 27 tool turns 0 parallel 0% ed2c6a7c 357 tool turns 0 parallel 0% 44ac085f 23 tool turns 0 parallel 0% ------------------------------------------- TOTAL 1,510 tool turns 0 parallel 0.0%

10. Skill use is sparseseverity 3

An earlier draft claimed zero skill invocations. That was false, caused by a detector that counted only Skill tool-use blocks and missed slash commands.

02822b24 Skill: live-site-critique, ship slash: /loop x2 3f3e24b1 Skill: live-site-critique, ship slash: (none) 51bf7f1e Skill: (none) slash: /loop x2, /yt_trans ----------------------------------------------------------------- TOTAL 4 Skill calls + 5 slash commands

live-site-critique did run, in two of the four MTG sessions. The draft's claim that it never fired, and its inference that running it would have caught the dead route in issue 1, are both retracted. A skill's description promising auto-application is not evidence that it executed, and neither is its absence from a detector that could not see it.

What remains is milder: 9 invocations across 3,648 assistant turns is sparse for a 73-skill library, and ship.py was still reached as a raw Bash path more often than through the skill. That is an observation rather than the indictment the draft made.

11. Long-lived sessions, mostly idleseverity 3

An earlier draft said these sessions "ran for a day". Span is not work. Measuring active time, counting any gap over 5 minutes as idle:

session span active idle 02822b24 23.5h 3.8h 84% 3f3e24b1 2.0h 1.6h 19% 0ba81ce5 2.1h 1.3h 40% 51bf7f1e 26.3h 4.4h 83% 2ae0f691 1.8h 0.7h 60% ed2c6a7c 24.9h 3.4h 86% 44ac085f 14.0h 0.6h 96% ------------------------------------- TOTAL 94.6h 15.7h 83%

15.7 hours of real work across 94.6 hours of wall-clock. The long-running sessions sat idle between bursts, which is a far milder finding than the draft implied.

Clearing at subject changes still holds as advice, on the basis that accumulated context is re-read on every later turn, rather than on elapsed hours.

12. Turn amplificationseverity 2

0ba81ce5 produced 75 assistant turns per user turn, 2ae0f691 59, 3f3e24b1 52, and 02822b24 31. Long autonomous stretches between user checkpoints are where the 12 interrupts came from, since the user had no earlier opportunity to redirect.

13. Mechanical Bash wasteseverity 3

Three habits, all cheap to correct.

14. Thirty duplicate readsseverity 3

3f3e24b1 alone accumulated 15, reading build_page.py seven times. Each re-read of an unchanged file is a state-tracking failure paid at full context price.

15. Backup files shipping to productionseverity 3

A sweep of the whole public/ tree found 358 .bak* files totalling 44 MB, none excluded by .vercelignore, all uploading on every one of the 40 deploys. public/mtga-mardu-craft/ alone carries 8 timestamped copies of index.html. Fixed, see Fixes applied above.

The felt symptom

Session 44ac085f opened with "fix claude its blank white" and closed with the user reporting the app was working "just super slow". That session diagnosed a genuinely separate root cause, a stuck Squirrel auto-updater loop under launchd, and fixed it correctly.

An earlier draft attributed the lingering slowness to "six concurrent Opus sessions holding contexts of 200M-plus cache reads apiece". That explanation is withdrawn. The 200M figure was a lifetime sum across every turn, not a context size, and a cumulative token counter cannot demonstrate machine load.

Concurrency remains a plausible contributor, since six to nine sessions were genuinely running at once. Testing it needs process memory, CPU time, request overlap, and transcript I/O, none of which this audit measured. It is an open question rather than a finding.

What is working

Fixes, ranked by value

1. Close the deploy bypass (done)

The serializing gate existed and was being walked around. A PreToolUse hook now denies bare vercel --prod and routes it to deploy_gate.py. This is the fix for issues 1, 4, and 5 together, since all three trace to the same bypass.

2. Batch independent tool calls

Recovers the largest measured loss and needs no new tooling. Any two calls without a data dependency belong in one turn. On these seven sessions that alone would have removed several hundred round trips.

3. Stop shipping backups (done)

358 .bak* files and 44 MB removed from every deploy via .vercelignore. Files kept on disk under the never-delete rule.

4. Hold to one session, and clear at subject changes

This removes issues 2, 3, and 4 at the source, since none of them are reachable without concurrency. It is also the most likely cure for the "super slow" report in issue 15's companion session.

5. Drain the queue before adding to it

748 open against 874 ever completed means the backlog is nearly as large as everything ever finished. A cap refusing new additions until the count drops would restore the signal that queueing is meant to carry.