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>
This commit is contained in:
Ben Stull
2026-05-28 09:40:06 -07:00
parent 412b6ab5d8
commit d5125190ae
21 changed files with 281 additions and 255 deletions
@@ -1,4 +1,4 @@
# Session L — Transcript
# Session 0012.0 — Transcript
> Date: 2026-05-28
> Goal: Execute Wave 5 of `ohm-rfc/ROADMAP.md` as the autonomous
@@ -55,8 +55,8 @@
> Side effect of the pin jumping from `0.12.0` → `0.15.0` → `0.16.0`
> → `0.17.0`: OHM now also runs v0.13.0's cookie-consent banner
> and v0.14.0's `/docs` route, which had been integrated on
> `main` since Session J but were not currently deployed because
> the pin had rolled back during Session K's Wave-4 sequence.
> `main` since Session 0010.0 but were not currently deployed because
> the pin had rolled back during Session 0011.0's Wave-4 sequence.
---
@@ -68,7 +68,7 @@
`v0.2.0, .1, .2, .3, v0.3.0, v0.4.0, v0.5.0, v0.6.0, v0.7.0,
v0.8.0, v0.9.0, v0.10.0, v0.11.0, v0.12.0, v0.13.0, v0.14.0`.
Last migration on disk: `017_device_trust.sql` (slot 016
reserved + skipped per Session K).
reserved + skipped per Session 0011.0).
- **ohm-rfc**: `.rfc-app-version` = `0.12.0`. The pin was "below"
v0.13.0 (cookie banner) and v0.14.0 (`/docs`) — those features
were integrated on rfc-app `main` but not currently deployed
@@ -81,15 +81,15 @@
`{"version":"0.12.0","status":"ok"}`. `flotilla deploy log
ohm-rfc-app` showed last successful deploy as `deploys.id=18`
(v0.12.0, succeeded, 11:18 UTC) — the post-`TURNSTILE_REQUIRED=true`
re-deploy from Session K that put abuse defense fail-closed.
re-deploy from Session 0011.0 that put abuse defense fail-closed.
- **ohm-rfc-app-flotilla**: `main` at `65c0e55` (CLAUDE.md
secret-set gesture correction). No flotilla work expected in
Wave 5; none performed.
- **ohm-infra**: most recent transcript is Session K
(`SESSION-K-TRANSCRIPT-2026-05-28T03-20--2026-05-28T03-55.md`).
Next letter is L (Session K = previous driver; Session J = the
- **ohm-infra**: most recent transcript is Session 0011.0
(`SESSION-0011.0-TRANSCRIPT-2026-05-28T03-20--2026-05-28T03-55.md`).
Next letter is L (Session 0011.0 = previous driver; Session 0010.0 = the
parallel docs-feature / v0.14.0 session that ran during
Session I's wind-down).
Session 0009.0's wind-down).
- **Hard rule baked in mid-Session-K**: never EVER ask the operator
to paste secret bytes into the conversation. Stayed honored
through this session — the Amplitude key the operator pasted is
@@ -120,7 +120,7 @@ with parallel `Agent` tool uses, `subagent_type: general-purpose`,
running in the background. Each subagent created its own
`git worktree add` in `/Users/benstull/git/rfc-app-<target-version-
slug>` (the `Agent` tool's worktree isolation only covers the
flotilla CWD, not the rfc-app CWD subagents needed — Session K
flotilla CWD, not the rfc-app CWD subagents needed — Session 0011.0
lesson). Each prompt was self-contained: full roadmap text,
target version, reserved migration slot (018 for ν, 019 for ο,
none for ξ), descending-order CHANGELOG insertion point, hard
@@ -221,7 +221,7 @@ operator added three new roadmap items:
claim so the Amplitude record is created with the OHM user_id
from the first event rather than as an anonymous device that
retroactively links). Part C explicitly names what "ships
inline in Session L" vs. what waits for the data-informed
inline in Session 0012.0" vs. what waits for the data-informed
audit. Committed to ohm-rfc at `f006d33` (Parts A + B), then
`1c88f71` (Part C added).
- **#22 Pro-analytics-consent copy on the privacy/cookies
@@ -341,7 +341,7 @@ scopes, hand-reconcilable.
The driver squash-merged each branch into rfc-app `main` in
version order, hand-resolving conflicts and adding inline
Amplitude wiring per #21 Part C "ships inline in Session L":
Amplitude wiring per #21 Part C "ships inline in Session 0012.0":
**v0.15.0 integration** — fast-forward squash from `b3f1b15`
(no conflicts: main was at ξ's base). Driver-side extensions
@@ -424,7 +424,7 @@ the union of ν's 237 + ο's 15 new). Inline Amplitude wiring per
### Arc 7 — Three serialized deploys to OHM
Per the §8.3 single-in-flight-deploy rule and Session K's
Per the §8.3 single-in-flight-deploy rule and Session 0011.0's
serialization lesson, each version deployed in turn:
- **Overlay set**: `flotilla overlay set ohm-rfc-app
@@ -438,7 +438,7 @@ serialization lesson, each version deployed in turn:
`{"version":"0.15.0","status":"ok"}`. Side-effect features
v0.13.0 (cookie banner) + v0.14.0 (`/docs` route) now also
on production for the first time since the pin had rolled
back during Session K's Wave-4 sequence.
back during Session 0011.0's Wave-4 sequence.
- **v0.16.0**: pin bumped, committed `1c2bb26`, pushed.
`flotilla deploy run ohm-rfc-app` → `deploys.id=20`, all 9
phases green, verify 2.4s. `/api/health` returns
@@ -463,7 +463,7 @@ about the pre-vendor wording. Committed at `47cb2f9`, pushed.
### Arc 9 — Protocol amendment: subagent transcripts (Session-L-introduced)
After the driver had written what it thought was the final
Session L transcript, the operator surfaced a series of follow-up
Session 0012.0 transcript, the operator surfaced a series of follow-up
asks:
1. "Prompt for next session pls?" + "and update transcript" —
@@ -489,8 +489,8 @@ test-suite outcomes). The amendment introduces subsession
transcripts:
- **Naming**: `SESSION-<letter>.<n>-TRANSCRIPT-<start>--<end>.md`
(e.g. `SESSION-M.1-TRANSCRIPT-…md` for the first subagent in
Session M). Nested ordinals (`.1.1`) supported if a forked
(e.g. `SESSION-0013.1-TRANSCRIPT-…md` for the first subagent in
Session 0013.0). Nested ordinals (`.1.1`) supported if a forked
subagent itself dispatches another.
- **Dispatch contract**: the driver pre-assigns subsession IDs
in dispatch order, names the exact filename + the
@@ -501,7 +501,7 @@ transcripts:
publishes its own + each subsession's transcript via the
publish script. Stub-write on subagent's behalf if the
subagent crashed without producing one.
- **Applies from Session M onward.** Session L itself ran under
- **Applies from Session 0013.0 onward.** Session 0012.0 itself ran under
the prior "driver-only" rule because the amendment landed
mid-session after L's three subagents had already returned;
no `SESSION-L.1` / `.2` / `.3` transcript files exist or will
@@ -516,10 +516,10 @@ Changes landed:
validator regex extended from `[A-Za-z]+` to
`[A-Za-z]+(\.[0-9]+)*` so subsession filenames pass.
Dry-run validation confirmed: the parent filename still
validates, and a hypothetical `SESSION-M.1-TRANSCRIPT-…md`
validates, and a hypothetical `SESSION-0013.1-TRANSCRIPT-…md`
would also pass.
- Session L's next-session prompt (below) updated with the new
dispatch shape so Session M's driver inherits it.
- Session 0012.0's next-session prompt (below) updated with the new
dispatch shape so Session 0013.0's driver inherits it.
The fourth ask — "update the transcript again — always do that
as a final step of a session" — was captured as a feedback
@@ -553,7 +553,7 @@ So this arc 11 captures: the operator reinforced the discipline,
the driver re-finalized the transcript with this arc included,
and re-published. The publish script's idempotent-on-identical /
update-on-changed behavior means the re-publish lands as an
"Update SESSION-L-TRANSCRIPT-…md" commit on
"Update SESSION-0012.0-TRANSCRIPT-…md" commit on
`wiggleverse/ohm-session-history`, not a duplicate file. The
filename's `--<end>` timestamp stays the original
`2026-05-28T05-17` (the time of the first finalization); the
@@ -565,7 +565,7 @@ Future driver sessions should expect this pattern to recur:
"finalization" is not a one-shot gesture. Any operator
instruction landing after the first publish triggers another
finalize + re-publish cycle. The discipline is captured for
Session M onward in the next-session prompt's closing block
Session 0013.0 onward in the next-session prompt's closing block
+ the feedback memory.
### Arc 12 — Roadmap item #23 surfaced: rename transcripts to numeric form
@@ -594,7 +594,7 @@ led, one-session operational gesture):
add+delete (preserve history); redirect tombstones vs. 404
(URL breakage for external references); sequencing relative
to the next-letter-after-L session (most-elegant timing is
Session M as the rename session itself, so `SESSION-0013.0`
Session 0013.0 as the rename session itself, so `SESSION-0013.0`
debuts as the new shape from the start). Decide at session
time.
@@ -632,10 +632,10 @@ cycle continues. The discipline holds open-ended.
| #12 Owner invite (v0.16.0) | ✅ shipped, `deploys.id=20` |
| #16 Admin-create user + invite (v0.17.0) | ✅ shipped, `deploys.id=21` |
| New roadmap items captured (Session L) | Status |
| New roadmap items captured (Session 0012.0) | Status |
| --- | --- |
| #20 Email deliverability | 📝 captured, awaiting session |
| #21 Amplitude audit + standing discipline | 📝 captured. Part C identity-lifecycle work shipped inline in Session L's v0.15.0 + v0.16.0 + v0.17.0 commits. Part A audit waits for ~1 week of real Amplitude data; Part B discipline can start anytime. |
| #21 Amplitude audit + standing discipline | 📝 captured. Part C identity-lifecycle work shipped inline in Session 0012.0's v0.15.0 + v0.16.0 + v0.17.0 commits. Part A audit waits for ~1 week of real Amplitude data; Part B discipline can start anytime. |
| #22 Pro-analytics-consent copy on privacy/cookies opt-in | 📝 captured. Waiting on operator-drafted + counsel-reviewed copy. |
| #23 Rename transcripts `SESSION-<letter>` → `SESSION-NNNN.M` | 📝 captured. One Track-Ω session, operator-led. Mapping A→0001.0 through L→0012.0 spelled out in the item. Surfaces enumerated (12 transcripts + protocol + publish-script + cross-doc refs). |
@@ -669,7 +669,7 @@ cycle continues. The discipline holds open-ended.
said "OHM serves v0.12.0" which was accurate, but did NOT
mention that v0.13.0 and v0.14.0 features (cookie banner,
`/docs`) were integrated on `main` but absent from the live
deploy because the pin had rolled back during Session K.
deploy because the pin had rolled back during Session 0011.0.
Any Wave-5 deploy was always going to bring those features
back; the driver flagged this in arc 1 + handled it
transparently, but a session-bootstrap script that emits
@@ -741,7 +741,7 @@ cycle continues. The discipline holds open-ended.
team if it bites again.
6. **Item #1 VM rename + #17 inventory + #19 PR coordination
+ #23 transcript-rename** stay operator territory. #23
adds one decision-point: do you want Session M to be the
adds one decision-point: do you want Session 0013.0 to be the
rename session (so it debuts as `SESSION-0013.0`), or run
a few more letter-form sessions first and rename in a
later session?
@@ -751,7 +751,7 @@ cycle continues. The discipline holds open-ended.
## Updated next-session prompt
```
You are the OHM roadmap driver. The previous session (Session L)
You are the OHM roadmap driver. The previous session (Session 0012.0)
shipped rfc-app v0.15.0 (Amplitude Analytics + Session Replay,
#13, deploys.id=19), v0.16.0 (per-RFC owner invites, #12,
deploys.id=20), and v0.17.0 (admin-create user + invite email,
@@ -759,7 +759,7 @@ deploys.id=20), and v0.17.0 (admin-create user + invite email,
v0.17.0 with Amplitude analytics + session replay live (gated by
the v0.13.0 cookie banner), v0.13.0 cookie banner itself, v0.14.0
/docs route, per-RFC owner invites, and admin-create user invites
all in production for the first time. Session L also folded #21
all in production for the first time. Session 0012.0 also folded #21
Part C identity-lifecycle work inline across all three release
commits — identify({ user_id, properties }) + setUserProperties()
+ amplitude.reset on sign-out + identify-BEFORE-track on every
@@ -769,19 +769,19 @@ Read `~/git/ohm-infra/SESSION-PROTOCOL.md` and
`/Users/benstull/projects/wiggleverse/ohm-rfc/ROADMAP.md`
end-to-end. The next session letter is M.
**New protocol amendment from Session L**: subagents write their
**New protocol amendment from Session 0012.0**: subagents write their
own transcripts (subsession files like
`SESSION-M.1-TRANSCRIPT-<start>--<end>.md`) before returning to
`SESSION-0013.1-TRANSCRIPT-<start>--<end>.md`) before returning to
the driver. The driver pre-assigns each subagent's subsession ID
in the dispatch prompt. The driver's own Session-M transcript
stays load-bearing for cross-subagent synthesis + cut-state,
with cross-references to each subsession. See
SESSION-PROTOCOL.md §5 for the binding form. The publish
script's filename validator was extended in Session L to accept
script's filename validator was extended in Session 0012.0 to accept
`SESSION-<letter>.<n>-TRANSCRIPT-…md`.
**Hard rule (Session K + Session L): never EVER ask the operator
to paste secret bytes into the conversation.** Session L
**Hard rule (Session 0011.0 + Session 0012.0): never EVER ask the operator
to paste secret bytes into the conversation.** Session 0012.0
confirmed the corollary: public bundle-embedded values
(`VITE_AMPLITUDE_API_KEY`, `VITE_TURNSTILE_SITE_KEY`) are fine
to receive in conversation and set via `flotilla overlay set` —
@@ -791,7 +791,7 @@ default to the operator-run gesture (`pbpaste | flotilla secret
set …` for secrets; `flotilla overlay set DEPLOYMENT KEY=VALUE`
for non-secrets).
Wave 6 candidates (per Session L's roadmap state):
Wave 6 candidates (per Session 0012.0's roadmap state):
- **#20 Email deliverability** (Track Ω + rfc-app template
hygiene) — high priority now that two invite paths ship and
the recipient's first contact with OHM is an email; spam
@@ -821,7 +821,7 @@ Wave 6 candidates (per Session L's roadmap state):
merges.
- **#1 VM rename** — operator-led ops gesture.
Dispatch shape (updated for Session M per the Session-L
Dispatch shape (updated for Session 0013.0 per the Session-L
amendment):
1. For each subagent, pre-assign a subsession ID: M.1, M.2, …
2. In the dispatch prompt, name the subsession ID + tell the
@@ -841,7 +841,7 @@ amendment):
(the regex now accepts `SESSION-<letter>.<n>-TRANSCRIPT-…md`).
Session-L lessons to apply automatically (in addition to all of
Session K's):
Session 0011.0's):
- **Vendor prompts can override the roadmap's pre-vendor
guesses.** When the operator pastes a vendor installation
prompt mid-session (Amplitude this time; could be Stripe,
@@ -876,14 +876,14 @@ Session K's):
anonymous device that retroactively links. SPEC chapter to
codify is part of #21 Part B.
- **Pin-jump side effects**: when the pin bumps past versions
that were integrated-but-undeployed (in Session L: v0.13.0
that were integrated-but-undeployed (in Session 0012.0: v0.13.0
cookie banner + v0.14.0 /docs both went live as a side
effect of the v0.15.0 → v0.17.0 sequence), flag this to the
operator at the deploy step. Not a blocker; just transparency.
- **CHANGELOG slot 016 stays reserved + skipped**. v0.15.0
used no schema migration; #12 took slot 018, #16 took 019.
Next free: 016, 020, 021, ….
- **Login.jsx remains contested**: Session L's v0.15.0
- **Login.jsx remains contested**: Session 0012.0's v0.15.0
Amplitude wiring added `User Signed In` calls at the three
verify paths (otc / passcode / trust-device). Future
auth-touching releases need to preserve v0.11.0 + v0.12.0 +
@@ -906,7 +906,7 @@ Session K's):
promptly so the operator sees them on the gitea side without
waiting.
End-of-session: write `~/git/ohm-infra/SESSION-M-TRANSCRIPT-…md`
End-of-session: write `~/git/ohm-infra/SESSION-0013.0-TRANSCRIPT-…md`
(your main transcript) AND ensure each subagent's subsession
transcript was written. Per Session-L feedback: **transcript is
the LAST step** — finish all other work first, then finalize the