ffe8aed6b4
The headless exit code read `last_batch_aborted()`, which answers "did a chain stop", not "did the request happen" — wrong both ways. `commit-cell-edit` at bottom-right lands its write, saves, and then `EnterAdvance`'s `AbortChain` exited 1 (c5ip); `add-item` into a missing category refuses without aborting and exited 0 (udt2). `App` gains a per-batch `batch_refused`, reset beside `batch_aborted` and written only by `App::refuse(msg)`, which sets the status and the flag together; commands reach it through `effect::refuse`. `main.rs` exits 1 on `last_batch_refused()` only. Not a severity on `status_msg`: that would be portable ViewState and would go stale across its ~60 writers. Strays into ui/app.rs (four small additions) — flagged in the hand-back. Unconverted refusals are filed as improvise-i3o5; headless `q` as improvise-ep5o. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze