#30: per-session folder layout + README + sessions.json

Restructures the flat repo into one folder per session, with a top-level
README.md (the "about sessions" page, also rendered at /docs/sessions/about
by rfc-app v0.19.0+) and a sessions.json title manifest keyed by 4-digit
NNNN. Filenames inside each folder retain the full SESSION-NNNN.M-TRANSCRIPT-…
form (no trim of the SESSION- prefix). Legacy letter-form transcripts, if
any are still at the root, are not moved — the folder convention applies
to the numeric form only.

Session 0017.0; see SESSION-PROTOCOL.md §1 amendment for the binding shape.
This commit is contained in:
Ben Stull
2026-05-28 09:12:08 -07:00
parent b6a7b7dfe9
commit ad01c0854a
21 changed files with 144 additions and 52 deletions
+127 -52
View File
@@ -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.
<!-- operator: rewrite this section in your voice -->
## 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.
<!-- 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, 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.
<!-- operator: rewrite this section in your voice -->
## 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-<letter>-TRANSCRIPT-<start>--<end>.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-<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.
| 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-<letter>-TRANSCRIPT-<start>--<end>.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-<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-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.
+17
View File
@@ -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.4v0.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)" }
}