isFeaturelessSnapshot() sees "Introducing" โ hint word โ NOT featureless โ routes to LLM[] (a model launch is no plugin surface)[] on a "capability-bearing" snapshot = burp โ sentinel parse_failedโค 2 bullets. A real multi-feature release still hits the LLM untouched.ANNOUNCEMENT_RE (introducing / generally available / promotional pricing / per-Mtok / default model). An ordinary thin CLI release (claude project purge, --max-turns flag) carries a generic hint word but no announcement language โ routes to the LLM.hook / SKILL.md / settings.json / MCP / โฆ) disqualifies it โ Added the SubagentStop hook still routes to the LLM.Runs in reconcileDeterministic() โ before and independent of the LLM โ so it heals the token-free cron, which is exactly where the churn lived. On any miss it falls through to the existing path: never a regression.
| changelog (thin) | announcement? | plugin surface? | verdict |
|---|---|---|---|
| Introducing Claude Sonnet 5 โฆ pricing | yes | no | GRADUATE thin_announcement |
| claude project purge; --max-turns flag | no | no | โ LLM real CLI features |
| Added the SubagentStop hook | no | yes (hook) | โ LLM adoptable |
thin_announcement=true, no parse_failedSubagentStop hook is NOT graduated โ the guard can't swallow a real featureImplement the #2757 cc-triage guard on branch fix/cc-triage-thin-changelog-guard: in reconcileDeterministic(), graduate a thin (โค2-bullet) changelog as thin_announcement (token-free, clearing any parse_failed) when it positively matches an announcement signal (introducing / generally available / promotional pricing / per-Mtok / default model) AND names no plugin surface โ so the 2.1.197 Sonnet-5 GA churn stops without swallowing real thin CLI/hook features. Add integration tests (graduate + negative-guard), keep the existing suite green, and close #2751/#2712 (the stragglers it spawned) in the same PR.