Add a one-shot diagnostic for the falling-behind case

The operator page turns red on two things — the app going quiet, or lagMs past
12 s with captionOnlyFinals above zero, which is the pipeline running slower
than people talk. Neither says WHY from the outside, and the machine that is
struggling is usually not the machine anyone is sitting at.

tools/diag.sh reads the log and asks the running app for its status, and prints
the four things that separate the causes: what hardware it is, whether it is
swapping, which models it actually chose at startup (a GPU with no fp16 or no
WebGPU at all changes that silently), and how long sentences are really taking.
Read-only throughout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Waters Church
2026-09-24 11:43:39 -04:00
co-authored by Claude Opus 5
parent c9eef0672c
commit 5d8d3e3527
+39
View File
@@ -0,0 +1,39 @@
#!/bin/bash
# Church Translate — one-shot diagnostic for "it is behind / in the red".
# Read-only: reads the log and asks the running app for its status. Changes nothing.
L="$HOME/Library/Application Support/Church Translate/data/logs/app.log"
C="$HOME/Library/Application Support/Church Translate/data/config.json"
echo "=== MACHINE ==="
system_profiler SPHardwareDataType 2>/dev/null | grep -E "Model Name|Chip|Total Number of Cores|Memory:" | sed 's/^ */ /'
echo " macOS $(sw_vers -productVersion)"
echo
echo "=== MEMORY PRESSURE / SWAP ==="
memory_pressure 2>/dev/null | grep -Ei "free percentage|pageouts" | sed 's/^/ /'
sysctl -n vm.swapusage 2>/dev/null | sed 's/^/ swap: /'
echo
echo "=== WHAT THE APP CHOSE AT STARTUP ==="
grep -E "GPU features \(speech\)|no GPU acceleration|no fp16|loading the speech model|loading the translation model|speech model ready|translation model ready|models could not load" "$L" 2>/dev/null | tail -8 | sed 's/^/ /'
echo
echo "=== THROUGHPUT — is it slower than people talk? ==="
echo " slow-sentence events (>4s): $(grep -c 'slow sentence' "$L" 2>/dev/null)"
grep "slow sentence" "$L" 2>/dev/null | tail -12 | sed 's/^/ /'
grep -E "stepping down to a lighter" "$L" 2>/dev/null | tail -3 | sed 's/^/ /'
echo
echo "=== THE RED CONDITION ==="
echo " caption-only events: $(grep -c 'caption only' "$L" 2>/dev/null)"
grep -E "caption only|stale — caption only" "$L" 2>/dev/null | tail -6 | sed 's/^/ /'
echo
echo "=== LIVE STATUS ==="
TOK=$(grep -o '"controlToken"[[:space:]]*:[[:space:]]*"[^"]*"' "$C" 2>/dev/null | sed 's/.*"\([^"]*\)"$/\1/')
curl -s -m 5 "http://127.0.0.1:3100/api/control/status?key=$TOK" 2>/dev/null | head -c 1500
echo
echo
echo "=== RECENT ERRORS ==="
grep "\[app\] err" "$L" 2>/dev/null | grep -v "natural voice fell back" | tail -12 | sed 's/^/ /'