Skip to content

Commit e649453

Browse files
committed
Add persistent deterministic lane manifests and incremental validation reuse to reduce repeated Playwright discovery and lane regeneration overhead - PR_26146_034-persistent-lane-manifests-and-incremental-validation
1 parent eb7367f commit e649453

21 files changed

Lines changed: 878 additions & 76 deletions

docs/dev/reports/dependency_gating_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Dependency Gating Report
22

3-
Generated: 2026-05-26T19:54:13.476Z
3+
Generated: 2026-05-26T20:05:20.957Z
44
Status: PASS
55

66
## Gate Order

docs/dev/reports/filesystem_scan_reduction_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Filesystem Scan Reduction Report
22

3-
Generated: 2026-05-26T19:54:13.454Z
3+
Generated: 2026-05-26T20:05:20.934Z
44
Status: PASS
55

66
## Scan Enforcement
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Incremental Validation Report
2+
3+
Generated: 2026-05-26T20:05:20.958Z
4+
Status: PASS
5+
6+
## Reuse Summary
7+
8+
Reused manifests: 4
9+
Invalidated manifests: 0
10+
Generated manifests: 0
11+
Skipped manifests: 0
12+
Prevented lane regeneration: 4
13+
Prevented discovery scans: 4
14+
Prevented helper resolution passes: 11
15+
Prevented fixture resolution passes: 6
16+
17+
## Incremental Decisions
18+
19+
| Lane | Decision | Invalidated By | Runtime Savings Observation |
20+
| --- | --- | --- | --- |
21+
| tool-runtime | REUSED | unchanged inputs | Reused 3 test input(s), 4 helper(s), and 4 fixture(s). |
22+
| game-runtime | REUSED | unchanged inputs | Reused 4 test input(s), 3 helper(s), and 1 fixture(s). |
23+
| integration | REUSED | unchanged inputs | Reused 1 test input(s), 4 helper(s), and 1 fixture(s). |
24+
| engine-src | REUSED | unchanged inputs | Reused 11 test input(s), 0 helper(s), and 0 fixture(s). |
25+
26+
## Invalidation Rules
27+
28+
- Helper ownership or file hash changes invalidate only manifests that list the helper.
29+
- Fixture ownership or file hash changes invalidate only manifests that list the fixture.
30+
- Dependency graph hash changes invalidate the owning lane manifest.
31+
- Lane definition hash changes invalidate persisted lane manifests before runtime.
32+
- Targeted test file hash changes invalidate the owning lane manifest.
33+
34+
## Runtime Savings Observations
35+
36+
- Fresh persisted manifests avoid repeated lane graph generation.
37+
- Fresh persisted manifests avoid repeated helper and fixture resolution.
38+
- Fresh persisted manifests avoid repeated ownership scans outside explicit manifest inputs.
39+
- Incremental validation remains deterministic and does not use project JSON, toolState, localStorage, sessionStorage, or repo tmp/.

docs/dev/reports/lane_compilation_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Lane Compilation Report
22

3-
Generated: 2026-05-26T19:54:13.476Z
3+
Generated: 2026-05-26T20:05:20.957Z
44
Status: PASS
55

66
## Lane Graph

docs/dev/reports/lane_deduplication_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Lane Deduplication Report
22

3-
Generated: 2026-05-26T19:54:13.477Z
3+
Generated: 2026-05-26T20:05:20.957Z
44
Status: PASS
55

66
## Summary

docs/dev/reports/lane_input_validation_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Lane Input Validation Report
22

3-
Generated: 2026-05-26T19:54:13.477Z
3+
Generated: 2026-05-26T20:05:20.958Z
44
Status: PASS
55

