stop.sh used a greedy sed capture to extract transcript_path from the Claude
Code Stop payload. The payload has fields after transcript_path, so the
capture grabbed trailing JSON and produced a path that never existed on disk.
The -f check always failed, /log was never POSTed, and the dashboard stayed
at 0 on every turn.
prime.sh had the same pattern for the primer field. /prime returns
{"primer":...,"port":...}, so the greedy capture injected trailing ","port"
junk into the primer. A negated-class sed fix would wrongly truncate primer
text at its first inner quote.
Fix both with jq -r. Move the command -v jq guard above the parse in stop.sh.
Switch printf %b to %s in prime.sh since jq -r already decodes JSON escapes.
Windows PowerShell hooks (stop.ps1, prime.ps1) use ConvertFrom-Json and were
already correct -- bash-only change.