# Session 0064.0 — Transcript

> Date: 2026-06-02
> Start: 2026-06-02T06-00 (PST implied)
> End: 2026-06-02T06-55 (PST implied)
> Driver: Claude (Opus 4.8) + Ben
> Session type: cross-project — primary work on the **ecomm BDD release planner**
> (`wiggleverse-ecomm-bdd-release-planner-app`, GCP project
> `wiggleverse-ecomm-bdd-app`), with an OHM ramification (OHM added as a project;
> the OHM GCP project's ADC quota pin changed). Session ID claimed **retroactively
> at end** — the start was assessed as ecomm-planner work, so no claim was made at
> launch; published here because OHM is materially involved.

---

## Launch prompt

```
Add OHM as a real project in the BDD planner. Read ecomm-bdd-release-planner.md
first. Use the new ⚙ project-management UI at rfc.wiggleverse.org to create the
`ohm` project pointing at its gitea meta repo + corpus subpath; confirm refresh.sh
auto-clones and ingests it (or trigger ingest on planner-vm), and that it appears
in the dropdown with scenarios. Decide how OHM's corpus is populated (paste vs an
existing spec dir). While in that GCP project, fix the ADC quota-project pin:
gcloud auth application-default set-quota-project wiggleverse-ecomm-bdd-app.
```

---

## Outcome (TL;DR)

OHM is now a project in the multi-project planner hub at `rfc.wiggleverse.org` —
but **not** a BDD project. Investigation showed OHM has **zero** Gherkin/BDD
content anywhere (it's a body of RFCs, RFC-0001..0032 in `ben.stull/ohm-rfc`;
published content in `wiggleverse/ohm-content`). So rather than seed a fake
corpus, Ben chose to **add a per-project `bdd_enabled` capability flag** to the
planner: BDD projects (ecomm) keep the scenario corpus/releases/paste machinery;
non-BDD projects (OHM) live in the hub as organizational entries with that
machinery turned off. Shipped, deployed, verified live. The ADC quota fix was
applied. No secret bytes published (the planner URL token is scrubbed to
`<PLANNER_TOKEN>` throughout; gitea bot tokens were used from Secret Manager and
never printed).

## What shipped

**Feature: per-project BDD on/off flag** — planner app repo
`wiggleverse/wiggleverse-ecomm-bdd-release-planner-app`, branch
`project-bdd-toggle` ff-merged to `main` as commit **`e436e19`**, pushed,
deployed. Pieces:

- **Migration `0005_project_bdd_enabled.sql`**: `project.bdd_enabled INTEGER NOT
  NULL DEFAULT 1` (1 = BDD project / ecomm; 0 = non-BDD / OHM). Forward-only,
  ingest-applied (NOT web-startup) — same gotcha as 0002/0003/0004.
- **`ingest.py --list-clones`** now filters `status='active' AND bdd_enabled=1`,
  so `refresh.sh` never clones/ingests a non-BDD project. (Flip the flag on and
  the next refresh clones + ingests its corpus.)
- **Backend** `require_bdd_project` dependency → **409** on the BDD write surface
  (releases create/add-scenarios, paste preview/commit, plan import, roadmap
  export) for a non-BDD project. `projects.create/update` accept `bdd_enabled`
  (ProjectCreate defaults True, ProjectPatch toggles); stored 0/1.
- **Frontend** (`App.tsx`/`api.ts`/`styles.css`): ⚙ create + edit forms get a
  "BDD scenarios" checkbox; main view shows a placeholder (no scenario browser /
  releases / paste) when `bdd_enabled===0`; manage list shows a "non-BDD" badge.
- **Tests**: +7 → **54 backend pass** (`test_project_crud.py`
  default/disable/toggle/list-clones-exclusion + new `test_bdd_guard.py` 409
  endpoint guards). Frontend `tsc --noEmit` + `vite build` clean.

**Deploy**: flotilla 10-phase green (`/api/health` ok, 1238 scenarios). Then ran
`systemctl start planner-ingest.service` on `planner-vm` (us-central1-a) to apply
0005 — REQUIRED before any project create, because `create_project` now writes
the new column. macOS deploy note still applies (`SSL_CERT_FILE=$(python3 -m
certifi)` for phase 9). The deploy's validate phase emitted the ADC-quota warning
(fixed below).

**OHM project created** via the hub endpoint `POST /<PLANNER_TOKEN>/api/projects`
— the exact call the ⚙ "New project" form issues. (The browser UI itself was
**org-policy-blocked** from `rfc.wiggleverse.org` in the agent's Claude-in-Chrome
this session; Ben verified the rendered UI manually.) Project record:
`slug=ohm name=OHM gitea_repo=wiggleverse/ohm-content corpus_path=research/bdd
roadmap_path=roadmap bdd_enabled=0`, status=active.

## Decisions (Ben)

1. **Repo + corpus path**: OHM points at **`wiggleverse/ohm-content`** with a new
   `research/bdd` subpath. Rationale: planner-bot has admin/push there; the
   `research/bdd` subdir is **not served** by the live rfc-app (which renders only
   `rfcs/` + PHILOSOPHY/About), so there's no live-site pollution. (`ben.stull/ohm-rfc`
   and a brand-new repo were the alternatives.)
