Skip to content

Commit b00a125

Browse files
author
DavidQ
committed
Execute debug observability validation for Level 19 Track D.
BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION - validate debug-data exposure for rendering/input/physics/state-replay/networking - add only minimal provider or test wiring if required - use deduplicated validation commands - update roadmap only for execution-backed results
1 parent 6f2893f commit b00a125

10 files changed

Lines changed: 362 additions & 11 deletions

docs/dev/CODEX_COMMANDS.md

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,58 @@
11
MODEL: GPT-5.4-codex
2-
REASONING: low
2+
REASONING: high
33

44
COMMAND:
5-
1. Inspect npm test vs run-node-tests.mjs
6-
2. Confirm overlap
7-
3. Update scripts/docs to use ONLY:
8-
node ./scripts/run-node-tests.mjs
9-
4. Remove redundant references to npm test where duplicate
10-
5. Package ZIP
5+
1. Open the roadmap at:
6+
docs/dev/roadmaps/MASTER_ROADMAP_HIGH_LEVEL.md
7+
8+
2. Execute the smallest real PR needed to complete Level 19 Track D:
9+
- ensure all systems expose debug data
10+
11+
3. Search only where needed:
12+
- existing debug providers
13+
- debug panels / registries
14+
- rendering/input/physics/state/replay/networking runtime data surfaces
15+
- focused tests validating debug exposure
16+
17+
4. Verify debug-data exposure for:
18+
- rendering
19+
- input
20+
- physics
21+
- state/replay
22+
- networking
23+
24+
5. If any target system is missing exposure, apply the smallest valid fix:
25+
- add minimal provider output or wiring
26+
- add/update focused tests proving the data reaches the existing debug surface
27+
- do not add new features or broad UX changes
28+
29+
6. Run validation using the deduplicated command set:
30+
- node ./scripts/run-node-tests.mjs
31+
- npm run test:launch-smoke only if needed for runtime/debug coverage
32+
33+
7. Produce reports:
34+
- docs/dev/reports/BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION_summary.md
35+
- docs/dev/reports/BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION_coverage.md
36+
- docs/dev/reports/BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION_results.md
37+
38+
8. In the reports, record:
39+
- which systems were checked
40+
- what debug data each system exposes
41+
- files changed
42+
- commands run
43+
- pass/fail results
44+
- any bounded caveats
45+
46+
9. Update the roadmap only if this PR proves the remaining Track D item:
47+
- [x] ensure all systems expose debug data
48+
49+
10. Package the repo-structured ZIP to:
50+
<project folder>/tmp/BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION.zip
51+
52+
CONSTRAINTS:
53+
- one PR purpose only
54+
- smallest scoped valid change
55+
- no vague wording
56+
- no repo-wide scanning unless required
57+
- do not run both npm test and node ./scripts/run-node-tests.mjs when they cover the same suite
58+
- no roadmap-only promotion without executed validation

docs/dev/COMMIT_COMMENT.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1-
Deduplicate test commands, standardize on run-node-tests
1+
Execute debug observability validation for Level 19 Track D.
22

