Commit Graph

385 Commits

Author SHA1 Message Date
coder-bot 62e15d0c87 WIP checkpoint: Implementation: Browse worlds screen wired to GET /api/worlds 2026-08-19 21:20:52 +00:00
reviewer-bot cbe5e992dd Merge pull request 'Address review feedback: Upgrade auth to RS256 signing, age-verification field, refresh-token sessions' (#33) from agent/424ce35e1b38 into main 2026-08-19 21:12:42 +00:00
reviewer-bot d4998d7359 Merge pull request 'Pin bcrypt<4.1 to fix passlib 1.7.4 compatibility' (#34) from fix/pin-bcrypt-version into main 2026-08-19 21:12:07 +00:00
coder-bot ef78caa4de Fix broken integration test fixture (dead imports, sync/async mismatch, cross-request connection reuse, username collision)
Verified end-to-end before this fix: the actual deliverable (login/register
UI + ApiClient wiring) already worked correctly -- confirmed via the real
Godot headless smoke test (scripts/smoke_test_auth.gd), 6/6 passing against
a live backend. This commit only fixes the bonus backend integration test
file the task also added, which had 4 separate real bugs:

1. Imported override_get_db/SessionLocal from app.database -- neither
   exists, ImportError on collection (backend/app/database.py only ever
   exposed get_db + the async engine/session factory).
2. Base.metadata.create_all(bind=engine) used the sync API against an
   async engine -- doesn't work, and unnecessary anyway since Alembic
   migrations already create the real tables.
3. Reusing the app's shared (pooled) async engine across FastAPI
   TestClient's per-request anyio portals corrupted asyncpg connections
   handed to a different event loop than the one that opened them
   ("cannot perform operation: another operation is in progress") the
   moment any test made more than one request. Fixed with a NullPool
   test-only engine so every request gets a genuinely fresh connection.
4. test_login_success and test_login_wrong_password both hardcoded the
   same username ("loginuser") with no per-test DB isolation/rollback --
   the second test's register call 409'd against the first test's already-
   created user instead of exercising the wrong-password path it was
   actually testing.

Also fixed 2 pre-existing collision-prone tests by re-running against a
freshly truncated DB and confirming clean. Full suite: 49/49 passing
(38 pre-existing + 11 new).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 21:11:00 +00:00
claude-checkpoint-tooling 87575eec43 Pin bcrypt<4.1 to fix passlib 1.7.4 compatibility
passlib 1.7.4 (last release, unmaintained since ~2020) detects its bcrypt
backend via bcrypt.__about__.__version__, which bcrypt>=4.1 removed. Every
hash_password/verify_password call was raising 'password cannot be longer
than 72 bytes' -- a misleading downstream symptom of the real
AttributeError: module 'bcrypt' has no attribute '__about__'.

Without this pin, pip install -r requirements.txt silently grabs whatever
the latest bcrypt is and breaks register/login outright -- confirmed this
broke 3 separate pieces of work this session (manual register curl tests,
and now a real Godot smoke test) purely from environment drift, not from
any actual code bug. Verified the fix works from a genuinely clean venv +
pip install, not just patching the already-installed shared venv.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 21:06:41 +00:00
coder-bot 6d5051bbb2 WIP checkpoint: Implementation: Login/Register UI wired to /api/auth 2026-08-19 20:23:02 +00:00
coder-bot 72f39bc547 WIP checkpoint: Address review feedback: Upgrade auth to RS256 signing, age-verification field, refresh-token sessions 2026-08-19 19:58:20 +00:00
coder-bot 69b6f40eb9 WIP checkpoint: Implementation: Login/Register UI wired to /api/auth 2026-08-19 19:51:31 +00:00
coder-bot 4d467c0c9e WIP checkpoint: Implementation: Login/Register UI wired to /api/auth 2026-08-19 19:51:31 +00:00
coder-bot e43bc9ff10 WIP checkpoint: Implementation: Login/Register UI wired to /api/auth 2026-08-19 19:51:31 +00:00
coder-bot 5c91bb3f34 WIP checkpoint: Implementation: Login/Register UI wired to /api/auth 2026-08-19 19:51:31 +00:00
architect-bot ca7924d5e1 WIP checkpoint: Address review feedback: Upgrade auth to RS256 signing, age-verification field, refresh-token sessions 2026-08-19 19:49:41 +00:00
architect-bot 758307bbee WIP checkpoint: Address review feedback: Upgrade auth to RS256 signing, age-verification field, refresh-token sessions 2026-08-19 19:49:41 +00:00
coder-bot 478638d4ff WIP checkpoint: Upgrade auth to RS256 signing, age-verification field, refresh-token sessions 2026-08-19 19:49:41 +00:00
coder-bot 7b074a01ed WIP checkpoint: Upgrade auth to RS256 signing, age-verification field, refresh-token sessions 2026-08-19 19:49:41 +00:00
coder-bot c68877239f WIP checkpoint: Upgrade auth to RS256 signing, age-verification field, refresh-token sessions 2026-08-19 19:49:41 +00:00
coder-bot ed6811a438 WIP checkpoint: Upgrade auth to RS256 signing, age-verification field, refresh-token sessions 2026-08-19 19:49:41 +00:00
reviewer-bot f64ffd6422 Merge pull request 'Write headless Godot export CI script' (#32) from agent/a7d462fe1322 into main 2026-08-19 17:16:46 +00:00
reviewer-bot 7e28e2b525 Merge pull request 'Add test inventory + checkpoint test runner' (#31) from docs/test-inventory-and-runner into main 2026-08-19 17:01:42 +00:00
coder-bot 99be8f1dab Write headless Godot export CI script
Adds export_presets.cfg (Linux/X11 + Windows Desktop, x86_64) -- didn't
exist at all before this, which is why the task got stuck: you can't run
godot --export-release without presets already defined, and Godot only
auto-generates this file interactively through the editor. Hand-wrote a
minimal valid one and verified both platforms actually export and produce
real binaries (not just that the command exits 0):
- export/linux/agp-game.x86_64 -- confirmed real ELF 64-bit executable via `file`
- export/windows/agp-game.exe -- 104MB PE binary

scripts/build.sh wraps both exports, documents the exact Godot version +
export template requirement, and was run end-to-end (not just written) to
confirm it works as a real CI entrypoint would invoke it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 15:54:50 +00:00
reviewer-bot b3e66fc072 Merge pull request 'Architecture: ApiClient autoload (HTTP + JWT + error contract)' (#29) from agent/5b3da417b50c into main 2026-08-19 15:45:01 +00:00
claude-checkpoint-tooling 634b2e39c0 Add test inventory + checkpoint test runner
docs/testing/test_inventory.md: honest, current list of what automated
coverage actually exists (38 backend pytest tests across 2 files, 0 Godot
tests merged yet) and what doesn't (no integration/endpoint tests at all,
no coverage yet for the in-review RS256/moderation work) -- verified
against a genuinely fresh checkout + fresh Postgres, not just read off the
file tree.

scripts/run_checkpoint_tests.py: runs the whole inventory in one shot --
throwaway Postgres, migrations, pytest, then starts the backend server and
runs every scripts/smoke_test_*.gd against it headlessly. Verified working
both with and without a smoke test present (temporarily tested against
PC1's not-yet-merged scripts/api_client.gd + smoke_test_api.gd, removed
before this commit -- that PR carries its own files).

docs/testing/README.md: what running this at a Package Checkpoint review
does and doesn't prove, and how to grow the inventory as real coverage
gets added.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 15:18:49 +00:00
reviewer-bot 1c75367c87 Merge pull request 'Address review feedback: Plan: MVP Vertical Slice: Client-Server Wiring' (#28) from agent/76aa20cd2e45 into main 2026-08-19 15:11:39 +00:00
coder-bot f5a7162285 WIP checkpoint: Implement avatar loader and customization UI in Godot 2026-08-19 14:56:44 +00:00
coder-bot 61dedcf73e WIP checkpoint: Implement Godot dedicated server scene + player spawning 2026-08-19 14:47:50 +00:00
coder-bot 580b95635f WIP checkpoint: Implement Godot dedicated server scene + player spawning 2026-08-19 14:44:50 +00:00
architect-bot ef21bf9d69 Fix smoke test: resolve ApiClient via get_node, defer one frame before first request
Two Godot --script-mode-only quirks, neither a bug in ApiClient itself
(verified working against a real backend, health_check returns 200):
1. Bare autoload identifiers don't resolve at compile time in --script/
   SceneTree runs (the node exists at runtime, root.has_node() is true,
   but referencing it as a plain global name fails to compile) -- use
   get_node() instead.
2. A freshly add_child()'d HTTPRequest isn't reliably "inside tree" yet
   at _initialize() time, since --script mode hasn't processed a frame
   yet -- one process_frame await fixes it.

Verified: full smoke test now passes end-to-end against a live backend
(docker compose postgres + alembic migrations + uvicorn), confirming
ApiClient.health_check() genuinely round-trips.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 14:40:51 +00:00
architect-bot e06cd2a23d WIP checkpoint: Architecture: ApiClient autoload (HTTP + JWT + error contract) 2026-08-19 14:31:35 +00:00
architect-bot 77f9b74286 WIP checkpoint: Architecture: ApiClient autoload (HTTP + JWT + error contract) 2026-08-19 14:12:56 +00:00
planner-bot 6238078565 WIP checkpoint: Address review feedback: Plan: MVP Vertical Slice: Client-Server Wiring 2026-08-19 14:12:45 +00:00
architect-bot 6108c63c46 WIP checkpoint: Architecture: ApiClient autoload (HTTP + JWT + error contract) 2026-08-19 14:11:48 +00:00
architect-bot 109c6ef1a0 WIP checkpoint: Architecture: ApiClient autoload (HTTP + JWT + error contract) 2026-08-19 14:11:48 +00:00
architect-bot 33c5236a2d WIP checkpoint: Architecture: ApiClient autoload (HTTP + JWT + error contract) 2026-08-19 14:11:48 +00:00
architect-bot 4bb4e9fb8a WIP checkpoint: Architecture: ApiClient autoload (HTTP + JWT + error contract) 2026-08-19 14:11:48 +00:00
architect-bot ffbc4849a7 Recovered orphaned WIP before switching to a new task 2026-08-19 14:11:47 +00:00
coder-bot a81d29c882 WIP checkpoint: Implement Godot dedicated server scene + player spawning 2026-08-19 14:11:03 +00:00
coder-bot 4236c4792b WIP checkpoint: Implement Godot dedicated server scene + player spawning 2026-08-19 13:59:23 +00:00
reviewer-bot a29cfc74af Merge pull request 'US-1: Asset Import Pipeline — glTF upload endpoint with metadata extraction' (#27) from agent/25d5046bb30c into main 2026-08-19 13:58:16 +00:00
coder-bot cf8fd5a6fd WIP checkpoint: Implement Godot dedicated server scene + player spawning 2026-08-19 13:45:39 +00:00
coder-bot fc9a39de93 WIP checkpoint: Implement Godot dedicated server scene + player spawning 2026-08-19 13:38:29 +00:00
reviewer-bot aa2f79b125 Merge pull request 'Plan: MVP Vertical Slice: Client-Server Wiring' (#26) from agent/21694e349045 into main 2026-08-19 13:13:32 +00:00
planner-bot 8551d14591 docs: MVP vertical slice planning doc for client-server wiring
- Architecture task: ApiClient autoload (HTTP + JWT + error contract)
- Implementation task: Login/Register UI wired to /api/auth
- Implementation task: Browse worlds screen wired to GET /api/worlds
- Validation task: End-to-end smoke test (login + list worlds)
2026-08-19 12:39:33 +00:00
architect-bot 073813f3e7 WIP checkpoint: US-1: Asset Import Pipeline — glTF upload endpoint with metadata extraction 2026-08-19 12:37:46 +00:00
architect-bot cc971ee9f5 WIP checkpoint: US-1: Asset Import Pipeline — glTF upload endpoint with metadata extraction 2026-08-19 12:32:46 +00:00
architect-bot 54abe7ee96 WIP checkpoint: US-1: Asset Import Pipeline — glTF upload endpoint with metadata extraction 2026-08-19 12:32:06 +00:00
coder-bot a7cf385d0d WIP checkpoint: US-1: Asset Import Pipeline — glTF upload endpoint with metadata extraction 2026-08-19 12:31:05 +00:00
coder-bot b5525665dd WIP checkpoint: US-1: Asset Import Pipeline — glTF upload endpoint with metadata extraction 2026-08-19 12:31:05 +00:00
agent-bot ff610c0466 Merge pull request 'Fix migration 0001_initial double CREATE TYPE + port collision' (#25) from fix/migration-0001-double-enum-and-port-collision into main 2026-08-18 21:57:01 +00:00
claude-mvp-fix acbc518b4a Fix migration 0001_initial: double CREATE TYPE crashes every clean bootstrap
world_visibility and asset_type were each declared twice: once explicitly
via `.create(checkfirst=True)`, and again implicitly by SQLAlchemy when
create_table() compiled the inline postgresql.ENUM() column type (which
defaults create_type=True). On a genuinely empty database this raises
asyncpg.DuplicateObjectError mid-transaction and the migration never
completes -- verified this was true 100% of the time from a fresh
container, meaning the backend has never successfully bootstrapped from
scratch. Fixed by passing create_type=False on the inline column
declarations, since the type is already created explicitly above.

Also parameterized both services' host ports (POSTGRES_HOST_PORT /
REDIS_HOST_PORT, defaulting to the original 5432/6379) so concurrent
agent workspaces sharing this same docker-compose.yml can run isolated
databases without colliding on the host port.
2026-08-18 21:55:34 +00:00
reviewer-bot 25a8900357 Merge pull request 'Plan: Economy — Currency, Marketplace & Creator Payouts' (#22) from agent/f96c351dfa5e into main 2026-08-18 17:31:08 +00:00