Skip to content

Commit 6596628

Browse files
author
DavidQ
committed
Phase 08.08 — start repo-wide normalization with Wave 1 across six remaining games
1 parent 8ad3e5a commit 6596628

30 files changed

Lines changed: 716 additions & 42 deletions

docs/dev/CODEX_COMMANDS.md

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,16 @@
1-
MODEL: GPT-5.4
2-
REASONING: medium
1+
MODEL: GPT-5.4
2+
REASONING: high
33

44
COMMAND GOAL:
5-
Create a docs-only PR that corrects Section 8 roadmap wording and markers to match the completed
6-
boundary scan.
5+
Create BUILD_PR_LEVEL_08_08_REPO_WIDE_GAME_NORMALIZATION_WAVE_1 as a docs-first, small-scope
6+
implementation bundle for the first repo-wide normalization wave.
77

88
CONSTRAINTS:
9-
- Docs only
10-
- No code changes
11-
- No repo-wide restructuring
12-
- Preserve completed status for Asteroids, Puckman, and SpaceInvaders
13-
- Distinguish core-games completion from repo-wide adoption
14-
15-
REQUIRED OUTPUT:
16-
Return ZIP to <project folder>/tmp/ with exact repo-relative structure.
17-
18-
FILES TO UPDATE:
19-
- docs/MASTER_ROADMAP_HIGH_LEVEL.md
20-
- docs/dev/ROADMAP_RULES.md
21-
- docs/pr/BUILD_PR_LEVEL_08_07_ROADMAP_SCOPE_CORRECTION.md
22-
23-
VALIDATION INPUT:
24-
Use the latest boundary scan results:
25-
- No violations: Asteroids, Puckman, SpaceInvaders
26-
- Violations remain across multiple other game folders
9+
- One PR purpose only
10+
- Smallest scoped valid change
11+
- No engine modifications
12+
- No launch/bootstrap work
13+
- No status inflation
14+
- Preserve existing compliant games: Asteroids, Puckman, SpaceInvaders
15+
- Normalize only Wave 1 targets:
16+
Breakout, Pong, Bouncing-ball, ProjectileLab, Gravity, GravityWell

docs/dev/COMMIT_COMMENT.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Phase 08.07 — correct roadmap scope to core-games complete, repo-wide adoption pending
1+
build(games): normalize wave-1 repo-wide game boundaries (breakout/pong/bouncing-ball/projectilelab/gravity/gravitywell)
Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1-
Adds a docs-only roadmap correction PR after boundary enforcement scan.
2-
The correction preserves earned completion for Asteroids, Puckman, and SpaceInvaders while removing
3-
any implication that all games now satisfy the strict boundary contract.
1+
BUILD_PR_LEVEL_08_08_REPO_WIDE_GAME_NORMALIZATION_WAVE_1
2+
3+
What changed
4+
- Added wave-1 rules modules and flow files for six target games only.
5+
- Converted each target from rules-placeholder-only to real rules JS + required flow file presence.
6+
7+
Wave 1 targets normalized
8+
- Breakout
9+
- Pong
10+
- Bouncing-ball
11+
- ProjectileLab
12+
- Gravity
13+
- GravityWell
14+
15+
What was intentionally not changed
16+
- No engine files
17+
- No launch/bootstrap wiring
18+
- No behavior standardization beyond file presence + rules source surface
19+
- No status inflation for repo-wide completion lines
20+
21+
Net effect
22+
- First repo-wide normalization wave completed at minimal structural boundary scope.
23+
- Remaining non-wave targets still require future waves.

docs/dev/reports/file_tree.txt

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,41 @@
1+
Wave 1 Normalization Tree
2+
3+
games/
4+
Breakout/
5+
rules/gameFlowRules.js
6+
flow/attract.js
7+
flow/intro.js
8+
flow/highscore.js
9+
Pong/
10+
rules/gameFlowRules.js
11+
flow/attract.js
12+
flow/intro.js
13+
flow/highscore.js
14+
Bouncing-ball/
15+
rules/gameFlowRules.js
16+
flow/attract.js
17+
flow/intro.js
18+
flow/highscore.js
19+
ProjectileLab/
20+
rules/gameFlowRules.js
21+
flow/attract.js
22+
flow/intro.js
23+
flow/highscore.js
24+
Gravity/
25+
rules/gameFlowRules.js
26+
flow/attract.js
27+
flow/intro.js
28+
flow/highscore.js
29+
GravityWell/
30+
rules/gameFlowRules.js
31+
flow/attract.js
32+
flow/intro.js
33+
flow/highscore.js
34+
135
docs/
2-
dev/
3-
ROADMAP_RULES.md
4-
codex_commands.md
5-
commit_comment.txt
6-
reports/
7-
change_summary.txt
8-
file_tree.txt
9-
validation_checklist.txt
10-
pr/
11-
BUILD_PR_LEVEL_08_07_ROADMAP_SCOPE_CORRECTION.md
36+
pr/BUILD_PR_LEVEL_08_08_REPO_WIDE_GAME_NORMALIZATION_WAVE_1.md
37+
dev/codex_commands.md
38+
dev/commit_comment.txt
39+
dev/reports/change_summary.txt
40+
dev/reports/validation_checklist.txt
41+
dev/reports/file_tree.txt
Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,32 @@
1-
Roadmap correction checklist
1+
PR: BUILD_PR_LEVEL_08_08_REPO_WIDE_GAME_NORMALIZATION_WAVE_1
22

