Files
session-history/README.md
T
Ben Stull d5125190ae Session 0018.0 (Wave 9): rewrite legacy session refs in transcript bodies + README scoping
- Rewrite every legacy `Session L` / `Session M.1` etc. reference inside
  transcript bodies to the numeric form (`Session 0012.0` / `Session 0013.1`),
  via a mechanical Python sed pass scoped to canonical-filename transcripts
  only (502 replacements across 39 files; 21 files in this published repo +
  18 sibling files in `~/git/ohm-infra/`). The §23 rename was originally
  filename-only — session 0018.0 reverses that and rewrites the bodies too,
  so cross-references inside a transcript match the filename you'd browse
  to. The mapping table (`A → 0001` … `N → 0014`) lives in
  `SESSION-PROTOCOL.md` §1 (also amended this session) for anyone hitting
  an old external link.

- Amend README.md:
  - New "Where the record begins" section noting OHM started with two
    vibe-coded prototypes (no transcripts; the discipline that produced this
    record didn't exist yet). The transcripts here begin at the
    spec-driven-development phase — not at the literal beginning of OHM.
  - Update the existing "Sessions 0001 through 0013 originally shipped
    under a letter-form naming" paragraph to reflect that body refs are
    now also in numeric form.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 09:40:06 -07:00

189 lines
8.6 KiB
Markdown

# ohm-session-history
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 0001: the
`git.benstull.org` personal-Gitea buildout) and every OHM session
since.
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+).
<!-- operator: rewrite this section in your voice -->
## Where the record begins
OHM started with two vibe-coded prototypes — exploratory passes the
operator built to figure out what the project wanted to be. Neither
prototype produced a session transcript; the discipline that produced
this record didn't exist yet, and the work was more "what does this
even feel like to use" than "ship a deployable version."
The first draft of the framework spec
([`rfc-app/SPEC.md`](https://git.wiggleverse.org/ben.stull/rfc-app/src/branch/main/SPEC.md))
was written off what those prototypes had taught the operator. From
that draft onward, the build switched to spec-driven development:
every session reads the spec, advances one feature, lands on OHM, and
records what happened. The transcripts here start at that point — not
at the very beginning of OHM's existence, but at the beginning of
OHM-as-spec-driven-work.
The two vibe-coded prototypes are not represented here. If you're
trying to understand how OHM thinks, the spec is the primary text;
the transcripts are the day-to-day record of how the spec gets
extended in use.
<!-- operator: rewrite this section in your voice -->
## How OHM gets built
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.
<!-- operator: rewrite this section in your voice -->
## 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 (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.
<!-- operator: rewrite this section in your voice -->
## What's in the repo
Layout: one folder per session, keyed by the 4-digit session number,
with the full `SESSION-NNNN.M-TRANSCRIPT-<start>--<end>.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.
```
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. Initially the file-level rename
was filename-only — the bodies still read "Session I" / "Session M.1"
internally — but session 0018.0 also rewrote the bodies to use the
numeric form throughout, so cross-references inside a transcript
match the filename you'd browse to. The legacy mapping table
(`A → 0001`, …, `N → 0014`) lives in `SESSION-PROTOCOL.md` §1 on
the private-but-referenced `ohm-infra` working repo, in case you
encounter a stray legacy reference in older external links.
## How transcripts get added
The pattern at the end of each session: the driver writes
`SESSION-NNNN.M-TRANSCRIPT-<start>--<end>.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-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-…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 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 their respective repos under
`wiggleverse/`. Transcripts reference spec sections; the spec is
authoritative when the two disagree.
- **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/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.