# Session 0013.2 — Transcript (subsession)

> Parent: SESSION-0013.0-TRANSCRIPT-2026-05-28T05-26--INPROGRESS.md
> Date: 2026-05-28
> Goal: Roadmap item #17 step 1 (inventory) + step 2 (propose) — survey every repo on `git.wiggleverse.org` and `git.benstull.org`, draft the move proposal as a single document for the operator to review. **Step 3 (execute) is explicitly out of scope.**
>
> Outcome: **`REPO-NAMING-PROPOSAL.md` written to `~/git/ohm-infra/`. 12 repos inventoried across the two hosts plus 9 local-only working dirs documented. 8 moves proposed (3 archives, 2 namespace transfers, 3 operator-decision items). 6 open questions surfaced. Zero git operations performed against any remote.**

This is a subsession of Session 0013.0 (the OHM driver session). The driver
dispatched M.2 with a tight read-only-inventory + single-deliverable
brief. Subsession boundaries follow the OHM session protocol §1
(letter+number scheme — M.2 is the second subsession of M).

---

## Pre-session state

The driver's hand-off named:

- 9 known wiggleverse.org repos (driver named 3; M.2 inventoried the
  rest via Gitea explore endpoint).
- 3 known benstull.org repos (same).
- Roadmap item #17 ("Repo naming + location alignment") names the
  framing: rfc-app should be in `wiggleverse/`, not personal namespace;
  mirror convention undocumented; the `ohm-app` legacy VM (tracked
  separately as roadmap #1, out of scope for M.2).
- Hard constraint: subsession publishes its transcript to
  `wiggleverse/ohm-session-history` (public). No secret bytes.
- Hard constraint: no Gitea admin actions, no transfers, no edits to
  anything but the proposal document itself.

Operator's working tree (parent session 0013.0's pre-state): clean.
Active OHM deployment: v0.17.0 (deploys.id=21). Pin: 0.17.0. Healthy.

---

## Turn-by-turn arc

### Arc 1 — Read roadmap #17 + scout local checkouts

Read `~/projects/wiggleverse/ohm-rfc/ROADMAP.md` lines 314+ for
item #17's full statement. The session-shape it names is:
inventory → propose → execute. M.2 owns the first two.

Listed `~/git/` and `~/projects/wiggleverse/` to map local checkouts:

- `~/git/`: ohm-infra (not a git repo!), ohm-meta (empty), rfc-app
  (canonical clone), rfc-app-v0.15/v0.16/v0.17 (per-release worktrees),
  wiggleverse-meta (clone of `wiggleverse/meta`), benstull-infra
  (not a repo, just two old transcript MDs).
- `~/projects/wiggleverse/`: ohm-rfc (clone), ohm-rfc-app-flotilla
  (clone), rfc-app-prototype (clone), org/ (not inspected).

Already a discovered-friction item: `~/git/ohm-infra/` not being a
git repo is structurally weird. Filed as §3.4 in the proposal.

### Arc 2 — Inventory both Gitea hosts

`curl https://git.wiggleverse.org/explore/repos` and the equivalent
on benstull.org returned HTTP 200 HTML for both — anonymous explore
works. Parsed out `href="/<owner>/<name>"` links.

Wiggleverse.org reported 9 repos:
- `ben.stull/{benstull,ohm-rfc,rfc-app,rfc-app-prototype}`
- `wiggleverse/{meta,ohm-meta,ohm-rfc-app-flotilla,ohm-session-history,rfc-0001-human}`

Benstull.org reported 3:
- `benstull/{docs,rfc-app,rfc-app-flotilla}`

For each, hit `/api/v1/repos/<owner>/<name>` for metadata (description,
created/updated, default branch, size, mirror flag, private flag).
All API calls anonymous; all returned 200. No auth needed for this
inventory.

Also hit `/api/v1/repos/<owner>/<name>/commits?limit=1` per repo for
the actual last-commit timestamp and message — `updated_at` from the
repo metadata wasn't always commit-tied (could be a description edit).

### Arc 3 — Confirm the push-mirror mechanism

`ben.stull/rfc-app` and `benstull/rfc-app` both reported commit
`1456c8b73f70` at `2026-05-28T05:10:52-07:00` — same sha, same
timestamp within seconds. But neither was flagged `mirror: True`
in the API. Tried `/api/v1/repos/.../push_mirrors` — returned
"user should be an owner or a collaborator with admin write," so
the push-mirror config is admin-only-visible.

Conclusion: the sync mechanism is a push-mirror configured by the
operator on the canonical side, invisible to the public read API.
Worth a note in the proposal — operator needs to reauthorize it
after Move 3.

