beck

Activeupdated 2026-08-03
Phases 0–3 built and tested: store seeded with 8 months of history, notes case file, autopilot + heartbeat. Autopilot deliberately NOT switched on until Scott agrees a cadence.
Next Ask Scott what check-in rhythm he wants, then install the cron. Nothing reaches out to him until he says so.
  • Decide: build Beck, or pay iris360 and keep the export as insurancewaiting on you
  • Hide #beck from Joshua's sidebar — owner bypasses overwrites, so it's mute + Hide Muted Channels, or move to a bot DMwaiting on you
  • Decide how much of Scott's exported history Beck may reference back to him unpromptedwaiting on you
  • Export the /notes/*.md case files (identity, current-focus, autopilot, topics/*) from the logged-in sessiontodo
  • Download the Guides library (Using AI for Health + Health Guides) as markdowntodo
  • Write prompts/curator.md — the notes-compression loop (the one Phase 2 piece still missing)todo
  • Fold scott-bp-log.pages.dev in as the Phase 4 web view rather than rebuilding ittodo
  • Agree a check-in cadence with Scott, then install the cron (scripts are ready, deliberately not enabled)waiting
  • Allowlist Scott in #beck — terminal `/discord:access`done

What & why

Scott used iris360 (app.iris360.me) daily from 10 December 2025 — a conversational health companion that turned short chat messages into structured logs, placed each new reading inside its trend, kept a curated case file, and checked in on its own two or three times a day. It did real work for his anxiety, his gut symptoms, and most recently a blood-pressure titration.

On 2 August 2026 it started withholding replies, and by 3 August every response was a billing wall — including the morning check-in on day 4 of a candesartan dose step, right after a reading of 145/98. He was cut off at precisely the wrong moment.

Beck is the replacement, named for Aaron Beck, who founded cognitive behavioural therapy. It runs on Obadiah’s existing infrastructure: Discord as the channel, markdown as the memory, cron as the autopilot, the Claude API as the brain.

Where it stands

Phases 0–3 are built and tested. Code at ~/Projects/Unicorn.Land/beck (this repo); all of Scott’s data at ~/Projects/Obadiah/workspace/beck (BECK_HOME), which is inside Obadiah’s gitignored workspace/. That split is deliberate and should be kept — see README.md.

  • Store — SQLite, one entries table keyed by kind + JSON payload, with typed views. Seeded from the export: 220 readings (60 BP, 160 sleep) and the 735-conversation index with iris’s RECAP blocks, which are the tone reference. Seeding is idempotent.
  • Timestamps verified. The export is in UTC; Scott is in Berlin. Converted through a real tz database, then checked against the 31 July file where iris refers in prose to readings the parser independently places at 09:44, 12:05, 12:30 and 14:04. They match.
  • A parser bug worth remembering. First pass tagged a post-dose reading as pre-dose, because Scott’s message mentioned doing “a pre-pill tomorrow” and first-match-won. Pre- versus post-dose is the exact distinction his titration question turns on. Fixed by scoring context phrases on proximity to the reading, discarding clauses about future readings, and splitting dose-timing from posture into separate fields. Nine parser cases pass.
  • Case filenotes/identity.md, current-focus.md, autopilot.md, topics/blood-pressure.md, written from the archive.
  • Autopilot + heartbeat — both tested. The autopilot correctly declined to send when run at 23:24, and produced a genuinely good check-in when run against a 06:15 morning slot.

The export itself — 188 daily transcript files, 735 conversations, 10.12.2025 → 03.08.2026 — now sits at BECK_HOME/data/transcripts/, alongside data/guides/ (both guide libraries, 356 KB, saved 03.08).

#beck is live and Scott is in it. Channel 1533940602675396779, under PROJECTS. Both access layers are set: a channel-level VIEW overwrite for Scott (the PROJECTS category denies him by default), and a group entry in access.json with requireMention: false and Scott alone on the allowlist. He said hello on 03.08 at 23:03, logged his first reading outside iris360 at 21:38 (128/79 p73), and was told plainly that Beck cannot yet check in on him.

Joshua cannot be hidden from the channel by permissions — he is the guild owner, and Discord lets owners bypass every overwrite. The options are client-side mute plus “Hide Muted Channels”, or moving Scott’s conversation to a bot DM and deleting the channel.

What the archive revealed — iris360 runs five agents, and the transcripts expose all of them:

Agent Count Job
onboarding 1 One-time intake: elicit the problem, propose what to track, set check-in cadence and tone
iris 353 The front door — the only agent Scott talks to
supervisor 205 Reviews each conversation, briefs the memory agent, schedules the next touchpoint
memory_manager 125 Maintains the markdown case file, compresses it when it grows
tracking 51 Structured logging — typed entries with IDs, custom per-user check-in schemas

Its memory is a markdown filesystem, not a database: identity.md, current-focus.md, autopilot.md, summary.md, topics/{blood-pressure, bathroom-anxiety-gi-patterns, sleep-reflux-management, right-shoulder-pain, depression-antidepressant}.md, plus an archive/. These files are still behind Scott’s login and have not been exported yet — they are the distilled version of everything, and worth more than the raw transcripts.

The volume is small. Scott sent 952 messages in eight months, about five a day, averaging 180 characters. 171 KB of user input in total. The value is not in handling scale; it is entirely in the quality of what wraps around those five short messages.

The autopilot is deliberately switched off. The cron lines are written down in README.md and not installed. Turning them on starts an automated system messaging Scott about his health on a schedule he has not agreed to — iris360 negotiated its three-a-day rhythm with him during onboarding, and Beck has not had that conversation.

Still missing: prompts/curator.md (the note-compression loop), iris360’s own /notes/*.md case files, and a web view — scott-bp-log.pages.dev already covers most of the latter and should be folded in rather than rebuilt.

Next / open threads

  • Ask Scott what rhythm he wants. This is the gate on the autopilot and it is his call, not ours. Until then he has to start every conversation, which is the one real regression from iris.
  • Get iris360’s /notes/*.md out. The guides came across; the case files did not. BECK_HOME/data/notes/ is empty and waiting. Needs his live session, in Chrome.
  • Build or pay is still open. Phases 0–3 existing changes the arithmetic but does not settle it. If iris360 is €15–30/month and works, paying remains defensible and the export is insurance.
  • How much history may Beck volunteer back to him — unresolved, and it shapes the front-door prompt.

Decisions

  • 2026-08-03 — Copied the full transcript export to Obadiah/workspace/iris-archive/ rather than leaving it in ~/Downloads. workspace/ is gitignored, so the health record and the live billing JWTs in those files cannot reach GitHub.
  • 2026-08-03 — Proposed Discord as the channel rather than WhatsApp or a web app. Scott is already in the server and already talks to Obadiah, which removes the largest build cost.
  • 2026-08-03 — Proposed collapsing iris360’s five agents to three (front door · curator · autopilot). The five-way split looks like an artefact of their platform, not a requirement.
  • 2026-08-03 — Chose local SQLite over Supabase for the first build. One user, tiny data, and local-first sidesteps a whole class of questions about hosting someone else’s health record.
  • 2026-08-03Renamed Iris → Beck at Scott’s request, after Aaron Beck. Created #beck and granted Scott visibility. Joshua does not want the channel in his own working set.
  • 2026-08-03 — Allowlisted Scott only in #beck, not Joshua. Beck will not answer Joshua in that channel, which was the intent. Backup at access.json.bak-20260803-225736.
  • 2026-08-03 — Told Scott up front that Beck cannot initiate check-ins yet, rather than letting him discover it by waiting for a morning message that never came. iris checked in three times a day; that gap is the single most noticeable regression and it should be named, not papered over.
  • 2026-08-03 — Built Phases 0–3 and left the autopilot switched off. The scripts are tested, the cron lines are written down, and installing them is a separate, deliberate act: turning them on means an automated system messages Scott about his health on a cadence he has not agreed to. iris360 negotiated that cadence with him on day one; Beck has not.
  • 2026-08-03 — Split dose-timing from posture in the BP payload after a parser bug tagged a post-dose reading as pre-dose. One label could not carry both, and collapsing them made “sitting 5 min” outrank “post pill” — backwards, given the trough/peak question is the whole point. Getting this wrong is worse than leaving it blank.
  • 2026-08-03 — Kept code and health data in separate repos. Unicorn.Land/beck is private but still a remote; BECK_HOME under Obadiah’s workspace/ is not a remote at all. A .gitignore in the code repo blocks the data paths as a second line of defence.

Artifacts

  • README.md — how to run it, and the code/data split that must be kept
  • docs/rebuild-scope.md — the full scope: what the product actually is, architecture, phasing, cost, and the risks worth taking seriously
  • beck.py · schema.sql · seed_transcripts.py — the store, and the importer for the archive
  • prompts/beck.md — the front door, and where the safety discipline lives
  • prompts/autopilot.md — when to check in, and when to stay quiet
  • scripts/beck-checkin.sh · scripts/beck-heartbeat.sh — cron-ready, not installed
  • #beck1533940602675396779, Scott’s channel
  • BECK_HOME = ~/Projects/Obadiah/workspace/beck — store, notes, transcripts, guides (local only)
  • scott-bp-log.pages.dev — BP logging + doctor PDF, already built for Scott
Source material 2 docs