Exercises the generation/left-planning guard in startTasksFetchLocked
via the fakeProvider gate: a fetch in flight when its generation is
superseded must not clobber the current tasks state.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The controller fetches the Marvin task list when entering planning,
mirroring the planning coach: generation-guarded goroutine, status enum
(idle/pending/ready/error), projected into State only while planning and
only when a provider is set. nil provider degrades to no tasks view.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The tasks.Provider port answers "what should I be doing?". The Marvin
adapter shells out to ampy's `am --json` and parses today's open tasks,
dropping done/empty-title entries. Leaf package mirroring ai.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A window-manager status bar can now read a single-line status file: a
glyph plus minutes-remaining (● 24m / ⚠ DRIFT 24m / ● 24m ·? / ◔ planning
/ ✓ review), empty when idle. Rewritten on a one-minute tick, only when
the line changes, and removed on shutdown. Degrades to no file if $HOME
is unresolvable.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A soft nudge advisory belongs to one continuous on-task stretch in an allowed
app. Guard it with an on-task-stretch epoch (advanced on session reset and on
any non-on-task-match observation) instead of a session-only counter, and clear
the advisory on leaving the allowed app, so a stale 'Heads up' never resurfaces
after a drift episode.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Addresses code-review follow-ups: codex now returns a specific error when
its -o file is empty rather than degrading to ErrEmptyResponse downstream;
CLI errors omit a dangling stderr suffix when stderr is empty.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rewrite TestFakeSourceEmits to synchronize through a channel (it now
asserts emission instead of racing on a shared slice and discarding it).
Skip the live X11 smoke test under -race: xgbutil's event loop has an
internal Quit/Quitting race on shutdown that is never reached in
production (Watch runs under a never-cancelled context.Background()).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>