From 9dd0bb934ef800c2cab65cc64eee9132539a1654 Mon Sep 17 00:00:00 2001 From: Felix Martin Date: Sun, 31 May 2026 18:11:42 -0400 Subject: [PATCH] Wire the semantic nudge into the daemon and document M3.5 Co-Authored-By: Claude Opus 4.8 --- README.md | 9 +++++++++ cmd/antidriftd/main.go | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 951c76c..38d20ea 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,15 @@ go test ./... ## Status +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 diff --git a/cmd/antidriftd/main.go b/cmd/antidriftd/main.go index d94a189..6d9e2f7 100644 --- a/cmd/antidriftd/main.go +++ b/cmd/antidriftd/main.go @@ -41,7 +41,8 @@ func main() { svc := ai.NewService(backend) ctrl.SetCoach(svc) ctrl.SetDriftJudge(svc) - log.Printf("ai: %s backend (coach + drift judge)", backend.Name()) + ctrl.SetNudge(svc) + log.Printf("ai: %s backend (coach + drift judge + nudge)", backend.Name()) } src := evidence.NewSource()