66
## Input Files
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
{
2+
"commandsHash": "ef29170bd803e5aa",
3+
"dependencies": [],
4+
"dependencyGraphHash": "e2570ebce03c46e3",
5+
"fileHashes": {
6+
"src/engine/assets/AssetLoaderSystem.js": "1079dbc1f02d3b1a",
7+
"src/engine/assets/AssetRegistry.js": "6f09f4b9f08e692f",
8+
"src/engine/assets/ImageAssetLoader.js": "c5cbaa10a707e41e",
9+
"src/engine/audio/AudioService.js": "d34d91cb0f843a3d",
10+
"src/engine/camera/Camera2D.js": "fd8ec387433e2c88",
11+
"src/engine/camera/Camera3D.js": "b9eca57ee8184d85",
12+
"src/engine/camera/CameraSystem.js": "2fe975f309173049",
13+
"src/engine/core/Engine.js": "da804d00538620ae",
14+
"src/engine/core/FixedTicker.js": "3990ab094244cb86",
15+
"src/engine/core/FrameClock.js": "68fe99c149aae1db",
16+
"src/engine/core/RuntimeMetrics.js": "bd3dc0615aabb243",
17+
"src/engine/events/EventBus.js": "438bbca0fd5595b7",
18+
"src/engine/input/ActionInputService.js": "87d24aa5e6722371",
19+
"src/engine/input/GamepadHapticsService.js": "be88ad30bcfccaf0",
20+
"src/engine/input/GamepadInputAdapter.js": "0e9819519d56234c",
21+
"src/engine/input/InputMap.js": "a840baef430dbf1d",
22+
"src/engine/input/InputService.js": "2b93f647588f3a91",
23+
"src/engine/input/KeyboardState.js": "bfbea88db28f5cd3",
24+
"src/engine/input/MouseState.js": "dad52e903669ae4a",
25+
"src/engine/physics/arcadeBody.js": "bb75b68ad5c75ed0",
26+
"src/engine/physics/collision3d.js": "8c2b4c2060d836ba",
27+
"src/engine/physics/drag.js": "8f507a58529df7dc",
28+
"src/engine/physics/integration3d.js": "441611ffe0372c50",
29+
"src/engine/physics/scene3d.js": "14886eddbcda291b",
30+
"src/engine/rendering/CanvasRenderer.js": "aaa2e6efe0114403",
31+
"src/engine/rendering/LayeredRenderSystem.js": "f7ace3c8d0294f0d",
32+
"src/engine/scene/Scene.js": "041dc376827ee06a",
33+
"src/engine/scene/SceneManager.js": "faf66ecd4268b524",
34+
"src/engine/systems/MovementSystem.js": "0bfe4654f7173672",
35+
"src/engine/systems/PhysicsSystem.js": "263375133f68d541",
36+
"tests/assets/AssetLoaderSystem.test.mjs": "b5dca32beea30078",
37+
"tests/audio/AudioService.test.mjs": "898f83c872e1a75e",
38+
"tests/core/EngineCoreBoundaryBaseline.test.mjs": "8a2c0f1fcb38fd1a",
39+
"tests/core/FixedTicker.test.mjs": "f86de53cc559d317",
40+
"tests/core/FrameClock.test.mjs": "46d4c11b354c90d3",
41+
"tests/input/GamepadHapticsService.test.mjs": "e6b11cedefff57aa",
42+
"tests/input/GamepadInputAdapter.test.mjs": "8f2c0951e56b1d04",
43+
"tests/input/InputMap.test.mjs": "1ce8484a6d367987",
44+
"tests/input/KeyboardState.test.mjs": "67b6b0877b513f0d",
45+
"tests/input/MouseState.test.mjs": "4df02d8c0a64486d",
46+
"tests/render/Renderer.test.mjs": "4a87105ad8c8a933"
47+
},
48+
"fixtures": [],
49+
"helpers": [],
50+
"imports": [
51+
"src/engine/assets/AssetLoaderSystem.js",
52+
"src/engine/assets/AssetRegistry.js",
53+
"src/engine/assets/ImageAssetLoader.js",
54+
"src/engine/audio/AudioService.js",
55+
"src/engine/camera/Camera2D.js",
56+
"src/engine/camera/Camera3D.js",
57+
"src/engine/camera/CameraSystem.js",
58+
"src/engine/core/Engine.js",
59+
"src/engine/core/FixedTicker.js",
60+
"src/engine/core/FrameClock.js",
61+
"src/engine/core/RuntimeMetrics.js",
62+
"src/engine/events/EventBus.js",
63+
"src/engine/input/ActionInputService.js",
64+
"src/engine/input/GamepadHapticsService.js",
65+
"src/engine/input/GamepadInputAdapter.js",
66+
"src/engine/input/InputMap.js",
67+
"src/engine/input/InputService.js",
68+
"src/engine/input/KeyboardState.js",
69+
"src/engine/input/MouseState.js",
70+
"src/engine/physics/arcadeBody.js",
71+
"src/engine/physics/collision3d.js",
72+
"src/engine/physics/drag.js",
73+
"src/engine/physics/integration3d.js",
74+
"src/engine/physics/scene3d.js",
75+
"src/engine/rendering/CanvasRenderer.js",
76+
"src/engine/rendering/LayeredRenderSystem.js",
77+
"src/engine/scene/Scene.js",
78+
"src/engine/scene/SceneManager.js",
79+
"src/engine/systems/MovementSystem.js",
80+
"src/engine/systems/PhysicsSystem.js"
81+
],
82+
"inputHash": "0f5dac5319ea6241",
83+
"lane": "engine-src",
84+
"laneDefinitionHash": "266a66af3454fc0f",
85+
"manifestHash": "4b09c904c7f073c7",
86+
"ownership": "engine",
87+
"tests": [
88+
"tests/assets/AssetLoaderSystem.test.mjs",
89+
"tests/audio/AudioService.test.mjs",
90+
"tests/core/EngineCoreBoundaryBaseline.test.mjs",
91+
"tests/core/FixedTicker.test.mjs",
92+
"tests/core/FrameClock.test.mjs",
93+
"tests/input/GamepadHapticsService.test.mjs",
94+
"tests/input/GamepadInputAdapter.test.mjs",
95+
"tests/input/InputMap.test.mjs",
96+
"tests/input/KeyboardState.test.mjs",
97+
"tests/input/MouseState.test.mjs",
98+
"tests/render/Renderer.test.mjs"
99+
],
100+
"version": 1,
101+
"generatedAt": "2026-05-26T20:04:58.489Z",
102+
"source": "generated"
103+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
"commandsHash": "7e3fd8e8e97765ac",
3+
"dependencies": [],
4+
"dependencyGraphHash": "e6ec9fe53535987b",
5+
"fileHashes": {
6+
"games/Asteroids/game.manifest.json": "e95aa97f885f0334",
7+
"tests/helpers/playwrightRepoServer.mjs": "5ca6bf7f3e5e7c2d",
8+
"tests/helpers/playwrightV8CoverageReporter.mjs": "9c0ed0ab83ea6ae9",
9+
"tests/helpers/workspaceV2CoverageReporter.mjs": "2cf6bcedc7e43c85",
10+
"tests/playwright/games/AsteroidsBackgroundAssetResolution.spec.mjs": "2f4d9b83847ef74e",
11+
"tests/playwright/games/AsteroidsBeatTiming.spec.mjs": "e5b47ba87e6bea91",
12+
"tests/playwright/games/AsteroidsGameSceneCleanup.spec.mjs": "e976a8f1418dcd5b",
13+
"tests/playwright/games/AsteroidsShipStateVisuals.spec.mjs": "b1a401c5b2f2a5fe"
14+
},
15+
"fixtures": [
16+
"games/Asteroids/game.manifest.json"
17+
],
18+
"helpers": [
19+
"tests/helpers/playwrightRepoServer.mjs",
20+
"tests/helpers/playwrightV8CoverageReporter.mjs",
21+
"tests/helpers/workspaceV2CoverageReporter.mjs"
22+
],
23+
"imports": [
24+
"tests/helpers/playwrightRepoServer.mjs",
25+
"tests/helpers/playwrightV8CoverageReporter.mjs",
26+
"tests/helpers/workspaceV2CoverageReporter.mjs"
27+
],
28+
"inputHash": "1f19b05ab0983a84",
29+
"lane": "game-runtime",
30+
"laneDefinitionHash": "266a66af3454fc0f",
31+
"manifestHash": "6b3ea783bd50d09f",
32+
"ownership": "games",
33+
"tests": [
34+
"tests/playwright/games/AsteroidsBackgroundAssetResolution.spec.mjs",
35+
"tests/playwright/games/AsteroidsBeatTiming.spec.mjs",
36+
"tests/playwright/games/AsteroidsGameSceneCleanup.spec.mjs",
37+
"tests/playwright/games/AsteroidsShipStateVisuals.spec.mjs"
38+
],
39+
"version": 1,
40+
"generatedAt": "2026-05-26T20:04:58.447Z",
41+
"source": "generated"
42+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"commandsHash": "3718bca8be4cb17f",
3+
"dependencies": [],
4+
"dependencyGraphHash": "4138c2ded15059b2",
5+
"fileHashes": {
6+
"games/Pong/game.manifest.json": "c6b124046d3dbdf0",
7+
"tests/helpers/playwrightRepoServer.mjs": "5ca6bf7f3e5e7c2d",
8+
"tests/helpers/playwrightStorageIsolation.mjs": "b04700fc0f9f36ab",
9+
"tests/helpers/playwrightV8CoverageReporter.mjs": "9c0ed0ab83ea6ae9",
10+
"tests/helpers/workspaceV2CoverageReporter.mjs": "2cf6bcedc7e43c85",
11+
"tests/playwright/integration/GameIndexPreviewManifestResolution.spec.mjs": "091c2b8dde819bfc"
12+
},
13+
"fixtures": [
14+
"games/Pong/game.manifest.json"
15+
],
16+
"helpers": [
17+
"tests/helpers/playwrightRepoServer.mjs",
18+
"tests/helpers/playwrightStorageIsolation.mjs",
19+
"tests/helpers/playwrightV8CoverageReporter.mjs",
20+
"tests/helpers/workspaceV2CoverageReporter.mjs"
21+
],
22+
"imports": [
23+
"tests/helpers/playwrightRepoServer.mjs",
24+
"tests/helpers/playwrightStorageIsolation.mjs",
25+
"tests/helpers/playwrightV8CoverageReporter.mjs",
26+
"tests/helpers/workspaceV2CoverageReporter.mjs"
27+
],
28+
"inputHash": "5d0da6db61d73d19",
29+
"lane": "integration",
30+
"laneDefinitionHash": "266a66af3454fc0f",
31+
"manifestHash": "a0a414fdcda4d881",
32+
"ownership": "integration",
33+
"tests": [
34+
"tests/playwright/integration/GameIndexPreviewManifestResolution.spec.mjs"
35+
],
36+
"version": 1,
37+
"generatedAt": "2026-05-26T20:04:58.453Z",
38+
"source": "generated"
39+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"commandsHash": "01ccc12413dbfbdf",
3+
"dependencies": [],
4+
"dependencyGraphHash": "4138c2ded15059b2",
5+
"fileHashes": {
6+
"games/Asteroids/game.manifest.json": "e95aa97f885f0334",
7+
"games/GravityWell/game.manifest.json": "947361edb0b9c4cf",
8+
"games/Pong/game.manifest.json": "c6b124046d3dbdf0",
9+
"tests/fixtures/workspace-v2/uat.manifest.json": "4b2d4b7e04df35e3",
10+
"tests/helpers/playwrightRepoServer.mjs": "5ca6bf7f3e5e7c2d",
11+
"tests/helpers/playwrightStorageIsolation.mjs": "b04700fc0f9f36ab",
12+
"tests/helpers/playwrightV8CoverageReporter.mjs": "9c0ed0ab83ea6ae9",
13+
"tests/helpers/workspaceV2CoverageReporter.mjs": "2cf6bcedc7e43c85",
14+
"tests/playwright/tools/AssetManagerV2.spec.mjs": "3113b992e8ae83c5",
15+
"tests/playwright/tools/CollisionInspectorV2.spec.mjs": "627ce1254a402b1b",
16+
"tests/playwright/tools/PreviewGeneratorV2Baseline.spec.mjs": "4c067a294e6fd465"
17+
},
18+
"fixtures": [
19+
"games/Asteroids/game.manifest.json",
20+
"games/GravityWell/game.manifest.json",
21+
"games/Pong/game.manifest.json",
22+
"tests/fixtures/workspace-v2/uat.manifest.json"
23+
],
24+
"helpers": [
25+
"tests/helpers/playwrightRepoServer.mjs",
26+
"tests/helpers/playwrightStorageIsolation.mjs",
27+
"tests/helpers/playwrightV8CoverageReporter.mjs",
28+
"tests/helpers/workspaceV2CoverageReporter.mjs"
29+
],
30+
"imports": [
31+
"tests/helpers/playwrightRepoServer.mjs",
32+
"tests/helpers/playwrightStorageIsolation.mjs",
33+
"tests/helpers/playwrightV8CoverageReporter.mjs",
34+
"tests/helpers/workspaceV2CoverageReporter.mjs"
35+
],
36+
"inputHash": "294a571cec509e5f",
37+
"lane": "tool-runtime",
38+
"laneDefinitionHash": "266a66af3454fc0f",
39+
"manifestHash": "999cd821c911cac6",
40+
"ownership": "tools",
41+
"tests": [
42+
"tests/playwright/tools/AssetManagerV2.spec.mjs",
43+
"tests/playwright/tools/CollisionInspectorV2.spec.mjs",
44+
"tests/playwright/tools/PreviewGeneratorV2Baseline.spec.mjs"
45+
],
46+
"version": 1,
47+
"generatedAt": "2026-05-26T20:04:58.431Z",
48+
"source": "generated"
49+
}

0 commit comments

Comments
 (0)