Files
claude-checkpoint-tooling 0ecc16d963 Registration: replace date-of-birth field with a simple 18+ confirmation
The register form collected and validated an actual date of birth just to
throw it away (backend never stored it beyond a nullable column). Per the
roadmap note: don't collect/store DOB right now, just get a client-side
"I am 18 or older" confirmation. RegisterRequest.date_of_birth (str) is now
over_18 (bool); the endpoint rejects over_18=false with 400 same as before.
calculate_age() is kept (unused by /register now) since real DOB collection
is coming back in a future pass and deleting it broke test_auth_age_gate.py's
import for no benefit.

Frontend: DOBEdit LineEdit replaced with an Over18Check CheckBox; api_client.gd's
register() now takes a bool instead of a date string. All Godot callers
(smoke_test_auth/e2e/world_list/main_menu_ui/main_menu_full_flow) and backend
test files updated to match. Full suite verified against a live backend:
61/61 pytest, 6/6 Godot smoke tests (33 individual assertions), all passing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6rUEynmv2QmweocAQYARN
2026-08-20 16:25:27 +00:00
..

Testing at Package Checkpoints

A Package Checkpoint (PC1, PC2, ...) is a periodic review point — every few real milestones, the client and server builds get packaged together and independently reviewed before anyone calls anything actually done. See project_agp in Claude's memory, or ask, for the full definition; this doc is just the mechanical "how do I run the tests" part of that review.

Running the suite

python scripts/run_checkpoint_tests.py

Brings up a throwaway Postgres, runs Alembic migrations against it, runs the backend pytest suite, starts the backend server, and runs every Godot headless smoke test (scripts/smoke_test_*.gd) against it. Tears the Postgres container down afterward (--keep-postgres to skip that if you want to poke at the DB after a failure).

If port 5432 is already taken on the machine, pass --postgres-port with something else.

Exit code is 0 only if everything that actually ran passed — suites with nothing to run yet (no Godot binary found, no smoke test scripts yet) are reported SKIPPED, not treated as a failure.

What this does and doesn't prove

Passing this script means: migrations apply cleanly to a genuinely empty database, the backend's unit-level logic is correct, and whatever Godot smoke tests exist actually round-trip against a live backend. It does not mean full endpoint/integration coverage exists — see test_inventory.md for the current, honest list of what's tested and what isn't. A checkpoint review should still involve reading the actual diffs for anything this script's current coverage doesn't reach, not just running green and calling it done.

Growing this over time

As real integration tests get added (endpoint tests hitting the FastAPI app, more Godot smoke coverage beyond health_check), they should land under backend/tests/ / scripts/smoke_test_*.gd respectively — this script picks up new files automatically, nothing to register by hand. Update test_inventory.md's tables when you do, so the inventory stays a source of truth instead of quietly going stale.

Eventual goal (not implemented yet): gate merges to main on this script passing, the same way a real CI pipeline would. For now it's a manual step run at checkpoint review time.