$SRC_ROOT scan, the fsw rev tree, the per-wt status memoThe board (BEE-025) must show each ticket's WORKTREE: a file frame (the BEE-022 quad counts) and a commit frame (ahead/behind, current tip) on the row of the ticket the worktree is named for. Three pieces, rulings gritzko 2026-08-19: (1) the SCAN — every worktree lives under $SRC_ROOT as //parent-tail, parent a registered repo, so one readdir of $SRC_ROOT matched against the registry names finds them all, naming convention only; (2) the WATCHER — quickjab fsw over each worktree, be's shared/cache.js rev tree (STATUS-019) as the model; (3) the MEMO — the status model per worktree, in-process only, dropped WHOLE on ANY event under that tree, never persisted.
view/status.js (BEE-022) computes the quad + ahead/behind for ONE repo; it is the model this memoizes, untouched.fsw.c (JAB-036): fsw.init() one watcher fd, fsw.dir arms a dir, drain packs (wd, len, name) records, wd -1 = kernel overflow; pol.run owns the blocking, so the pager/http loop is where events arrive.shared/cache.js — the per-dir rev tree (an event stamps its dir and every ancestor; revs exist only under a live watcher; arming is lazy and lands on the query) and todo.js:476:4h wtIndex, :629 wtStat, :1009 _memoOn — the consumer shape.$SRC_ROOT/repo-TKT-123, branch TKT-123, submodules populated.mount.js fold of registry lines (BEE-009).index/wts.js scan(): readdir $SRC_ROOT once per run; a dir whose basename is <name>-<tail> for the LONGEST registry name name and which holds a .git (file or dir) is a worktree { name, tail, root }; bee1, bee-BEE022 (no dash) are NOT found, and git worktree list is not consulted (ruling).index/cache.js: the rev tree over fsw — rev(dir) returns the rev stamped on a dir by the last event under it; an overflow or a failed drain bumps the ROOT (everything misses); no watcher ⇒ a fresh token per query (nothing memoizes); arming is lazy, on the query, before the caller computes; recursive over the worktree MINUS .git and gitignored dirs (igno).view/wtstat.js (or inside view/todo.js): per worktree { rev, model }, the BEE-022 status model; a HIT is rev(root) standing still; any event under the tree drops the whole entry (ruling: whole-wt drop, no per-block witnesses).<●> KEY ┄ title <file frame> <commit frame> for a ticket whose code is some worktree's tail; a worktree whose tail is no ticket code lists in a worktrees block of the board.bee todo --plain) computes everything once and memoizes nothing.index/refs.js as status does; a ref move under .git is NOT witnessed (unwatched) — the tip pair is a fingerprint checked on every render, be's tips precedent..git/worktrees reading, no registry edit, no auto-registration (BEE-009)..git is never armed (object churn); gitignored dirs (build/) are never armed, so the watch count stays under the kernel default; a tree too big to arm degrades to "no watcher" for that tree, not to a wrong answer.view/status.js's and is not forked; this ticket adds a memo and a frame renderer, not a second status.$SRC_ROOT naming-convention scan only; own ticket, BEE-025 depends on it.bee http's status page.todo.js:721:4h FRAMEW_FILE 16, FRAMEW_COMMIT 13) or the BEE-022 quad vocabulary per column? Default: be's widths, BEE-022's glyphs.
[v3 v1 v2 v5 !1] and [o2 o1 a1b2c], ASCII canon, POSITION naming the column as the quad's does.index/wts.js scan() over $SRC_ROOT + registry names, longest prefix, .git probeindex/cache.js: fsw init/arm/drain wiring into the pager and http loops, rev tree, overflow → root bump, lazy arming, igno + .git exclusiontips fingerprintworktrees block in view/todo.js; http — landed with BEE-025, the frames on a forked ticket's row and every other worktree in its own blocktest/wts/run.sh: scan fixtures (match, no-dash miss, dashed parent name, non-git dir), rev tree (event drops the wt, sibling stays, overflow drops all, no watcher = no memo), a board row after a wt editfsw.init etc.); verify in quickjab/API.md / jab.md first — if the bundle lacks it, that is a quickjab ticket.$SRC_ROOT and the registry names; the rev tree and the memo do not wait on it.