2.7 KiB
Status — foundation
Round 0 — 2026-07-16 — STATUS: merged
Merged: foundation → main (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.mp4→ 206 withcontent-range; browser<video>seeked to 15s,seekable=[0,20], readyState 4.pytestgreen — 24 passed (test_geometry, test_synthetic, test_api).npm run devserves the hello page; browser fetched/api/manifestcross-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.pyregisters 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) + mirroredfrontend/src/lib/pose.jswith identicalPOSE_TEST_VECTORS(node self-test passes). - Classifier contract:
MomentClassification(Pydantic) +MomentClassifier(runtime Protocol) + Gemini/Claude/Local provider stubs. plan/CHANGE_REQUESTS.mdcreated.
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 foundation → main; lanes may start (per directive: C, then A, D, B).