BE-041: [put] buttons on status rows — pager-visible O spells

Now:
OPEN
Sev:
MED

Status rows name the actionable states (unk, mod, new) but acting on one still means typing put <path>. Wanted: a visible [put] button on those rows in the PAGER, clicking it runs the hidden O put <path> spell (Nav); plain/CLI output stays byte-identical (buttons are pager-only chrome). Twin of the [done] button round in BE-040; requested by gritzko 2026-07-10.

Input

Context

Goals

Constraints

WIP

Design decisions

TODOs

-v Red tests (test/status/buttons/{run.sh,assert_buttons.js}): red O button-spell set mismatch: got []; green asserts 3 buttons (unk/mod/new) + 4 U navs, ok/mis clean, plain parity vs the pre-change golden (dates normalised), raw wt-relative O spells. -v views/status/status.js: ACT_PUT={unk,mod,new} buckets grow the button pair via out.row(..., act); suite 167/165 = the 2 known bro reds only; test/status/links untouched, green. -v Pager smoke — worker (pty click staged unk, filename click still opens the diff, label painted blue) AND orchestrator-independent (scratch wt: plain shows zero [put] bytes, screen row unk unk.txt [put], scripted SGR click flipped the row unknew). -v Round 2 buckets: drop new from ACT_PUT, add mis[del] delete <path>; tests updated (expect_o = put mod/unk + delete mis, [del] plain-leak guard, label↔verb pairing in assert_buttons.js). -v Round 2 in-place refresh: _actSpell + _isMutation gate (pager.js, loop.js, registry.js dirs param, bro.js wiring); new headless test/status/buttons/click_refresh.js (button click: drive + status re-drive + stack unchanged; nav click: push) — suite still 167/165 (same 2 bro reds, verified identical in the untouched BE-040 wt). -v Round 2 pty smoke (orchestrator): scratch wt, SGR click [put] on unk → screen stays status, row flips unknew in place; click [del] on mis → del mis.txt; final --plain confirms both mutations.

Blockers and bummers

Outcome