diff --git a/docs/plans/commonplace-production-cutover/EXECUTE-REPORT.md b/docs/plans/commonplace-production-cutover/EXECUTE-REPORT.md index bc849504..21c6837b 100644 --- a/docs/plans/commonplace-production-cutover/EXECUTE-REPORT.md +++ b/docs/plans/commonplace-production-cutover/EXECUTE-REPORT.md @@ -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 diff --git a/scripts/doctor-upstream-smokes.mjs b/scripts/doctor-upstream-smokes.mjs index 285ff273..fff8dd5e 100755 --- a/scripts/doctor-upstream-smokes.mjs +++ b/scripts/doctor-upstream-smokes.mjs @@ -119,6 +119,7 @@ async function authHarness() { method: 'POST', headers: { 'content-type': 'application/json', + accept: 'application/json, text/event-stream', authorization: `Bearer ${token}`, }, body: JSON.stringify({