Views recompute fs-derived state on every render; a todo re-render in the resident pager pays ~2.6 s of classifyMerge over 88 wts + 81 subs. Ruling gritzko 2026-08-04: replace BRO-043's per-repo value buckets with ONE cheap universal change witness — a rev tree like { "be": { rev: 3, sub: { "core": { rev: 2 } } } }: one shared counter, any fsw event increments it and stamps the event's dir AND every ancestor up the tree. shared/cache.js stores no view values anymore; each consumer keeps its own memo and compares the subtree rev it saw. Bigger views (todo, work) can then track many spots and skip recompute where the rev stands still.
JAB-032 landed (jab ed75d4ce): fsw.dir returns a real signed wd and every drained record carries it, so ONE watcher fd serves the whole tree with a wd→dir map doing attribution — cache.js's one-fd-per-repo trick is dead weight now.
be todo tty profile 2026-08-04: classifyMerge top ~0.9 s + mounted subs 1.7 s (hash-unstamped 716 + 529 ms inside those); the board itself 76 ms.wd === fsw.OVERFLOW (-1) = the kernel dropped events; a drain Buf too small for the burst is the SAME fact; kqueue names are "" = rescan-this-dir; fsw.unwatch leaves the kernel watch alive (ABC-013), unclaimed wds keep firing — ignore them.The module shrinks to the rev tree; values move out to the consumers.
start(root), poll(), rev(path) — arm lazily on the first query, answer the spot's rev (a live-watcher token when unarmed) — plus bumpRoot(), stop(), stats(); take/peek/drop/dropAll and the per-repo buckets GO AWAY.R/r maps to bumpRoot() (pager.js:568).start → rev() says so and every consumer recomputes; a missed event is never read as truth.{rows, state, rev} memo; the state fingerprint STAYS — shard refs move below .be/ (unwatched, object dirs churn), revs cannot witness them.rev(wtDir); gate foldSubs on the sub boundary's rev — the "cheap dirty probe" from the 2026-08-04 profile, item 2..be/ re-admitted, everything below it ignored — exactly as today.fsw.dir returns a nonzero wd); a stale jab = stop and report, never improvise.rev() hands out a FRESH never-repeating token, so a plain === compare always recomputes; a pre-JAB-032 jab (wd=0) yields tokens only, never an unwitnessed rev.bumpRoot() stamps EVERY spot; the arming walk re-runs only when that spot's own rev moved..be/) can leave a stale ahbeh count on the board until something under the wt changes — status.js's state fingerprint has no twin here; ticket candidate."skip" into the arming walk means changing classify.wtWalk itself (shared with wtScan) — left alone, ticket candidate.~/bin/jab (07:38) must be updated to a JAB-032 build before the suite is run against it.//STATUS-019/ (nothing committed): shared/cache.js (rev-tree rewrite), views/status/status.js, views/todo/todo.js, views/bro/pager.js (R/r → bumpRoot), test/cache.js, test/status/cache/drive.js.todo board showed per-wt hits with only the written wt's row moving.STATUS-019: per-dir rev tree replaces the view cache