3-
BUILD_PR_LEVEL_19_14_TEST_COMMAND_DEDUP
3+
BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION
4+
- validate debug-data exposure for rendering/input/physics/state-replay/networking
5+
- add only minimal provider or test wiring if required
6+
- use deduplicated validation commands
7+
- update roadmap only for execution-backed results
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION Coverage
2+
3+
## Systems Checked And Surfaces
4+
- rendering
5+
- surface: `src/engine/debug/PerformanceMetricsPanel.js`
6+
- debug data: `fps`, `frameMs`, `updateMs`, `renderMs`, `fixedUpdates`
7+
- validation: `tests/final/DebugObservabilityMaturity.test.mjs`
8+
9+
- input
10+
- surface: `src/engine/input/ActionInputDebugOverlay.js`
11+
- debug data: action flags (`down/pressed/buffered/queued/windowOpen/cooldown`), queue, chain progress
12+
- validation: `tests/final/DebugObservabilityMaturity.test.mjs`
13+
14+
- physics
15+
- surfaces:
16+
- `src/engine/debug/standard/threeD/providers/collisionOverlaysProvider.js`
17+
- `src/engine/debug/standard/threeD/panels/panel3dCollisionOverlays.js`
18+
- debug data: `overlayRows`, `overlayCount`, `activeCount`
19+
- validation: `tests/final/DebugObservabilityMaturity.test.mjs`
20+
21+
- state/replay
22+
- surfaces:
23+
- `src/engine/debug/inspectors/bootstrap/createInspectorSurfaceIntegration.js`
24+
- `src/engine/debug/inspectors/host/debugInspectorHost.js`
25+
- debug data:
26+
- providers: `inspector.stateDiff.snapshot`, `inspector.timeline.snapshot`
27+
- panel output: state diff lines and replay timeline marker lines
28+
- validation: `tests/final/DebugObservabilityMaturity.test.mjs`
29+
30+
- networking
31+
- surfaces:
32+
- `src/engine/debug/network/panels/networkObservabilityPanels.js`
33+
- `src/engine/debug/network/diagnostics/*`
34+
- debug data: latency (`status/rttMs/jitterMs`) and replication (`hostTick/highestBacklog/divergenceWarnings/client rows`)
35+
- validation:
36+
- `tests/final/DebugObservabilityMaturity.test.mjs`
37+
- `tests/final/NetworkDebugAndServerDashboardCloseout.test.mjs`
38+
39+
## Additional Runtime Coverage
40+
- `tests/runtime/LaunchSmokeAllEntries.test.mjs` executed as part of `node ./scripts/run-node-tests.mjs` and passed (`PASS=271 FAIL=0 TOTAL=271`), confirming runtime launch stability for games/samples/tools with debug surfaces present.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION Results
2+
3+
## Commands Run
4+
- `node ./scripts/run-node-tests.mjs`
5+
6+
No separate `npm run test:launch-smoke` invocation was required because `LaunchSmokeAllEntries` is already executed inside `run-node-tests`.
7+
8+
## Pass/Fail
9+
- `node ./scripts/run-node-tests.mjs`: PASS
10+
- explicit tests: `136/136` passed
11+
- includes `PASS DebugObservabilityMaturity`
12+
- includes `PASS NetworkDebugAndServerDashboardCloseout`
13+
- includes `PASS LaunchSmokeAllEntries`
14+
- launch smoke summary (from embedded run): `PASS=271 FAIL=0 TOTAL=271`
15+
16+
## Debug Exposure Outcome
17+
- rendering debug exposure: PASS
18+
- input debug exposure: PASS
19+
- physics debug exposure: PASS
20+
- state/replay debug exposure: PASS
21+
- networking debug exposure: PASS
22+
23+
## Roadmap Decision
24+
- Level 19 Track D item `ensure all systems expose debug data` set to `[x]` based on executed validation in this PR.
25+
26+
## Bounded Caveats
27+
- This PR validates debug-observability contracts and wiring surfaces; it does not add new debug UX/features beyond the existing architecture.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION Summary
2+
3+
## Target
4+
Level 19, Track D:
5+
- ensure all systems expose debug data
6+
7+
## Execution Summary
8+
This PR validated debug-data exposure through existing surfaces for:
9+
- rendering
10+
- input
11+
- physics
12+
- state/replay
13+
- networking
14+
15+
Validation was execution-backed using `node ./scripts/run-node-tests.mjs` with a focused observability test added to the suite and the existing integrated tests.
16+
17+
## Systems Proven
18+
- rendering: `drawPerformanceMetricsPanel` emits render timing lines from runtime metrics snapshots.
19+
- input: `drawActionInputDebugOverlay` emits per-action, queue, and chain debug lines.
20+
- physics: `createCollisionOverlaysProvider` + `create3dCollisionOverlaysPanel` expose normalized collision overlay rows/counts.
21+
- state/replay: inspector integration exposes `inspector.stateDiff.snapshot` and `inspector.timeline.snapshot`; panels render state diffs and replay timeline markers.
22+
- networking: `createNetworkObservabilityPanels` renders latency/replication lines from network snapshot data.
23+
24+
## Files Changed
25+
- `tests/final/DebugObservabilityMaturity.test.mjs` (added)
26+
- `tests/run-tests.mjs` (wired focused test into node suite)
27+
- `docs/dev/roadmaps/MASTER_ROADMAP_HIGH_LEVEL.md` (Track D status-only update)
28+
- `docs/dev/reports/BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION_summary.md`
29+
- `docs/dev/reports/BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION_coverage.md`
30+
- `docs/dev/reports/BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION_results.md`

