Three pi workers claimed and launched: SQLite critical-search port,
compacted session index build, growth/budget alerts. Flagg host worker
redeployed on patched capture code (supervisor respawn, health 200).
Capture clients (pi, claude, codex) send byte-accurate from_offset,
to_offset, jsonl_sha256, and deterministic source_identity. Stale
cursors coalesce into one pending outbox segment under one Run ID.
capture-outbox-replay.ts is the only replay implementation; the audit
script fails closed on legacy flags and the scheduled nas-backup caller
is migrated. Raw Run writes reject divergent redelivery; a larger
proven-prefix body returns accepted_prefix without overwrite.
Verified adversarially (multi-byte offsets, repeated stale cursors,
fixture-only replay): 20 bun tests + 2 vitest + tsc clean. Receipts in
.brain/projects/typesense-reboot-recovery/patch-verification.svx.
Verifier confirmed provenance, coalescing, and canonical replay under
multi-byte and stale-cursor attack, but found nas-backup.ts still
passing removed replay flags (scheduled backup fails closed). Biome
condition narrowed to touched files; caller-migration condition added.
Read-only scan of ~/.joelclaw/runs-dev producing byte-proven
prefix-coverage verdicts per Run. Receipts in
.brain/projects/typesense-reboot-recovery/run-manifest-summary.svx.
Critical projection becomes a replicated FTS5 critical.db (flagg writes,
both NAS boxes read-only, ordered fallback; panda decommissioning).
Session search goes two-tier: observer layer + flagg-local FTS5 from the
manifest keep-set. Typesense demoted to flagg-only non-critical.
Records worker results: capture/replay patch and byte-proven Run
manifest (134,013 keep / 14,010 skip).
grill-master charter from the reboot diagnosis (a99aa938). Finish line
constrained to existing tailnet hardware. Execution authorized. Two AFK
tasks (capture/replay patch, Run manifest) launched as pi workers.
joelclaw gateway doctor prints PASS/FAIL for daemon (with crash-relaunch
detection against an operator restart marker), live gateway source
CLEAN/DIRTY (a running daemon plus dirty source is today's outage), and
transport state; --live proves delivery with a real probe that must
return a Telegram platformMessageId — confirmed telemetry alone fails.
Every FAIL prints its exact remediation command. gateway restart writes
the marker and ends with the doctor summary.
Joel's single Seen tap produced repeated receipt DMs: re-delivered
callback_query events each minted a fresh receipt identity. Receipt ids
now derive from rawEventId + actionId (duplicate delivery = same row,
no new send), gateway dedupe is durable across restarts, and
learner-flow.ack sends zero receipt DMs — buttons are real actions,
never acknowledgment chores.
Joel rejected emoji reactions as the operator action API (2026-07-19).
Labeled inline keyboard buttons on outbound DMs publish
message/action.requested with kind: callback and stable learner-flow.*
action ids; the callback_query owner answers, authorizes, resolves
flowId, verifies the declared action, then publishes. Legacy reaction
consumer stays until the live Seen canary passes.
Joel rejected the emoji-reaction model outright (2026-07-19). Inline
keyboard callbacks routed through the existing gateway replace it;
callback payloads verified under Telegram's 64-byte limit. Includes
pulse/daily composer spec and the reaction-listener retirement proposal.
- File verification records ok/missing/timeout/error with null counts
on timeout/error instead of fake zero files / missing backup.
- Replay receipts preserve child exit code, skipped-large count, and
the first concrete child error; failures land in the host error list.
Forced-fixture validated (1 ms timeout -> backupStatus timeout,
unreachable Central -> failed attempt + Connection refused, healthy
fixture still passes). Receipts in dark-wizard
.brain/projects/fleet-check-maintenance-2026-07-18/.
- authority_shape_ok: Flagg is self-Central (joels-mac-studio:3111,
local Typesense :8108); reject stale Panda-Central values instead of
requiring them. Normalize one trailing slash.
- nas_mount_status_ok: run the status helper through bash so mount
truth no longer depends on the checkout's exec bit; add a separate
required probe for the service-owned LaunchDaemon helper's exec bit.
Validated live-pass + simulated-fail; receipts in dark-wizard
.brain/projects/fleet-check-maintenance-2026-07-18/.
Panda's main diverged with two Joel-authored commits from mid-June that
never got pushed:
- 9bba6d72 fix o11y triage classifier JSON parsing + parse contract tests
- 70434b60 auto-capture #brain-joel Slack links into discovery/noted
The triage fix merged clean. The Slack capture was written against the
legacy channels/slack.ts that the messaging-v2 cutover replaced; its
feature block (URL extraction + discovery/noted emit, gated to Joel in
BRAIN_JOEL_CHANNEL_ID) is grafted into slack-runtime.ts, modernized to
use loadGatewayInngestEventConfig instead of hardcoded env fallbacks.
tsc clean; 60 tests green (triage contract tests + chat-sdk + inbound);
biome clean. Landing this makes panda's local main an ancestor of
origin/main so panda reconciles with a plain fast-forward.
joelclaw notify send now accepts --kind memory|alert|digest|ask|receipt,
passed through the Redis envelope and honored by the gateway compat shim
(invalid kinds are rejected instead of guessing a lane). Without --kind,
low/normal-priority sends are inferred as digest, which the Telegram
digest-lane classifier may silently suppress — that suppressed a
Joel-requested message twice on 2026-07-18. Operator-lane kinds
(ask/alert/memory) always deliver. CLI next_actions now point at otel
delivery verification instead of the ignored --telegram-only flag;
skills/messaging documents the flag and the verify rule.
Also lands the in-flight contract-v2 reaction-actions work from a
concurrent session (MessageAction schema in message-contract, telegram
adapter action messages, notify context.actions passthrough, inbound
reaction callback normalization) — entangled in the same files and
committed together deliberately.
81 tests pass across message-contract, chat-sdk, chat-sdk-inbound, sdk;
tsc clean. Live on flagg since 2026-07-18 (gateway restarted, CLI
rebuilt, kind=ask delivery confirmed via notify.compat_v2.confirmed).
joelclaw retro <brief-path> fires the event; memory-retro-writer reads
the closed brief + step Result sections, enforces the noise bar (<3
steps and no ledger → skip with OTel warn), condenses via pi, and
atomically writes dark-wizard .brain/resources/retros/<slug>-<yyyy-mm>.svx.
Per decide-retro-writer. 7 tests.
Large runs (4MB+ replays, long sessions) died on 'step output size is
greater than the limit' — load-jsonl/chunk returned whole transcripts
through persisted step outputs. Steps now reread jsonl_path on disk and
return counts/hashes only; inline payloads spool to a temp file in a
small early step. Receipt: run 01KXRWNW7FTQMX3ES89BS6XZGA.
joelclaw recall and voice recall now answer from Brain/observation
stores (19 tests). memory_observations archived to NAS (28,050 docs,
238MB, sha d2f3038d, verified) and dropped. Zombie functions
(reflect/review-promote/proposal-triage/batch-review) unregistered and
deleted with the MEM/FRIC suites (-6,306 lines). System log retired:
panda copy snapshotted (3,981 lines, sha 4e8e815d), slog write path /
system-logger / sync + backup + PDS mirror removed. Per decisions
decide-legacy-memory-retirement + decide-system-log-home.
Rhizomatic SessionStart/Stop hooks removed from claude/codex/pi configs
(machine-local; no dark-wizard source exists). 13-mutation outbox
snapshotted with per-file SHA-256 and byte-for-byte verification;
sources untouched. Service stop + un-park path documented in the step;
launchctl disable/bootout is steering's (needs sudo).
Grilled live with Joel 2026-07-17: legacy stack retires (recall
retargets to Brain, memory_observations archives to NAS then drops,
zombies unregister, MEM/FRIC dies), system log retires with a NAS
snapshot, Chorus parks, Claude auto-memory becomes a pointer index,
retros get a hook-fired Inngest writer. memory-system-cleanup brief +
six steps charter the execution and the fleet skill/prompt update.
Empty-but-valid captures now upsert the same runs_dev metadata document
as chunk-producing captures (turn_count 0), so outbox replay can verify
them by SHA instead of timing out on a row that never appears. Switch to
single-document upsert so Typesense schema rejection surfaces as an
error instead of hiding behind import's HTTP 200.
Deterministic reaction->intent mapping is a dead end (Telegram's
reaction set is huge/open). Classify intent from whatever he taps
instead; converge reactions and buttons on the same receipt-gated path.
The digest read like a form: 'Source:/When:/Why now:/Connection:' on
separate plain-text lines, no hierarchy. Now bold emoji headers, prose
lead lines, and a muted italic footer for provenance — HTML-escaped.
Reads like a person wrote it, per the chief-of-staff voice contract.