EPIC: Unify P1 — Survey the Universe (target + scan planets/asteroids) #927

Closed
opened 2026-08-06 16:11:57 +00:00 by spikerj · 2 comments
Owner

Part of the Game Unification lane: all games become one game — different modes over one shared persistent universe (space → scan → hex-TD conquest → voxel base → satellite logistics → dungeon portals). Clients = Angular web + Godot (iOS/Android embed Godot). Full plan: ~/.claude/plans/i-want-a-plan-breezy-eclipse.md on the 4090.

From space, on web AND Godot: target a planet/asteroid, scan it with ship sensors (GameShip.SensorRange/ScanStrength, energy cost), receive a survey report (composition, bio/robotic presence, age, difficulty 1-10) persisted per character.

Wires the dead-but-tested GameServer/Data/{Elements,ResourceDistribution}.cs composition system. Design: TargetKind + string body id extension of TargetCommand (no uint ids for celestial bodies); new ScanBodyCommand/ScanBodyAckEvent/SurveyReportEvent(+List) (union tags 48/79/80/81); difficulty = deterministic function (FNV-1a of body id) so it is stable and Phase 2 can consume it.

Playable when done: fly to any body, target, scan, read a real report on web and mobile; report remembered per character.

Tickets


Child issues (per-repo, auto-close on merge)

This epic is complete when every box below is checked. Each child lives in the
repo that holds its fix, so fixes #N in a PR closes it automatically.

Backend

Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent

Part of the **Game Unification** lane: all games become one game — different modes over one shared persistent universe (space → scan → hex-TD conquest → voxel base → satellite logistics → dungeon portals). Clients = Angular web + Godot (iOS/Android embed Godot). Full plan: `~/.claude/plans/i-want-a-plan-breezy-eclipse.md` on the 4090. From space, on web AND Godot: target a planet/asteroid, scan it with ship sensors (`GameShip.SensorRange`/`ScanStrength`, energy cost), receive a survey report (composition, bio/robotic presence, age, difficulty 1-10) persisted per character. Wires the dead-but-tested `GameServer/Data/{Elements,ResourceDistribution}.cs` composition system. Design: `TargetKind` + string body id extension of `TargetCommand` (no uint ids for celestial bodies); new `ScanBodyCommand`/`ScanBodyAckEvent`/`SurveyReportEvent(+List)` (union tags 48/79/80/81); difficulty = deterministic function (FNV-1a of body id) so it is stable and Phase 2 can consume it. **Playable when done**: fly to any body, target, scan, read a real report on web and mobile; report remembered per character. ### Tickets - [ ] #942 - [ ] #943 - [ ] #944 - [ ] #945 - [ ] #946 <!-- BEGIN MIGRATED-CHILDREN --> --- ## Child issues (per-repo, auto-close on merge) This epic is complete when every box below is checked. Each child lives in the repo that holds its fix, so `fixes #N` in a PR closes it automatically. **Backend** - [ ] spikerj/spikersoft-backend#562 — [ALL] Cross-client acceptance: scan on web, verify on Godot, survive restart <sub>(was #946)</sub> <sub>Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent</sub> <!-- END MIGRATED-CHILDREN -->
spikerj added the agenticenhancement labels 2026-08-06 16:11:57 +00:00
Author
Owner

First slice implementation complete — all five PRs up (2026-08-06):

Stage Ticket PR Status
0 binding fix #934 backend#521 CI green; compose-verified
1 target+scan backend #942 backend#522 (stacked) 1824/1824 tests
2 persistence #943 backend#523 (stacked) compose-verified best-quality upsert
3 web client #944 angular#620 3793 tests, 30 new
4 Godot client #945 godot#10 headless selftest+smoke PASS

Merge order: backend #521 → #522 → #523 (stacked; CI attaches as each retargets to master), then angular#620 + godot#10 in any order, then re-export games.pck for the iOS shell.

Stage 5 (#946) — cross-client acceptance needs a real Keycloak login (anonymous connections can't JoinZone, and the e2e Bao hydration requires an interactive OIDC token). Acceptance harness is ready on the 4090 (survey-acceptance.mjs in the session scratchpad): given node survey-acceptance.mjs ws://localhost:7777 "$TOKEN" it drives ListShips→CreateShip→JoinZone→Target→ScanBody and prints the report. The local compose stack is still up with the merged-code images. Also verify there: gameserver restart → "Loaded N planets from Redis" with stable ids (the last unverified piece of #934).

**First slice implementation complete — all five PRs up (2026-08-06):** | Stage | Ticket | PR | Status | |---|---|---|---| | 0 binding fix | #934 | backend#521 | CI green; compose-verified | | 1 target+scan backend | #942 | backend#522 (stacked) | 1824/1824 tests | | 2 persistence | #943 | backend#523 (stacked) | compose-verified best-quality upsert | | 3 web client | #944 | angular#620 | 3793 tests, 30 new | | 4 Godot client | #945 | godot#10 | headless selftest+smoke PASS | Merge order: backend #521 → #522 → #523 (stacked; CI attaches as each retargets to master), then angular#620 + godot#10 in any order, then re-export games.pck for the iOS shell. **Stage 5 (#946) — cross-client acceptance** needs a real Keycloak login (anonymous connections can't JoinZone, and the e2e Bao hydration requires an interactive OIDC token). Acceptance harness is ready on the 4090 (`survey-acceptance.mjs` in the session scratchpad): given `node survey-acceptance.mjs ws://localhost:7777 "$TOKEN"` it drives ListShips→CreateShip→JoinZone→Target→ScanBody and prints the report. The local compose stack is still up with the merged-code images. Also verify there: gameserver restart → "Loaded N planets from Redis" with stable ids (the last unverified piece of #934).
spikerj added the epic label 2026-08-07 13:43:03 +00:00
Author
Owner

Dissolved into per-repo issues as part of the umbrella-tracker breakup.

This epic could never auto-close from a merge, because Gitea only resolves
fixes #N within a single repo. Its work now lives where the code is:

Backend

The unit is tracked by the shared [Unify P1] title prefix and by sibling
cross-links in each issue body. Closing here — the umbrella tracker is being
emptied.

— Opus 5 Agent

Dissolved into per-repo issues as part of the umbrella-tracker breakup. This epic could never auto-close from a merge, because Gitea only resolves `fixes #N` within a single repo. Its work now lives where the code is: **Backend** - spikerj/spikersoft-backend#562 — [ALL] Cross-client acceptance: scan on web, verify on Godot, survive restart The unit is tracked by the shared `[Unify P1]` title prefix and by sibling cross-links in each issue body. Closing here — the umbrella tracker is being emptied. — Opus 5 Agent
Sign in to join this conversation.