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
|
## 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 —
|
M7 (reflection): when a session ends, a fourth AI role — the reviewer —
|
||||||
reflects on it, read against your recent sessions, and produces two short
|
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
|
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;
|
background: none; border: none; padding: 0; font: inherit; font-size: 12px;
|
||||||
color: var(--accent); cursor: pointer; text-decoration: underline;
|
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.className = 'band statusband col';
|
||||||
el.innerHTML = `<div><span class="pill">Drift</span></div>
|
el.innerHTML = `<div><span class="pill">Drift</span></div>
|
||||||
<div class="drift-reason">${drift.reason || 'This looks off task.'}</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">
|
<div class="band-actions">
|
||||||
<button id="refocus" type="button" class="btn btn-primary">Back to task</button>
|
<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>
|
<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>Minutes</label><input id="mins" type="number" min="1" value="25">
|
||||||
<label>Allowed apps (comma-separated window classes)</label>
|
<label>Allowed apps (comma-separated window classes)</label>
|
||||||
<input id="apps" placeholder="e.g. code, firefox">
|
<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>
|
<button id="start" class="btn btn-primary" disabled>Start commitment</button>
|
||||||
</div>`;
|
</div>`;
|
||||||
const na = document.getElementById('na'), sc = document.getElementById('sc'),
|
const na = document.getElementById('na'), sc = document.getElementById('sc'),
|
||||||
@@ -254,6 +257,7 @@ function render(state) {
|
|||||||
timebox_secs: Math.round(+mins.value * 60),
|
timebox_secs: Math.round(+mins.value * 60),
|
||||||
allowed_window_classes: (document.getElementById('apps').value || '')
|
allowed_window_classes: (document.getElementById('apps').value || '')
|
||||||
.split(',').map(s => s.trim()).filter(Boolean),
|
.split(',').map(s => s.trim()).filter(Boolean),
|
||||||
|
enforce: document.getElementById('enforce').checked,
|
||||||
});
|
});
|
||||||
document.getElementById('sharpen').onclick = () => {
|
document.getElementById('sharpen').onclick = () => {
|
||||||
const intent = document.getElementById('intent').value.trim();
|
const intent = document.getElementById('intent').value.trim();
|
||||||
|
|||||||
Reference in New Issue
Block a user