diff --git a/ohm/0070/SESSION-0070.0-TRANSCRIPT-2026-06-04T01-48--2026-06-04T02-14.md b/ohm/0070/SESSION-0070.0-TRANSCRIPT-2026-06-04T01-48--2026-06-04T02-14.md
new file mode 100644
index 0000000..8257f12
--- /dev/null
+++ b/ohm/0070/SESSION-0070.0-TRANSCRIPT-2026-06-04T01-48--2026-06-04T02-14.md
@@ -0,0 +1,105 @@
+# Session 0070.0 — Transcript
+
+> App: ohm (rfc-app framework repo, `ben.stull/rfc-app`; worktree `rfc-app-main`)
+> Start: 2026-06-04T01-48 (PST)
+> End: 2026-06-04T02-14 (PST)
+> Goal: Merge `feat/containerize-for-preview` into `main`. (Claimed mid-way through a broader, cross-repo stale-branch triage running under `wgl-session-ignore`; this transcript covers the ohm-scoped slice.)
+> Outcome: **v0.34.0 containerize-for-preview merged to `main`** (`0252e40`); the two stale `session-004x/e2e-tier1` branches **deleted as superseded**.
+
+## Plan
+
+The ohm session was opened specifically to land the per-PR preview-environment
+containerization branch. Renumber the release to the next-free version, resolve
+the bookkeeping conflicts created by `main` moving on, fast-forward `main`, and
+clean up. The two `e2e-tier1` branches in the same repo were evaluated in the
+same pass and found superseded.
+
+## Pre-session state
+
+- `main` at `97ba3ae`, **VERSION 0.33.0** (§22 M3 backend Plan A had shipped —
+ the integration that 0069 left on the operator's plate is done).
+- Local `main` was **42 commits behind `origin/main`** at session start — the
+ initial branch triage had (mis)compared against the stale local main, so every
+ verdict had to be recomputed against the real `origin/main`.
+- `feat/containerize-for-preview` (`7e07a92`, 3 days old): one commit adding a
+ `Dockerfile`, `.dockerignore`, and `deploy/preview/*`, self-labelled **v0.32.0**
+ — but `0.32.0` and `0.33.0` were both already taken on `origin/main`.
+- Two e2e branches: `session-0046/e2e-tier1-scaffold` and `session-0047/e2e-tier1`
+ (0046 ⊂ 0047), the #38 Tier-1 local-Docker groundwork.
+
+## Turn-by-turn arc (wrong turns included, per protocol)
+
+1. **Triaged `feat/containerize-for-preview`.** Confirmed genuinely un-merged
+ (its files absent from `origin/main`, not patch-equivalent). The catch: it
+ was a **version collision**, not just a changelog nit — `0.32.0` was taken by
+ the optional-grad/retire feature and `0.33.0` by M3 backend. Renumber target:
+ **0.34.0**.
+2. **Baseline check caught the stale local main** (42 behind). Re-evaluated
+ against `origin/main`: conflicts were `VERSION`, `frontend/package.json`,
+ `CHANGELOG.md` — all bookkeeping. (Also a false alarm: the CLAUDE.md
+ org-context import was "missing" only because local main was stale; the
+ fast-forward supplied it.)
+3. **Fast-forwarded `main` to `origin/main`**, rebased the branch onto it,
+ resolved the three conflicts: `VERSION` → `0.34.0`, `frontend/package.json` →
+ keep main's (test scripts + testing-library) with version `0.34.0`,
+ `CHANGELOG.md` → re-slot the containerize block at the top as `0.34.0`, keep
+ all of main's entries. Amended the commit message `v0.32.0` → `v0.34.0`.
+4. **Operator chose direct fast-forward** over force-push+PR (a force-push of the
+ rebased branch was offered and declined). FF'd `main` to the rebased commit
+ and pushed: `97ba3ae..0252e40`. Deleted the stale pre-rebase branch from
+ `origin` (local ref kept — operator declined the force-delete).
+5. **Re-evaluated the two e2e branches against the real `origin/main`** and found
+ `origin/main` had **independently grown its own e2e suite** — the `testing/`
+ (Docker harness) + `e2e/` (Playwright specs) split from M3-0 Task 7. The
+ branches were the earlier #38 attempt at the same Tier-1 goal, with a cruder
+ layout and — tellingly — a backend **rate-limit bypass** (`ratelimit.py` +
+ `test_ratelimit_bypass.py`) that the shipped design **deliberately rejected**
+ (it sidesteps the OTC cooldown with a fresh per-run email "without touching
+ backend config"). Verdict: **superseded.** Deleted both (local + origin). The
+ branch's slightly richer OTC assertions were noted but not salvaged (bound to
+ the rejected harness).
+
+## Cut state (end of session)
+
+| Artifact | State |
+| --- | --- |
+| `main` | `0252e40` — **v0.34.0**, containerize-for-preview merged + pushed |
+| `feat/containerize-for-preview` (origin) | **deleted** (work is on `main`) |
+| `feat/containerize-for-preview` (local) | merged ref left in place (operator declined deletion) — harmless |
+| `session-0046/e2e-tier1-scaffold`, `session-0047/e2e-tier1` | **deleted** local + origin (superseded by M3-0 `testing/`+`e2e/`) |
+| Working tree | clean, `main` == `origin/main` |
+
+v0.34.0 payload on `main`: `Dockerfile` (multi-stage Vite→Python+nginx, single
+SQLite, no prod secrets), `.dockerignore`, `deploy/preview/` (entrypoint, nginx
+template, synthetic `seed.sql`, `preview.env.example`) — the app-side enabler for
+flotilla per-PR previews (SPEC §15).
+
+## What lands on the operator's plate
+
+- Nothing blocking from the ohm slice — v0.34.0 is shipped and clean.
+- The leftover local `feat/containerize-for-preview` ref can be force-deleted any
+ time (`git -C rfc-app-main branch -D feat/containerize-for-preview`).
+- Roadmap continuation is unchanged from 0069's plate (M3-frontend plan +
+ execute, PPE standup, etc.) — this session did not touch the M3 critical path,
+ only the preview-container enabler and stale-branch cleanup.
+
+## Prompt the operator can paste into the next session
+
+```
+Resume rfc-app §22 M3. v0.34.0 (containerize-for-preview) is now on main — the
+app is container-ready for flotilla per-PR previews. Read the rfc-app memory
+(project_rfc_app_multiproject.md) for the M3 state, then continue the M3-frontend
+plan-and-execute on the M3-0 harness, and stand up the PPE (rfc-app-ppe.)
+for the Tier-2 e2e gate.
+```
+
+## Note — broader session context
+
+This ohm transcript covers only the rfc-app-main work. It was claimed partway
+through a cross-repo stale-branch triage (run under `wgl-session-ignore` from the
+`~/git` parent) that also: merged `slice2-schema-validate` to `flotilla-core`
+`main`; merged launch-app Slice 3 to the `engineering` handbook `main`; deleted
+an obsoleted `docs/standard-repo-set` branch (it recommended the now-retired
+per-app `flotilla` repo); and abandoned `feat/preview-environments` in the
+**archived** `ohm-rfc-app-flotilla` (flotilla went generic via flotilla-core).
+Those are separate apps and not part of ohm session 0070.
diff --git a/ohm/0070/SESSION-0070.0-TRANSCRIPT-2026-06-04T01-48--INPROGRESS.md b/ohm/0070/SESSION-0070.0-TRANSCRIPT-2026-06-04T01-48--INPROGRESS.md
deleted file mode 100644
index 30a0f7a..0000000
--- a/ohm/0070/SESSION-0070.0-TRANSCRIPT-2026-06-04T01-48--INPROGRESS.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Session 0070.0 — Transcript
-
-> App: ohm
-> Start: 2026-06-04T01-48 (PST)
-> Status: **PLACEHOLDER — claimed at session start; finalized at session end.**
->
-> This file reserves session ID 0070 for ohm. The driver replaces this
-> body with the full transcript and renames the file to its final
-> SESSION-0070.0-TRANSCRIPT-2026-06-04T01-48--.md form at session end.
-
-## Launch prompt
-
-```
-Merge feat/containerize-for-preview into main in rfc-app-main (ohm app):
-renumber the containerization release v0.32.0 -> 0.33.0 (0.32.0 is already taken
-on main by the optional-graduation-id/retire feature), resolve the CHANGELOG.md
-collision, then push -> PR -> merge per conventions. Branch adds Dockerfile,
-.dockerignore, and deploy/preview/* for per-PR preview environments (flotilla
-SPEC §15).
-
-```