#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 Full Claude Code session transcripts from the build of the
[Open Human Model](https://ohm.wiggleverse.org) — including the [Open Human Model](https://ohm.wiggleverse.org) — including the
infrastructure work that preceded it (Session A: the `git.benstull.org` infrastructure work that preceded it (Session 0001: the
personal-Gitea buildout) and every OHM session since. `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 <!-- operator: rewrite this section in your voice -->
full transcript that captures decisions, friction, dead ends, and the ## How OHM gets built
reasoning behind each settlement — the cleaned-up post-hoc version is
not what you find here.
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 include the gestures that worked and the ones that did not, the
mistakes and their recoveries, the §19.2 candidates surfaced and mistakes and their recoveries, the `§19.2` candidates surfaced and
deferred, and the running thread of "what did the operator and the deferred (the running ledger of "this deserves its own session
agent actually do with each other this turn." If you came here looking later"), and the running thread of what the operator and the agent
for documentation, you will be disappointed; this is closer to a flight actually did with each other this turn.
recorder.
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 ## What's in the repo
Filenames carry the session's PST start and end times as ISO datetimes Layout: one folder per session, keyed by the 4-digit session number,
with colons replaced by dashes for filesystem compatibility: with the full `SESSION-NNNN.M-TRANSCRIPT-<start>--<end>.md` filename
`SESSION-<letter>-TRANSCRIPT-<start>--<end>.md` where each datetime is inside the folder (the `SESSION-` prefix is retained so files remain
`YYYY-MM-DDTHH-MM`. PST is implied. 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 | ```
| --- | --- | --- | README.md
| [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. | sessions.json
| [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. | 0001/
| [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. | SESSION-0001.0-TRANSCRIPT-…md
| [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.) | 0013/
| [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.) | SESSION-0013.0-TRANSCRIPT-…md
| [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.) | SESSION-0013.1-TRANSCRIPT-…md
| [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.) | SESSION-0013.2-TRANSCRIPT-…md
| [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. | SESSION-0013.3-TRANSCRIPT-…md
| [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. |
```
`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 ## How transcripts get added
The pattern at the end of each session is: the driver writes The pattern at the end of each session: the driver writes
`SESSION-<letter>-TRANSCRIPT-<start>--<end>.md` to `~/git/ohm-infra/` `SESSION-NNNN.M-TRANSCRIPT-<start>--<end>.md` to `~/git/ohm-infra/`
locally, the operator reviews, then a one-line script publishes to locally, the operator reviews, and the one-line publish script
this repo: copies the file into the matching `NNNN/` folder here and pushes:
```bash ```bash
~/git/ohm-infra/scripts/publish-transcript.sh \ ~/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 The script is idempotent: re-running on an already-published
no-ops; re-running on an updated transcript pushes the diff with a transcript no-ops; re-running on an updated transcript pushes the
commit message of the form `update SESSION-J-TRANSCRIPT-…md`. 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 ## What this repo is not
- **Not a place to discuss OHM.** Discussion lives on - **Not a place to discuss OHM.** Discussion lives on
[ohm.wiggleverse.org](https://ohm.wiggleverse.org) itself, per its [ohm.wiggleverse.org](https://ohm.wiggleverse.org) itself, per the
PR-less per-RFC discussion surface (added in rfc-app v0.5.0). Issues PR-less per-RFC discussion surface (rfc-app v0.5.0). Issues opened
on this repo will likely go unanswered; the work is the corpus. here will likely go unanswered; the work is the corpus.
- **Not the canonical spec.** That lives in `rfc-app/SPEC.md` and - **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 `wiggleverse/`. Transcripts reference spec sections; the spec is
authoritative when the two disagree. authoritative when the two disagree.
- **Not a curated retelling.** No redaction has been applied beyond - **Not a curated retelling.** Beyond the audit pass documented in
the audit pass documented in `ohm-infra/TRANSCRIPT-PUBLISHING-PLAN.md` (kept private, no secret
[`ohm-infra/TRANSCRIPT-PUBLISHING-PLAN.md`](https://github.com/) (kept bytes), nothing has been redacted. Wrong turns stay in. Operator
private). If a transcript contains a wrong turn, the wrong turn stays quirks and self-corrections stay in.
in. If it contains an operator quirk or a self-correction, those
stay too.
## Related repos ## Related repos
- [`wiggleverse/ohm-rfc`](https://git.wiggleverse.org/ben/ohm-rfc) — the - [`wiggleverse/ohm-rfc`](https://git.wiggleverse.org/wiggleverse/ohm-rfc)
OHM content repo (RFCs, deployment pin, roadmap). — the OHM content repo (RFCs, deployment pin, roadmap).
- [`ben.stull/rfc-app`](https://git.wiggleverse.org/ben.stull/rfc-app) - [`ben.stull/rfc-app`](https://git.wiggleverse.org/ben.stull/rfc-app)
the framework code OHM runs. the framework code OHM runs.
- [`wiggleverse/ohm-rfc-app-flotilla`](https://git.wiggleverse.org/wiggleverse/ohm-rfc-app-flotilla) - [`wiggleverse/ohm-rfc-app-flotilla`](https://git.wiggleverse.org/wiggleverse/ohm-rfc-app-flotilla)
— the operator CLI for OHM deploys. — the operator CLI for OHM deploys.
## License ## License
[CC BY 4.0](./LICENSE). Copy, modify, redistribute freely; credit the [CC BY 4.0](./LICENSE). Copy, modify, redistribute freely; credit
author. Same license as the OHM content repo. 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)" }
}