{"service":"cccc console","reads":"HyperDX (ClickHouse) for what fixers said; the durable ledger for what was launched","endpoints":{"GET /api/health":"app up AND able to read HyperDX; used as the container healthcheck","GET /api/fixers":"every fixer, ledger ∪ HyperDX, each tagged ledger+hdx | ledger only | hdx only. ?tools=N adds the live tool feed","GET /api/runs":"runs that shipped, newest first, with derived state","GET /api/runs/:run":"one run: rollup, phase timeline, tool tally, derived team, conversation beats (?beats=0 to skip)","GET /api/issues":"one row per issue with agent activity","GET /api/tools":"what was CALLED — per-tool tally with failures, MCP entries split into server+tool, plus the live feed. ?run= scopes, ?mcp=1 filters to MCP","GET /api/errors":"every error, newest first, selected by severity (?run= scopes)","GET /api/logs":"raw records with the attribute map intact. Filter kind|run|project|issue|box|tool|severity and hours|since; returns a cursor for polling","GET /api/stream":"SSE. Default: a change signal. ?include=tool,message,event,metrics,config (or all) pushes the records themselves. ?run= follows one run","POST /api/say":"{project, issue, text} → message the running fixer (only on a console co-located with the fixers)"},"filters":{"common":"hours, project, box, q — shared by the UI and the API so links match","note":"hours is a window over HyperDX; the ledger is always read in full"},"freshness":{"tool successes":"sub-second — PostToolUse posts each call straight to HyperDX","tool errors":"within one heartbeat (CCCC_HEARTBEAT_SECS, default 10s) — Claude Code does NOT run PostToolUse for a failing tool, so errors arrive with the transcript flush instead","conversation turns":"within one heartbeat, same flush","phase events":"immediate — written by progress.py as they happen","ledger last_seen":"within one heartbeat","stream tick":"2s (CCCC_STREAM_TICK_MS)","caveat":"the heartbeat rides on a SUCCESSFUL tool call, so a run whose first tool fails and which never calls another waits for its next phase boundary"}}