Observed (2026-08-24, production box)
A jcode seat whose first readiness turn was refused by the provider gateway (400 model_not_found on a provider-prefixed model id) surfaced to the operator only as:
✗ <name> exited on launch - last output: [cotal-jcode] fatal: Jcode host startup failed (unknown); inspect the private Jcode logs.
Diagnosing required digging the seat's private logs/jcode-*.log, where the actual cause was one precise line: the gateway's 400 response naming the rejected model id. The scrubbing is right as a default posture for a private-home harness, but here it hid information the connector itself originated or can classify.
Ask
The in-flight variant→reasoning-effort work adds a narrow render path for self-generated refusals (attempted tier named in the launch error). The model-id refusal class deserves the same treatment: when the readiness turn dies on a provider 4xx, surface the provider's error code and the offending parameter value (model id / effort tier) in the launch error, keeping everything else scrubbed.
Related: 0.28.0 already moved one instance of this class to the launch boundary ("refuses a provider-prefixed model id ... refused where the accepted form can be named"); this issue asks for the same principle at the readiness-turn boundary for whatever the launch-time validation cannot catch.
Observed (2026-08-24, production box)
A jcode seat whose first readiness turn was refused by the provider gateway (400
model_not_foundon a provider-prefixed model id) surfaced to the operator only as:Diagnosing required digging the seat's private
logs/jcode-*.log, where the actual cause was one precise line: the gateway's 400 response naming the rejected model id. The scrubbing is right as a default posture for a private-home harness, but here it hid information the connector itself originated or can classify.Ask
The in-flight variant→reasoning-effort work adds a narrow render path for self-generated refusals (attempted tier named in the launch error). The model-id refusal class deserves the same treatment: when the readiness turn dies on a provider 4xx, surface the provider's error
codeand the offending parameter value (model id / effort tier) in the launch error, keeping everything else scrubbed.Related: 0.28.0 already moved one instance of this class to the launch boundary ("refuses a provider-prefixed model id ... refused where the accepted form can be named"); this issue asks for the same principle at the readiness-turn boundary for whatever the launch-time validation cannot catch.