plugins/reflect/skills/errors-ack/SKILL.md
Triage and acknowledge entries in the reflect errors sink (~/.reflect/errors.json). Invoked from the statusline ⚠N badge when pipeline errors accumulate (drain poison, parser crashes, ingest failures, hook timeouts).
npx skillsauth add stevengonsalvez/agents-in-a-box reflect:errors-ackInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Triages unacknowledged entries in ~/.reflect/errors.json and
acknowledges them (individually or in bulk). The statusline ⚠N /reflect:errors-ack badge is the entry point — clicking the badge or
typing /reflect:errors-ack lands here.
⚠N /reflect:errors-ack badge~/.reflect/errors.json and filter to unacked entrieskind so repeats are obviousAskUserQuestion):
drain_poison after fixing the parser)python -m reflect_kb.errors ack [ids...] and report the count
of records flipped to acked: trueid when source kind message (first 80 chars)
─────────────────────────────────────────────────────────────────────────
err-b177eb 05-17 drain drain_poison poison after 3 retries: …
err-614742 05-17 drain drain_poison poison after 3 retries: …
err-579ed4 05-17 drain drain_no_output claude -p produced no out…
err-c942a3 05-17 drain drain_poison poison after 3 retries: …
Group repeats by kind in the prompt: "4 drain_poison + 1 drain_no_output — ack all? ack just drain_poison? show one in detail?"
# Count of unacked entries (what the statusline calls)
python3 -m reflect_kb.errors count
# Ack all unacked entries
python3 -m reflect_kb.errors ack
# Ack specific entries by ID
python3 -m reflect_kb.errors ack err-b177eb err-614742
# Append a new error (used by hooks/scripts, not user)
python3 -m reflect_kb.errors append \
--source drain --kind drain_poison --message "…" --transcript "…"
The store at ~/.reflect/errors.json is locked via fcntl so it's
safe to ack and append concurrently. Entries are deduplicated within a
short window (same kind + same hash) to prevent loops from flooding it.
When invoked:
# 1. show the count + table
python3 -m reflect_kb.errors count
python3 <<'PY'
import json, datetime
with open('/Users/stevengonsalvez/.reflect/errors.json') as f:
d = json.load(f)
unacked = [e for e in d.get('errors', []) if not e.get('acked')]
for e in unacked[:20]:
eid = e.get('id', '?')
ts = e.get('timestamp', e.get('ts', '?'))[:10]
src = (e.get('source') or '?')[:10]
kind = (e.get('kind') or '?')[:18]
msg = (e.get('message') or '')[:80]
print(f"{eid:12} {ts:10} {src:10} {kind:18} {msg}")
PY
# 2. ask user via AskUserQuestion (ack all / ack by kind / show detail / leave)
# 3. run ack
python3 -m reflect_kb.errors ack [optional-ids]
After ack the badge disappears on next statusline refresh (10s cache).
Found N unacked errors in ~/.reflect/errors.json.
By kind:
drain_poison ×4
drain_no_output ×1
Acked M entries. Badge will clear within 10s.
parser_typeerror or ingest_* failures usually point at a real bug
that needs fixing before acking (otherwise the same error returns
next session).~/.reflect/errors.json to clear the badge — that loses
the history. Always ack./reflect-status — broader system health view/reflect:recall — search learnings (separate concern, not errors)~/.reflect/errors.json⚠N /reflect:errors-ack (rendered red, only when
count > 0)documentation
Report reflect drain spend over a time window — tokens split by cached (cache_read), uncached writes (cache_creation), and io (input+output), with a $ estimate, grouped by day / outcome / model / transcript. Reads the drainer's cost log and surfaces outlier runs and cache-reuse health (the 41.5M-token failure mode = low cache reuse + high cache writes). Use to answer "what is reflection costing me" for the last day / week.
development
Show fleet status — every claude session running on the host, merged across ainb + claude-peers broker + background jobs. Use when you need to enumerate sessions before composing an action, see which sessions have a peer registered (broker-routable) vs tmux-only, check the `summary` of each session, or pipe the list into jq for filtering. Default output: text table. Pass --format json for LLM consumption.
testing
Ordered multi-step prompts to fleet targets, ack-gated between steps via JSONL assistant-turn-end detection. Use for cycles like disconnect→reconnect→verify, or any flow where step N+1 requires step N to have completed first. The skill BLOCKS until each target's transcript shows the next assistant turn finishing OR per-step timeout fires (default 300s).
development
Center control panel — enumerate every claude session that is blocked waiting on something: a user answer (AskUserQuestion fired), an API error retry, an idle assistant turn-end with no follow-up, or an explicit WAITING: marker. Returns rich JSON with signal kind + context per session. Use this when you've stepped away from the fleet and want one place to see everything that wants your attention and answer it.