Roadmap
Active plan. Completed Tracks A–H / M1–M4 live in History.
Constraints (locked)
Section titled “Constraints (locked)”- Interactive TUI (default) + positional-query non-interactive filter (fzf-compatible).
- Single-box syntax: bare words fuzzy-match;
key:valuehard-filter; AND-combined. - Unified normalized model, not strict per-format keys.
- No persistent index, no daemon, no
cgoby default. - Budgets: 5–10k files, cold
scan+parse<500ms, per-keystrokequery+rank<50ms.
Now (P0 — indexless perf, must hold budgets)
Section titled “Now (P0 — indexless perf, must hold budgets)”- T1: Benchmark + profile current path. 5k synthetic-file corpus; measure cold
scan+parseand per-keystrokequery+rank; CPU profilesearch.scoreDoc(fuzzy.Findper doc per word vs wholeSearchBlob). Acceptance: numbers + p50/p95 in PR; bottleneck confirmed or refuted. - T2: Indexless rank optimization. Cache lowered
SearchBlob/tokens at parse time; avoid per-doc filter-map rebuilds; early-exit bare-word AND; reuse query parse per keystroke. Acceptance: T1 corpus meets <50ms/keystroke with no behavior change (go test ./...green). - T3: Facet pre-index (roaring bitmaps). Pre-build
value → bitmapfortag/type/status+ hot custom keys;MatchesDocbecomes bitmapAnd/AndNotbefore fuzzy scoring. Acceptance: filter-only queries scale with result size, not corpus size; generickey:valuestill falls back tolookupField.
Next (P1 — only pay if T1/T2 miss)
Section titled “Next (P1 — only pay if T1/T2 miss)”- T4: Fuzzy-core bake-off. Compare
sahilm/fuzzy(current) vslithammer/fuzzysearchvssajari/fuzzy(SymDelete) on recall + latency over real titles/bodies. Acceptance: matrix + keep/swap decision; no swap without TUI blind-test win. - T5: Persistent-index spike (gated). Prototype behind a flag: (a)
bleveNewMemOnlydynamic mapping, (b)bluge, (c) SQLite FTS5 (moderncvscgo). Compare binary size, cold-start, query latency, fuzzy+facet parity per Backend Evaluation. Acceptance: decision record + throwaway branches only; no new default dep. - T6: Scan hardening. Implement
RespectGitignore(currently ignored,internal/scan/scan.go:31) + parallel file load. Acceptance: gitignored files excluded unless--no-ignore; 5k cold scan still <500ms.
Later (v2 — language + display)
Section titled “Later (v2 — language + display)”- T7: Query v2.
|alternation within a token group, negation beyond tags, per-field boosting. Acceptance: Query Syntax updated + table tests. - T8: Facet counts + highlighting. Expose facet counts to TUI/
--format jsonand match-fragment snippets. Acceptance: works indexless; aligns with T5 API if an index lands.
Delivered
Section titled “Delivered”- T9: mdtask-compatible task CLI + TUI.
mdfu task(list,view/show,open,move,set,ids,archive,validate,install-skills) plusmdfu tasksfor an interactive TUI, matching the externalmdtaskformat (checkbox headers,#tag/!priority/@key:valuemetadata,@blocked_by,.mdtaskrc/.mdfurcconfig) and command surface; see Tasks and Tasks TUI. Acceptance: engine, CLI, and TUI tests green (go test ./...);mdfu tasksfalls back tomdfu task listwhen stdout is not a TTY.
Working agreements
Section titled “Working agreements”internal/modelis the shared contract — changes need cross-package sign-off.- Each task:
go build ./... && go test ./...green before merge.