# Session 0041.0 — Transcript > Date: 2026-05-29 > Start: 2026-05-29T05-45 (PST implied) > Status: **IN PROGRESS** > > Goal: Settle ROADMAP #36 — adopt the meta-only RFC repository topology > (no per-RFC repos; graduation = in-place state flip), revise the > rfc-app SPEC + code, fold RFC-0001 back into its meta entry, ship > rfc-app v0.31.0, deploy to OHM. --- ## Plan / TODO - [x] Claim session ID (0041). - [x] Close stale ohm-meta PR #2 (duplicate "Graduate human" PR). - [x] Read SPEC §1/§3/§13 + map the rfc-app graduation code surface. - [x] Operator decisions: settle #36 meta-only; fold RFC-0001 back (single model); reframe SPEC for the "single content repo" deployer story + track the ohm-meta→ohm-content rename for #33. - [x] Revise SPEC §1/§2/§3/§4/§9.8/§13 to meta-only (operator signed off on the diff). - [x] rfc-app code: collapse graduation to an in-place flip; re-key the branch/PR/chat dispatch on meta-residency; remove the per-repo read path / guards; simplify the bot + GraduateDialog. - [x] Tests green (full suite 375 passed); frontend builds. - [x] Bump VERSION + package.json + CHANGELOG (v0.31.0). - [ ] RFC-0001 fold-back content migration (restore body to meta entry, `repo: null`, archive `wiggleverse/rfc-0001-human`). - [ ] Commit + tag v0.31.0 + push origin + benstull mirror. - [ ] Bump ohm-rfc pin to v0.31.0. - [ ] `flotilla deploy ohm-rfc-app` + verify. - [ ] Strike ROADMAP #36; capture #33 rename follow-up. - [ ] Finalize + publish transcript. --- ## Launch prompt OHM driver session. Reserve session ID. Context from session 0040.0: #35 (operator RFC authoring lane) proven; "Informed Consent" super-draft live; **#36 OPEN + BLOCKING** — decide repo-per-RFC vs. meta-only (operator leans meta-only); OHM live v0.30.1 (deploys.id=43), rfc-app main 732b23b; loose end ohm-meta PR #2 (stale graduate-human) open. --- ## Pre-session state - OHM live: v0.30.1, healthy (`/api/health` ok). - rfc-app `main` at `732b23b` (v0.30.1). - ohm-meta: `human` is **active** (RFC-0001, `repo: wiggleverse/rfc-0001-human`, graduated 2026-05-26, body stripped to frontmatter), `informed-consent` is a super-draft. `wiggleverse/rfc-0001-human` exists with a 22KB `RFC.md`. - PR #2 was a **duplicate** stale graduation PR (the real graduation merged 2026-05-26 via another PR); closing it was correct. --- ## Turn-by-turn arc ### Arc 1 — Orient + operator decisions Claimed 0041. Closed ohm-meta PR #2 (the authoring-lane token is `write:repository`, not `write:issue`, so the explanatory PR comment got a 403 — closure itself succeeded; **runbook gap noted**: commenting needs `write:issue` scope). Discovered RFC-0001 is a real graduated per-repo RFC (22KB RFC.md), which made its fate the pivot for #36. Operator decisions (via AskUserQuestion): 1. **Settle #36 meta-only** (full code + deploy, not SPEC-only). 2. **Fold RFC-0001 back** to a single meta-only model (restore body to the meta entry, archive the repo, delete the per-repo read path) — rather than grandfathering it as a dual path. 3. **Reframe the SPEC** for the "single content repository" deployer story (a framework-level win, not just OHM), keep `META_REPO` config term stable, and **track the concrete `ohm-meta → ohm-content` rename as a #33 follow-up** (do NOT rename this session). ### Arc 2 — SPEC revision (signed off) Rewrote SPEC §1 (topology: one meta repo, no per-RFC repos, + a boxed supersession note + deployer-facing "content repository" framing), §2 (`repo:` always-null, README index, body-migration note), §3 (active = in-place state), §3.2, §4 (cache/reconciler), §9.8 (the four per-repo handoff frictions struck through), and §13 in full (retitled "in place"; §13.2 two-field dialog, no repo name, no open-PR precondition; §13.3 "The flip" = single open+merge PR, body kept, no transaction/no rollback, old sequence struck through; §13.4 nothing moves; §13.5 reversal softened; new §13.6 RFC-0001 fold-back migration record). Operator approved the diff as the contract. ### Arc 3 — rfc-app code (meta-only) - `api_graduation.py` rewritten: `GraduateBody` drops `repo_name`; `graduate_check` is two fields; the orchestrator is a two-step flip (`open_pr` → `merge_pr`) that **keeps the body** and sets `repo=None`; no rollback (merge-failure cleans up the unmerged PR + branch). New `graduate_failed` audit kind; removed the `graduate_repo_*` / `graduate_rollback` steps. - `bot.py`: `open_graduation_pr` drops `repo_full` + the "moves to RFC.md" PR body; deleted `create_rfc_repo_for_graduation`, `seed_graduated_rfc`, `delete_rfc_repo`. - Dispatch re-keyed on **meta-residency (`repo IS NULL`)** in `api_prs.py` + `api_branches.py` (`_is_meta_resident`, `_is_meta_target`, the cache-refresh dispatch); removed the two `"RFC has no repo"` 409 guards; `promote-to-branch` now names an active RFC's auto-branch `edit--` so the shared meta-repo cache can attribute it; the §9.8 read-only-edit-branch guard scoped to legacy per-repo only; `pre_graduation_history` scoped to legacy per-repo only. - `cache.py`: `refresh_meta_branches` includes meta-resident active RFCs (synthetic main + edit branches). `hygiene.py`: branch-delete repo resolution keyed on meta-residency. - `GraduateDialog.jsx` + `api.js`: two-field dialog, two-step stack, no repo field, no blocking-PR popover. - **Tests:** rewrote `test_graduation_vertical.py` to the flip model (happy-path keeps body + no per-repo + no repo audit rows; coexists with open body-edit PR; open-pr failure leaves super-draft; merge failure cleans up; edit branch surfaces normally post-graduation); updated `test_hygiene_vertical.py` + `test_e2e_smoke.py`. **Full suite: 375 passed.** Frontend builds clean. - Bumped VERSION + frontend/package.json to **0.31.0**; CHANGELOG entry with RFC 2119 upgrade steps (incl. the MUST fold-back step). ### Arc 4 — (in progress) content migration + release + deploy _To be filled in: RFC-0001 fold-back, tag/push, pin bump, deploy, verify._ --- ## Decisions / notes for the record - **Deploy ordering:** v0.31.0 is dual-capable (handles both legacy per-repo actives and meta-only actives), so it is deployed FIRST, then RFC-0001 is folded back — avoids a window where the live app 409s on a repo-null active. - **Authoring-lane runbook gap:** `ohm-gitea-token` is `write:repository` scope; PR/issue commenting needs `write:issue`. Either widen the scope or document that the lane can open/merge/close PRs but not comment. - **#33 follow-up captured:** rename `wiggleverse/ohm-meta → ohm-content` (rename repo → update `META_REPO` overlay → update the Gitea webhook → re-point catalog + redeploy). Decided this session; deferred to a #33 ops session. --- ## Prompt the operator can paste into the next session _(to be finalized at session end)_