Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion bin/iak-degradation-watch.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,11 @@ async function tick(cfg) {
}

const accepted = agent.accepted_models || [];
if (signals.model && accepted.length) {
// "<synthetic>" is the harness placeholder on synthetic turns (usage-limit
// 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>') {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 πŸ‘Β / πŸ‘Ž.

const ok = accepted.some((prefix) => signals.model.startsWith(prefix));
await checkSignal(cfg, agent, 'model', !ok,
`🟠 degradation watch: @${agent.name}'s session has SLIPPED to model "${signals.model}" ` +
Expand Down
Loading