festifun/plan/status/foundation.md
m3ultra 5fa7301148 status: foundation merged to main (M0 + M3 + frozen contracts)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 00:46:41 +10:00

2.7 KiB

Status — foundation

Round 0 — 2026-07-16 — STATUS: merged

Merged: foundationmain (fast-forward, commit cf6a6fb) after all acceptance below passed. Local only — not yet pushed to origin (awaiting go-ahead).

Directives acknowledged: round 0 of plan/DIRECTIVES.md (run foundation only; contracts correctness beats speed; lanes hard-depend on API shapes, schema, pose math, synthetic fixtures).

Acceptance checklist (plan/00-foundation.md + spec M0/M3) — all pass:

  • python -m festival4d synthetic → 3 fixture videos + populated DB + points.ply (3106 pts) + ground_truth.json. Evidence: CLI run logs "3 videos, 3106 points, 7 events, 4 anchors".
  • python -m festival4d serve → every M3 endpoint returns synthetic data; videos seekable. Evidence: curl of manifest/poses/anchors/events/pointcloud; curl -H "Range: bytes=0-100" /media/cam0.mp4206 with content-range; browser <video> seeked to 15s, seekable=[0,20], readyState 4.
  • pytest green — 24 passed (test_geometry, test_synthetic, test_api).
  • npm run dev serves the hello page; browser fetched /api/manifest cross-origin (CORS ok), pose.js self-test passed, 0 console errors. (Vite fell back to :5174 — an unrelated dev server holds :5173; CORS now allows any localhost port.)
  • All lane-owned modules stubbed with frozen signatures; cli.py registers all 6 subcommands (dispatch + graceful NotImplementedError → exit 2).
  • Frozen geometry contract: colmap_to_threejs + test_geometry.py (3 known vectors, random round-trip, scipy oracle) + mirrored frontend/src/lib/pose.js with identical POSE_TEST_VECTORS (node self-test passes).
  • Classifier contract: MomentClassification (Pydantic) + MomentClassifier (runtime Protocol) + Gemini/Claude/Local provider stubs.
  • plan/CHANGE_REQUESTS.md created.

Done this round: full M0 + M3 + all frozen contracts. Env: Python 3.12 venv via uv, all spec deps installed. DB schema per spec §2 with CRUD helpers. Timebase helpers in config.py. API is Range-capable and CORS-enabled. Frontend scaffolds every layout file (lane-C modules are stubs; lib/pose.js is the live frozen contract).

Frozen-contract note for lanes: CORS was widened from a single :5173 origin to any http://localhost|127.0.0.1:<port> (local single-user tool; robust to Vite port fallback). Explicit :5173 still included. If a lane needs a different API shape/schema/pose math, file a CR in plan/CHANGE_REQUESTS.md — do not edit db.py/api.py/cli.py/config.py/ synthetic.py/pyproject.toml.

Blockers / questions for coordinator: none.

Next: merge foundationmain; lanes may start (per directive: C, then A, D, B).