:todo meta-pair args — render, click, filterPut the meta pairs to work in the ticket views: render Key: value rows nicely, make both halves clickable, and grow the :todo arg grammar so Key:Value filters are first-class args, answered through the TODO-003 index. Builds on the BE-038 board (:todo, :todo TOPIC, :todo TOPIC-123) and the TODO-001 board IO.
Now: Sev: Who: Due: …) registered in todo.metaidx.find(query, opts) is LAZY (scan, index the unindexed, answer) and returns {tickets:[{id,rel,code,file,mtime,meta}], sweep}.Now: carries the state and Sev: the priority, so the header [MARK] grep that views/todo/todo.js filters on is dead — 9 of 837 headers still carry a mark and the board lists closed tickets.[done] buttons — this ticket must compose with those rows, not fork them.The arg line is a topic OR a ticket id, plus any number of Key:Value filter args, in any order. Errors in plain words.
:todo — the board; :todo TODO — one topic; :todo TODO-004 — the page (all unchanged).:todo Now:OPEN — one filter; :todo TODO Now:OPEN — a topic and a filter; :todo Who:gritzko Sev:HIGH — two filters, AND.:todo Now:OPEN Now:DONE. A second colon inside one token is an error in plain words, not a second meaning.Now:* matches any value (presence); Now: matches not-defined-or-empty; a bare key with no colon is an error pointing at Key:*.[A-Z]+-[0-9]+ ticket id, all-caps word topic, Key:Value filter — case alone separates ABC from Ask:.:todo TODO, clicking OPEN gives :todo TODO Now:OPEN, and clicking DONE then gives :todo TODO Now:DONE.todo(key, value) call — that is what makes replacement and the address-bar display expressible (BRO-025).Rev: and See: values (URIs, links) are presence-filterable only, never exact.Now: in the query the board hides Now:DONE and Now:DONT ONLY — Now:STALE and pair-less tickets stay listed (fail-open, as an unmarked header used to).Now: overrides that default, so :todo Now:DONE reaches the closed tickets.find() only — values and titles for DISPLAY come from reading the narrowed tickets, never from the index payload (it is a despaced, decased match token, sometimes only a hash).Sev: values order CRIT > HIGH > MED > LOW per todo; unknown keys and unknown values are legal args — the index is key-agnostic.Sev: order.be list todo costs 2.8 s and still leaves entries unk at the LIST_MAX_WALK ceiling, against 17 ms for a warm index query.shared/lastcommit.js), bounded to the visible rows, cached against the tip — never the per-file weave walk repeated down the list.Key:Value filters, repeat-key OR, Key:* and Key: forms, plain-word errorsNow: default (hide DONE + DONT) and its overridefind(); value+title read-back over the narrowed setNow: default and its overrideverbs/done/done.js writes a header [DONE] mark, not Now: DONE, so the pair and the header can drift — its own ticket.