# Session 0040.0 — Transcript > Date: 2026-05-29 > Goal: Answer the operator's question about non-UX RFC contributions > (ROADMAP #35), then "do it" — stand up the operator RFC-authoring > lane. Along the way, settle the repo-per-RFC topology question the > operator kept raising. > > Outcome: **#35 proven end-to-end (Informed Consent super-draft live > in the OHM corpus, authored + merged natively via a new > `rfc-authoring.sh` lane). The operator's "does each RFC need its own > repo?" pushback overturned the session's first answer — topology is > now captured as ROADMAP #36 (leaning meta-only), RFC-0002 graduation > paused. A real rfc-app bug the operator spotted (phantom pending-idea > after a merge-with-branch-delete) was fixed, tested, released as > v0.30.1, and deployed (deploys.id=43).** > > Highlights: > - rfc-app v0.30.1 — phantom-pending-idea reconcile fix, 375 tests green. > - New durable tooling: `ohm-infra/scripts/rfc-authoring.sh` + > `RFC-AUTHORING-LANE-RUNBOOK.md`. Token in macOS Keychain, never in > a transcript. > - ROADMAP: #35 layout note corrected (wrong SPEC §1 premise), #36 added. --- ## Pre-session state - ohm-rfc pin: rfc-app **0.30.0**; OHM live on 0.30.0 (healthy). - rfc-app main at `1558cc3` (v0.30.0). - Corpus: one active RFC (`human` → RFC-0001, `wiggleverse/rfc-0001-human`) + the `wiggleverse/ohm-meta` manifest. - ROADMAP #35 (operator RFC authoring lane) open, captured 2026-05-29 in a prior session; no tooling built yet. - No gitea token configured anywhere (clean slate). --- ## Turn-by-turn arc ### Arc 1 — "Any roadmap work for non-UX git contributions?" Identified ROADMAP **#35** as exactly that item. Walked its open questions; the operator zeroed in on one sub-question — *"does each RFC really need its own repo? it's a single document"* — asked three times across the session, which signaled it was the real decision. ### Arc 2 — First (wrong) topology answer, then the correction Initially folded a "maturity-gated, manifest-glued" decision into #35 (keep per-RFC repos at graduation). The operator pushed back. Reading SPEC §1 showed two of the three pro-per-repo arguments were **nullified by the design**: (a) per-repo Gitea permissions — wrong, all git ops go through a single bot and auth is app-side; (b) fork-to-contribute — wrong, raw git push isn't a supported path. What survives (isolated history, multi-file-bundle container) is thin for a single document. Corrected the #35 note, added **#36** (decide repo-per-RFC vs. meta-only; operator leans meta-only — a SPEC §1 + §13 framework change, not something #35 bakes in). **RFC-0002 graduation paused** so a second per-repo data point isn't canonized while #36 is open. ### Arc 3 — Build the authoring lane (credential hygiene) Operator chose "file I read by reference," then improved on it mid-build: *"create a script you run so you never read that file. Can it be encrypted?"* — which is the better shape. Built `ohm-infra/scripts/rfc-authoring.sh`: verb-based gitea-API wrapper, token in the **macOS Keychain** (encrypted at rest, no plaintext file), piped to `curl --config -` so it never enters argv/stdout/transcript. Several subshell-scope bugs found and fixed during smoke-testing (token-resolution exit not propagating; HTTP status not surviving the command-substitution subshell). Trace-verified the token never appears on a curl argv line. Operator loaded a `write:repository`-scoped PAT; `whoami` (needs `read:user`) 403s but that's irrelevant — authorship is confirmed from PR author fields instead. ### Arc 4 — Prove #35 end-to-end with a real RFC Operator's working title: **Informed Consent** (already named in RFC-0001 as a future entity — a real corpus entry, not a throwaway). Drafted `rfcs/informed-consent.md` as a super-draft matching the original `human` propose-commit shape. Branch `propose/informed-consent` → commit (authored **Ben Stull**, not the bot) → push → `pr-create` (PR #7) → `pr-merge --method merge --delete-branch`. File landed on ohm-meta main; `/api/rfcs` showed the super-draft live — **the webhook reconciled a CLI merge automatically**, answering #35's named failure-mode question in the affirmative for ohm-meta merges. ### Arc 5 — The operator catches a real bug Operator: *"I see Informed Consent as both a Super-Draft and a Pending Idea in the UX."* Investigated: gitea truth = PR #7 closed+merged, but `/api/proposals` still listed it. Root cause: I merged with `--delete-branch`; gitea then reports the PR `head.ref` as the `refs/pull/7/head` sentinel; `refresh_meta_pulls` parses the slug from the branch name → `None` → row skipped → `cached_prs.state` frozen at `open` forever. `cached_rfcs` reconciled off the push event (super-draft appeared) but `cached_prs` never did (phantom idea). The web UX never hit this because it leaves branches in place (`default_delete_branch_after_merge=false`). ### Arc 6 — Fix, test, release, deploy Fixed in `backend/app/cache.py`: when gitea reports an empty or `refs/pull/` sentinel ref, recover the real branch name from the stored `cached_prs.head_branch` row (migration 002 retains it). Applied to both `refresh_meta_pulls` and `refresh_rfc_repo`. Added regression test `test_merged_idea_pr_with_deleted_branch_clears_proposal` — **proven by reverting the fix and watching it fail with the exact phantom**, then restoring. Full suite **375 green**. Released **rfc-app v0.30.1** (branch → bump VERSION + package.json → CHANGELOG → commit → tag → push origin + benstull mirror, SHAs match → ff-merge main). Bumped ohm-rfc pin 0.30.0 → 0.30.1. Deploy hit a stale-ADC reauth wall twice (operator's `gcloud auth application-default login` had to actually complete — first attempts didn't rewrite the credential file); once the ADC minted a token, **deploy succeeded, deploys.id=43, v0.30.1 live**. Verified: `/api/health` = 0.30.1, `/api/proposals` = `[]` (phantom gone), `informed-consent` intact as a super-draft. ### Arc 7 — Durable artifacts + protocol close Wrote `ohm-infra/RFC-AUTHORING-LANE-RUNBOOK.md` (#35's required gesture-note). Confirmed ohm-infra is not a git repo (only transcripts publish, via the script, to `ohm-session-history`), so the script + runbook simply live on disk. --- ## Cut state (end of session) | | | | --- | --- | | rfc-app | `732b23b` v0.30.1 — phantom-pending-idea reconcile fix; pushed origin + benstull | | OHM live | deploys.id=43, **v0.30.1**, healthy | | ohm-rfc | `470251b` — ROADMAP #35 correction + #36 added; pin → 0.30.1; pushed | | ohm-meta | `informed-consent` super-draft live (PR #7 merged) | | ohm-infra | `rfc-authoring.sh` + `RFC-AUTHORING-LANE-RUNBOOK.md` on disk (not a git repo) | | gitea token | Ben-owned PAT, `write:repository`, in macOS Keychain `ohm-gitea-token` | | Wave ledger | Status | | --- | --- | | #35 operator RFC authoring lane | ✅ proven end-to-end (super-draft path); tooling + runbook shipped | | #36 RFC topology (meta-only) | 🟡 captured, operator leans meta-only, decision deferred | | rfc-app v0.30.1 (phantom fix) | ✅ shipped + deployed (deploys.id=43) | --- ## §19.2 / process candidates surfaced 1. **#36 — RFC repository topology.** The big one. SPEC §1 says "each RFC is its own repo," but the bot-mediated app-auth model nullifies most of the benefit for single-document RFCs. Decide meta-only vs. per-repo deliberately; it's a §1 + §13 framework change. 2. **Stale open graduation PR.** `ohm-meta` PR #2 ("Graduate human → RFC-0001", ohm-bot) is still open — a leftover from RFC-0001's creation. Harmless but should be cleaned up. 3. **Idea-PR merge hygiene.** Even with the v0.30.1 fix, omit `--delete-branch` on idea-PR merges to match the web UX. Encoded in the runbook; could be enforced in `rfc-authoring.sh` (refuse `--delete-branch` for `propose/*` heads). --- ## What lands on the operator's plate 1. **Decide #36** (meta-only vs. per-repo). Until then, do not graduate RFC-0002 into its own repo. Authoring super-drafts is unblocked. 2. **Flesh out Informed Consent** — it's a live super-draft; the body can grow via `edit/informed-consent/*` branches on ohm-meta (the meta-only revision path, safe regardless of #36). 3. **GCP ADC** expires; `gcloud auth application-default login` needs to actually complete (watch for "Credentials saved to file") before a deploy. --- ## Prompt the operator can paste into the next Claude Code session ``` OHM driver session. Reserve your own session ID first (~/git/ohm-infra/scripts/claim-session-id.sh --start ). Context from session 0040.0: - ROADMAP #35 (operator RFC authoring lane) is PROVEN. The tool is ~/git/ohm-infra/scripts/rfc-authoring.sh (verbs: whoami/pr-create/ pr-merge/pr-list/pr-get/api); credential is a Ben-owned gitea PAT (write:repository) in the macOS Keychain service `ohm-gitea-token`. Full gesture + caveats: ~/git/ohm-infra/RFC-AUTHORING-LANE-RUNBOOK.md. When merging idea PRs, do NOT pass --delete-branch (see runbook). - "Informed Consent" is a live super-draft in wiggleverse/ohm-meta (rfcs/informed-consent.md). To flesh out its body, use the meta-only edit path: edit/informed-consent/* branch + PR on ohm-meta. This is safe regardless of #36. - ROADMAP #36 is OPEN and BLOCKING: decide repo-per-RFC vs. meta-only topology (operator leans meta-only). It's a SPEC §1 + §13 framework change. DO NOT graduate any RFC into its own repo until #36 is decided. If the operator wants to settle #36, that's the next big piece — draft the SPEC §1/§3/§13 revision + the rfc-app graduation- flow change (in-place state flip, no repo creation). - OHM live: v0.30.1 (deploys.id=43). rfc-app main 732b23b. - Loose end: ohm-meta PR #2 (stale "Graduate human" PR from ohm-bot) is still open — close it if convenient. ```