Deterministic first, model last
Most of what you want to know is already in local state: whether a turn is running, whether it failed with a structured error, whether it is a registered automation, whether it was interrupted, and whether the agent left a status footer on its last message. ThreadBear reads that from a read-only local index and decides without a model call. Every classification records how it was reached — runtime, structured_error, automation, interruption, footer, luna, or unknown — so the provenance of every answer is auditable rather than implied.