5342da2755
The planning view renders a quiet line for the standing-profile state (loading/grounded/absent/unreadable) with a "change" affordance to repoint the file via POST /knowledge/path. The profile text never reaches the browser — only status, path, and size. Also updates the README Status section to describe the M6 knowledge port. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
65 lines
3.0 KiB
Markdown
65 lines
3.0 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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`).
|