8d823000d1
- digest queue no longer dropped on failed dispatch (retry next tick) - collapsed reminders marked fired/rescheduled only after digest delivers - /tools step-up gate skipped when WebAuthn is not configured (was 403 forever) - passkey credential store rolls back memory on persist failure - auth_test fake updated for TickTrace (branch build break) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ASstMtsZWLSRcD1Tq8T68Q
6.6 KiB
6.6 KiB
Overnight Session — 2026-07-05
Branch: overnight-jul5 (from infra/spine-migrations-encryption-mavweb)
Architect: .opencode/agent/architect.md
Phase 0 — Setup
- Branch
overnight-jul5created frominfra/spine-migrations-encryption-mavweb .opencode/agent/architect.md— orchestrator agentSESSION-05-07-2026.md— this file
Phase 1 — Housekeeping
| # | Task | Commit | Status |
|---|---|---|---|
| 2 | Makefile hygiene — -race -coverprofile in make test, add build-caldav target |
b9248ef |
done |
| 3 | db_key.env hygiene — remove live key from repo, add to .gitignore, keep .env.example |
already-done | done |
| 4 | Passkey persistence — store credentials on disk (JSON file) instead of in-memory map | 44807b6 |
done |
Notes:
- Live AES-256 key in
deploy/db_key.envmust be removed from git history. Rotate after.
Phase 2 — Test Coverage Gaps
| # | Task | Commit | Status |
|---|---|---|---|
| 5 | mavcaldav tests — cmd/mavcaldav/ (314 lines, 0 coverage). CalDAV polling, iCal parsing, value-change filtering |
6daa96b |
done |
| 6 | mavttsd tests — cmd/mavttsd/ (Piper handler). TTS worker protocol round-trip |
a80b919 |
done |
| 7 | voicesink tests — internal/delivery/voicesink/. Voice channel dispatch, ErrNoSession mapping |
ffef44f |
done |
| 8 | mavweb tests — extend to cover main.go routes (server setup, template parsing, route registration, startup flags) |
185f4f5 |
done |
Notes:
- mavweb
handlers_test.goexists (14 cases). The gap is the non-handler code inmain.go(549 lines) andwebauthn.go(213 lines). - voicesink has 0 tests but is critical — it's the bridge between delivery routing and voice sessions.
Phase 3 — Easy Features (from feature ranking)
| # | Task | Commit | Status |
|---|---|---|---|
| 9 | Command history — read-only query over existing facts. New endpoint or /dash section | f8ba396 |
done |
| 10 | Revert / undo — void the latest row for a fact key. Wrapper around existing append-only void mechanism | a02e10f |
done |
| 11 | Stale-reminder burst collapse — digest overdue reminders on boot instead of firing all at once. Cosmetic: group into a single notification | ca081ce |
done |
Notes:
- Command history: the data is already there (
RecentFacts). This is exposing it better. - Revert:
internal/storealready supports voiding (VoidFact). This is a thin API + confirm gate. - Burst collapse: the
DueRemindersquery ininternal/store/reminders.goalready returns all pending due reminders. The fix is ininternal/loop/gather.goto collapse them.
Phase 4 — Doable Features
| # | Task | Commit | Status |
|---|---|---|---|
| 12 | Recurring reminders — cron+next_fire_ts cols, RescheduleReminder, dispatcher logic | 1eca17f |
done |
| 13 | Capability model — scope column on tools table, migration, UI, tests |
6b80fd0 |
done |
| 14 | Notification batching/digest mode — in-memory queue, configurable window/max_items/severity_ceiling | 354990f |
done |
| 15 | Rule trace/explanation engine — ExplainTick/ExplainGate, TickTrace IPC, daemon cache | 2689db1 |
done |
| 16 | Backup/restore automation — scripts/maven-backup.sh with backup/restore/verify/list | 3f09cdb |
done |
Notes:
- Recurring reminders: needs schema migration (#1). Add
cron TEXTandnext_fire_ts INTEGERto reminders table. - Capability model: ranking says "cheap now, expensive to retrofit once tools surface passes ~15 entries."
- Rule trace: the data is ephemeral — can log predicate results per tick to a ring buffer or a
rule_evalstable.
Phase 5 — Web UI Re-imagination
| # | Task | Commit | Status |
|---|---|---|---|
| 17 | In-process auth gate for /tools — local PasskeySession check on POST, returns 403 if unasserted | 5afff00 |
done |
| 18 | Digest / notification history UI — /notifications page with recent nudge history | 5c34fb1 |
done |
| 19 | Rule trace page — /trace route showing predicate eval results per rule per tick | 85013f7 |
done |
| 20 | Command history page — new /history route showing recent facts/commands |
f8ba396 |
done |
| 21 | PWA icons — SVG icon + manifest.json icons array | 00a3bba |
done |
| 22 | Language unification — bilingual cheatsheet with RU/EN toggle in nav + ?lang= param | c225ba3 |
done |
Notes:
- In-process auth gate added for POST /tools (
5afff00). Digest UI (#18) depends on #14; trace page (#19) depends on #15. - PWA manifest currently has
"icons": []— no icons, mobile add-to-home-screen shows a blank tile.
Phase 6 — Final Pass
| # | Task | Commit | Status |
|---|---|---|---|
| 23 | Run make test with race detector — fix any races |
ccb1d78 |
done |
| 24 | docker compose build — verify all six daemons compile |
ccb1d78 |
done |
| 25 | Final review pass — check for debugging artifacts, commented code, TODO stubs | ccb1d78 |
done |
Cross-reference: feature ranking → this session
| Ranking item | Session task |
|---|---|
| Infra #2 (mavweb/mavcaldav tests) | #5, #8 |
| Easy: command history | #9 |
| Easy: revert/undo | #10 |
| Easy: capability model | #13 |
| Easy: stale-reminder collapse | #11 |
| Doable: recurring reminders | #12 |
| Doable: passkey persistence | #4 |
| Doable: backup/restore | #16 |
| Doable: testing infra | #2 |
| Doable: rule trace/explanation | #15 |
| Doable: notification batching/digest | #14 |
Caveats & Gotchas
- Destroy-confirm policy is listed as "mandatory" in ranking but already shipped in tool executor (PROGRESS.md confirms). No action needed.
- Quiet-hours definition is listed as "mandatory" but already shipped (
3623305). No action needed. - At-rest encryption is listed as infra #1 in ranking but already done (
047a813). No action needed. - Schema migrations —
migrations.goexists and is wired. Any new schema change (recurring reminders) uses it. - Docker is already deployed and build-tested (commits
04c8dd1–7683a9b). The "not build-tested" comment in Dockerfile is stale. - Systemd is explicitly replaced by Docker per commit
04c8dd1: "Chosen Docker over interim systemd units." - Race detector may surface pre-existing races in the IPC or worker packages — fix them but don't scope-creep into a full refactor.
- Passkey persistence has a chicken-and-egg problem with cold-start unlock (needs passkey to unlock, passkey needs re-enroll after restart). Fix just the mavweb credential storage; the cold-start unlock flow is a separate feature.