Add the enforce toggle and drift-band minimize note
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -73,6 +73,7 @@ function updateActiveDrift(state) {
|
||||
el.className = 'band statusband col';
|
||||
el.innerHTML = `<div><span class="pill">Drift</span></div>
|
||||
<div class="drift-reason">${drift.reason || 'This looks off task.'}</div>
|
||||
${drift.enforced ? '<div class="enforce-note">Off-task window minimized.</div>' : ''}
|
||||
<div class="band-actions">
|
||||
<button id="refocus" type="button" class="btn btn-primary">Back to task</button>
|
||||
<button id="ontask" type="button" class="btn btn-ghost">This is on task</button>
|
||||
@@ -242,6 +243,8 @@ function render(state) {
|
||||
<label>Minutes</label><input id="mins" type="number" min="1" value="25">
|
||||
<label>Allowed apps (comma-separated window classes)</label>
|
||||
<input id="apps" placeholder="e.g. code, firefox">
|
||||
<label class="enforce-toggle"><input id="enforce" type="checkbox"> Enforce focus</label>
|
||||
<p class="hint">Minimize off-task windows when you drift.</p>
|
||||
<button id="start" class="btn btn-primary" disabled>Start commitment</button>
|
||||
</div>`;
|
||||
const na = document.getElementById('na'), sc = document.getElementById('sc'),
|
||||
@@ -254,6 +257,7 @@ function render(state) {
|
||||
timebox_secs: Math.round(+mins.value * 60),
|
||||
allowed_window_classes: (document.getElementById('apps').value || '')
|
||||
.split(',').map(s => s.trim()).filter(Boolean),
|
||||
enforce: document.getElementById('enforce').checked,
|
||||
});
|
||||
document.getElementById('sharpen').onclick = () => {
|
||||
const intent = document.getElementById('intent').value.trim();
|
||||
|
||||
Reference in New Issue
Block a user