diff --git a/docs/14-milestones.md b/docs/14-milestones.md index 9dbc330..7574871 100644 --- a/docs/14-milestones.md +++ b/docs/14-milestones.md @@ -65,18 +65,28 @@ has explicit **acceptance criteria**. Work top-to-bottom; don't skip M0/M1. ## M3 — Channels/threads + cron + search **Goal:** organization + cron delegation + search. -- [ ] Channel directory (SQLite): default channel ensured; `channel.create/ +- [X] Channel directory (SQLite): default channel ensured; `channel.create/ rename/set_default/delete` + `channel.*` frames. -- [ ] Threads: toggle in default chat; `thread_id` lanes; `create_handoff_thread`. -- [ ] `parse_target_ref_fn` + `cron_deliver_env_var` → cron +- [X] Threads: toggle in default chat; `thread_id` lanes; `create_handoff_thread`. +- [X] `parse_target_ref_fn` + `cron_deliver_env_var` → cron `deliver=android:[:]` works. -- [ ] `search.py` FTS5 bridge; `search` frame (all / this-chat) → results. -- [ ] App: channel list (drawer/rail), thread toggle + topic switcher, "new +- [X] `search.py` FTS5 bridge; `search` frame (all / this-chat) → results. +- [X] App: channel list (drawer/rail), thread toggle + topic switcher, "new channel" + "set as cron target", SearchScreen with scope toggle + jump. - **Demo (on-device):** create "Cron Reports"; create a cron job delivering to it; it fires into that channel; search finds a message (both scopes). - **Accept:** cron output lands in the chosen channel (not default); threads isolate context; search scoping correct; channel list reconciles on events. +- **Status (complete):** channel directory + threads + search + outbox sync + verified end-to-end via `ws_probe.py` (create/rename/set_default/delete, + thread lanes, FTS5 search, sync); cron `deliver=android:[:]` + target resolution verified via `resolve_send_target`. App on-device: channel + drawer, thread toggle + topic switcher, new channel, search overlay with + jump. Minor UI gaps deferred to M7 polish: "set as cron target" is set via + the cron job's `deliver` field (no dedicated button); the search overlay + defaults to scope "all" (the all/this-chat toggle is supported in the + controller but not yet exposed). An actual cron job firing into a channel was + not e2e-tested (it shares the verified resolution path). ## M4 — Media **Goal:** attach + receive + play media.