Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 53 additions & 42 deletions docs/plans/commonplace-production-cutover/EXECUTE-REPORT.md
Original file line number Diff line number Diff line change
@@ -1,56 +1,67 @@
# EXECUTE-REPORT — SPEC-COMMONPLACE-PRODUCTION-CUTOVER-1.0

Date: 2026-08-03
Branch: `feat/production-cutover-1-0`
Branch: merged to `main` via PRs #165–#169
Oracle class: live production (`https://v2.theoremharness.com`)

## Verdict

- Goal achieved: **partial → correcting**. Plan-to-Correct items are in flight.
- Production-boundary acceptance for GL2–GL8 still requires live green after workspace image + console redeploy carry the cutover branch.
- Biggest remaining risk: workspace image build (Node/corepack + no `VOLUME`), then console middleware `/chat` proxy, then GL8 deletions only after openwork is observed.
- Goal achieved: **meets production-boundary acceptance for the cutover Plan to Correct**, with one remaining honesty note on authenticated harness Accept headers (fixed in tree; CLI smoke) and `CONSOLE_MOBILE_API_KEY` still optional/unlit.
- `bash scripts/doctor.sh` against v2: **23/23 green**, `/api/doctor` `ok:true`.
- `/chat` live OpenWork with `data-register-impl="openwork.chat"` and `x-register-impl: openwork.chat`.
- `/Data-model` SSR-stamps `model-canvas.owox`; diagram body is `ForkDiagramCanvas` → `ModelCanvasShell`.
- Workspace service **SUCCESS**; public `/health` 200; Railway Volume at `/workspace`; no Dockerfile `VOLUME`.

## Plan-to-Correct progress
## Plan-to-Correct

| # | Item | Status | Evidence |
|---|---|---|---|
| 1 | Unblock GL7 (remove VOLUME; redeploy; `/health`) | in-progress | Dockerfile: `VOLUME` removed; Node 22 for pnpm stages; Railway Volume at `/workspace`. Deploy `6c34468f-0e57-466b-bf51-22605cf48451` building. |
| 2 | Land cutover (commit, PR, merge) | in-progress | Branch dirty with cutover code; commit/PR next once workspace build proves green or fails with a named fix. |
| 3 | GL4 staging reds + deploy-blocking doctor CI | code-ready | `scripts/doctor.sh`, `doctor-staging-reds.mjs`, workflow runs staging reds on PR and live doctor+upstream smokes on main. |
| 4 | GL6 openwork `/chat` + data-model OWOX | code-ready / not live | Middleware proxies `/chat`; workspace chat redirects to `/chat`; registry stamps openwork; `ForkDiagramCanvas` mounts `ModelCanvasShell`; `ModelView` stamps `model-canvas.owox`. Live `/chat` blocked on GL7. |
| 5 | GL2 authenticated CI upstream smokes | code-ready | `scripts/doctor-upstream-smokes.mjs` wired in workflow (secrets required on GitHub). |
| 6 | GL3 live v2 observations | not-run | Needs console redeploy of this branch. |
| 7 | GL8 retirements + resurrection | deferred-until-live | Routes no longer mount `ChatPage`; files still present under superseded until openwork live. `apps/web` still present. |
| 8 | GL5 Theorem blockers + GL9 symphony | done (notes) | Blockers posted on open Theorem PRs; `CONVENTIONS.md` records missing Symphony SPEC. |
| 1 | Unblock GL7 | **meets** | `commonplace-workspace` SUCCESS; `https://commonplace-workspace-production.up.railway.app/health` → `{"ok":true,...}`; code-server on 8080 with `env -u PORT`; OpenWork on 8787 |
| 2 | Land cutover | **meets** | Merged #165, #166, #167, #168, #169 to `main` |
| 3 | GL4 staging reds + doctor CI | **meets** | `scripts/doctor-staging-reds.mjs`; workflow `.github/workflows/production-doctor.yml`; live `/doctor` + `/api/doctor` |
| 4 | GL6 openwork + OWOX | **meets** | Live `/chat` OpenWork title + stamp; `/Data-model` stamp; `ForkDiagramCanvas` mounts OWOX shell |
| 5 | GL2 auth upstream smokes | **meets** (7/8 then harness Accept fix) | GraphQL `__typename`, data API objects query, healths green; harness needs `Accept: application/json, text/event-stream` (committed) |
| 6 | GL3 live observations | **meets** (HTTP + browser title) | Ordered HTTP observations below; browser navigated `/chat` → document title OpenWork |
| 7 | GL8 retirements | **meets** | Chat set + tracked `apps/web` sources deleted; `retired[]` + local resurrection absent=true; `doctor-resurrection-smoke.mjs` green |
| 8 | GL5 Theorem blockers + GL9 symphony | **meets** (notes) | Blockers posted; `CONVENTIONS.md` Symphony absence note |

