Skip to content

Commit 0b18960

Browse files
author
DavidQ
committed
Tighten schemas and validate samples/games against strict tool contracts - PR 11.98
1 parent debf0c0 commit 0b18960

22 files changed

Lines changed: 1567 additions & 88 deletions

docs/dev/codex_commands.md

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,10 @@
1-
# Codex Command - PR 11.97
1+
# Codex Command - PR 11.98
22

33
Model: GPT-5.4
44
Reasoning: high
55

6-
```text
7-
Run BUILD_PR_LEVEL_11_97_FIX_ASSET_BROWSER_SCHEMA_PROPERLY.
6+
Run this from the repo root:
87

9-
Goal:
10-
Fix the Asset Browser schema to match the flat asset-browser.assets contract and update sample 1902 workspace data accordingly.
11-
12-
Requirements:
13-
- Update tools/schemas/tools/asset-browser.schema.json.
14-
- asset-browser.assets must be a flat map of asset ids to entries.
15-
- Asset ids must follow <kind>.<domain>.<name>, for example image.sample1902.preview.
16-
- Asset entries require path, kind, and source.
17-
- Allow optional stretchOverride.uniformEdgeStretchPx on image.*.bezel asset entries.
18-
- Do not restore nested media.
19-
- Do not remove existing compatibility properties unless proven obsolete.
20-
- Fix sample 1902 preview asset to image.sample1902.preview.
21-
- Search for generic asset-browser asset id preview and fix if found.
22-
- Add/update docs/dev/reports/PR_11_97_schema_validation.md with exact validation results.
23-
- Run targeted validation only; do not run full sample suite.
24-
25-
Return a ZIP artifact at <project folder>/tmp/PR_11_97_FIX_ASSET_BROWSER_SCHEMA_PROPERLY.zip.
8+
```powershell
9+
codex --model gpt-5.4 --reasoning high "Execute BUILD_PR_LEVEL_11_98_STRICT_SCHEMA_VALIDATION_AND_USAGE_REVIEW exactly. Tighten schemas so unknown fields are rejected, validate tools/workspaces/samples/games, update code that expects loose or legacy schema shapes, and write reports under docs/dev/reports. Do not add fallback/default payloads. Do not run the full samples suite unless required by shared loader changes."
2610
```

docs/dev/commit_comment.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Fix Asset Browser schema for flat manifest assets and sample 1902 preview id - PR 11.97
1+
Tighten schemas and validate samples/games against strict tool contracts - PR 11.98
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# PR 11.98 - Strict Schema Validation And Usage Review
2+
3+
## Scope Executed
4+
- Tightened schema contracts for workspace/tool usage in scoped targets.
5+
- Added contract validation scripts:
6+
- `scripts/PS/validate-tool-schemas.ps1`
7+
- `scripts/PS/validate-sample-json.ps1`
8+
- `scripts/PS/validate-game-manifests.ps1`
9+
- `scripts/PS/validate-all-json-contracts.ps1`
10+
- `scripts/validate-json-contracts.mjs`
11+
- Updated workspace runtime validator coverage in `tools/Workspace Manager/main.js` for strict constructs (`anyOf`, `allOf`, `not`, `propertyNames`, typed `additionalProperties`).
12+
- Enforced flat asset-browser schema contract updates and removed duplicate workspace palette alias key.
13+
14+
## Required Reports Generated
15+
- `docs/dev/reports/schema_strictness_inventory.md`
16+
- `docs/dev/reports/schema_strictness_inventory.csv`
17+
- `docs/dev/reports/sample_json_schema_validation.csv`
18+
- `docs/dev/reports/game_manifest_schema_validation.csv`
19+
- `docs/dev/reports/tool_payload_schema_validation.csv`
20+
- `docs/dev/reports/schema_usage_code_updates.md`
21+
22+
## Validation Commands Run
23+
1. `powershell -ExecutionPolicy Bypass -File .\\scripts\\PS\\validate-all-json-contracts.ps1 -Details`
24+
2. `powershell -ExecutionPolicy Bypass -File .\\scripts\\PS\\validate-tool-schemas.ps1`
25+
3. `powershell -ExecutionPolicy Bypass -File .\\scripts\\PS\\validate-sample-json.ps1`
26+
4. `powershell -ExecutionPolicy Bypass -File .\\scripts\\PS\\validate-game-manifests.ps1`
27+
5. `node tests/tools/ToolSchemaStrictModeValidation.test.mjs`
28+
6. `node tests/runtime/LaunchSmokeAllEntries.test.mjs --samples --sample-range=1902-1902 --tools`
29+
7. `node --check scripts/validate-json-contracts.mjs`
30+
8. `node --check "tools/Workspace Manager/main.js"`
31+
9. `node --check tests/tools/ToolSchemaStrictModeValidation.test.mjs`
32+
10. `node -e "...Asteroids manifest asset checks..."`
33+
11. `rg -n "assets/images/bezel\\.png|assets/images/background\\.png|bezel1\\.png" src tools games samples`
34+
12. `rg -n "asset-browser\\.assets\\.media|\\.assets\\.media" src tools games samples`
35+
36+
## Validation Results
37+
- Tool schema validation: `total=17 invalid=0`
38+
- Sample JSON validation: `total=66 invalid=38`
39+
- Game manifest validation: `total=12 invalid=0`
40+
- Sample 1902 strict workspace validation test: PASS
41+
- Sample 1902 targeted launch smoke (with tools): PASS (19/19)
42+
- Asteroids manifest asset checks: PASS
43+
- `image.asteroids.bezel.path = /games/Asteroids/assets/images/bezel.png`
44+
- `image.asteroids.background.path = /games/Asteroids/assets/images/deluxe.png`
45+
- `font.asteroids.vector-battle` present
46+
- Guessed chrome-path search:
47+
- only expected manifest declaration hit for `bezel.png`
48+
- no `assets.media` usage hits in scanned runtime/tool/sample paths
49+
50+
## Blockers / Remaining Invalid Rows
51+
- 38 sample JSON files remain invalid under strict schema review.
52+
- Exact file-level errors are recorded in:
53+
- `docs/dev/reports/sample_json_schema_validation.csv`
54+
- Dominant blocker patterns:
55+
- legacy top-level `$schema` fields not accepted by strict tool schemas
56+
- legacy `config` vs strict `payload` contract mismatches
57+
- payload shape mismatches in older sample payload documents
58+
59+
## Notes
60+
- No fallback/default payloads were introduced.
61+
- Full samples suite was skipped by design: this PR used targeted schema + targeted smoke validation only, and did not require a broad full-samples run.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# PR 11.98 Expected Reports
2+
3+
Codex must generate:
4+
- schema_strictness_inventory.md
5+
- schema_strictness_inventory.csv
6+
- sample_json_schema_validation.csv
7+
- game_manifest_schema_validation.csv
8+
- tool_payload_schema_validation.csv
9+
- schema_usage_code_updates.md
10+
11+
These reports must identify every remaining blocker instead of silently accepting loose payloads.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
filePath,status,errorCount,firstErrors
2+
games/_template/game.manifest.json,valid,0,
3+
games/AITargetDummy/game.manifest.json,valid,0,
4+
games/Asteroids/game.manifest.json,valid,0,
5+
games/Bouncing-ball/game.manifest.json,valid,0,
6+
games/Breakout/game.manifest.json,valid,0,
7+
games/GravityWell/game.manifest.json,valid,0,
8+
games/Pacman/game.manifest.json,valid,0,
9+
games/Pong/game.manifest.json,valid,0,
10+
games/SolarSystem/game.manifest.json,valid,0,
11+
games/SpaceDuel/game.manifest.json,valid,0,
12+
games/SpaceInvaders/game.manifest.json,valid,0,
13+
games/vector-arcade-sample/game.manifest.json,valid,0,
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
filePath,schemaPath,status,errorCount,firstErrors,note
2+
samples/metadata/samples.index.metadata.json,,skipped,0,,no matching schema contract
3+
samples/phase-02/0204/sample.0204.3d-asset-viewer.json,tools/schemas/tools/3d-asset-viewer.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.asset3d: value must satisfy exactly one oneOf branch",
4+
samples/phase-02/0204/sample.0204.asset-browser.json,tools/schemas/tools/asset-browser.schema.json,invalid,3,"$: missing required key ""assets"" | $: unknown key ""$schema"" | $.payload: unknown key ""assetCatalog""",
5+
samples/phase-02/0207/sample.0207.palette.json,,skipped,0,,no matching schema contract
6+
samples/phase-02/0207/sample.0207.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
7+
samples/phase-02/0213/sample.0213.palette.json,,skipped,0,,no matching schema contract
8+
samples/phase-02/0213/sample.0213.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
9+
samples/phase-02/0214/sample.0214.palette.json,,skipped,0,,no matching schema contract
10+
samples/phase-02/0214/sample.0214.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
11+
samples/phase-02/0219/sample.0219.palette.json,,skipped,0,,no matching schema contract
12+
samples/phase-02/0219/sample.0219.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
13+
samples/phase-02/0221/sample-0221-tile-map-editor-document.json,,skipped,0,,no matching schema contract
14+
samples/phase-02/0221/sample.0221.palette.json,,skipped,0,,no matching schema contract
15+
samples/phase-02/0221/sample.0221.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.tileMapDocument: value must satisfy exactly one oneOf branch",
16+
samples/phase-02/0221/sample.0221.tile-model-converter.json,tools/schemas/tools/tile-model-converter.schema.json,invalid,1,"$: unknown key ""$schema""",
17+
samples/phase-02/0224/sample-0224-tile-map-editor-document.json,,skipped,0,,no matching schema contract
18+
samples/phase-02/0224/sample.0224.palette.json,,skipped,0,,no matching schema contract
19+
samples/phase-02/0224/sample.0224.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
20+
samples/phase-02/0224/sample.0224.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.tileMapDocument: value must satisfy exactly one oneOf branch",
21+
samples/phase-02/0226/sample.0226.skin-editor.json,tools/schemas/tools/skin-editor.schema.json,invalid,4,"$: unknown key ""$schema"" | $: unknown key ""config"" | $.payload: unknown key ""gameId""",
22+
samples/phase-02/0227/sample.0227.skin-editor.json,tools/schemas/tools/skin-editor.schema.json,invalid,4,"$: unknown key ""$schema"" | $: unknown key ""config"" | $.payload: unknown key ""gameId""",
23+
samples/phase-03/0301/sample.0301.palette.json,,skipped,0,,no matching schema contract
24+
samples/phase-03/0301/sample.0301.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
25+
samples/phase-03/0302/sample.0302.palette.json,,skipped,0,,no matching schema contract
26+
samples/phase-03/0302/sample.0302.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
27+
samples/phase-03/0305/sample-0305-tile-map-editor-document.json,,skipped,0,,no matching schema contract
28+
samples/phase-03/0305/sample.0305.palette.json,,skipped,0,,no matching schema contract
29+
samples/phase-03/0305/sample.0305.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.tileMapDocument: value must satisfy exactly one oneOf branch",
30+
samples/phase-03/0305/sample.0305.tile-model-converter.json,tools/schemas/tools/tile-model-converter.schema.json,invalid,1,"$: unknown key ""$schema""",
31+
samples/phase-03/0308/sample.0308.palette.json,,skipped,0,,no matching schema contract
32+
samples/phase-03/0313/sample.0313.palette.json,,skipped,0,,no matching schema contract
33+
samples/phase-09/0901/sample.0901.palette.json,,skipped,0,,no matching schema contract
34+
samples/phase-09/0905/sample.0905.palette.json,,skipped,0,,no matching schema contract
35+
samples/phase-09/0905/sample.0905.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
36+
samples/phase-12/1204/sample.1204.palette.json,,skipped,0,,no matching schema contract
37+
samples/phase-12/1205/sample.1205.palette.json,,skipped,0,,no matching schema contract
38+
samples/phase-12/1208/sample.1208.palette.json,,skipped,0,,no matching schema contract
39+
samples/phase-12/1208/sample.1208.parallax-editor.json,tools/schemas/tools/parallax-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.parallaxDocument: value must satisfy exactly one oneOf branch",
40+
samples/phase-12/1208/sample.1208.svg-asset-studio.json,tools/schemas/tools/svg-asset-studio.schema.json,invalid,1,"$: unknown key ""$schema""",
41+
samples/phase-12/1208/sample.1208.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,4,"$: unknown key ""$schema"" | $.payload: unknown key ""vectorAssetSvgPath"" | $.payload.parallaxDocument: value must satisfy exactly one oneOf branch",
42+
samples/phase-12/1209/sample-1209-tile-map-editor-document.json,,skipped,0,,no matching schema contract
43+
samples/phase-12/1209/sample.1209.palette.json,,skipped,0,,no matching schema contract
44+
samples/phase-12/1209/sample.1209.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.tileMapDocument: value must satisfy exactly one oneOf branch",
45+
samples/phase-12/1209/sample.1209.tile-model-converter.json,tools/schemas/tools/tile-model-converter.schema.json,invalid,1,"$: unknown key ""$schema""",
46+
samples/phase-12/1210/sample-1210-tile-map-editor-document.json,,skipped,0,,no matching schema contract
47+
samples/phase-12/1210/sample.1210.palette.json,,skipped,0,,no matching schema contract
48+
samples/phase-12/1210/sample.1210.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.tileMapDocument: value must satisfy exactly one oneOf branch",
49+
samples/phase-12/1211/sample-1211-tile-map-editor-document.json,,skipped,0,,no matching schema contract
50+
samples/phase-12/1211/sample.1211.palette.json,,skipped,0,,no matching schema contract
51+
samples/phase-12/1211/sample.1211.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.tileMapDocument: value must satisfy exactly one oneOf branch",
52+
samples/phase-12/1212/sample-1212-vector-map-editor.json,tools/schemas/tools/vector-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.vectorMapDocument: value must satisfy exactly one oneOf branch",
53+
samples/phase-12/1213/sample-1213-vector-map-editor.json,tools/schemas/tools/vector-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.vectorMapDocument: value must satisfy exactly one oneOf branch",
54+
samples/phase-12/1214/sample-1214-vector-map-editor.json,tools/schemas/tools/vector-map-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.vectorMapDocument: value must satisfy exactly one oneOf branch",
55+
samples/phase-12/1215/sample-1215-svg-asset-studio.json,tools/schemas/tools/svg-asset-studio.schema.json,invalid,1,"$: unknown key ""$schema""",
56+
samples/phase-12/1216/sample-1216-svg-asset-studio.json,tools/schemas/tools/svg-asset-studio.schema.json,invalid,1,"$: unknown key ""$schema""",
57+
samples/phase-12/1217/sample-1217-svg-asset-studio.json,tools/schemas/tools/svg-asset-studio.schema.json,invalid,1,"$: unknown key ""$schema""",
58+
samples/phase-12/1218/sample-1218-parallax-editor.json,tools/schemas/tools/parallax-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.parallaxDocument: value must satisfy exactly one oneOf branch",
59+
samples/phase-12/1219/sample-1219-parallax-editor.json,tools/schemas/tools/parallax-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.parallaxDocument: value must satisfy exactly one oneOf branch",
60+
samples/phase-12/1220/sample-1220-parallax-editor.json,tools/schemas/tools/parallax-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.parallaxDocument: value must satisfy exactly one oneOf branch",
61+
samples/phase-14/1413/sample.1413.3d-asset-viewer.json,tools/schemas/tools/3d-asset-viewer.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.asset3d: value must satisfy exactly one oneOf branch",
62+
samples/phase-14/1413/sample.1413.asset-browser.json,tools/schemas/tools/asset-browser.schema.json,invalid,3,"$: missing required key ""assets"" | $: unknown key ""$schema"" | $.payload: unknown key ""assetCatalog""",
63+
samples/phase-14/1413/sample.1413.asset-pipeline-tool.json,tools/schemas/tools/asset-pipeline-tool.schema.json,invalid,3,"$: unknown key ""$schema"" | $.payload: unknown key ""sampleImportInput"" | $.payload.pipelinePayload: value must satisfy exactly one oneOf branch",
64+
samples/phase-14/1414/sample.1414.palette.json,,skipped,0,,no matching schema contract
65+
samples/phase-14/1414/sample.1414.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,2,"$: unknown key ""$schema"" | $.payload.spriteProject: value must satisfy exactly one oneOf branch",
66+
samples/phase-15/1505/sample.1505.asset-browser.json,tools/schemas/tools/asset-browser.schema.json,invalid,3,"$: missing required key ""assets"" | $: unknown key ""$schema"" | $.payload: unknown key ""assetCatalog""",
67+
samples/phase-19/1902/sample.1902.workspace-all-tools.json,tools/schemas/workspace.manifest.schema.json,valid,0,,

0 commit comments

Comments
 (0)