main injects the AI service as the reviewer alongside the other roles. A web test drives a session to Review and asserts the recap rides the state payload, then to the next Planning and asserts the carry-forward does too. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
AntiDrift
A personal focus operating system: treat each work session as an explicit commitment (next action, success condition, timebox), and make drift visible.
This is the Go reimagining. The original Rust implementation is preserved under
legacy/ for reference. See docs/superpowers/specs/ for the design.
Run
go run ./cmd/antidriftd
The daemon serves a local web UI at http://localhost:7777 and opens your
browser. State is persisted to ~/.antidrift/state.json.
Test
go test ./...
Status
M6 (knowledge port): the planning coach now sharpens intents against who you
actually are. A single profile file (~/.antidrift/knowledge.md, overridable
via ANTIDRIFT_KNOWLEDGE_FILE) holds your standing context — priorities,
values, what counts as good work — and the daemon loads it asynchronously on
entering planning, mirroring the tasks fetch. The cached text grounds the AI
coach prompt only; the drift judge and nudge are untouched, and the profile text
never crosses the wire. A subtle planning-screen indicator shows whether the
profile loaded and from where, with a "change" affordance to repoint at another
file. It degrades gracefully — a missing, blank, or unreadable file just leaves
the coach ungrounded, and planning still works.
M3.5 (semantic nudge): the drift interceptor catches the wrong app, but not the wrong work inside a right app. M3.5 adds a third, ambient AI role that — only while you are on-task in an allowed app — periodically reads your recent window titles and, if the trajectory has wandered from the commitment, shows a soft, dismissible "Heads up" line (no interrupt, no buttons to fight). It is debounced to roughly one check every five minutes, reuses the same CLI backend as the coach and drift judge, and degrades gracefully — without it, everything else still works.
M3 (drift interceptor): while a commitment is Active, the daemon watches the focused window. A cheap local match against the session's allowed window classes is authoritative for on-task; only unmatched windows are sent to the LLM drift judge (debounced and cached per class, run asynchronously). When it judges you off-task, the active view shows a dismissible interrupt: "Back to task", "This is on task" (which adds the app to the session's allowed list), or "End session". The drift judge degrades gracefully — without it, local matching still runs.
M2 (AI planning coach): in the Planning view, a rough intent is "sharpened"
into a structured commitment (next action, success condition, timebox) by an
LLM CLI backend (claude or codex, selectable via ANTIDRIFT_AI_BACKEND). The
coach runs asynchronously and degrades gracefully — manual planning always
works.
M1 (evidence & audit): active-window tracking, two-tier evidence store
(disposable per-session raw log + permanent hash-chained session summaries),
and live SSE updates. Live drift judgment and the ambient nudge arrive in later
milestones (see the roadmap in
docs/superpowers/specs/2026-05-31-go-focus-os-design.md).