diff --git a/README.md b/README.md index ef66101..8f1ae36 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,13 @@ go test ./... ## Status +**M8 (Tier A) — Enforcement (window-minimize).** Drift finally costs something. +A planning-screen "Enforce focus" toggle arms the new `enforce.Guard` port: when +the drift judge confirms the active window is off-task, the daemon minimizes that +window (native X11, no `xdotool`). It is unprivileged, per-session (the chosen +enforcement level rides the snapshot), and degrades to today's advisory behavior +when off, unwired, or on a platform without the X11 adapter. + M7 (reflection): when a session ends, a fourth AI role — the reviewer — reflects on it, read against your recent sessions, and produces two short lines: a recap shown on the Review screen, and a carry-forward takeaway that diff --git a/internal/web/static/app.css b/internal/web/static/app.css index 8be65b2..ea4bf6e 100644 --- a/internal/web/static/app.css +++ b/internal/web/static/app.css @@ -124,3 +124,7 @@ input:focus { outline: 0; border-color: var(--accent); } background: none; border: none; padding: 0; font: inherit; font-size: 12px; color: var(--accent); cursor: pointer; text-decoration: underline; } + +.enforce-note { opacity: 0.8; font-size: 0.85em; } +.enforce-toggle { display: flex; align-items: center; gap: 0.4em; } +.hint { opacity: 0.7; font-size: 0.85em; margin: 0.2em 0 0.6em; } diff --git a/internal/web/static/app.js b/internal/web/static/app.js index 8117ab2..fe6cae3 100644 --- a/internal/web/static/app.js +++ b/internal/web/static/app.js @@ -73,6 +73,7 @@ function updateActiveDrift(state) { el.className = 'band statusband col'; el.innerHTML = `
Minimize off-task windows when you drift.