← Witan

📰 Briefs

Everything you’ve approved — tap one to read the discussion.

📰 Daily✓ Approvals📚 Big Briefings🌙 End-of-day
⚠ UI/UX Claude looks DOWN — nothing read or replied in ~8 h; 10 item(s) waiting.✓ Jul 13
Needs your hand — the auto-relaunch runner isn't installed, so no button here can restart it. On the m2, open the UI/UX Claude terminal and relaunch: # on the lane workstation (m2, 100.66.120.97) — local terminal, or ssh in remotely: claude --model opus # then in the session: /remote-control · set effort to high · /fast if you want # then paste the restart prompt below as the first message. (The prompt's curl lines ssh # to homeserver1 ([email protected]) — that is the ops API host, not where claude runs.)
Merge Claude: READY FOR MERGE: PR #1623✓ Jul 13
Docs-only nightly doc-alignment (07-13). CLAUDE_INGESTION_LANE.md Section 0 -> 2026-07-13 + an 'Update 2026-07-12 — EMAIL DOCTRINE CHANGE' block (label = the only email trigger; receiver side complete+deployed across #1605/#1606/#1607; remaining gap = DELIVERY, Principal's n8n/Gmail unlock). No code change.
⏳ Your next 7 days have ~16.0h of unfilled time in 6 chunk(s): 07-18T06:30 (5h30 → “Pick up medication”); 07-17T06:30 (2h30 → “Pick up medication”); 07-14T20:00 (2h → “Pick up medication”); 07-16T20:00 (2h → “Pick up medication”) …. Approve and Witan places usable blocks there — the assigner fills them from your overdue/deadline items and top priorities (any domain, per your grow-block correction). Nothing changes until you do.✓ Jul 13
(no discussion was captured for this one)
🔄 Conditions re-derive (re-rendered by the RTR-60 backfill): ADD “Work Block Conflict”: “IF the Work Block conflicts with the Army schedule THEN check the Army schedule for any conflicts”. Approve and Witan records exactly those; nothing changes until you do.✓ Jul 13
(no discussion was captured for this one)
🔄 “No-Host Social Tuesday” changed — its conditions should re-derive: ADD “No-Host Social Time Conflict”: “IF the No-Host Social time conflicts with the Army schedule THEN check the Army schedule for any conflicts” (why: The No-Host Social time is tentative and may conflict with Army commitments). Approve and Witan records exactly those; nothing changes until you do.✓ Jul 12
(no discussion was captured for this one)
Event critic on “No-Host Social Tuesday”: The event's start time is not specified as 'right after class' or 'at agreed upon time', but rather a fixed time Suggested: Set the start time to 'right after class' or 'at agreed upon time' to match the ask. Propose-only — the event stands until you act.✓ Jul 12
(no discussion was captured for this one)
Why 'Wed July 15' survived every sweep: the creation backstop knew the date-string class; the SWEEP detector (is_bad_title) never learned it. Now one vocabulary for both (lazy, fail-open; real-words-with-a-date-word stay good, pinned) + the sweep's event items carry notes/attendees/location/when into make_title so the rewrite can derive 'Kevin meeting' instead of compressing a date into itself. Propose-only; title_locked sacred. Plus a drifted-fake harness fix (make_title lacked hint_title — the masking class again). 22/22; sweep baseline, 0 non-flake.✓ Jul 12
(no discussion was captured for this one)
PR #1615 [RTR-49] apex contrast/consistency fix (gate follow-up on merged #1583, msg_07da1497). The apex accent went muted #6d9a72 but paired green-tint BACKGROUNDS stayed bright emerald rgba(52,211,153)/rgba(16,185,129) + #34d399 literals → muted-green text green-on-green ~3.9:1 (below AA) on ✓Done/review-banner/approve buttons. Muted ALL bright-emerald tints+literals to accent channels rgba(109,154,114)/#6d9a72. Apex now one consistent e-ink green. Verified: zero bright-emerald in rendered apex. 8 tests (2 new + 6 apex-mobile). 1 file (portal.html) + test.✓ Jul 12
(no discussion was captured for this one)
Merge #1612 first (this uses its time_prose). Root cause was one line: the deriver's default surrounding=[] — the model never saw a real neighbor and fossilized from ACTIVE CONDITIONS. Now: _window_neighbors default (store events ±1 day, humanized whens, self excluded) + prompt carries {title, when} + deterministic entity veto on trigger/consequence prose (NAME field + grammar openers + schedule vocab exempt — the first cut over-dropped labels, caught per #1332). Rifath/JHU fixture pinned: JHU survives, Jon fossil drops. 21/21; sweep baseline, 0 non-flake.✓ Jul 12
(no discussion was captured for this one)
⚠ Brief Claude looks DOWN — nothing read or replied in ~2 d; 6 item(s) waiting (still down — one re-remind; your earlier Keep still stands).✓ Jul 12
Needs your hand — the auto-relaunch runner isn't installed, so no button here can restart it. On the m2, open the Brief Claude terminal and relaunch: # on the lane workstation (m2, 100.66.120.97) — local terminal, or ssh in remotely: claude --model opus # then in the session: /remote-control · set effort to medium · /fast if you want # then paste the restart prompt below as the first message. (The prompt's curl lines ssh # to homeserver1 ([email protected]) — that is the ops API host, not where claude runs.)
Dismissal = failed comprehension. Layered on #1603: a gate-passing card after a dismissal arrives REWORDED (deterministic decision-first template, identical verbiage floor-checked vs every prior narrative, fold-consequence stated); a dismissed REWRITE retires the class to ONE cascade digest (sentinel seam), never another solo card, digest items carry material_sig so the same state never re-folds; approved priors stay normal; rewrite+prior_dismissals stamped for the RTR-57 learning loop. 38/38 file; sweep baseline, 0 non-flake.✓ Jul 12
(no discussion was captured for this one)
PR #1610 [RTR-49] e-ink — web brief-reader chrome (last self-styled surface). brief_web.py _READER_HTML :root → warm paper + muted green #6d9a72 (was cool #0f1115 + blue accent); record-state red muted; #content stays WHITE (the printed-brief document, intentional). PDF-SAFE: Boox PDF composed separately (brief_composer/render_canonical.py) + @media print hides affordances → web-only. Verified vs REAL reader render. 2 tests, no new lint. Remaining: semantic-color cleanup (built-in brights → muted tokens), deferred. Files: brief_web.py, +test.✓ Jul 12
(no discussion was captured for this one)
Merge Claude: READY FOR MERGE: PR #1605✓ Jul 12
EMAIL DOCTRINE part 1 (off-switch, as code). email_loop now label-gates to 'Claude Email Manager'-labeled email only (new shared ops/action_label.py, single source of truth read by the #1509 door too); the always-on scan of unlabeled inbound is OFF. #1590 zero-capture kept. 70 tests pass (ingestion+email_loop+action_label); #1509 door green. Follow-ups (trigger half + reasoning pass + label-delivery) noted in PR body, not in this PR.
HOST PICK: homeserver1 (already has Python 3.12+uv+git+systemd, always-on; m2_8gb = isolation alt). AFTER #1604 is on prod: (1) TOKEN — GitHub -> repo Settings -> Actions -> Runners -> New self-hosted runner -> copy it. (2) RUN: cd ~/Witan/02_hardware/samsung_laptop/code/ci_runner && ./install_runner.sh <TOKEN> cd ~/actions-runner && sudo ./svc.sh install "$USER" && sudo ./svc.sh start LAST switch: re-enable Actions (Settings -> Actions -> Allow all) = zero billed minutes; first run is the canary. Runbook: that dir README.md.✓ Jul 12
(no discussion was captured for this one)
CI infra. test.yml runs-on ubuntu-latest -> [self-hosted,linux,witan] (SAFE while Actions disabled, nothing runs). + 02_hardware/samsung_laptop/code/ci_runner/ bundle (install_runner.sh + README) so his hand is only token + sudo svc.sh. Host rec = homeserver1 (has py3.12+uv+git+systemd). Nothing flips before runner registered+canary-green. Pairs with an Inbox card.✓ Jul 12
(no discussion was captured for this one)
Docs-only, the nightly 22:00 lane-doc alignment. Adds the RTR-45 doc-drift sweep (#1579, shadow-live) as a capability row in FLEET_READINESS per its own add-a-row footer contract. One-row edit.✓ Jul 12
(no discussion was captured for this one)
Agent lane, 3 idle ticks: 4 PRs this window merged+live (#1589-#1592), repetition class quiet in prod, hostile probe clean. Every remaining item needs your hand: (1) RTR-40 calendar-nesting shadow-to-live flip - probes 4/4 green, one word from you; (2) fleet-registry paste (fb_a810bfcd) - turn-6 coaching fires the tick it lands; (3) RTR-33 Gmail label list - until then your forwarded emails never reach Witan; (4) Surface-A relaunch-runner install (dead lanes stay dead without it). Tap/answer any and it becomes my next build; otherwise I hold - no manufactured work.✓ Jul 12
(no discussion was captured for this one)
Merge gate: PR #1593 - docs(router) nightly roadmap note 07-11 + 4 banked operational rules [RTR-46]. Docs-only, 2 files (NIGHTLY_ROADMAP_NOTES dated entry + ROUTER_KANBAN_PRACTICE append), cut from origin/main tip 9c003af5.✓ Jul 12
(no discussion was captured for this one)
🔁 The condition “IF the medication pickup is not done before this block starts THEN release this block back to open time” has now been proposed on 3 different events. Promote it to a BASE condition? Approved → it applies to every block within the tactical horizon automatically and these per-item cards stop forever.✓ Jul 12
(no discussion was captured for this one)
⏳ Your next 7 days have ~17.0h of unfilled time in 6 chunk(s): 07-12T13:00 (4h30 → “Pick up medication”); 07-12T08:30 (2h30 → “Pick up medication”); 07-13T06:30 (2h30 → “Pick up medication”); 07-14T06:30 (2h30 → “Pick up medication”) …. Approve and Witan places usable blocks there — the assigner fills them from your overdue/deadline items and top priorities (any domain, per your grow-block correction). Nothing changes until you do.✓ Jul 12
(no discussion was captured for this one)
Merge gate: PR #1587 — fix(calendar) coaching item msg_36b5651f. (1) X-to-Y compact range grammar ('9pm est to 930' = 21:00-21:30; meridiem inherits, crosses-noon +12, uninvertible falls back) overrides the 1h default; VERBATIM ask = the fixture. (2) event critic deterministic grounding veto: provably-false start/weekday claims dropped, invented numeric suggestions dropped, TRUE mismatches survive (pinned both ways). (3) JHU + universal set self-resolve. 10 tests; sweep 3432 passed, 0 new reds.✓ Jul 12
(no discussion was captured for this one)
🔄 “JHU systems meeting” changed — its conditions should re-derive: ADD “JHU Meeting Conflict”: “IF the meeting starts late THEN check the schedule for any conflicts with other commitments” (why: The JHU systems meeting has been added, which may conflict with other commitments). Approve and Witan records exactly those; nothing changes until you do.✓ Jul 12
(no discussion was captured for this one)
PR #1586 [RTR-49] e-ink slice 4 — Cortex SPA (05_command_center theme.css, own palette). :root → warm paper + muted green #6d9a72; semantic neuro/escalate/grade accents kept but muted (cyan→teal, violet muted); hardcoded rgba tints (emerald/cyan/violet on badges/nav/dots — don't inherit :root) swept to muted; body radial glows removed, top-bar warmed. Verified vs REAL Cortex Event Log render (its JS+theme.css) — warm, flat, states preserved. Static-app CSS, render+grep-clean verification. 1 file. Remaining: brief PDF, semantic cleanup, calendar, sprite.✓ Jul 11
(no discussion was captured for this one)
PR #1585 [RTR-49] e-ink slice 3 — self-styled surfaces (chat, Claude board, call page) that carry own :root palettes (not witan-* tokens, so slices 1-2 missed them). All → warm paper + muted green #6d9a72 (was #10b981); Claude --violet kept as meaning but muted #a78bfa→#8f86a3; call-state green/red/yellow muted. Verified vs REAL chat render (warm paper, muted-green tab). 3 tests, no new lint. Deferred: brief_web (daily PDF), Cortex SPA, built-in-color cleanup, calendar, sprite. Files: chat_router.py, claude_workers_router.py, call_page_router.py, +test.✓ Jul 11
(no discussion was captured for this one)
⚠ Brief Claude looks DOWN — nothing read or replied in ~24 h; 4 item(s) waiting (still down — one re-remind; your earlier Keep still stands).✓ Jul 11
Needs your hand — the auto-relaunch runner isn't installed, so no button here can restart it. On the m2, open the Brief Claude terminal and relaunch: # on the lane workstation (m2, 100.66.120.97) — local terminal, or ssh in remotely: claude --model opus # then in the session: /remote-control · set effort to medium · /fast if you want # then paste the restart prompt below as the first message. (The prompt's curl lines ssh # to homeserver1 ([email protected]) — that is the ops API host, not where claude runs.)
PR #1582 [RTR-49/50] fix(inbox): activity feed honest. Machine capture receipts (born-done, RTR-48) no longer say 'you asked:'; feed+All/Done/Failed counters default to HIS asks only; machine+Claude-build behind a 'show system activity' toggle (?system=1); superseded fails (goal_key later passed) hidden. Additive/backward-compat (list_events/counts defaults preserved, unread_count untouched); schema via _EXTRA_COLS (origin+goal_key). 18 tests incl over-drop guard (real ask survives) + TestClient render. No new lint. Files: task_inbox.py, bots_router.py, inbox.html, +test.✓ Jul 11
(no discussion was captured for this one)
🔄 “Call With Hymie” changed — its conditions should re-derive: UPDATE “Hymie Call Conflict”: “IF the call runs late THEN push the night routine later” → “IF the call starts at 12:00:00-04:00 THEN push the night routine later” (why: The call's start time is now fixed, so the condition should be updated to reflect this.); UPDATE “Hymie Call Conflict”: “IF the call runs late THEN push the night routine later” → “IF the call ends at 13:00:00-04:00 THEN push the night routine later” (why: The call's end time is now fixed, so the condition should be updated to reflect this.); UPDATE “Hymie Call Conflict”: “IF the call runs late THEN push the night routine later” → “IF the call duration is 1 hour THEN push the night routine later” (why: The call's duration is now fixed, so the condition should be updated to reflect this.). Approve and Witan records exactly those; nothing changes until you do.✓ Jul 11
(no discussion was captured for this one)
Merge gate: PR #1581 — feat(rtr40) slice 6: agents speak BLOCK operations. Four verbs in the closed taxonomy+menu (open=no-title schema, closed=titled activity), six-type explainer in prompt + term store (idempotent seed, his edits sacred), reserved-time rule upgraded (named->closed, anonymous->open, never move_event/lazy add_todo), routing w/o downgrade, case-4 fixtures pinned. 6 tests; sweep 3402 passed, 0 new reds. COMPLETES my RTR-40 plate.✓ Jul 11
(no discussion was captured for this one)
UI render half of RTR-40, wired to Agent's slice-2 projection (#1568, live). New shadow surface /ops/views/calendar/projection reads GET /ops/calendar/day-projection/{date} and renders the grey day-template skeleton: OPEN=domain-capacity (faint fill + chips from real DOMAIN_COLORS), CLOSED=solid titled, remainders=parent+cut-edge; conditions/wake; date nav; fail-open; shadow-only alongside the live calendar, NO cutover. Self-contained view+template (no calendar.html surgery). test_rtr40_projection.py 5 passed, no new ruff errors, witan.css rebuilt. Fresh origin/main incl #1534/#1568.✓ Jul 11
(no discussion was captured for this one)
Merge gate: PR #1570 — feat(spine) E3 altitude [RTR-43-E3]. Epic auto-close (children all done -> epic closes itself; honesty at altitude: all-gate-verified kids => verified_by=acceptance_gate:children else unverified; rides the sweep) + WITAN_VISION coverage (GET /ops/spine/vision-coverage: served/unserved sections + unreffed epics; Brief renders nightly). 7 tests + 3 pins; sweep 3339 passed, 0 new reds. Completes my routed RTR-43 scope (E1+E2+E3).✓ Jul 11
(no discussion was captured for this one)
Docs-only, no device config. wedge_guard proposal (approved+applied 2026-07-06) moved proposed->applied w/ OUTCOME banner; planner_tier proposed dup (wrong port :8081) archived to _archive_pruned + tombstone (applied record has correct :8082); cloudflare-tunnel record gets a hostname-migration note (witantable->mywitan.xyz). DOC_AUDIT epic.✓ Jul 11
(no discussion was captured for this one)
Merge gate: PR #1568 — feat(rtr40) slice 2: the projection engine [RTR-40]. Pure template∘day-class∘conditions∘content: wake anchor (Sleep-end/fallback; slept-in moves, woke-late drops), weekday/weekend designations from his skeleton, closed content cuts slots into OPEN REMAINDERS (the 06:10 leave-by oracle = a literal test), clear-day, fail-open wrapper + SHADOW GET /calendar/day-projection/{date}. UI render UNBLOCKED (slices 1-2 in). 10 tests; sweep 3332 passed, 0 new reds.✓ Jul 11
(no discussion was captured for this one)
Docs-only, no device config. 02_hardware/README (Pi5 apprentice->witan_terminal, +M2 daily-driver row, fixed no-failover) + 02_hardware/CLAUDE (layout: apprentice archived, jetson spare, zachmac2 ollama) + jetson CLAUDE (role: spare not active) + samsung CLAUDE (deploy flow -> auto-deploy cron). First hardware-section batch. DOC_AUDIT epic.✓ Jul 11
(no discussion was captured for this one)
Merge gate: PR #1566 — fix(spine) telemetry lines are never asks [RTR-43-E1]. Runaway forensics: the amplifier was the bus mirror re-capturing WITAN-MIRROR/WITAN-OUTPUT audit lines and reform decomposing the QUOTED 'pack for my 0730 flight' into a fresh todo each cycle (74 tasks, 55/hr peak; last mint 08:09:56Z, 57+min clean). One-line class fix + the amplifier line pinned verbatim. Sweep 3322 passed, 0 new reds.✓ Jul 11
(no discussion was captured for this one)
Docs-only. BOOT_SURVIVAL (2026-06-24 away-audit re-scoped as standing doc; auto-deploy-on-boot fact kept; Surface-A items flagged for re-verify) + FLEET_ACTIVATION_PLAN (re-baseline: registry/dispatch/Cortex shipped, spine runs SHADOW, Motor no longer unbuilt; marked historical). Completes the substrate lanes 27 docs. DOC_AUDIT epic.✓ Jul 11
(no discussion was captured for this one)
Docs-only. Verified via /ops/claude/restart-info that relaunch is MANUAL (no auto-runner installed) and reconciled 3 dated advisories: AWAY_SURVIVAL (re-scoped standing doc; actuation-not-live is correct; reconciled vs MANAGER_OPEN_ITEMS #930) + CLAUDE_RELAUNCH_PROPOSAL (app-half shipped, runner-half still PROPOSED) + WITAN_CLOUD_REACHABILITY (dated advisory + lane count 6->7). Did not assert unverifiable Surface-A status. DOC_AUDIT epic.✓ Jul 11
(no discussion was captured for this one)
Merge gate: PR #1563 — fix(spine) gate-hold runaway class [RTR-43-E1]. Live out_todo loop root-caused: dup-check card now signature-idempotent (15 retries = 1 card; drifted match re-cards); every gate-hold bumps the #966 goal breaker (goal-keyed) + past cap the hold goes SILENT (mirror spam dead, ask never lost — brake failure = plain hold, tested); RE-ROUTE plumbing only in lane context (his bare reroute asks mirror). Feeder blocked, #221 cancel staged appr_86b182b93c9c. 6 tests; sweep 3319, 0 new reds.✓ Jul 11
(no discussion was captured for this one)
I deleted 1 to-do(s): #219 “Pack Niceville flight”.✓ Jul 11
You: 219 was the duplicate; the restored 220 is the single live copy.
Docs-only. HARDWARE_SUSTAINABILITY (pending zachmac2-no-sleep/auto-login marked DONE, only EXO remains) + serve_code_model (status banner: undeployed, Qwen pick violates US-origin, reconcile vs staged Ornith-9B) + HANDOFF_2026-05-23 (resolution banner: ollama-localhost fixed, nomenclature glossary still live). DOC_AUDIT epic.✓ Jul 11
(no discussion was captured for this one)
Merge gate: PR #1561 — fix(spine) mirror-scope + confirm idempotency [RTR-43-E1]. Bus mirror excludes lane-plumbing classes regardless of source (READY/gate/STATE/janitor/re-route; address-stripped so his prefixed asks survive — survive-set pinned). Confirm emitters card ONCE per (task, wording) sig: no pending triplets, no re-asking answered; changed ask re-cards; log-down fails open to asking. 11 new tests; sweep 3311, 0 new reds.✓ Jul 11
(no discussion was captured for this one)
I deleted 1 to-do(s): #218 “Diagnostic emitter lacks idempotency”.✓ Jul 11
You: Outcome right (junk todo minted from a diagnostic line), but the workflow that both minted and deleted it off Claude plumbing was the defect — closed by 1561/1566.
Docs-only, status/supersession banners. EXO_BENCH_RUNBOOK (#1381 applied 2026-07-06, sequencing moot) + 2026-06-11_exo (PROPOSED->APPROVED 2026-07-04) + serve_interface_mac2 (OUTCOME: shipped as ollama gemma3-interface not 30B) + serve_3b (US-origin over Qwen drift, unapplied) + PARALLEL_FLEET (interface-on-mac3 superseded, multi-model rollout unapplied). DOC_AUDIT epic.✓ Jul 11
(no discussion was captured for this one)
Merge gate: PR #1559 — feat(spine) E2 attribution [RTR-43-E2]. capability_verdict + could_witan_have stamped at plan-time (reuses #1349 assess); executor stamped on real move-to-active (idempotent); self_sufficiency.score counts ONLY gate-verified rows (executor can never inflate; unverified excluded; honest None basis) + reclaimable_gap = cloud-done-but-could-have-been-local ids. GET /ops/spine/self-sufficiency for the Cortex tile + brief line. 7 tests; sweep 3298 passed, 0 new reds.✓ Jul 11
(no discussion was captured for this one)
Docs-only. fleet_registry/README: fixed the single-endpoint-default claim (default is multi-node), added the thinking field + never-single-row warning + reformatter env, dropped PR-#992/Manager framing, fixed the verify example. ops/README: filled the empty placeholder with the real ops surface + auto-deploy cron path + no-DB-backup gap. DOC_AUDIT epic.✓ Jul 11
(no discussion was captured for this one)
Merge gate: PR #1557 — feat(spine) ACCEPTANCE GATE [RTR-43-E1]. review drains to verified (probe/artifact evidence, reusing sentinel per-prefix resolve) / blocked (FAILS CLOSED: probe-failed or artifact provably missing) / honest unverified (metric-excluded). completed_by/verified_by minted ONLY at the gate (E2 honesty). Pilot flip: calendar_scribe create route parks at review — drainer + flip in the SAME PR; reaper watches review as the gate watchdog. 10 tests + 3 pins; sweep 3291 passed, 0 new reds.✓ Jul 11
(no discussion was captured for this one)