lite/ has three output modes — plain, color (tty), html — over one good hunk model, but the axes are tangled: color exists only inside the pager (no ANSI-to-pipe), the plain leg is five hand-rolled copies in main.js (runPlain/runLog/runCommit/runDiff/runView), verbs return four different shapes (rows, text+hunks, hunks, hunks+plain/bytes), and bro.js mixes hunk building, row geometry, the ANSI painter and the plain sink in one file, with TOK_TAG and banner chrome mirrored again in html.js. Target: N views x 3 renderers with no pairwise code, a new renderer = one file in render/.
The current seams, mapped 2026-08-15 on the main tree lite/:
{uri, kind, text, toks}; all three sinks already consume it without re-reading a byte (plainHunk bro.js:334, cellAnsi bro.js:122, hunkHtml html.js:119); theme.js single-sources every colour number.openTarget/seatOf/VERBS in main.js serve CLI args, pager clicks and serve links alike.plain escape hatch sits at two levels: per-hunk hunk.plain (diff weave) vs per-view out.plain (list/tree rows).Views and renderers become orthogonal axes; the tree says which is which.
index/ lane+ODB readers only; view/ one module per verb -> {hunks}; render/ = theme.js wrap.js plain.js ansi.js html.js, each render(hunks, opts) -> bytes, verb-blind; door.js the one openTarget/seatOf/VERBS table; pager.js and serve.js top-level apps pinned to ansi/html.{hunks}, hunk = {uri, kind, text, toks, plain?, land?}; log rows, commit meta text and list/tree out.plain become ordinary hunks; per-hunk plain stays as the ONE escape hatch.--plain, --color (the missing ANSI-to-pipe leg, falls out free), --html; the five bespoke plain legs collapse into one runVerb(verb, arg, renderer).build* hunk makers -> view/fs.js, geometry (indexRows/rowEnd/landAt/tokSpanAt) -> render/wrap.js, painter -> render/ansi.js, plain sink -> render/plain.js; the html.js TOK_TAG/banner mirror dies.ansi.paintRow(hunk, span); serve calls html.render with its link resolver; both navigate through the door only.//LITE-045 (clone ///lite/ per /meta/work); no VC ops; suites green under a fresh quickjab (LITEJAB=, stale ~/bin/jab lacks git.getTreeDiff).--color/--html legs.The reorg is stepwise, cheapest-risk first; every step ends with all suites green and the golden bytes identical. Steps:
{hunks} (log/commit/list/tree reshaped, out.plain/out.bytes retired into per-hunk plain); main.js's five plain legs collapse into one runVerb; goldens byte-identical.render/plain.js, render/ansi.js, render/wrap.js and view/fs.js; update requires; bro.js deleted.TOK_TAG/chrome mirror deleted); mark/ embeds unchanged.openTarget/seatOf/splitRef/VERBS move out of main.js; pager.js and serve.js re-point; main.js is dispatch + mode pick only.index/ -> view/; index/ keeps the readers (index.js, read.js, resolve.js, weave.js, perma.js, hook.js).--color (ansi.render to a pipe) and --html, one flag scan in main.js; new tests pin both.{hunks} contract, one runVerb, goldens identical--color + --html legs with testslite/index/index.js, lindex.js, list.js and lite/.be were
all rewritten at 15:30:07 (after the 14:54 baseline the brief was cut
against); the new index.js writes .lite.idx lanes (IDX_EXT,
index/index.js:68) while the landed suites pin the LITE-044 .lite2.idx
format — so on the UNTOUCHED tree, under a fresh packed quickjab, the
baseline is 18/24 suites green with SIX failures, not the three known
ones: diff 1/34 + pager pty 1/33 + rst 1/92 (expected) PLUS first 1/18
("the bare run built no index"), index 1/129 ("the run family lives in
<repo>/.git/be/"), list 2/85 (LITE-044 leg 1b: old lane survived, no
new-format lane). A live .INDEXES.mkd.swp in lite/ suggests an editing
session is mid-flight in the very dir step 6 reorganises. Golden capture
against this moving baseline would pin the wrong oracle, and no step could
end suites-green, so per the brief: stop, no reorg edits made. Needs
gritzko's call: land/finish the .lite.idx rename (or revert it) so the
tree is green-modulo-3, then LITE-045 restarts at step 1..lite2.idx leftovers were cleared, the untouched tree measured 21/24 green with exactly the three known fails, and all seven steps then landed on it.All seven steps landed on the main tree, uncommitted; 22/24 suites green, the 3 known pre-existing fails unchanged (diff 1/34 "a non-repository is refused", pager pty 1/33, rst 1/92 LITE-043 autolink). Golden bytes IDENTICAL after every step.
index/ = 8 lane+ODB readers; view/ = fs + the 7 verb views, each (arg, opts) -> {hunks}; render/ = theme/wrap/plain/ansi/html, every one verb-blind; door.js; apps main.js pager.js serve.js merge.js chat.js.view/bro.js deleted, html.js's tok32 mirror deleted, the five plain legs are one runVerb, one flag scan + one mode pick (MODES/renderOf).bare — "this hunk IS the answer, not an excerpt" — because byte parity needs the hunk <uri> band on a path/diff hunk and NOT on a cat/log/list one, and plain (the body escape hatch) cannot say which. Ask if a different spelling is wanted.--color (unclamped, one row per logical line — a pipe has no width to lose bytes to) and --html (self-contained page, stylesheet inline). New suite test/render/ (59 checks); goldens cover both.LITE-045: views make hunks, render/ makes bytes$HOME/tmp/LITE-045/ (goldens.sh, check.sh, rebuild.sh, runsuites.sh, goldens/), NOT in the tree — the brief put scratch there.