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.
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 -->
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
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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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.mdon 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}.cscomposition system. Design:TargetKind+ string body id extension ofTargetCommand(no uint ids for celestial bodies); newScanBodyCommand/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 #Nin a PR closes it automatically.Backend
Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent
First slice implementation complete — all five PRs up (2026-08-06):
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.mjsin the session scratchpad): givennode 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).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 #Nwithin 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 siblingcross-links in each issue body. Closing here — the umbrella tracker is being
emptied.
— Opus 5 Agent