docs/dev/reports/launch_smoke_report.md

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

3-
Generated: 2026-04-17T18:01:07.109Z
3+
Generated: 2026-04-17T18:22:44.903Z
44

55
Filters: games=true, samples=true, tools=true, sampleRange=all
66

docs/dev/roadmaps/MASTER_ROADMAP_HIGH_LEVEL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@
810810
- [x] identify bottlenecks
811811

812812
### Track D � Debug & Observability Maturity
813-
- [ ] ensure all systems expose debug data
813+
- [x] ensure all systems expose debug data
814814
- [x] ensure providers are complete and consistent
815815
- [x] validate debug panels across systems
816816
- [x] confirm production-safe debug toggling
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION
2+
3+
## Purpose
4+
Complete the next real execution PR for Level 19 by validating the remaining Track D item:
5+
- [ ] ensure all systems expose debug data
6+
7+
## Scope
8+
- one PR purpose only
9+
- execute debug-observability validation work
10+
- make only the smallest validation-backed runtime changes needed
11+
- no feature creation
12+
- no broad repo cleanup
13+
- no unrelated roadmap promotion
14+
15+
## Target Systems
16+
Validate debug-data exposure for the core systems already called out in Level 19 Track A:
17+
- rendering
18+
- input
19+
- physics
20+
- state/replay
21+
- networking
22+
- debug platform integration points where needed to surface the above
23+
24+
## Required Execution
25+
1. Inspect the existing debug provider/panel/data-surface path.
26+
2. Verify each target system exposes meaningful debug data through the existing debug architecture.
27+
3. If any target system is missing exposure, add the smallest non-feature provider or wiring change needed.
28+
4. Add or update focused tests/harness coverage to prove the exposure path.
29+
5. Record exactly what was validated and what commands were run.
30+
6. Update the roadmap only if this PR actually proves the remaining Track D item.
31+
32+
## Preferred Change Areas
33+
- `src/engine/**` only where tiny provider exposure fixes are required
34+
- `tests/**`
35+
- existing debug provider/panel wiring
36+
- validation scripts/harnesses if needed
37+
38+
## Validation Commands
39+
Use the non-duplicative test flow:
40+
- `node ./scripts/run-node-tests.mjs`
41+
- `npm run test:launch-smoke` only if needed to prove runtime/debug exposure beyond the node suite
42+
43+
Do not run both `npm test` and `node ./scripts/run-node-tests.mjs` when they execute the same suite.
44+
45+
## Acceptance
46+
- all target systems are shown to expose debug data through the existing debug surfaces
47+
- evidence is captured in reports
48+
- roadmap advances only for the execution-backed Track D item
49+
- ZIP artifact produced at `<project folder>/tmp/BUILD_PR_LEVEL_19_15_DEBUG_OBSERVABILITY_VALIDATION.zip`
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
/*
2+
Toolbox Aid
3+
David Quesenberry
4+
04/17/2026
5+
DebugObservabilityMaturity.test.mjs
6+
*/
7+
import assert from "node:assert/strict";
8+
import { drawPerformanceMetricsPanel } from "../../src/engine/debug/PerformanceMetricsPanel.js";
9+
import { create3dCollisionOverlaysPanel } from "../../src/engine/debug/standard/threeD/panels/panel3dCollisionOverlays.js";
10+
import { createCollisionOverlaysProvider } from "../../src/engine/debug/standard/threeD/providers/collisionOverlaysProvider.js";
11+
import { createAdvancedInspectorDebugPluginDefinition } from "../../src/engine/debug/inspectors/index.js";
12+
import { createNetworkObservabilityPanels } from "../../src/engine/debug/network/index.js";
13+
import { drawActionInputDebugOverlay } from "../../src/engine/input/ActionInputDebugOverlay.js";
14+
15+
function createRendererProbe() {
16+
const texts = [];
17+
return {
18+
texts,
19+
drawRect() {},
20+
strokeRect() {},
21+
drawText(text) {
22+
texts.push(String(text));
23+
}
24+
};
25+
}
26+
27+
export async function run() {
28+
const renderingRenderer = createRendererProbe();
29+
drawPerformanceMetricsPanel(
30+
renderingRenderer,
31+
{
32+
getSnapshot: () => ({
33+
fps: 59.7,
34+
frameMs: 16.73,
35+
updateMs: 5.3,
36+
renderMs: 4.21,
37+
fixedUpdates: 1
38+
})
39+
},
40+
{ x: 0, y: 0 }
41+
);
42+
assert.equal(renderingRenderer.texts.some((line) => line.includes("Render ms: 4.21")), true);
43+
44+
const inputRenderer = createRendererProbe();
45+
drawActionInputDebugOverlay(
46+
inputRenderer,
47+
{
48+
getActionDebugSnapshot: () => [
49+
{
50+
action: "move",
51+
down: true,
52+
pressed: true,
53+
buffered: false,
54+
queued: true,
55+
windowOpen: true,
56+
cooldown: false
57+
}
58+
],
59+
getQueuedActions: () => [{ action: "move", priority: 2 }],
60+
getActionChainProgress: () => 2,
61+
isActionChainComplete: () => false
62+
},
63+
{
64+
x: 0,
65+
y: 0,
66+
chains: ["movement"]
67+
}
68+
);
69+
assert.equal(inputRenderer.texts.some((line) => line.includes("move: D1 P1 B0 Q1 W1 C0")), true);
70+
assert.equal(inputRenderer.texts.some((line) => line.includes("Queue: move:2")), true);
71+
72+
const collisionProvider = createCollisionOverlaysProvider({
73+
collisionOverlays: () => ({
74+
overlays: [
75+
{ overlayId: "broadphase", kind: "bounds", state: "active", enabled: true }
76+
]
77+
})
78+
});
79+
const collisionSnapshot = collisionProvider.getSnapshot({});
80+
assert.equal(collisionSnapshot.overlayCount, 1);
81+
assert.equal(collisionSnapshot.activeCount, 1);
82+
83+
const collisionPanel = create3dCollisionOverlaysPanel(collisionProvider, { enabled: true });
84+
const collisionRender = collisionPanel.render({}, {});
85+
assert.equal(collisionRender.lines.includes("overlay.1=broadphase|bounds|active|enabled=true"), true);
86+
87+
const inspectorPlugin = createAdvancedInspectorDebugPluginDefinition({
88+
panelsEnabled: true
89+
});
90+
const inspectorProviders = inspectorPlugin.getProviders();
91+
assert.equal(
92+
inspectorProviders.some((provider) => provider.providerId === "inspector.stateDiff.snapshot"),
93+
true
94+
);
95+
assert.equal(
96+
inspectorProviders.some((provider) => provider.providerId === "inspector.timeline.snapshot"),
97+
true
98+
);
99+
100+
const inspectorContext = {
101+
inspectors: {
102+
state: {
103+
current: {
104+
mode: "play",
105+
replayFrame: 12
106+
}
107+
},
108+
timelineMarkers: [
109+
{
110+
markerId: "replay-12",
111+
frameIndex: 12,
112+
category: "replay",
113+
label: "Replay frame 12"
114+
}
115+
],
116+
eventStream: [
117+
{
118+
eventId: "input-pressed",
119+
category: "input",
120+
message: "move pressed"
121+
}
122+
]
123+
}
124+
};
125+
126+
const inspectorPanels = inspectorPlugin.getPanels();
127+
const stateDiffPanel = inspectorPanels.find((panel) => panel.id === "inspector-state-diff");
128+
const timelinePanel = inspectorPanels.find((panel) => panel.id === "inspector-timeline");
129+
const stateDiffRender = stateDiffPanel.render(stateDiffPanel, inspectorContext);
130+
const timelineRender = timelinePanel.render(timelinePanel, inspectorContext);
131+
assert.equal(stateDiffRender.lines.some((line) => line.includes("added:mode")), true);
132+
assert.equal(timelineRender.lines.some((line) => line.includes("category=replay")), true);
133+
134+
const networkPanels = createNetworkObservabilityPanels();
135+
const latencyRender = networkPanels[0].render(networkPanels[0], {
136+
assets: {
137+
network: {
138+
latency: {
139+
status: "degraded",
140+
rttMs: 85,
141+
jitterMs: 11
142+
},
143+
replication: {
144+
hostTick: 300,
145+
highestBacklog: 5
146+
}
147+
}
148+
}
149+
});
150+
assert.equal(latencyRender.lines.some((line) => line.includes("rttMs=85")), true);
151+
}

0 commit comments

Comments
 (0)