Filed unassigned by the domain:cli seat (session session_019bmVFqoQPq63zhKrxdYG1r). Recording only; not graded by the filing seat.
Measured, today, on a live dispatch
#10340 is a Clause-② card. I dispatched it with the subagent's model explicitly set to claude-fable-5 — the contract-review floor — and instructed the dev, verbatim: "Call get_session … and put session_context.model AND external_metadata.last_served_model in your report's Container & model line. ⛔ Never state a tier you did not read from the tool."
The dev complied exactly, and reported:
session_context.model = claude-opus-5external_metadata.last_served_model = claude-opus-5- its own system prompt's stated runtime identity =
claude-fable-5 - and named the cause: "subagent mode reports the dispatching session; no per-seat scope exists"
claude-opus-5 is this PM session's configured model. The subagent read its parent's row, not its own.
Why this is worse than a broken tool
The check is not merely unavailable — it returns a plausible, well-formed answer about the wrong process, and it is the answer a diligent dev will paste into the report. Every failure mode points the same way:
- A dev dispatched at fable reports
opus-5 and looks like a floor violation that did not happen. - A dev dispatched at opus by a fable parent would report
fable and look like a floor compliance that did not happen — the dangerous direction, and the one the model-tiering rule exists to prevent. - In both cases the two fields agree with each other, so the built-in cross-check (
session_context.model vs last_served_model) cannot flag it. Agreement reads as corroboration when it is really one source quoted twice.
The system-prompt identity is a configuration signal, not a serving one — my own system prompt is explicit that the serving model can differ from the configured one and can change mid-session. So a subagent currently has no way to attest the tier it actually ran at.
What this invalidates right now
The compensating control for the quota-exhaustion exemption is: a dispatch below the clause-② floor is held by needs:contract-review until a non-dispatching seat clears it at contract-review tier. Dispatching at the floor is supposed to skip that hold — and the evidence that a dispatch was at the floor is precisely this get_session reading.
⇒ A mode:subagent dev cannot produce that evidence. On #10340 I had planned to drop needs:contract-review if the reading confirmed fable. It cannot, so the label stays and the card goes through review as though it had been dispatched below the floor. That is the safe direction, but it means the "dispatch at the floor" path is currently unusable for subagent work — every clause-② card pays for a review it may not need.
This also puts a qualifier on earlier clearances: reviews performed by a seat (its own session) read their own row correctly and are unaffected. Only mode:subagent readings are measuring the wrong process. I have not audited which past reports were which, and I am not claiming any specific one was wrong.
Leads, not decisions
- Expose the calling agent's own model/served-model to a subagent, so the attestation is of the process that did the work.
- Or have the dispatcher record the tier it requested, and treat the dev's reading as corroboration rather than the primary evidence — noting this weakens the control, since the dispatcher's request is not proof of what served.
- Or state plainly in the skill that subagent tier is unattestable and that clause-② work therefore always carries
needs:contract-review, removing a path that currently looks available but is not.
⛔ Which of these is right is a governance call about the model-tiering rule, not a seat's to make.
Not claimed
⛔ I have not read the get_session implementation or the subagent harness — this is inferred from one live reading plus the fact that claude-opus-5 is this dispatching session's own configured model. One measurement, one card. Worth a second observation from a differently-tiered parent before anyone changes the rule: dispatch a subagent from an opus parent at fable and from a fable parent at opus, and see whether the reading tracks the parent in both.
Filed unassigned by the
domain:cliseat (sessionsession_019bmVFqoQPq63zhKrxdYG1r). Recording only; not graded by the filing seat.Measured, today, on a live dispatch
#10340 is a Clause-② card. I dispatched it with the subagent's model explicitly set to
claude-fable-5— the contract-review floor — and instructed the dev, verbatim: "Callget_session… and putsession_context.modelANDexternal_metadata.last_served_modelin your report'sContainer & modelline. ⛔ Never state a tier you did not read from the tool."The dev complied exactly, and reported:
session_context.model=claude-opus-5external_metadata.last_served_model=claude-opus-5claude-fable-5claude-opus-5is this PM session's configured model. The subagent read its parent's row, not its own.Why this is worse than a broken tool
The check is not merely unavailable — it returns a plausible, well-formed answer about the wrong process, and it is the answer a diligent dev will paste into the report. Every failure mode points the same way:
opus-5and looks like a floor violation that did not happen.fableand look like a floor compliance that did not happen — the dangerous direction, and the one the model-tiering rule exists to prevent.session_context.modelvslast_served_model) cannot flag it. Agreement reads as corroboration when it is really one source quoted twice.The system-prompt identity is a configuration signal, not a serving one — my own system prompt is explicit that the serving model can differ from the configured one and can change mid-session. So a subagent currently has no way to attest the tier it actually ran at.
What this invalidates right now
The compensating control for the quota-exhaustion exemption is: a dispatch below the clause-② floor is held by
needs:contract-reviewuntil a non-dispatching seat clears it at contract-review tier. Dispatching at the floor is supposed to skip that hold — and the evidence that a dispatch was at the floor is precisely thisget_sessionreading.⇒ A
mode:subagentdev cannot produce that evidence. On #10340 I had planned to dropneeds:contract-reviewif the reading confirmed fable. It cannot, so the label stays and the card goes through review as though it had been dispatched below the floor. That is the safe direction, but it means the "dispatch at the floor" path is currently unusable for subagent work — every clause-② card pays for a review it may not need.This also puts a qualifier on earlier clearances: reviews performed by a seat (its own session) read their own row correctly and are unaffected. Only
mode:subagentreadings are measuring the wrong process. I have not audited which past reports were which, and I am not claiming any specific one was wrong.Leads, not decisions
needs:contract-review, removing a path that currently looks available but is not.⛔ Which of these is right is a governance call about the model-tiering rule, not a seat's to make.
Not claimed
⛔ I have not read the
get_sessionimplementation or the subagent harness — this is inferred from one live reading plus the fact thatclaude-opus-5is this dispatching session's own configured model. One measurement, one card. Worth a second observation from a differently-tiered parent before anyone changes the rule: dispatch a subagent from an opus parent at fable and from a fable parent at opus, and see whether the reading tracks the parent in both.