2. **Corpus population**: OHM has no existing BDD spec dir and no Gherkin, so
   "paste vs existing spec dir" resolved to **neither for now** — OHM is a non-BDD
   entry. Turning `bdd_enabled` on later (⚙ modal or PATCH) is the populate path,
   after which paste/commit-to-`research/bdd` + ingest would fill it.
3. **Build the flag, don't fake a corpus**: Ben explicitly chose "build a real
   BDD on/off flag" over seeding a demo scenario or leaving an empty BDD project.

## Verification (live, prod)

- `GET /api/projects` lists both: `ohm` (`bdd_enabled:0`) + `ecomm-specs`
  (`bdd_enabled:1`). This list is the dropdown source.
- ecomm intact: 15 domains / 1238 scenarios; OHM domains empty.
- Non-BDD guards: OHM release-create + paste-preview → **409**; ecomm endpoints
  still 200.
- On `planner-vm`: `ingest.py --list-clones` returns only `ecomm-specs`; the only
  meta clone on disk under `/opt/planner-meta` is `wiggleverse-ecomm-meta`.
  **OHM's `ohm-content` repo was never cloned or committed to** — confirming the
  non-BDD project leaves the OHM content repo untouched.

## ADC quota fix

`gcloud auth application-default set-quota-project wiggleverse-ecomm-bdd-app`
(was pinned to `wiggleverse-ohm`). NOTE: ADC quota project is a **single shared
file**; it now favors ecomm-bdd, so a future OHM deploy will show the inverse
(harmless) warning. Both flotillas pin `--project` explicitly, so this only
affects the ADC billing/quota attribution warning, not correctness.

## OHM ramifications (cross-reference)

- No OHM release, no rfc-app deploy, no `ohm-rfc`/`ohm-content` content change, no
  §13 deployment-record edit. The only OHM-touching effects: (a) OHM is now a
  registered (non-BDD) project in the planner hub; (b) the shared ADC quota pin
  moved off `wiggleverse-ohm`. Hence this transcript, claimed retroactively.

## Files changed (planner app repo)

```
A  migrations/0005_project_bdd_enabled.sql
A  tests/test_bdd_guard.py
M  backend/app/main.py        (ProjectCreate/Patch + require_bdd_project + guards)
M  backend/app/projects.py    (MUTABLE + _validate + create_project cols)
M  tools/ingest.py            (--list-clones bdd_enabled filter)
M  frontend/src/App.tsx       (checkboxes + non-BDD placeholder view)
M  frontend/src/api.ts        (Project.bdd_enabled + ProjectInput)
M  frontend/src/styles.css    (.proj-check, .non-bdd-note)
M  tests/test_project_crud.py (+4 flag tests)
```

Memory updated: ecomm project memory `ecomm-bdd-release-planner.md` (+ its
`MEMORY.md` index line) carry the full state. (Memory referenced as
`<PLANNER_TOKEN>` — the literal URL token is in Secret Manager
`planner-planner-token`, intentionally unrotated low-value path obscurity.)

## Gotchas captured

- Migration 0005 is ingest-applied; `create_project` now writes `bdd_enabled`, so
  **ingest MUST run after deploy before any project create** or the insert 500s.
- flotilla deploy does not sync nginx (only systemd units) — unchanged here.
- Stale OHM `--INPROGRESS` placeholders linger in `ohm-session-history` (0026,
  0027, 0045, 0063 were active at claim time) — housekeeping debt, not this
  session's.

---

## Next-session prompt

```
Continue on the ecomm BDD release planner (multi-project hub at rfc.wiggleverse.org).
Read memory first: ecomm-bdd-release-planner.md (esp. the 2026-06-02 "PER-PROJECT
BDD FLAG + OHM ADDED" section). OHM now exists as a non-BDD project (bdd_enabled=0,
empty, pointing at wiggleverse/ohm-content : research/bdd). If you want OHM to
actually hold BDD scenarios: flip its flag on in the ⚙ Manage-projects modal (or
PATCH /<token>/api/projects/ohm {"bdd_enabled": true}), then either paste scenarios
or commit Gherkin under research/bdd and let refresh.sh ingest. Url token is in
Secret Manager (planner-planner-token). Deploy = flotilla 10-phase + then
`systemctl start planner-ingest.service` on planner-vm to apply migrations.
Optional cleanup: a stale merged local branch `release-plan-import` in the planner
app repo, and several stale --INPROGRESS placeholders in ohm-session-history.
```
