[put] buttons on status rows — pager-visible O spellsStatus 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.
verb args spells followed token-precisely by _uriAt (views/bro/pager.js); the row's existing hidden U nav (diff:/cat:, BRO-006/DIS-057) keeps handling clicks on the filename — _lineUri's lone-U fallback counts only U tags, so a stray row-click can never fire the button.test/status/links asserts PLAIN output byte-identical to the retired native be status --plain — a visible [put] in plain would break it, so the button label must render in the pager ONLY (a hidden-in-plain, painted-in-pager tag pair, the U/O hiding precedent).put <wt-relative-path> verbatim, the verb resolves (BE-039 ruling, BE-030).put, new) carry NO button (re-stage is a no-op); mod/unk keep [put]; mis gains [del] (the delete verb unstages the gone file).unk/mod file rows show a [put] button, mis rows a [del] button (verb palette colors); put/new/ok rows show none; a left-click runs the spell and the row re-buckets.test/status/links native-parity stays green untouched.diff:/cat: nav, row fallback unchanged.put <path> spell stays typable in the address bar.test/status/buttons/ (fixture wt, the test/status/links runner pattern).work/BE-041): NO pager/serializer change — pure views/status/status.js emission riding the WHY-001 machinery; button row layout path U:nav " " Y:"[put]" O:"put <path>" S:"\n" — the U stays byte-adjacent to the path (token-precise filename click), the Y label paints in the put theme slot, _uriAt follows the O verbatim (no # prefix).--plain/piped takes the columnar path that never renders the button tokens; O toks route the hunk through the existing why paint passes (U+O hidden, label painted). Side effect: --color | cat shows the same [put] chrome + padded banner band — no test asserts color bytes."put " + navPath RAW — deliberately not navLink (it injects //authority; the BE-039 law).[done] round reuses it verbatim.act is {label, tag, spell} — ACT_PUT={unk,mod} → [put]/'Y' (blue), ACT_DEL={mis} → [del]/'X' (del brown, the delete verb); the label paints in its verb's palette slot.loop._isMutation(w) = registry.verbFile(w, _, ["verbs"]) (the verbs/-tree probe, views/ excluded); pager _mouse routes a mutation O spell to _actSpell (drive, drop hunks, _refresh in place, no back-stack push) — WHY's commit ?sha O spell stays push-nav (a views/ verb).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.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.[put] bytes, screen row unk unk.txt [put], scripted SGR click flipped the row unk → new).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)._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).[put] on unk → screen stays status, row flips unk→new in place; click [del] on mis → del mis.txt; final --plain confirms both mutations.work/BE-041: views/status/status.js, views/bro/{pager,bro}.js, core/{loop,registry}.js + test/status/buttons/* (tests in the beagle-ext-tests sub); orchestrator-verified red→green + independent pty click smoke both rounds; pending gritzko's review and land)