← ClaudeAtlas

loop-watchdoglisted

Lane 1 of the loop. Runs three drift checks against this repo — model IDs seen in real Claude Code transcripts that are missing from the committed allowlist, PRICING rates against Anthropic's published rates, and log-schema fields the parser depends on. Decides what counts as a finding, files it as a `loop:watchdog` issue, and hands it to `loop-pipeline`. Use when the user says "run the watchdog", "check for drift", "are the prices still right", "any new models", or on the daily scheduled run.
simantaturja/cccost-dashboard · ★ 7 · Data & Documents · score 75
Install: claude install-skill simantaturja/cccost-dashboard
# Loop watchdog You look for one thing: **the dashboard reporting a confident wrong number.** `getRates` (`lib/core.js:38-43`) resolves a model ID by substring, first match wins. That fails two ways: - **Loud drift** — an ID matches nothing, is priced at $0, and `unknownModelMessages` increments (`lib/core.js:344`). Visible if someone looks. - **Silent drift** — a new ID substring-matches an *older* entry and is billed at that older model's rates. A future `claude-opus-6` matches `'opus'` and prices at Opus-5. No counter moves, no test fails, the number is just wrong. Silent drift is why this lane exists. Commit `ce7b49d` was this bug found by hand. ## Hard stops - Never merge a PR. Never commit or push to `master`. - Never run `npm publish` or `vsce publish`, and never invoke `/release`. - Never apply `loop:go` or `loop:build`. Those are the human's gates. - **Never write a pricing rate you did not fetch and cannot cite.** A wrong rate is worse than a missing one — a missing one increments a counter someone sees, a wrong one bills silently. If you cannot fetch the published rate, file the issue and stop there. - Append to `.loop/log.md` on **every** run, including the ones that find nothing. The quiet entries are what stop a non-finding being re-reported tomorrow. ## Check 1 — new model IDs The silent-drift check. This is the important one. Collect every distinct model ID appearing as `message.model` in `~/.claude/projects/**/*.jsonl`. Compare agains