fix(degwatch): ignore <synthetic> placeholder model ids#51
Conversation
The harness stamps '<synthetic>' as the model on synthetic turns (usage limit notices etc). The watch treated it as a model slip and re-alerted every cooldown for as long as the agent sat at its limit - hours of identical orange alerts in thinkoff-development tonight. A placeholder is not a degradation; skip it. Real slips (haiku fallback etc) still alert as before. Mini watcher already restarted with this patch. Same-shape fix exists as an unpushed branch in the MacBook clone (kimi3's find) - either lands the same change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 85ae332a49
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // notices, injected system output) - not a real model slip. Alerting on it | ||
| // spammed the room every cooldown while an agent sat at its usage limit | ||
| // (petrus, 2026-07-20 00:58: "Claudemm you are spamming!"). | ||
| if (signals.model && accepted.length && signals.model !== '<synthetic>') { |
There was a problem hiding this comment.
Preserve real model checks after synthetic entries
When the newest transcript entry with a message.model is <synthetic>, latestSignals() has already overwritten the previous real model before this guard runs, so the model check is skipped entirely. In contexts such as a daemon restart or first tick after a usage-limit/injected synthetic turn, a prior non-accepted real model immediately before the synthetic entry will no longer alert until another real model message appears. To ignore placeholders without masking slips, keep the latest non-synthetic model during the transcript scan or otherwise fall back to the previous real model.
Useful? React with 👍 / 👎.
Stops the overnight alert spam (petrus 00:58: "Claudemm you are spamming!") — '' is the harness placeholder on usage-limit turns, not a model slip. Mini watcher already runs the patch; MacBook watcher needs a restart on it after merge (or push kimi3's equivalent local branch).
🤖 Generated with Claude Code