Phase 10 — Walking Skeleton¶
Defined 2026-08-24 at the goal reset (plan.md). Serves Goal B (backbone maturity): a clean clone walks end-to-end on real accounts, scripted and machine-checkable, with the demo scaffolding deleted.
Closed 2026-08-26 — all three exit criteria met¶
Two days, seven issues, one release. Every claim below was measured against the live tracker, the Actions history and the prod host on 2026-08-26 — none is inferred from a merge.
| # | Exit criterion | Evidence |
|---|---|---|
| 1 | Clean clone → docker compose up + bootstrap env vars + scripts/smoke_e2e.py exits 0 |
sdk-smoke.yml does exactly that from a fresh checkout with compose up --build, then uv run python scripts/smoke_e2e.py (workflow L111/L172): green on 5c67b3d — run 32950123976, and on the three trunk SHAs before it |
| 2 | sdk-smoke.yml green running that walk, no demo.py, no SEED_READY |
Same run; grep -n "demo.py\|SEED_READY" .github/workflows/sdk-smoke.yml matches nothing on 5c67b3d |
| 3 | Demo layer gone from code; docs describe only the real walk | #892 deleted it whole, #894 rewrote the docs, ADR-077 records it; the epic's residue grep (CL_SEED_DEMO\|CL_DEMO_USER_PASSWORD\|seed_demo\|demo@example.com\|SEEDED_FIXTURE_SOURCE over src/, docker/, compose, .env.example, .github/) returns 0 on 5c67b3d |
Shipped and live. The sequence landed as #889
→ #890 →
#891 →
#892 →
#894 +
ui#120, with the
attended #893 purge
done on 2026-08-25; epic #895
closed the same day. Prod runs backbone v0.17.1 (5c67b3d) + UI v0.8.0
since 2026-08-26 09:07 UTC (deploy-prod.yml run; scripts/verify-deploy.sh
v0.17.1 identity check passed; fastapi 0.135.3 inside the api container
confirms the lock-pinned install of
#984 is what ships).
The UI's smoke stack now provisions real ingested data
(ui#212), so
showcase Moment 1 steps 1–2 are exercised from a clean clone, not skipped.
Carried, deliberately. #954 (credential rotation) was scheduled in this phase's window as phase-independent ops, never as an exit criterion; it is being worked in its own attended session and stays on the GitHub milestone only until it closes. Nothing else is open against the phase.
Bookkeeping the close created. The 2026-08-25 sitting that walked Phase 9's
Full-Catalog walkthrough ran on v0.17.0, so Phase 10 also discharged the
Phase 9 coastal carry-over (#970)
before it closed — see the struck note under Notes for the build.
Why first¶
Every later phase verifies against this walk. Phase 9's fix avalanche (~30 integration-seam issues) came from verifying units while no automated end-to-end walk existed; this phase makes the walk the platform's permanent verification spine before the showcase work begins.
Scope — the demo-purge sequence (epic #895)¶
In dependency order; all issues already specified:
| Order | Issue | What | Repo |
|---|---|---|---|
| 1 | #889 | First-class environment bootstrap (org/admin/roles via CL_BOOTSTRAP_ADMIN_*, compose one-shot, RLS-guarded, idempotent) — replaces demo seeding |
backbone |
| 2 | #890 | scripts/smoke_e2e.py real-journey walk (bootstrap → boundaries → real ingest of the reference raster → queued compute → assert); rewires sdk-smoke.yml off demo.py |
backbone |
| 3 | #892 | Delete the demo layer whole (seed_demo.py, demo.py, demo_data/, CL_SEED_DEMO/CL_DEMO_USER_PASSWORD, lifespan seeding, demotion filter) |
backbone |
| 4 | #894 | Docs rewrite to the persistent-users walk (MVP slice, DEPLOYMENT, RUNBOOK, quickstarts) | backbone |
| 4 | ui#120 | Remove demo onboarding wiring (banner, tour, demo creds) | UI |
| — | #893 | Owner-gated attended prod cleanup (acme-demo rows, MinIO sweep) — not on the critical path | backbone |
Also scheduled in this phase's window (phase-independent ops): #954 — rotate the leaked prod credentials.
Notes for the build¶
- These issue bodies were written 2026-08-13, before the goal reset — run the
pre-dispatch premise check (grep named symbols against current
src/, check sibling closing PRs) and post corrections on the issue before dispatching. - ~~The coastal walk debt carried from Phase 9 (deploy + per-org
POST /v1/impact-functions/seed+ first coastal 3×3 grid) rides the first post-#890 release, proven by the new walk.~~ DISCHARGED 2026-08-25 — the owner's Full-Catalog walkthrough on prodv0.17.0completed the coastal 3 × 3 grid (six scenario cells, 12:12 UTC) and confirmed the per-org seed (15 impact functions innorthlane, three coastal). #970 is closed and Phase 10 carries no Phase 9 debt. - After #890 lands,
sdk-smoke.ymlbecomes the walking-skeleton run: dispatch it at wave/phase boundaries (~6.5 min/run), not per PR — see the CI model inCLAUDE.md.
Exit criteria¶
- From a clean clone:
docker compose up+ bootstrap env vars +scripts/smoke_e2e.pycompletes the full journey with exit 0. sdk-smoke.ymlis green running that walk (nodemo.py, noSEED_READYsentinel).- The demo layer is gone from the codebase and the docs describe only the real walk.