Also noticed: the **descriptions** of the canonical and mirror have
drifted apart ("The Wiggleverse RFC framework app — see PHILOSOPHY.md
and SPEC.md." vs "Open-source RFC platform software"). Filed under
§3.3.

### Arc 4 — Probe URL-redirect handling on Gitea

The flotilla CHANGELOG L282–283 has a note about `ben/ohm-rfc` being
a redirect alias to `ben.stull/ohm-rfc`. Tested:
- `/api/v1/repos/ben/ohm-rfc` → HTTP 307
- `/api/v1/repos/ben.stull/ohm-rfc` → HTTP 200
- Same `307` for `ben/rfc-app`, `ben/benstull`, `ben/rfc-app-prototype`.

Conclusion: `ben` is an old username that aliases to `ben.stull` via
Gitea's user-rename redirect feature. This matters because if Moves
3+4 land, the alias chain becomes two hops: `ben → ben.stull →
wiggleverse`. Filed as risk in Move 4 and as Q5.

### Arc 5 — Find URL refs in load-bearing docs

`grep -nE 'git\.(wiggleverse|benstull)\.org'` against:
- `~/git/rfc-app/CLAUDE.md` and `SPEC.md` → zero hits. rfc-app source
  doesn't reference the hosting URLs. Good — moves don't break
  shipped framework code.
- `~/git/rfc-app/frontend/` → zero hits. The running frontend doesn't
  embed the canonical URL. Confirms zero shipped-artifact breakage.
- `~/projects/wiggleverse/ohm-rfc-app-flotilla/CLAUDE.md`, `SPEC.md`,
  `README.md`, `CHANGELOG.md`, `docs/operator-guide.md`, `scripts/`,
  `tests/` → **many hits**. Catalogued line-by-line in the proposal's
  Moves 3 and 4 sections. Test files hardcode `ben/ohm-rfc` four
  places. The SPEC has it ~10 places, plus a whole framing paragraph
  in §3.1 about why rfc-app gets a benstull mirror that **needs
  conceptual rewriting**, not just URL swapping.
- `~/projects/wiggleverse/ohm-rfc/ROADMAP.md` → many hits including
  the entire §16 release-table (rows 2–13) with tag URLs. Note in
  proposal: those should probably stay (they record historical state)
  but Gitea's redirect will keep them resolving.
- `~/git/ohm-infra/SESSION-*-TRANSCRIPT-*.md` → many hits. Per session
  protocol these are immutable. Gitea's redirect handles them. Filed
  explicitly in the proposal's "do NOT edit historical transcripts"
  callout.

### Arc 6 — Inspect overlapping meta-repo content

`wiggleverse/meta`, `wiggleverse/ohm-meta`, and
`wiggleverse/rfc-0001-human` all had READMEs and `rfcs/` dirs.
Fetched contents via API.

- `wiggleverse/meta`: `PHILOSOPHY.md` (12 KB), `CONTRIBUTING.md`
  (626 B), `rfcs/.gitkeep`, generic README.
- `wiggleverse/ohm-meta`: `PHILOSOPHY.md` (12 KB), `CONTRIBUTING.md`
  (626 B), `rfcs/human.md` (292 B **stub**), README.
- `wiggleverse/rfc-0001-human`: `RFC.md` (22 KB, the full body),
  `.rfc` marker, README that says "canonical text lives here;
  meta-repo entry is `rfcs/human.md` in ohm-meta."
- `ben.stull/ohm-rfc`: `PHILOSOPHY.md` (13.5 KB — superset),
  `CONTRIBUTING.md` (4.5 KB — superset), `RFC-0001-human.md` (22 KB
  — **same body** as `rfc-0001-human/RFC.md`), `ROADMAP.md` (61 KB),
  `CLAUDE.md`, `LICENSE`, `.rfc-app-version`.

The proposal's §2 Move 2 names the collision: two models
("per-RFC repos" vs "monorepo") both exist, monorepo has won in
practice. Operator decision Q1 settles whether to archive the per-RFC
repos.

### Arc 7 — Confirm flotilla SQLite registry state

`sqlite3 ~/.ohm-rfc-app-flotilla/ohm-rfc-app-flotilla.db 'SELECT *
FROM deployments;'` returned the ohm-rfc-app row with
`pin_source_repo='ben/ohm-rfc'` and `corpus_repo='ben/ohm-rfc'`.

Important: after Move 4, the operator must run a flotilla command
to update these values, or the next deploy chases a two-hop redirect.
Flagged in Move 4 cross-repo-cleanup section.

### Arc 8 — Write the proposal

Wrote `~/git/ohm-infra/REPO-NAMING-PROPOSAL.md` (~22 KB) covering:

- §1 inventory: two host tables + local-only working dirs + topology snapshot
- §2 move proposal: 8 moves with risk, ordering, URL-breakage callouts, specific paths
- §3 discovered friction: 6 items (confirmed roadmap #17's plus 4 new)
- §4 open questions: 6 (Q1 RFC-shape, Q2 mirror destination, Q3 stub fate, Q4 ohm-infra-as-repo, Q5 username alias, Q6 backup before)
- §5 suggested execution-session shape: pre-flight checklist, ordered execution, Gitea-admin vs git-cli vs edit-text gestures, verify
- §6 §19.2 candidates surfaced
- §7 summary table

No git operations against any remote. No edits to anything besides
the proposal doc itself.

---

## Cut state (end of subsession)

| | |
| --- | --- |
| `~/git/ohm-infra/REPO-NAMING-PROPOSAL.md` | new file, ~22 KB, M.2's only artifact |
| Every other repo (local + remote) | untouched |
| OHM live | unchanged (deploys.id=21, v0.17.0, healthy) |
| flotilla SQLite registry | unchanged |
| Parent session 0013.0 state | unchanged |

| M.2 deliverable ledger | Status |
| --- | --- |
| Read roadmap #17 in full | done |
| Inventory wiggleverse.org repos | done (9 found) |
| Inventory benstull.org repos | done (3 found) |
| Cross-reference local checkouts | done |
| Read CLAUDE.md/SPEC.md/ROADMAP.md for URL refs | done |
| Write proposal doc | done |
| Write transcript | done (this file) |
| Publish transcript to ohm-session-history | **driver does this**, not subsession (per protocol §"subagents do not write their own transcripts" — but the brief overrode that and asked M.2 to write one; M.2 wrote, driver publishes) |

---

## §19.2 candidates surfaced

Two surfaced during M.2 (also in proposal §6):

1. **Stop relying on Gitea path aliases.** flotilla currently leans
   on the `ben/ohm-rfc` → `ben.stull/ohm-rfc` redirect alias (urllib
   follows 307s). After Moves 3+4, that chain becomes two hops.
   Better: resolve canonical paths at `flotilla deployment update`
   time, store the resolved path in SQLite, never chase aliases at
   deploy time.
2. **flotilla-core extraction reservation as concrete artifact.**
   The stub repo `git.benstull.org/benstull/rfc-app-flotilla` (Move 5)
   could either be archived or repurposed as the placeholder for the
   future `flotilla-core` §19.2 extraction. Operator decision (Q3).

A third candidate **not** in the proposal but worth a separate item:

3. **Promote `~/git/ohm-infra/` to a real git repo.** Currently a
   working dir with no version control on `SESSION-PROTOCOL.md`,
   the publish script, the transcript-publishing plan, etc. Roadmap
   #17 scope doesn't cover it but the inventory surfaced it (§3.4).
   Worth its own roadmap item.

---

## What the driver needs to know

1. **Proposal lives at `~/git/ohm-infra/REPO-NAMING-PROPOSAL.md`**
   and is ready for operator review.
2. **Six open questions** the operator must settle before the
   execution session. Q1 is structural (monorepo vs per-RFC) and may
   reshape the proposal entirely.
3. **Biggest finding not in roadmap #17:** `wiggleverse/meta`,
   `wiggleverse/ohm-meta`, and `wiggleverse/rfc-0001-human` are three
   repos for one job. Monorepo has won in practice; archive the other
   two if operator confirms.
4. **Biggest cross-repo cleanup load:** the flotilla SPEC.md needs
   ~10 URL updates *plus* a conceptual rewrite of the §3.1 paragraph
   that explains why rfc-app has a benstull mirror (the "personal
   shape" rationale dissolves once rfc-app moves to org namespace).
5. **flotilla test files hardcode `ben/ohm-rfc` in four places**
   (`test_plan.py`, `test_pin.py`, `test_bringup_replay.py`,
   `test_deployment.py`). These must update with Move 4.
6. **The flotilla SQLite registry** at
   `~/.ohm-rfc-app-flotilla/ohm-rfc-app-flotilla.db` has
   `pin_source_repo` and `corpus_repo` both set to `ben/ohm-rfc`.
   Must be updated post-Move-4 or next deploy chases a redirect.
7. **No shipped frontend artifacts reference the canonical URLs.**
   This is the load-lightening discovery: the moves don't break
   anything that an OHM end-user sees.
8. **No git operations were performed by M.2** against any remote.
   Read-only inventory, single new file (the proposal), this
   transcript.

---

## Closing handoff to driver

M.2 is done. The driver returns control to the operator with the
proposal ready for review. The next OHM session that wants to
execute roadmap #17 picks up by:

1. Operator reads `REPO-NAMING-PROPOSAL.md`, settles Q1–Q6.
2. Operator backs up `~/git/ohm-infra/` (Q6 / §3.4 surfaced) if not
   yet a real repo.
3. Driver session opens, follows the execution shape in proposal §5.

That execution session is operator-led (per the brief that dispatched
M.2: "step 3 is operator-led in a future session").
