- TaskStore.watch() now initializes lastPollTime so the first
checkForChanges() poll filters by "modified since now" instead of
doing an unfiltered SELECT * and emitting a task:updated event for
every cached task. On a 1200-task board this dropped ~60 MB of SSE
traffic and a 1199-call setState storm one second after dashboard
startup.
- listTasks() gains a column option so callers can filter in SQL.
- dashboard CLI auto-merge sweeps (startup + 2 unpause handlers + the
15s periodic retry) now use listTasks({ column: "in-review" })
instead of pulling the full table on every cycle.
- self-healing archiveStaleDoneTasks() uses slim listTasks — it only
needs id/column/columnMovedAt to decide staleness.
- Document the listTasks() perf contract and the watch() polling
invariant in AGENTS.md and project memory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>