diff --git a/SESSION-0001.0-TRANSCRIPT-2026-05-25T15-00--2026-05-25T17-01.md b/0001/SESSION-0001.0-TRANSCRIPT-2026-05-25T15-00--2026-05-25T17-01.md similarity index 100% rename from SESSION-0001.0-TRANSCRIPT-2026-05-25T15-00--2026-05-25T17-01.md rename to 0001/SESSION-0001.0-TRANSCRIPT-2026-05-25T15-00--2026-05-25T17-01.md diff --git a/SESSION-0002.0-TRANSCRIPT-2026-05-25T19-30--2026-05-25T21-30.md b/0002/SESSION-0002.0-TRANSCRIPT-2026-05-25T19-30--2026-05-25T21-30.md similarity index 100% rename from SESSION-0002.0-TRANSCRIPT-2026-05-25T19-30--2026-05-25T21-30.md rename to 0002/SESSION-0002.0-TRANSCRIPT-2026-05-25T19-30--2026-05-25T21-30.md diff --git a/SESSION-0003.0-TRANSCRIPT-2026-05-27T06-00--2026-05-27T09-44.md b/0003/SESSION-0003.0-TRANSCRIPT-2026-05-27T06-00--2026-05-27T09-44.md similarity index 100% rename from SESSION-0003.0-TRANSCRIPT-2026-05-27T06-00--2026-05-27T09-44.md rename to 0003/SESSION-0003.0-TRANSCRIPT-2026-05-27T06-00--2026-05-27T09-44.md diff --git a/SESSION-0004.0-TRANSCRIPT-2026-05-27T15-30--2026-05-27T16-47.md b/0004/SESSION-0004.0-TRANSCRIPT-2026-05-27T15-30--2026-05-27T16-47.md similarity index 100% rename from SESSION-0004.0-TRANSCRIPT-2026-05-27T15-30--2026-05-27T16-47.md rename to 0004/SESSION-0004.0-TRANSCRIPT-2026-05-27T15-30--2026-05-27T16-47.md diff --git a/SESSION-0005.0-TRANSCRIPT-2026-05-27T17-00--2026-05-27T18-40.md b/0005/SESSION-0005.0-TRANSCRIPT-2026-05-27T17-00--2026-05-27T18-40.md similarity index 100% rename from SESSION-0005.0-TRANSCRIPT-2026-05-27T17-00--2026-05-27T18-40.md rename to 0005/SESSION-0005.0-TRANSCRIPT-2026-05-27T17-00--2026-05-27T18-40.md diff --git a/SESSION-0006.0-TRANSCRIPT-2026-05-27T19-00--2026-05-27T19-21.md b/0006/SESSION-0006.0-TRANSCRIPT-2026-05-27T19-00--2026-05-27T19-21.md similarity index 100% rename from SESSION-0006.0-TRANSCRIPT-2026-05-27T19-00--2026-05-27T19-21.md rename to 0006/SESSION-0006.0-TRANSCRIPT-2026-05-27T19-00--2026-05-27T19-21.md diff --git a/SESSION-0007.0-TRANSCRIPT-2026-05-27T19-30--2026-05-27T19-45.md b/0007/SESSION-0007.0-TRANSCRIPT-2026-05-27T19-30--2026-05-27T19-45.md similarity index 100% rename from SESSION-0007.0-TRANSCRIPT-2026-05-27T19-30--2026-05-27T19-45.md rename to 0007/SESSION-0007.0-TRANSCRIPT-2026-05-27T19-30--2026-05-27T19-45.md diff --git a/SESSION-0008.0-TRANSCRIPT-2026-05-27T20-00--2026-05-27T22-40.md b/0008/SESSION-0008.0-TRANSCRIPT-2026-05-27T20-00--2026-05-27T22-40.md similarity index 100% rename from SESSION-0008.0-TRANSCRIPT-2026-05-27T20-00--2026-05-27T22-40.md rename to 0008/SESSION-0008.0-TRANSCRIPT-2026-05-27T20-00--2026-05-27T22-40.md diff --git a/SESSION-0009.0-TRANSCRIPT-2026-05-27T23-30--2026-05-28T03-15.md b/0009/SESSION-0009.0-TRANSCRIPT-2026-05-27T23-30--2026-05-28T03-15.md similarity index 100% rename from SESSION-0009.0-TRANSCRIPT-2026-05-27T23-30--2026-05-28T03-15.md rename to 0009/SESSION-0009.0-TRANSCRIPT-2026-05-27T23-30--2026-05-28T03-15.md diff --git a/SESSION-0010.0-TRANSCRIPT-2026-05-27T23-50--2026-05-28T03-20.md b/0010/SESSION-0010.0-TRANSCRIPT-2026-05-27T23-50--2026-05-28T03-20.md similarity index 100% rename from SESSION-0010.0-TRANSCRIPT-2026-05-27T23-50--2026-05-28T03-20.md rename to 0010/SESSION-0010.0-TRANSCRIPT-2026-05-27T23-50--2026-05-28T03-20.md diff --git a/SESSION-0011.0-TRANSCRIPT-2026-05-28T03-20--2026-05-28T03-55.md b/0011/SESSION-0011.0-TRANSCRIPT-2026-05-28T03-20--2026-05-28T03-55.md similarity index 100% rename from SESSION-0011.0-TRANSCRIPT-2026-05-28T03-20--2026-05-28T03-55.md rename to 0011/SESSION-0011.0-TRANSCRIPT-2026-05-28T03-20--2026-05-28T03-55.md diff --git a/SESSION-0012.0-TRANSCRIPT-2026-05-28T04-22--2026-05-28T05-17.md b/0012/SESSION-0012.0-TRANSCRIPT-2026-05-28T04-22--2026-05-28T05-17.md similarity index 100% rename from SESSION-0012.0-TRANSCRIPT-2026-05-28T04-22--2026-05-28T05-17.md rename to 0012/SESSION-0012.0-TRANSCRIPT-2026-05-28T04-22--2026-05-28T05-17.md diff --git a/SESSION-0013.0-TRANSCRIPT-2026-05-28T05-26--2026-05-28T06-50.md b/0013/SESSION-0013.0-TRANSCRIPT-2026-05-28T05-26--2026-05-28T06-50.md similarity index 100% rename from SESSION-0013.0-TRANSCRIPT-2026-05-28T05-26--2026-05-28T06-50.md rename to 0013/SESSION-0013.0-TRANSCRIPT-2026-05-28T05-26--2026-05-28T06-50.md diff --git a/SESSION-0013.1-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-40.md b/0013/SESSION-0013.1-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-40.md similarity index 100% rename from SESSION-0013.1-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-40.md rename to 0013/SESSION-0013.1-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-40.md diff --git a/SESSION-0013.2-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-37.md b/0013/SESSION-0013.2-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-37.md similarity index 100% rename from SESSION-0013.2-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-37.md rename to 0013/SESSION-0013.2-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-37.md diff --git a/SESSION-0013.3-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-58.md b/0013/SESSION-0013.3-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-58.md similarity index 100% rename from SESSION-0013.3-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-58.md rename to 0013/SESSION-0013.3-TRANSCRIPT-2026-05-28T05-30--2026-05-28T05-58.md diff --git a/SESSION-0014.0-TRANSCRIPT-2026-05-28T07-01--2026-05-28T08-25.md b/0014/SESSION-0014.0-TRANSCRIPT-2026-05-28T07-01--2026-05-28T08-25.md similarity index 100% rename from SESSION-0014.0-TRANSCRIPT-2026-05-28T07-01--2026-05-28T08-25.md rename to 0014/SESSION-0014.0-TRANSCRIPT-2026-05-28T07-01--2026-05-28T08-25.md diff --git a/SESSION-0014.1-TRANSCRIPT-2026-05-28T07-08--2026-05-28T07-40.md b/0014/SESSION-0014.1-TRANSCRIPT-2026-05-28T07-08--2026-05-28T07-40.md similarity index 100% rename from SESSION-0014.1-TRANSCRIPT-2026-05-28T07-08--2026-05-28T07-40.md rename to 0014/SESSION-0014.1-TRANSCRIPT-2026-05-28T07-08--2026-05-28T07-40.md diff --git a/SESSION-0015.0-TRANSCRIPT-2026-05-28T07-44--2026-05-28T08-28.md b/0015/SESSION-0015.0-TRANSCRIPT-2026-05-28T07-44--2026-05-28T08-28.md similarity index 100% rename from SESSION-0015.0-TRANSCRIPT-2026-05-28T07-44--2026-05-28T08-28.md rename to 0015/SESSION-0015.0-TRANSCRIPT-2026-05-28T07-44--2026-05-28T08-28.md diff --git a/README.md b/README.md index 350c9df..40d673c 100644 --- a/README.md +++ b/README.md @@ -2,86 +2,161 @@ Full Claude Code session transcripts from the build of the [Open Human Model](https://ohm.wiggleverse.org) — including the -infrastructure work that preceded it (Session A: the `git.benstull.org` -personal-Gitea buildout) and every OHM session since. +infrastructure work that preceded it (Session 0001: the +`git.benstull.org` personal-Gitea buildout) and every OHM session +since. -## What this is +Canonical location: +[`git.wiggleverse.org/wiggleverse/ohm-session-history`](https://git.wiggleverse.org/wiggleverse/ohm-session-history). +There is no GitHub mirror. The same content is rendered on-site at +[`ohm.wiggleverse.org/docs/sessions`](https://ohm.wiggleverse.org/docs/sessions) +(live from rfc-app v0.19.0+). -OHM is built in the open in the literal sense. Every build session has a -full transcript that captures decisions, friction, dead ends, and the -reasoning behind each settlement — the cleaned-up post-hoc version is -not what you find here. + +## How OHM gets built -These transcripts are the artifact, not a polished retelling. They +OHM is built in the open in the literal sense. Every build session +runs in Claude Code, with one human operator (Ben Stull) and one +agent (Claude). The session has a goal, the goal gets executed, and +when the session closes a transcript captures what happened — every +decision, every wrong turn, every recovery, every spec correction. +The transcripts land here. + +The build follows a few binding rules that show up in every session: + +- **One feature per session, one commit per gesture.** Sessions don't + branch into half-finished work. Either it ships (tag + push + deploy + + verify) or it stays uncommitted until the next session picks it + up — but it doesn't live half-on, half-off in a branch nobody owns. +- **Paired-session discipline.** The operator gates irreversible + gestures (DNS edits, IAM changes, secret rotations, force pushes + to protected branches). The agent drafts, the operator commits. + Secret bytes never enter the conversation; per + `ohm-rfc-app-flotilla/SPEC.md` §3 invariant 1, the build pipeline + has no path through which a secret value can touch the model. +- **Parallel forked subagents for fan-out waves.** When a session + has independent shippable items (e.g., three roadmap items targeting + three separate rfc-app minor releases), the driver dispatches them + in parallel as subagent threads. Each subagent writes its own + subsession transcript (numbered `.1`, `.2`, …) and the driver folds + the cross-reference into the main session transcript. +- **Cross-repo coherence.** OHM is three repos in lockstep: the + framework code (`rfc-app`), the deployment content (`ohm-rfc`, + including the pin file that names which rfc-app version OHM serves), + and the operator CLI (`ohm-rfc-app-flotilla`). When a session ships + across all three, the transcript names all three commit SHAs in + the cut-state table. No ambiguity about what landed where. + + +## Why the transcripts are public + +The transcripts are the artifact, not a polished retelling. They include the gestures that worked and the ones that did not, the -mistakes and their recoveries, the §19.2 candidates surfaced and -deferred, and the running thread of "what did the operator and the -agent actually do with each other this turn." If you came here looking -for documentation, you will be disappointed; this is closer to a flight -recorder. +mistakes and their recoveries, the `§19.2` candidates surfaced and +deferred (the running ledger of "this deserves its own session +later"), and the running thread of what the operator and the agent +actually did with each other this turn. +The lesson from `rfc-app/SPEC.md` §19.3 is that the build is the +artifact; the cleanup is dishonest. A redacted record reads as if +the wrong turns never happened, which makes the path look obvious +when in fact the choosing was the work. So no curation. If a +session hit a dead end, the dead end stays. If the operator violated +a hard rule and recovered, the violation stays and so does the +recovery. The only filter is `§3` invariant 1: no secret bytes, +ever. + +The transcripts are the cross-session driver brief. Future sessions +read the last session's transcript before opening — that's how +context survives the gap between sessions when the operator and +the agent are both fresh. The closing block of each transcript +includes a paste-ready prompt for the next session. + +Oh and Jan, your joke is in there somewhere. + + ## What's in the repo -Filenames carry the session's PST start and end times as ISO datetimes -with colons replaced by dashes for filesystem compatibility: -`SESSION--TRANSCRIPT---.md` where each datetime is -`YYYY-MM-DDTHH-MM`. PST is implied. +Layout: one folder per session, keyed by the 4-digit session number, +with the full `SESSION-NNNN.M-TRANSCRIPT---.md` filename +inside the folder (the `SESSION-` prefix is retained so files remain +self-identifying when shared as raw links). Subagent transcripts +(`.1`, `.2`, …) sit in the same folder as their parent driver +transcript. -| Session | Window (PST) | Topic | -| --- | --- | --- | -| [A](./SESSION-A-TRANSCRIPT-2026-05-25T15-00--2026-05-25T17-01.md) | 2026-05-25 15:00 → 17:01 | Stood up `git.benstull.org` — personal Gitea on GCP, end-to-end. **Predates OHM.** Included for continuity; the OHM-specific work begins with Session B. | -| [B](./SESSION-B-TRANSCRIPT-2026-05-25T19-30--2026-05-25T21-30.md) | 2026-05-25 19:30 → 21:30 | First OHM deployment — rfc-app brought up against the Wiggleverse content repo. | -| [C](./SESSION-C-TRANSCRIPT-2026-05-27T06-00--2026-05-27T09-44.md) | 2026-05-27 06:00 → 09:44 | rfc-app 0.3.0 release + first OHM upgrade. | -| [D](./SESSION-D-TRANSCRIPT-2026-05-27T15-30--2026-05-27T16-47.md) | 2026-05-27 15:30 → 16:47 | (See file for topic header.) | -| [E](./SESSION-E-TRANSCRIPT-2026-05-27T17-00--2026-05-27T18-40.md) | 2026-05-27 17:00 → 18:40 | (See file for topic header.) | -| [F](./SESSION-F-TRANSCRIPT-2026-05-27T19-00--2026-05-27T19-21.md) | 2026-05-27 19:00 → 19:21 | (See file for topic header.) | -| [G](./SESSION-G-TRANSCRIPT-2026-05-27T19-30--2026-05-27T19-45.md) | 2026-05-27 19:30 → 19:45 | (See file for topic header.) | -| [H](./SESSION-H-TRANSCRIPT-2026-05-27T20-00--2026-05-27T22-40.md) | 2026-05-27 20:00 → 22:40 | Shipped `ohm-rfc-app-flotilla` v1.0.0 — the operator CLI for OHM deploys. | -| [I](./SESSION-I-TRANSCRIPT-2026-05-27T23-30--2026-05-28T03-15.md) | 2026-05-27 23:30 → 2026-05-28 03:15 | Three waves shipped via parallel forked subagents: rfc-app v0.4.0 → v0.13.0 (skipping vacant slots). First autonomous-driver session. | +``` +README.md +sessions.json +0001/ + SESSION-0001.0-TRANSCRIPT-…md +0013/ + SESSION-0013.0-TRANSCRIPT-…md + SESSION-0013.1-TRANSCRIPT-…md + SESSION-0013.2-TRANSCRIPT-…md + SESSION-0013.3-TRANSCRIPT-…md +… +``` + +`sessions.json` is the title manifest — a flat JSON object keyed by +the 4-digit session number, with a human-readable title for each. +The on-site sessions browser at `ohm.wiggleverse.org/docs/sessions` +reads this file to render the nav. Subagent transcripts inherit +their parent session's title; the `.N` ordinal disambiguates rows +under the parent. + +Sessions 0001 through 0013 originally shipped under a letter-form +naming (`SESSION-A` through `SESSION-M`). Roadmap item #23 (executed +in session 0014.0) renamed every file to the zero-padded numeric +form via `git mv` so the audit trail shows file-was-renamed rather +than file-was-deleted-and-recreated. Transcript bodies still read +"Session I" / "Session M.1" / etc. internally; that's deliberate — +the rename is filename-level only, not a rewrite. The mapping table +is in `SESSION-PROTOCOL.md` §1 (legacy form table) on the +private-but-referenced `ohm-infra` working repo. ## How transcripts get added -The pattern at the end of each session is: the driver writes -`SESSION--TRANSCRIPT---.md` to `~/git/ohm-infra/` -locally, the operator reviews, then a one-line script publishes to -this repo: +The pattern at the end of each session: the driver writes +`SESSION-NNNN.M-TRANSCRIPT---.md` to `~/git/ohm-infra/` +locally, the operator reviews, and the one-line publish script +copies the file into the matching `NNNN/` folder here and pushes: ```bash ~/git/ohm-infra/scripts/publish-transcript.sh \ - SESSION-J-TRANSCRIPT-2026-05-28T04-00--2026-05-28T06-30.md + SESSION-0017.0-TRANSCRIPT-2026-05-28T08-52--2026-05-28T10-30.md ``` -The script is idempotent: re-running on an already-published transcript -no-ops; re-running on an updated transcript pushes the diff with a -commit message of the form `update SESSION-J-TRANSCRIPT-…md`. +The script is idempotent: re-running on an already-published +transcript no-ops; re-running on an updated transcript pushes the +diff with a commit message of the form `update SESSION-…md`. The +script also handles the folder placement — it parses the leading +`NNNN` from the filename and routes into the matching folder. ## What this repo is not - **Not a place to discuss OHM.** Discussion lives on - [ohm.wiggleverse.org](https://ohm.wiggleverse.org) itself, per its - PR-less per-RFC discussion surface (added in rfc-app v0.5.0). Issues - on this repo will likely go unanswered; the work is the corpus. + [ohm.wiggleverse.org](https://ohm.wiggleverse.org) itself, per the + PR-less per-RFC discussion surface (rfc-app v0.5.0). Issues opened + here will likely go unanswered; the work is the corpus. - **Not the canonical spec.** That lives in `rfc-app/SPEC.md` and - `ohm-rfc-app-flotilla/SPEC.md` on the respective repos under + `ohm-rfc-app-flotilla/SPEC.md` on their respective repos under `wiggleverse/`. Transcripts reference spec sections; the spec is authoritative when the two disagree. -- **Not a curated retelling.** No redaction has been applied beyond - the audit pass documented in - [`ohm-infra/TRANSCRIPT-PUBLISHING-PLAN.md`](https://github.com/) (kept - private). If a transcript contains a wrong turn, the wrong turn stays - in. If it contains an operator quirk or a self-correction, those - stay too. +- **Not a curated retelling.** Beyond the audit pass documented in + `ohm-infra/TRANSCRIPT-PUBLISHING-PLAN.md` (kept private, no secret + bytes), nothing has been redacted. Wrong turns stay in. Operator + quirks and self-corrections stay in. ## Related repos -- [`wiggleverse/ohm-rfc`](https://git.wiggleverse.org/ben/ohm-rfc) — the - OHM content repo (RFCs, deployment pin, roadmap). -- [`ben.stull/rfc-app`](https://git.wiggleverse.org/ben.stull/rfc-app) — - the framework code OHM runs. +- [`wiggleverse/ohm-rfc`](https://git.wiggleverse.org/wiggleverse/ohm-rfc) + — the OHM content repo (RFCs, deployment pin, roadmap). +- [`ben.stull/rfc-app`](https://git.wiggleverse.org/ben.stull/rfc-app) + — the framework code OHM runs. - [`wiggleverse/ohm-rfc-app-flotilla`](https://git.wiggleverse.org/wiggleverse/ohm-rfc-app-flotilla) — the operator CLI for OHM deploys. ## License -[CC BY 4.0](./LICENSE). Copy, modify, redistribute freely; credit the -author. Same license as the OHM content repo. +[CC BY 4.0](./LICENSE). Copy, modify, redistribute freely; credit +the author. Same license as the OHM content repo. diff --git a/sessions.json b/sessions.json new file mode 100644 index 0000000..5f2d28c --- /dev/null +++ b/sessions.json @@ -0,0 +1,17 @@ +{ + "0001": { "title": "Bootstrap — git.benstull.org personal Gitea on GCP" }, + "0002": { "title": "Session B — first OHM deployment (ohm.wiggleverse.org from zero)" }, + "0003": { "title": "Session C — rfc-app 0.3.0 release + OHM upgrade (allowlist + anon read)" }, + "0004": { "title": "Session D — flotilla SPEC + rfc.wiggleverse.org deprovision" }, + "0005": { "title": "Session E — flotilla Slices 1 & 2 (registry + overlay; secret refs)" }, + "0006": { "title": "Session F — flotilla Slice 3 (pin reading + deploy --dry-run, v0.3.0)" }, + "0007": { "title": "Session G — flotilla Slice 4 (full deploy gesture + health probe, v0.4.0)" }, + "0008": { "title": "Session H — flotilla v1.0.0 + first real OHM upgrade via flotilla" }, + "0009": { "title": "Session I — multi-wave driver (rfc-app v0.4–v0.13, skipping vacants)" }, + "0010": { "title": "Session J — DOCS.md + /docs route (rfc-app v0.14.0)" }, + "0011": { "title": "Session K — Wave 4 (admin /users, device trust, CloudFlare Turnstile)" }, + "0012": { "title": "Session L — Wave 5 (Amplitude, owner-invite, admin-create)" }, + "0013": { "title": "Session M — Wave 6 (CONTRIBUTING + SPEC §21 analytics; repo-naming; email/webhook runbook)" }, + "0014": { "title": "Session N — Wave 7 driver (SMTP + webhook hardening, #23 transcript rename)" }, + "0015": { "title": "Roadmap-capture parallel session (items #24–#30 added to ROADMAP.md)" } +}