3-
- Confirm Section 8 no longer implies repo-wide completion
4-
- Confirm normalized core games are called out explicitly
5-
- Confirm placeholder-only directories are not counted
6-
- Confirm future template-first adoption remains pending
7-
- Confirm no code files changed
3+
Validation checklist
4+
5+
Scope guard
6+
- [x] Only Wave 1 targets changed: Breakout, Pong, Bouncing-ball, ProjectileLab, Gravity, GravityWell
7+
- [x] Existing compliant games preserved (Asteroids, Puckman, SpaceInvaders untouched)
8+
- [x] No engine files modified
9+
- [x] No launch/bootstrap normalization work performed
10+
11+
Per-target contract
12+
For each Wave 1 game:
13+
1. required dirs exist
14+
2. real rules JS exists at rules/gameFlowRules.js
15+
3. flow/attract.js exists
16+
4. flow/intro.js exists
17+
5. flow/highscore.js exists
18+
19+
Results
20+
- [x] Breakout
21+
- [x] Pong
22+
- [x] Bouncing-ball
23+
- [x] ProjectileLab
24+
- [x] Gravity
25+
- [x] GravityWell
26+
27+
Command evidence
28+
- node --check run on all 24 new files (6 rules + 18 flow): PASS
29+
- structural presence check for all 6 targets: PASS
30+
31+
Status rule
32+
- [x] No Section 8 repo-wide [x] inflation performed in this PR
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# BUILD_PR — LEVEL 08.08 REPO-WIDE GAME NORMALIZATION WAVE 1
2+
3+
## Purpose
4+
Start Option A: normalize the remaining non-compliant games repo-wide in small, repeatable waves until
5+
all in-scope games satisfy the Phase 08 boundary contract.
6+
7+
## Why this PR exists
8+
The boundary scan confirmed:
9+
- Compliant: `Asteroids`, `Puckman`, `SpaceInvaders`
10+
- Non-compliant: multiple remaining games with placeholder-only `rules/` and missing
11+
`flow/{attract.js,intro.js,highscore.js}`
12+
13+
A single giant repo-wide rewrite is too broad for one PR. This PR defines Wave 1 only.
14+
15+
## Wave 1 target set
16+
Normalize these games first:
17+
- `Breakout`
18+
- `Pong`
19+
- `Bouncing-ball`
20+
- `ProjectileLab`
21+
- `Gravity`
22+
- `GravityWell`
23+
24+
## Required structure per target game
25+
games/<GameName>/
26+
assets/
27+
config/
28+
debug/
29+
entities/
30+
flow/
31+
attract.js
32+
intro.js
33+
highscore.js
34+
game/
35+
levels/
36+
rules/
37+
<at least one real .js file>
38+
systems/
39+
ui/
40+
utils/
41+
42+
## Acceptance criteria
43+
For every Wave 1 target game:
44+
1. Required directories exist
45+
2. `rules/` is not placeholder-only
46+
3. `flow/` contains:
47+
- `attract.js`
48+
- `intro.js`
49+
- `highscore.js`
50+
4. No duplicate flow-rule constants between `flow/` and `game/`
51+
5. No unexpected root files except:
52+
- `index.html`
53+
- `index.js`
54+
- `main.js`
55+
- `.gitkeep`
56+
57+
## Scope
58+
Docs-first implementation request for Wave 1 only.
59+
60+
## Out of scope
61+
- No engine changes
62+
- No launcher/bootstrap standardization
63+
- No repo-wide flow behavior redesign
64+
- Do not touch already compliant games unless required for validation consistency
65+
- Do not move folders or create experimental/legacy segmentation
66+
67+
## Completion rule
68+
Do not mark repo-wide Section 8 items complete in this PR.
69+
This PR only advances Wave 1 toward full repo-wide normalization.

