Where AI-assisted work keeps getting stuck - review of 46 sessions¶
Written: 2026-08-08
Source: all Claude session transcripts under C:\Users\ronny\.claude\projects\*NDInsight*
(46 sessions, about 700 MB of JSONL)
How this was measured¶
A script walked every transcript and pulled out two things:
- messages Ronny actually typed (system-injected text - skill files, compaction
summaries,
/loopbodies, context reports - filtered out; anything over 1200 characters treated as injected) - assistant messages admitting a wrong assumption (matched on "I was wrong", "correction", "I assumed", "false alarm", "retract", and similar)
Script: scratchpad/analyse2.py (working file, not committed).
| Measure | Count |
|---|---|
| Real typed user messages | 3,153 |
| Of those, pushback / correction | 355 (11%) |
| Assistant self-corrections | 613 |
UNVERIFIED: the theme buckets below are keyword matches, so the counts are indicative, not exact. Some task-notification noise survived the filter. The quoted examples are all genuine.
What the pushback was about¶
| Count | Theme |
|---|---|
| 83 | hardware / emulator facts stated wrongly |
| 38 | assumed instead of verifying |
| 36 | wrong or missing file path |
| 27 | did not run or validate tests |
| 17 | commit hygiene (mentioning Claude) |
| 15 | asked in prose instead of the interview tool |
| 10 | processes killed or left running |
The striking number is 613 self-corrections against 355 pushbacks. Most wrong turns are caught internally - but only after the work was already done wrong. The cost is wasted turns, not usually wrong final answers.
The recurring patterns¶
1. Facts that decay are stored as prose, and prose does not update itself¶
The single most expensive pattern. Examples:
- The
unity-norskdataskill says the player is "Starter Assets PlayerArmature (the robot placeholder)". It is not, and has not been for some time. On 2026-08-08 I repeated that claim and had to be corrected.PlayerArmatureappears 0 times inSampleScene.unity. - The memory index already carries the warning "read
unity-norskdataFIRST (but it is STALE - see below)". A document that has to warn you it is wrong is not doing its job. - Memory entries like
accp-control-store-model-correctedexist specifically because "5 old MEASURED facts" turned out dead. stale-status-headers-lie- a memory whose whole content is "grep before believing OPEN".
The pattern: hand-written descriptions of current state go stale silently. Invariants (a wire protocol, a register layout, a cabinet dimension) are fine in prose. Current state (what is in the scene, what is wired, what is done) is not.
2. Measurements taken through the wrong API silently lie¶
Fresh evidence from 2026-08-07/08, all in one session:
UnityEditor.UnityStatslooked authoritative and gave draw-call and triangle counts. It was reporting a stale Game view frame. Proved it by hiding two huge objects and re-rendering - the numbers did not move. Every figure quoted from it had to be retracted.Camera.Render()timing gave 4.86 ms warm and 706 ms cold for the same scene. Useless as a benchmark, and it silently blew past the MCP call timeout, producingsuccess:falsewith no message.- Earlier in the project: play mode is frozen while the Editor is unfocused, so "velocity=0, all settled" measurements were measuring frame zero.
- Screenshot capture ghosts - the renderer drew objects at stale poses that disagreed with every transform, bound and raycast. Cost a whole session.
The pattern: there is no blessed way to measure, so each session invents one, and some of them are wrong.
3. Rules exist only as instructions, with nothing enforcing them¶
CLAUDE.md forbids mentioning Claude in commits, forbids LINQ, requires full
paths for markdown, requires dotnet build-server shutdown. There are:
- no git hooks at all (
.git/hooksholds only.samplefiles) - no doc or path lint in
scripts/
17 pushbacks about commit hygiene alone. An instruction that is violated 17 times is not an instruction problem, it is a missing check.
4. Tooling failures diagnose themselves badly¶
On 2026-08-08 the Unity MCP bridge detached. execute_code returned
{"success":false,"message":null,"data":null} - no reason at all - about eight
times across roughly 40 minutes. Only read_console gave the actual cause:
Unity session not ready for 'read_console' (ping not answered); please retry
Time was also lost to manage_editor action=get_state, which is not a valid
action but took over 120 seconds to say so.
5. Answers are too long¶
"too much text for me to process. what is you fucking question ?" - and "i give a fuck about the plan", "remember! when i ask for a plan, i dont give a shit for what is done". This one is behavioural and mine to fix, not the codebase's. Noted here so it is not lost.
Recommendations, best payoff first¶
R1. Generate the state descriptions instead of writing them¶
Problem: pattern 1 above - the largest single time sink.
Fix: a committed Editor script that dumps scene state to JSON, run on demand:
Assets/Editor/ProjectStateReport.cs -> ProjectState.json (git-tracked)
Contents: scene roots with renderer and triangle counts, the player object and
its components, camera rig, LOD groups, static-flag and occlusion status, package
versions. Then delete the "what we are building" prose from the
unity-norskdata skill and have it say only: "run ProjectStateReport and read
ProjectState.json - never describe the scene from memory."
Same idea for the emulator side: scripts/ already has validate-mon-carves.py
and verify-dt-devices.py, which is exactly the right shape. Extend that habit
to "what is currently wired" rather than only "is this carve correct".
Cost: a few hours. Payoff: kills the recurring stale-fact correction.
R2. One blessed measurement tool per domain¶
Problem: pattern 2 - measurements that lie.
Fix: commit the correct method once, with the traps written into the file as comments:
Assets/Editor/PerfReport.cs- takes counts from a real Game view frame, notUnityStatsafter an off-screenCamera.Render(). Documents in comments that UnityStats does not observe off-screen renders and that play mode is frozen when the Editor is unfocused.- Keep the "render to RenderTexture, ReadPixels, average luma per column" trick from the street-lamp work - it is the one thing that reliably answered "is this actually brighter". It currently exists only in a memory file.
Cost: half a day. Payoff: no more retracted numbers.
R3. Mechanical enforcement of the rules that keep getting broken¶
Fix, in order of value for effort:
commit-msghook rejecting any message matchingclaude|Co-Authored-By. Ten lines. Ends a 17-occurrence problem permanently.scripts/check-docs.ps1- fails if a markdown file under the repo contains an absolute path (E:\,C:\,/), whichCLAUDE.mdalready forbids but nothing checks.scripts/dev-cleanup.ps1-dotnet build-server shutdown, then list any remainingdotnet.exe/testhost.exe/MSBuild.exewith their command lines so it is obvious which are Ronny's and which are strays. The locked-DLL-gives-fake-green-tests trap is already a memory; make it a script.
Cost: an hour for all three. Payoff: removes three whole categories.
R4. Make the Unity bridge fail fast and reconnect itself¶
Fix:
- Turn on "Auto-Start Server on Editor Load" in the MCP for Unity Advanced
Settings (the skill documents this exists; it is not on).
- Add scripts/unity-ping.ps1 that calls read_console first - the only tool
that returns a useful error - and prints either "bridge up" or the exact
reason. Run it before any Unity batch instead of discovering the problem eight
calls in.
Cost: fifteen minutes. Payoff: roughly 40 minutes recovered per incident.
R5. Split every skill into invariants and current state¶
Fix: two headings in each skill file.
- Invariants - protocol facts, register layouts, measured dimensions, hard-won traps. These age well; keep writing them.
- Current state - dated, and every claim must name the command that checks it. If it cannot name one, it belongs in R1's generated file instead.
The traps sections are the genuinely valuable part and should be expanded, not
trimmed - sintran-pads-bodies-with-f0 saved two days, retrocore-ini-has-the-ports
saves a guess every session.
R6. A repo-root paths.json¶
Problem: 36 pushbacks about paths, and Rule #0 exists solely because of a wrong-folder incident.
Fix: one file naming the canonical locations - models, manuals, photo archive
(\\Nas9t\data\NorskData\Pictures), disc images (F:\ND), the Unity project,
the RetroTerm binary, scratch. Resolve names from it instead of remembering
paths. It is also self-documenting for any future assistant.
What is already working and should not change¶
- The memory index. Dense, cross-linked, and the "cost me two days" notes are
what stop repeats.
ask-the-machine-before-carving-itandgrep-reference-manuals-firstare worth more than most tooling. scripts/validate-*.py/verify-*.py. Exactly the right instinct - a script that checks a claim beats a paragraph asserting it.- Rule #0 and the honesty requirement. The 613 self-corrections show they are landing; without them those would be confident wrong answers instead.