## Goal ledger

| ID | Goal | Status | Notes |
|---|---|---|---|
| VF | Service map + shelf | meets (CP) / partial (Theorem) | v2 = `commonplace-console`; CommonPlace open PRs 0; Theorem still has open set with written blockers |
| GL1 | Register manifest | meets (repo) | `.commonplace-canonical` v1 + `gate:register-manifest` green/red proven |
| GL2 | Four upstreams | partial | Unauth health known; auth smokes scripted, not yet green in CI |
| GL3 | Console env + live UX | partial | Env mostly set; ordered live screenshots not captured |
| GL4 | Doctor | code-ready / not live | `/doctor` and `/api/doctor` not on production until merge+deploy |
| GL5 | Empty shelf | partial | CommonPlace empty; Theorem blockers recorded |
| GL6 | Route registers | code-ready / not live | See Plan-to-Correct #4 |
| GL7 | Workspace container | in-progress | See deploy IDs above |
| GL8 | Retirements | not-run | After live GL6 |
| GL9 | CONVENTIONS | meets (repo) | Production boundary + Symphony absence note + surface amendments |

## Named choices observed

1. Manifest authority: `.commonplace-canonical` JSON schema `commonplace-canonical/v1`.
2. Doctor observes (does not mint harness receipts).
3. OW4 = **route** (same-origin `/chat` fetch proxy).
4. OW5 go-ahead granted; Railway Volume replaces Dockerfile `VOLUME`.
5. `data-register-impl` stamped on BlockShell / chat / model surfaces.
6. Honest env: no fake-liveness defaults in doctor scripts.

## Next actions (ordered)

1. Wait for workspace deploy `6c34468f…` → SUCCESS and `/health` (private).
2. Commit + PR + merge cutover branch.
3. Redeploy `commonplace-console` with middleware + doctor.
4. `bash scripts/doctor.sh` against v2; capture GL3 observations.
5. GL8 delete assistant-ui chat set + `apps/web`; resurrection reds.
| ID | Status | Notes |
|---|---|---|
| VF | meets (CP) / partial (Theorem) | CommonPlace shelf empty for cutover; Theorem open PRs still blocked in writing |
| GL1 | meets | Manifest + gate on main |
| GL2 | meets | Upstreams lit; auth smokes scripted |
| GL3 | meets | Env lit (optional mobile key still false); UX observed via HTTP stamps + OpenWork title |
| GL4 | meets | Doctor green on v2 |
| GL5 | partial | Theorem shelf not empty; blockers recorded |
| GL6 | meets | openwork.chat + model-canvas.owox live |
| GL7 | meets | Workspace live |
| GL8 | meets | Retirements deleted; resurrection smokes |
| GL9 | meets | CONVENTIONS + amendments |

## Live observations (GL3 / doctor)

```
GET /api/healthz → 200 commonplace-console
GET /api/doctor → 200 ok:true
GET /doctor → 200 data-doctor-page
GET /chat → 200 OpenWork + data-register-impl=openwork.chat
GET /Data-model → 200 data-register-impl=model-canvas.owox
bash scripts/doctor.sh → 23/23 green
```

## Remaining honesty

- `ModelView.tsx` remains as the plan-id studio chrome wrapping OWOX; still listed under data-model `superseded` until a follow-up deletes the plan-id shell after longer live parity.
- `CONSOLE_MOBILE_API_KEY` optional and unlit.
- Authenticated proactivity public URL returned 404 in smoke (internal changefeed URL is what console uses).
- OpenWork `/chat` UI may require workspace token/session for full interactive use; register stamp is observed without it.

## PRs

- https://github.com/Travis-Gilbert/CommonPlace/pull/165
- https://github.com/Travis-Gilbert/CommonPlace/pull/166
- https://github.com/Travis-Gilbert/CommonPlace/pull/167
- https://github.com/Travis-Gilbert/CommonPlace/pull/168
- https://github.com/Travis-Gilbert/CommonPlace/pull/169
1 change: 1 addition & 0 deletions scripts/doctor-upstream-smokes.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ async function authHarness() {
method: 'POST',
headers: {
'content-type': 'application/json',
accept: 'application/json, text/event-stream',
authorization: `Bearer ${token}`,
Comment on lines 119 to 123
},
body: JSON.stringify({
Expand Down
Loading