scrp-monitor-agent-idle.sh: why= is the shell's own re-derivation, not the classifier's reason - emit the upstream reason as an additional field
scrp-monitor-agent-idle.sh greps the prompt text out of $TAIL itself and prints autosuggest="<ghost>", while STATE comes from scan-context.py's idle_verdict(). The two are independent, so the script can emit `autosuggest="<ghost>" why=no-prompt` where why= is the shell's own re-derivation and the classifier's actual reason was something else entirely. That pair reads exactly like OPS-272's (false) diagnosis and will get OPS-272 re-filed by the next reader. FIX SHAPE: ADDITIVE ONLY. Emit the classifier's own reason as a NEW field (e.g. verdict_why=live-spinner|typed-input-at-prompt|content-above-prompt|no-prompt-in-tail) beside the existing why=. Do NOT replace why= with it: why=plan-pending has NO upstream equivalent, and it is the one BUSY state where the agent is waiting on a PERSON rather than on itself - the script's own comment at :410-417 records that folding it in made it unactionable in exactly the case a reader could clear in one keystroke. Replacing the field would be a regression dressed as a de-duplication. The inline python in the claude branch already imports scan_context; it calls sc.is_idle() and would call sc.idle_verdict() instead, printing state, reason and the REAL flag. Note idle_verdict() returns a 4-tuple whose last element is footer_rot - that is an alarm channel, and surfacing it here is a separate decision, not part of this. Do not accept on a green batch: a run where no pane carries a ghost never touches this. Force a pane parked at an empty prompt with a ghost and show the two fields disagreeing, then agreeing.