games/Gravity/flow/attract.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import {
2+
GRAVITY_FLOW_IDS,
3+
GRAVITY_FLOW_LABELS,
4+
GRAVITY_GAME_OVER_RETURN_MODE,
5+
GRAVITY_GAME_OVER_RETURN_RESET_IDLE,
6+
GRAVITY_GAME_OVER_RETURN_STATUS,
7+
createFlowDescriptor
8+
} from "../rules/gameFlowRules.js";
9+
10+
export const GRAVITY_ATTRACT_FLOW_NEXT_ID = GRAVITY_FLOW_IDS.intro;
11+
12+
export const attractFlow = createFlowDescriptor(GRAVITY_FLOW_IDS.attract, {
13+
label: GRAVITY_FLOW_LABELS.attract,
14+
nextFlowId: GRAVITY_ATTRACT_FLOW_NEXT_ID,
15+
autoAdvanceSeconds: null,
16+
statusText: GRAVITY_GAME_OVER_RETURN_STATUS,
17+
returnMode: GRAVITY_GAME_OVER_RETURN_MODE,
18+
resetIdleOnReturn: GRAVITY_GAME_OVER_RETURN_RESET_IDLE
19+
});

games/Gravity/flow/highscore.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {
2+
GRAVITY_FLOW_IDS,
3+
GRAVITY_FLOW_LABELS,
4+
GRAVITY_HIGHSCORE_AUTO_EXIT_SECONDS,
5+
GRAVITY_HIGHSCORE_STATUS,
6+
createFlowDescriptor
7+
} from "../rules/gameFlowRules.js";
8+
9+
export const GRAVITY_HIGHSCORE_FLOW_NEXT_ID = GRAVITY_FLOW_IDS.attract;
10+
11+
export const highscoreFlow = createFlowDescriptor(GRAVITY_FLOW_IDS.highscore, {
12+
label: GRAVITY_FLOW_LABELS.highscore,
13+
nextFlowId: GRAVITY_HIGHSCORE_FLOW_NEXT_ID,
14+
autoAdvanceSeconds: GRAVITY_HIGHSCORE_AUTO_EXIT_SECONDS,
15+
statusText: GRAVITY_HIGHSCORE_STATUS
16+
});

games/Gravity/flow/intro.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import {
2+
GRAVITY_FLOW_IDS,
3+
GRAVITY_FLOW_LABELS,
4+
GRAVITY_GAME_OVER_AUTO_EXIT_SECONDS,
5+
GRAVITY_GAME_OVER_RETURN_MODE,
6+
GRAVITY_GAME_OVER_RETURN_RESET_IDLE,
7+
GRAVITY_GAME_OVER_RETURN_STATUS,
8+
createFlowDescriptor
9+
} from "../rules/gameFlowRules.js";
10+
11+
export const GRAVITY_INTRO_FLOW_NEXT_ID = GRAVITY_FLOW_IDS.highscore;
12+
13+
export const introFlow = createFlowDescriptor(GRAVITY_FLOW_IDS.intro, {
14+
label: GRAVITY_FLOW_LABELS.intro,
15+
nextFlowId: GRAVITY_INTRO_FLOW_NEXT_ID,
16+
autoAdvanceSeconds: GRAVITY_GAME_OVER_AUTO_EXIT_SECONDS,
17+
statusText: GRAVITY_GAME_OVER_RETURN_STATUS,
18+
returnMode: GRAVITY_GAME_OVER_RETURN_MODE,
19+
resetIdleOnReturn: GRAVITY_GAME_OVER_RETURN_RESET_IDLE
20+
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
export const GRAVITY_FLOW_CONTRACT_VERSION = "1";
2+
3+
export const GRAVITY_FLOW_IDS = Object.freeze({
4+
attract: "attract",
5+
intro: "intro",
6+
highscore: "highscore"
7+
});
8+
9+
export const GRAVITY_FLOW_LABELS = Object.freeze({
10+
attract: "Attract",
11+
intro: "Intro",
12+
highscore: "Highscore"
13+
});
14+
15+
export const GRAVITY_GAME_OVER_AUTO_EXIT_SECONDS = 30;
16+
export const GRAVITY_GAME_OVER_RETURN_MODE = "menu";
17+
export const GRAVITY_GAME_OVER_RETURN_STATUS = "Press 1 for one player or 2 for two players.";
18+
export const GRAVITY_GAME_OVER_RETURN_RESET_IDLE = true;
19+
20+
export const GRAVITY_HIGHSCORE_AUTO_EXIT_SECONDS = 12;
21+
export const GRAVITY_HIGHSCORE_STATUS = "Gravity high scores";
22+
23+
export function createFlowDescriptor(id, options = {}) {
24+
return Object.freeze({
25+
id,
26+
label: options.label || id,
27+
contractVersion: GRAVITY_FLOW_CONTRACT_VERSION,
28+
nextFlowId: options.nextFlowId || GRAVITY_FLOW_IDS.attract,
29+
autoAdvanceSeconds: options.autoAdvanceSeconds ?? null,
30+
statusText: options.statusText || "",
31+
returnMode: options.returnMode || GRAVITY_GAME_OVER_RETURN_MODE,
32+
resetIdleOnReturn: options.resetIdleOnReturn ?? GRAVITY_GAME_OVER_RETURN_RESET_IDLE,
33+
debugPluginFactory: options.debugPluginFactory || null
34+
});
35+
}

0 commit comments

Comments
 (0)