bee todo — the ticket board over one repo or all of themPort be's read-only ticket board (be/views/todo/todo.js, BE-038, TODO-004) to bee: bee todo is the open-ticket board, bee todo GET one topic, bee todo Sev:HIGH a filter, every row a click to see KEY. The root is todo/ of the CONTEXT repo (BEE-023); with NO context and no local todo/ the board is EVERY registered repo's todo/, open tickets NEWEST FIRST (ruling gritzko 2026-08-19). Now:/Sev: come off the BEE-024 lane. The worktree frames, the scan and the watcher are BEE-027; keeper and the [go]/[done] buttons stay out.
be/views/todo/todo.js (1389 lines) — portable as-is: shape/ticketKey/keyTopic (:138-:177 tables PRIO, HIDDEN, STATES), pageFile ladder (thin TOPIC-123.mkd / fat TOPIC-123/README.mkd), pageHead, stripMark, listTopic/listTopics (:355, :425), nest() for Sub: families (:649), byCode/byFresh (:256, :337), dateRows (:314).snapshot/query over be's metaidx (:192-:233 — becomes BEE-024 find), freshRepo/tipBlob over the store (:272-:294 — becomes the REV-CMMT rows + a wt stat), runReset/runClose/wtIndex and everything from :459 to :640 (worktree half), the THEME BTN_TAG buttons (:730).bee see BEE-022 opens a ticket from either tree through the door's six spellings (BEE-017); a row click spells see KEY, so NO ticket view is needed (be's TODO-011 split is moot here).door.js:42 VERBS takes (arg, opts) -> hunks; the pager's U follower and http's href both go through openTarget.index/mount.js list() — the registry as a mount table, the fan-out the all-repos board walks.be/test/todo/{meta,nav,rows,sort} (check.js + run.sh each), click; ci, go, igload, pathreuse, rowcache, view are worktree-side and do not port.view/todo.js + the todo row in door.js VERBS: todo (board), todo TOPIC (list), todo Key:Value / Key:* / Key: (filter, AND across keys, OR within a key's repeats), todo TOPIC Key:Value (both); a miss is one line + throw, todo: <arg>: TODONONE.<context>/todo/ when the context repo has one; else, with no //name context, the union of <root>/todo/ over mount.list(), each row prefixed by its repo name where the board mixes repos.Now: OPEN (or no Now: and no closed header mark, the legacy fallback); Sev: paints the bullet — CRIT red, HIGH salmon/orange, MED plain, LOW dim — via the view/theme.js slots the status view already uses.byFresh); dateRows date separators ride along.<●> KEY ┄ title, Sub: families nested with the RAIL; the row's U span is see KEY, a topic header's is todo TOPIC, an inline Key:Value is todo Key:Value (TODO-008 click).render/html.js; bee todo --plain stays greppable KEY title lines.done/go, no keeper, no write to any ticket; the worktree column and the [..] buttons do not exist here.Key:Value, the uc ucnum* "-" dgt+ ticket-code rule stays lexical), never by path probing.todo/TOPIC/TOPIC-123.mkd or todo/TOPIC/TOPIC-123/README.mkd; todo/done/ never lists; attached files never list.todo/ -> ALL registered repos, newest first; no //<name>-journal guessing.ticket view — see KEY is the page, the board is the only new verb.$SRC_ROOT scan.Now: opens a ticket.todo/ (bee //linux todo, /bee/todo over http) falls back to the all-repos board; the refusal that landed first (todo: //<name>: no todo/) is gone.Now: STALE does not open — be's own HIDDEN set is wider.Sub: rails; rails need the code order.see KEY.kv.find grew ONE option, opts.rows: the matched files' cells ride back with them, so one query per repo per run answers the open test, the OR'd clauses and the Key: absences alike.view/todo.js: lexer + tables + pageFile ladder + pageHead (portable half of be's file), opts.from-rootedkv.find; the all-repos fan-out over mount.list()byFresh over REV-CMMT commit time + wt stat; dateRowsU spans; door.js VERBS.todo; httptest/todo/ fixture repo (a todo/ with thin + fat tickets, Now:/Sev:/Sub: spread) and rows, sort, meta, nav, click suites ported; an all-repos case over two fixture reposREADME.mkd usage row; INDEXES.mkd consumer note//name context; the ambient repo and the all-repos fan-out do not wait on it.