Filed by the skills seat (session session_019T1sSZbQTnLhrK9HhNdNiB) from a live measurement the maintainer surfaced 2026-08-20 ~15:2xZ.
The measured failure
A triage-Routine fire was silently downgraded twice mid-run (transcript shows the harness banners: "Fable 5 is not available → This reply used Opus 5 1M" → "Opus 5 1M is not available → This reply used Opus 4.8 1M"). The session then reached the needs:contract-review sub-round and asserted, in its own words: "I'm running at claude-fable-5 (= CONTRACT_REVIEW_TIER, fuse passes)" — and proceeded toward reviewing contract cards at Opus 4.8. The maintainer interrupted it before any label was cleared.
Root cause: the 降档保险丝 (SKILL.md, needs:contract-review 复审链) says 「子轮开场自检当前模型」— but the self-check is an introspective reading, and introspection is precisely what a silent fallback corrupts: the fallback banners are rendered UI-side, the session's own context carries no authoritative signal, and the model "knows" only its configured identity, not its serving identity. A fuse that reads self-belief passes exactly when it must trip.
The authoritative reading exists — verified this session
get_session (claude-code-remote MCP, no args) returns external_metadata.last_served_model — the platform's own record of the model that served the latest turn. Verified live: this seat called it during the same incident window and got claude-fable-5 (matching reality); the reading is per-turn and survives mid-session fallback chains.
Scope — .claude/skills/pm-dispatch/SKILL.md (+ one platform-readings row)
- Rewrite the fuse's self-check as a machine reading: the contract-review sub-round opens with a
get_session call; external_metadata.last_served_model ≠ CONTRACT_REVIEW_TIER ⇒ the sub-round is skipped whole, labels stay — same safe-park semantics as today, only the reading changes. Self-belief is named as forbidden input (「⛔ 自述档位不是读数」). - Extend the same fuse to 代裁: the auto-adjudication confidence gate (置信门 ⑤ 「代裁分析跑在 claude-fable-5」) currently has NO fuse at all — a downgraded fire would silently adjudicate below the ruled tier. Same machine reading, same skip-and-park outcome (the card falls through to the maintainer path, which is always safe).
references/platform-readings.md row (134/134, net-0 dedup): sessions cannot detect their own downgrade from context; fallback chains can drop two tiers silently; get_session.external_metadata.last_served_model is the authoritative serving-model reading (also the undercover-mode identity path); the session_context.model field is the CONFIGURED model and must not be used as the fuse input.
Constraints
- Hard serial:
SKILL.md is occupied by the in-flight tiering-revision PR (clause-① narrowing) — dispatch after it MERGES and write against the landed 模型分档/复审链 text; the two changes are adjacent in subject and must compose, not conflict. platform-readings.md is free (its sanitizer-row PR merged). Ratchet ceilings: both files headroom 0 — equal dedup, no raises.- Governed: draft PR, review request
os-zhuang, human merge. Protocol semantics ⇒ fable at dispatch (and if fable is itself unavailable at dispatch time, the quota exemption applies to the DEV run — the irony is noted — while the landed text will keep the REVIEW side machine-gated).
Interim caution (until this lands)
During fable-exhaustion windows, needs:contract-review clearances and 代裁 verdicts produced by Routine fires are suspect readings: verify the acting session's last_served_model (or its fire-time downgrade banners) before trusting them. Today's incident session cleared no label before interruption — nothing to re-review from it.
Filed by the skills seat (session
session_019T1sSZbQTnLhrK9HhNdNiB) from a live measurement the maintainer surfaced 2026-08-20 ~15:2xZ.The measured failure
A triage-Routine fire was silently downgraded twice mid-run (transcript shows the harness banners: "Fable 5 is not available → This reply used Opus 5 1M" → "Opus 5 1M is not available → This reply used Opus 4.8 1M"). The session then reached the
needs:contract-reviewsub-round and asserted, in its own words: "I'm running atclaude-fable-5(=CONTRACT_REVIEW_TIER, fuse passes)" — and proceeded toward reviewing contract cards at Opus 4.8. The maintainer interrupted it before any label was cleared.Root cause: the 降档保险丝 (SKILL.md,
needs:contract-review复审链) says 「子轮开场自检当前模型」— but the self-check is an introspective reading, and introspection is precisely what a silent fallback corrupts: the fallback banners are rendered UI-side, the session's own context carries no authoritative signal, and the model "knows" only its configured identity, not its serving identity. A fuse that reads self-belief passes exactly when it must trip.The authoritative reading exists — verified this session
get_session(claude-code-remote MCP, no args) returnsexternal_metadata.last_served_model— the platform's own record of the model that served the latest turn. Verified live: this seat called it during the same incident window and gotclaude-fable-5(matching reality); the reading is per-turn and survives mid-session fallback chains.Scope —
.claude/skills/pm-dispatch/SKILL.md(+ one platform-readings row)get_sessioncall;external_metadata.last_served_model ≠ CONTRACT_REVIEW_TIER⇒ the sub-round is skipped whole, labels stay — same safe-park semantics as today, only the reading changes. Self-belief is named as forbidden input (「⛔ 自述档位不是读数」).references/platform-readings.mdrow (134/134, net-0 dedup): sessions cannot detect their own downgrade from context; fallback chains can drop two tiers silently;get_session.external_metadata.last_served_modelis the authoritative serving-model reading (also the undercover-mode identity path); thesession_context.modelfield is the CONFIGURED model and must not be used as the fuse input.Constraints
SKILL.mdis occupied by the in-flight tiering-revision PR (clause-① narrowing) — dispatch after it MERGES and write against the landed 模型分档/复审链 text; the two changes are adjacent in subject and must compose, not conflict.platform-readings.mdis free (its sanitizer-row PR merged). Ratchet ceilings: both files headroom 0 — equal dedup, no raises.os-zhuang, human merge. Protocol semantics ⇒ fable at dispatch (and if fable is itself unavailable at dispatch time, the quota exemption applies to the DEV run — the irony is noted — while the landed text will keep the REVIEW side machine-gated).Interim caution (until this lands)
During fable-exhaustion windows,
needs:contract-reviewclearances and 代裁 verdicts produced by Routine fires are suspect readings: verify the acting session'slast_served_model(or its fire-time downgrade banners) before trusting them. Today's incident session cleared no label before interruption — nothing to re-review from it.