#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:
@@ -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.
|
||||||
|
|||||||
@@ -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)" }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user