From 9e693b8985d8fe55ceb7f2a715844a04f3bd20f6 Mon Sep 17 00:00:00 2001 From: Charlie Team <97194984+ToolboxAid@users.noreply.github.com> Date: Sun, 28 Jun 2026 16:34:22 -0400 Subject: [PATCH] Fix Messages shared validation guard --- ...0_OWNER_004-shared-validation-guard-fix.md | 53 ++ dev/reports/codex_changed_files.txt | 23 +- dev/reports/codex_review.diff | 776 ++---------------- toolbox/messages/messages.js | 5 +- 4 files changed, 114 insertions(+), 743 deletions(-) create mode 100644 dev/reports/PR_26180_OWNER_004-shared-validation-guard-fix.md diff --git a/dev/reports/PR_26180_OWNER_004-shared-validation-guard-fix.md b/dev/reports/PR_26180_OWNER_004-shared-validation-guard-fix.md new file mode 100644 index 000000000..5333cec1e --- /dev/null +++ b/dev/reports/PR_26180_OWNER_004-shared-validation-guard-fix.md @@ -0,0 +1,53 @@ +# PR_26180_OWNER_004-shared-validation-guard-fix + +Team: OWNER + +Branch: PR_26180_OWNER_004-shared-validation-guard-fix + +## Scope + +Fix the shared extraction guard regression in `toolbox/messages/messages.js` only. + +## Changes + +- Imported `isFiniteNumber` from `src/shared/number/numbers.js`. +- Replaced two direct `Number.isFinite(...)` checks in Messages typewriter-speed handling with `isFiniteNumber(...)`. +- Preserved the existing numeric conversion, fallback, and validation behavior. + +## Validation Results + +| Command | Result | Notes | +| --- | --- | --- | +| `node --check toolbox/messages/messages.js` | PASS | Syntax check passed | +| `node dev/tools/toolbox-dev/checkSharedExtractionGuard.mjs` | PASS | Shared extraction guard passed against baseline | +| `git diff --check` | PASS | No whitespace errors | +| `npm test` | FAIL | Guard passed, then node test runner failed on unrelated missing module `src/engine/combat/Combat.js` imported by `dev/tests/combat/Combat.test.mjs` | + +## Shared Guard Result + +The original failure is fixed: + +- File: `toolbox/messages/messages.js` +- Rule: `inline-helper-clone` +- Match: `rule:number-is-finite-usage` +- Previous unexpected count: 2 +- Current guard status: PASS + +## NPM Test Blocker + +`npm test` passed the `pretest` shared extraction guard, then failed in the node test runner: + +```text +Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'src/engine/combat/Combat.js' imported from dev/tests/combat/Combat.test.mjs +``` + +This PR does not change combat tests or engine combat files. + +## Merge / Baseline Status + +- PR merge: BLOCKED by `npm test` failure. +- Baseline commit: NOT CREATED because the requested condition was `If PASS`. + +## ZIP + +- `dev/workspace/zips/PR_26180_OWNER_004-shared-validation-guard-fix_delta.zip` diff --git a/dev/reports/codex_changed_files.txt b/dev/reports/codex_changed_files.txt index dae75d365..3ac78d159 100644 --- a/dev/reports/codex_changed_files.txt +++ b/dev/reports/codex_changed_files.txt @@ -1,23 +1,4 @@ -dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -dev/reports/PR_26179_CHARLIE_040-dev-artifact-location-cleanup.md +dev/reports/PR_26180_OWNER_004-shared-validation-guard-fix.md dev/reports/codex_changed_files.txt dev/reports/codex_review.diff -docs_build/dev/reports/codex_changed_files.txt -docs_build/dev/reports/codex_review.diff +toolbox/messages/messages.js diff --git a/dev/reports/codex_review.diff b/dev/reports/codex_review.diff index 652f9f16a..de59d9de4 100644 --- a/dev/reports/codex_review.diff +++ b/dev/reports/codex_review.diff @@ -1,724 +1,60 @@ -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md b/dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -similarity index 96% -rename from docs_build/dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -rename to dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -index 7833d2346..eb72dc560 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -+++ b/dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -@@ -16,9 +16,9 @@ The current repository did not contain `docs_build/tool-planning/sprites/`, and - - toolbox/sprites/index.html - - src/shared/toolbox/tool-metadata-inventory.js - - dev/tests/playwright/tools/SpritesToolShell.spec.mjs --- docs_build/dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md --- docs_build/dev/reports/codex_changed_files.txt --- docs_build/dev/reports/codex_review.diff -+- dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -+- dev/reports/codex_changed_files.txt -+- dev/reports/codex_review.diff - - ## Branch Validation - -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md b/dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -similarity index 93% -rename from docs_build/dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -rename to dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -index b5925c595..104eb3756 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -+++ b/dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -@@ -3,7 +3,7 @@ - Team: CHARLIE - Workflow: stacked feature workflow - Base branch: PR_26179_CHARLIE_022-sprites-tool-shell --Canonical ZIP path: dev/workspace/zip/PR_26179_CHARLIE_023-sprites-toolbar-placeholders_delta.zip -+Canonical ZIP path: dev/workspace/zips/PR_26179_CHARLIE_023-sprites-toolbar-placeholders_delta.zip - - ## Summary - -@@ -65,4 +65,4 @@ Results: - - ## ZIP Path - --`dev/workspace/zip/PR_26179_CHARLIE_023-sprites-toolbar-placeholders_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_023-sprites-toolbar-placeholders_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md b/dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -similarity index 93% -rename from docs_build/dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -rename to dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -index 4d7d89ce7..1ed7fbee0 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -+++ b/dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -@@ -3,7 +3,7 @@ - Team: CHARLIE - Workflow: stacked feature workflow - Base branch: PR_26179_CHARLIE_023-sprites-toolbar-placeholders --Canonical ZIP path: dev/workspace/zip/PR_26179_CHARLIE_024-sprites-canvas-grid_delta.zip -+Canonical ZIP path: dev/workspace/zips/PR_26179_CHARLIE_024-sprites-canvas-grid_delta.zip - - ## Summary - -@@ -59,4 +59,4 @@ Results: - - ## ZIP Path - --`dev/workspace/zip/PR_26179_CHARLIE_024-sprites-canvas-grid_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_024-sprites-canvas-grid_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md b/dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -similarity index 93% -rename from docs_build/dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -rename to dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -index 7f4879aa8..f8ab15d03 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -+++ b/dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -@@ -3,7 +3,7 @@ - Team: CHARLIE - Workflow: stacked feature workflow - Base branch: PR_26179_CHARLIE_024-sprites-canvas-grid --Canonical ZIP path: dev/workspace/zip/PR_26179_CHARLIE_025-sprites-basic-drawing_delta.zip -+Canonical ZIP path: dev/workspace/zips/PR_26179_CHARLIE_025-sprites-basic-drawing_delta.zip - - ## Summary - -@@ -61,4 +61,4 @@ Results: - - ## ZIP Path - --`dev/workspace/zip/PR_26179_CHARLIE_025-sprites-basic-drawing_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_025-sprites-basic-drawing_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md b/dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -similarity index 93% -rename from docs_build/dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -rename to dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -index 8a4036c83..151753b3b 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -+++ b/dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -@@ -3,7 +3,7 @@ - Team: CHARLIE - Workflow: stacked feature workflow - Base branch: PR_26179_CHARLIE_025-sprites-basic-drawing --Canonical ZIP path: dev/workspace/zip/PR_26179_CHARLIE_026-sprites-palette-panel_delta.zip -+Canonical ZIP path: dev/workspace/zips/PR_26179_CHARLIE_026-sprites-palette-panel_delta.zip - - ## Summary - -@@ -58,4 +58,4 @@ Results: - - ## ZIP Path - --`dev/workspace/zip/PR_26179_CHARLIE_026-sprites-palette-panel_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_026-sprites-palette-panel_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md b/dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -similarity index 93% -rename from docs_build/dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -rename to dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -index f1a8fa62f..cb6b6ffcf 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -+++ b/dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -@@ -3,7 +3,7 @@ - Team: CHARLIE - Workflow: stacked feature workflow - Base branch: PR_26179_CHARLIE_026-sprites-palette-panel --Canonical ZIP path: dev/workspace/zip/PR_26179_CHARLIE_027-sprites-preview-export_delta.zip -+Canonical ZIP path: dev/workspace/zips/PR_26179_CHARLIE_027-sprites-preview-export_delta.zip - - ## Summary - -@@ -59,4 +59,4 @@ Results: - - ## ZIP Path - --`dev/workspace/zip/PR_26179_CHARLIE_027-sprites-preview-export_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_027-sprites-preview-export_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md b/dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -similarity index 93% -rename from docs_build/dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -rename to dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -index 43a4c0b56..d5f2395cc 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -+++ b/dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -@@ -3,7 +3,7 @@ - Team: CHARLIE - Workflow: stacked feature workflow - Base branch: PR_26179_CHARLIE_027-sprites-preview-export --Canonical ZIP path for this batch: dev/workspace/zip/PR_26179_CHARLIE_028-sprites-editor-polish_delta.zip -+Canonical ZIP path for this batch: dev/workspace/zips/PR_26179_CHARLIE_028-sprites-editor-polish_delta.zip - - ## Summary - -@@ -69,4 +69,4 @@ PR_26179_CHARLIE_029-sprites-clear-reset-controls - - ## ZIP Path - --`dev/workspace/zip/PR_26179_CHARLIE_028-sprites-editor-polish_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_028-sprites-editor-polish_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md b/dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -similarity index 92% -rename from docs_build/dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -rename to dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -index 3f62e1528..14e923da9 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -+++ b/dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -@@ -3,7 +3,7 @@ - Team: CHARLIE - Workflow: stacked feature workflow - Base branch: PR_26179_CHARLIE_028-sprites-editor-polish --Canonical ZIP path for this batch: dev/workspace/zip/PR_26179_CHARLIE_029-sprites-clear-reset-controls_delta.zip -+Canonical ZIP path for this batch: dev/workspace/zips/PR_26179_CHARLIE_029-sprites-clear-reset-controls_delta.zip - - ## Summary - -@@ -68,4 +68,4 @@ PR_26179_CHARLIE_030-sprites-undo-redo - - ## ZIP Path - --`dev/workspace/zip/PR_26179_CHARLIE_029-sprites-clear-reset-controls_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_029-sprites-clear-reset-controls_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md b/dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -similarity index 97% -rename from docs_build/dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -rename to dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -index 62593187a..0866af13f 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -+++ b/dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -@@ -70,4 +70,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_030-sprites-undo-redo_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_030-sprites-undo-redo_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md b/dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -similarity index 97% -rename from docs_build/dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -rename to dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -index 4e61c7b6d..e02135a02 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -+++ b/dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -@@ -66,4 +66,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_031-sprites-picker-zoom_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_031-sprites-picker-zoom_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md b/dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -similarity index 97% -rename from docs_build/dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -rename to dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -index 200ac1ce8..58eb45a9f 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -+++ b/dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -@@ -68,4 +68,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_032-sprites-shape-tools_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_032-sprites-shape-tools_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md b/dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -similarity index 97% -rename from docs_build/dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -rename to dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -index 4426f9ea2..be0376bac 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -+++ b/dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -@@ -72,4 +72,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_033-sprites-canvas-preview-sync_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_033-sprites-canvas-preview-sync_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md b/dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -similarity index 96% -rename from docs_build/dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -rename to dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -index ccd669c7b..9e5a84a58 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -+++ b/dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -@@ -59,4 +59,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_034-sprites-frame-strip_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_034-sprites-frame-strip_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md b/dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -similarity index 96% -rename from docs_build/dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -rename to dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -index 54189a866..d9cf32ddf 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -+++ b/dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -@@ -64,4 +64,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_035-sprites-frame-editing_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_035-sprites-frame-editing_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md b/dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -similarity index 96% -rename from docs_build/dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -rename to dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -index 772128525..b0caa16b6 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -+++ b/dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -@@ -60,4 +60,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_036-sprites-animation-preview_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_036-sprites-animation-preview_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md b/dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -similarity index 96% -rename from docs_build/dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -rename to dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -index 1f32a2978..c4c9c8869 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -+++ b/dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -@@ -61,4 +61,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_037-sprites-animation-export_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_037-sprites-animation-export_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md b/dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -similarity index 96% -rename from docs_build/dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -rename to dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -index 4d8010eb4..1a238d1b9 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -+++ b/dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -@@ -63,4 +63,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_038-sprites-grid-dimension-fix_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_038-sprites-grid-dimension-fix_delta.zip` -diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md b/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -similarity index 97% -rename from docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -rename to dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -index aa665b793..b3d6e5549 100644 ---- a/docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -+++ b/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -@@ -75,4 +75,4 @@ PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs - - ## ZIP - --`dev/workspace/zip/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix_delta.zip` -+`dev/workspace/zips/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix_delta.zip` -diff --git a/dev/reports/PR_26179_CHARLIE_040-dev-artifact-location-cleanup.md b/dev/reports/PR_26179_CHARLIE_040-dev-artifact-location-cleanup.md -new file mode 100644 -index 000000000..93c65a43d ---- /dev/null -+++ b/dev/reports/PR_26179_CHARLIE_040-dev-artifact-location-cleanup.md -@@ -0,0 +1,103 @@ -+# PR_26179_CHARLIE_040-dev-artifact-location-cleanup -+ -+Team: CHARLIE -+ -+Base branch: PR_26179_CHARLIE_039-sprites-color-and-zoom-fix -+ -+Branch: PR_26179_CHARLIE_040-dev-artifact-location-cleanup -+ -+## Scope -+ -+Development artifact location cleanup only. No runtime behavior, Sprite Editor functionality, DB/API/schema, or start_of_day files were changed. -+ -+## Project Instructions Read -+ -+- dev/build/ProjectInstructions/addendums/batch_governance_mode.md -+- dev/build/ProjectInstructions/repository/canonical_repository_structure.md -+- dev/build/ProjectInstructions/addendums/codex_artifact_and_reporting_standard.md -+- dev/build/ProjectInstructions/addendums/documentation_ownership.md -+ -+## Canonical Artifact Mapping -+ -+| Legacy path | Canonical path | Action | -+| --- | --- | --- | -+| docs_build/dev/reports/PR_26179_CHARLIE_0*.md | dev/reports/PR_26179_CHARLIE_0*.md | Moved generated Charlie Sprite PR reports | -+| docs_build/dev/reports/codex_changed_files.txt | dev/reports/codex_changed_files.txt | Removed legacy tracked copy; regenerated canonical report | -+| docs_build/dev/reports/codex_review.diff | dev/reports/codex_review.diff | Removed legacy tracked copy; regenerated canonical diff | -+| dev/workspace/zip/ | dev/workspace/zips/ | Updated Charlie Sprite report references to canonical ZIP path | -+ -+Canonical ZIP path confirmed from current Project Instructions: dev/workspace/zips/ -+ -+## Files Moved -+ -+- docs_build/dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -> dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -+- docs_build/dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -> dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -+- docs_build/dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -> dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -+- docs_build/dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -> dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -+- docs_build/dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -> dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -+- docs_build/dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -> dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -+- docs_build/dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -> dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -+- docs_build/dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -> dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -+- docs_build/dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -> dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -+- docs_build/dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -> dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -+- docs_build/dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -> dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -+- docs_build/dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -> dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -+- docs_build/dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -> dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -+- docs_build/dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -> dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -+- docs_build/dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -> dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -+- docs_build/dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -> dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -+- docs_build/dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -> dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -+- docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -> dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -+ -+## References Updated -+ -+- Updated moved Charlie Sprite PR reports from docs_build/dev/reports/ to dev/reports/. -+- Updated moved Charlie Sprite PR reports from dev/workspace/zip/ to dev/workspace/zips/. -+- Left unrelated historical/report artifacts untouched, including docs_build/dev/reports/sprite-history-inventory.md. -+ -+## Files Intentionally Not Moved -+ -+- Product planning intended to remain in docs_build/ -+- Architecture documents intended to remain in docs_build/ -+- DDL, DML, and seed files -+- Documentation intended to remain in docs_build/ -+- Runtime, Sprite Editor, DB/API/schema, and start_of_day files -+ -+## Validation Checklist -+ -+| Requirement | Result | Notes | -+| --- | --- | --- | -+| Batch governance mode reviewed | PASS | Read dev/build/ProjectInstructions/addendums/batch_governance_mode.md | -+| Canonical artifact paths confirmed | PASS | Reports: dev/reports/; ZIPs: dev/workspace/zips/ | -+| Generated Charlie Sprite reports moved out of docs_build/ | PASS | PR 022 through PR 039 reports moved | -+| Legacy docs_build report aliases removed | PASS | Removed tracked codex_changed_files.txt and codex_review.diff from docs_build/dev/reports/ | -+| References updated within Charlie work only | PASS | Updated moved Charlie Sprite report references only | -+| No product planning, architecture, DDL, DML, seed, or intended docs_build docs moved | PASS | Scope limited to generated Charlie report artifacts | -+| No runtime behavior changed | PASS | Changed-file scope is reports/artifacts only | -+| No Sprite Editor functionality changed | PASS | No assets/toolbox or runtime source changes | -+| No DB/API/schema files changed | PASS | Changed-file scope check passed | -+| No start_of_day files changed | PASS | Changed-file scope check passed | -+ -+## Validation Lane -+ -+- PASS: `rg -n "docs_build/dev/reports|docs_build\\dev\\reports|dev/workspace/zip/" dev/reports -g "PR_26179_CHARLIE_0*.md" -g "!PR_26179_CHARLIE_040-dev-artifact-location-cleanup.md"` returned no matches. -+- PASS: `git diff --name-only | rg -v "^(dev/reports/|docs_build/dev/reports/)"` returned no out-of-scope paths. -+- PASS: `git diff --check` returned no whitespace errors. Git reported CRLF normalization warnings only for moved markdown reports. -+ -+## EOD Repair Note -+ -+- Rebased against current `origin/main` after PRs 022 through 039 were merged. -+- Resolved generated report conflicts by regenerating `dev/reports/codex_changed_files.txt` and `dev/reports/codex_review.diff`. -+- Preserved canonical paths: reports under `dev/reports/` and ZIPs under `dev/workspace/zips/`. -+- Preserved obsolete tracked `docs_build/dev/reports/` Charlie report removals. -+ -+## Manual Validation Notes -+ -+- Confirmed this cleanup is artifact-only. -+- Confirmed canonical report files now live under dev/reports/. -+- Confirmed PR 040 ZIP will be generated under dev/workspace/zips/. -+- Confirmed unrelated docs_build/dev/reports/sprite-history-inventory.md remains untouched. -+ -+## ZIP -+ -+- dev/workspace/zips/PR_26179_CHARLIE_040-dev-artifact-location-cleanup_delta.zip -diff --git a/dev/reports/codex_changed_files.txt b/dev/reports/codex_changed_files.txt -index 0e26265e5..dae75d365 100644 +diff --git a/dev/reports/codex_changed_files.txt b/dev/reports/codex_changed_files.txt +index dae75d365..3ac78d159 100644 --- a/dev/reports/codex_changed_files.txt +++ b/dev/reports/codex_changed_files.txt -@@ -1,19 +1,23 @@ --M dev/build/ProjectInstructions/addendums/codex_artifact_and_reporting_standard.md --M dev/build/ProjectInstructions/addendums/pr_workflow.md --M dev/build/ProjectInstructions/repository/canonical_repository_structure.md --A dev/reports/PR277-post-merge-closeout_branch-validation.md --A dev/reports/PR277-post-merge-closeout_manual-validation-notes.md --A dev/reports/PR277-post-merge-closeout_report.md --A dev/reports/PR277-post-merge-closeout_requirement-checklist.md --A dev/reports/PR277-post-merge-closeout_validation-report.md --A dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_branch-validation.md --A dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_eod-report.md --A dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_manual-validation-notes.md --A dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_report.md --A dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_requirement-checklist.md --A dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_validation-report.md --M dev/reports/codex_changed_files.txt --M dev/reports/codex_review.diff --M dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_branch-validation.md --M dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_eod-report.md --M dev/reports/PR_26179_OWNER_036-reports-are-tracked-source_validation-report.md -+dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md -+dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md -+dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md -+dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md -+dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md -+dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md -+dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md -+dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md -+dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md -+dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md -+dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md -+dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md -+dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md -+dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md -+dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md -+dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md -+dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md -+dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -+dev/reports/PR_26179_CHARLIE_040-dev-artifact-location-cleanup.md -+dev/reports/codex_changed_files.txt -+dev/reports/codex_review.diff -+docs_build/dev/reports/codex_changed_files.txt -+docs_build/dev/reports/codex_review.diff -diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt -deleted file mode 100644 -index 06b902964..000000000 ---- a/docs_build/dev/reports/codex_changed_files.txt -+++ /dev/null -@@ -1,7 +0,0 @@ --assets/theme-v2/css/gamefoundrystudio.css --assets/toolbox/sprites/js/index.js --dev/tests/playwright/tools/SpritesToolShell.spec.mjs --docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md +@@ -1,23 +1,4 @@ +-dev/reports/PR_26179_CHARLIE_022-sprites-tool-shell.md +-dev/reports/PR_26179_CHARLIE_023-sprites-toolbar-placeholders.md +-dev/reports/PR_26179_CHARLIE_024-sprites-canvas-grid.md +-dev/reports/PR_26179_CHARLIE_025-sprites-basic-drawing.md +-dev/reports/PR_26179_CHARLIE_026-sprites-palette-panel.md +-dev/reports/PR_26179_CHARLIE_027-sprites-preview-export.md +-dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md +-dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md +-dev/reports/PR_26179_CHARLIE_030-sprites-undo-redo.md +-dev/reports/PR_26179_CHARLIE_031-sprites-picker-zoom.md +-dev/reports/PR_26179_CHARLIE_032-sprites-shape-tools.md +-dev/reports/PR_26179_CHARLIE_033-sprites-canvas-preview-sync.md +-dev/reports/PR_26179_CHARLIE_034-sprites-frame-strip.md +-dev/reports/PR_26179_CHARLIE_035-sprites-frame-editing.md +-dev/reports/PR_26179_CHARLIE_036-sprites-animation-preview.md +-dev/reports/PR_26179_CHARLIE_037-sprites-animation-export.md +-dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md +-dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md +-dev/reports/PR_26179_CHARLIE_040-dev-artifact-location-cleanup.md ++dev/reports/PR_26180_OWNER_004-shared-validation-guard-fix.md + dev/reports/codex_changed_files.txt + dev/reports/codex_review.diff -docs_build/dev/reports/codex_changed_files.txt -docs_build/dev/reports/codex_review.diff --toolbox/sprites/index.html -diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff -deleted file mode 100644 -index fe4994612..000000000 ---- a/docs_build/dev/reports/codex_review.diff -+++ /dev/null -@@ -1,245 +0,0 @@ --diff --git a/assets/theme-v2/css/gamefoundrystudio.css b/assets/theme-v2/css/gamefoundrystudio.css --index 5786394a2..b92e7101e 100644 ----- a/assets/theme-v2/css/gamefoundrystudio.css --+++ b/assets/theme-v2/css/gamefoundrystudio.css --@@ -1184,6 +1184,10 @@ body.tool-focus-mode .tool-column:last-of-type { -- grid-template-rows: repeat(32, minmax(0, 1fr)) -- } -- --+.sprite-canvas-shell[data-sprites-zoom-level="0.5"] .sprite-canvas-grid { --+ width: min(260px, 50%) --+} --+ -- .sprite-canvas-shell[data-sprites-zoom-level="2"] .sprite-canvas-grid { -- width: min(720px, 160%) -- } --@@ -1212,26 +1216,31 @@ body.tool-focus-mode .tool-column:last-of-type { -- background: var(--text) -- } -- --+.sprite-canvas-cell.is-painted.sprite-canvas-cell--ink, -- .sprite-canvas-cell--ink, -- .sprite-color-chip--ink { -- background: var(--text) -- } -- --+.sprite-canvas-cell.is-painted.sprite-canvas-cell--orange, -- .sprite-canvas-cell--orange, -- .sprite-color-chip--orange { -- background: var(--molten-orange) -- } -- --+.sprite-canvas-cell.is-painted.sprite-canvas-cell--gold, -- .sprite-canvas-cell--gold, -- .sprite-color-chip--gold { -- background: var(--forge-gold) -- } -- --+.sprite-canvas-cell.is-painted.sprite-canvas-cell--green, -- .sprite-canvas-cell--green, -- .sprite-color-chip--green { -- background: var(--green) -- } -- --+.sprite-canvas-cell.is-painted.sprite-canvas-cell--blue, -- .sprite-canvas-cell--blue, -- .sprite-color-chip--blue { -- background: var(--electric-blue) --diff --git a/assets/toolbox/sprites/js/index.js b/assets/toolbox/sprites/js/index.js --index e6d249c52..48f8ba56e 100644 ----- a/assets/toolbox/sprites/js/index.js --+++ b/assets/toolbox/sprites/js/index.js --@@ -1,7 +1,7 @@ -- const DEFAULT_GRID_SIZE = 16; -- const DEFAULT_FRAME_DURATION_MS = 120; -- const SUPPORTED_GRID_SIZES = Object.freeze([16, 32]); ---const SUPPORTED_ZOOM_LEVELS = Object.freeze([1, 2, 4]); --+const SUPPORTED_ZOOM_LEVELS = Object.freeze([0.5, 1, 2, 4]); -- const SHAPE_TOOLS = Object.freeze(["line", "rectangle", "circle"]); -- const EDITOR_TOOLS = Object.freeze(["pencil", "eraser", "fill", "picker", "zoom", ...SHAPE_TOOLS]); -- const EDITOR_COLOR_KEYS = Object.freeze(["ink", "orange", "gold", "green", "blue"]); --diff --git a/dev/tests/playwright/tools/SpritesToolShell.spec.mjs b/dev/tests/playwright/tools/SpritesToolShell.spec.mjs --index b04cb375d..3282b79fa 100644 ----- a/dev/tests/playwright/tools/SpritesToolShell.spec.mjs --+++ b/dev/tests/playwright/tools/SpritesToolShell.spec.mjs --@@ -219,6 +219,25 @@ async function previewCellHasPaint(page, row, column) { -- }, { column, gridSize, row }); -- } -- --+async function previewCellColor(page, row, column) { --+ const gridSize = Number(await page.locator("[data-sprites-pixel-grid]").getAttribute("data-sprites-grid-size")); --+ return page.locator("[data-sprites-preview-canvas]").evaluate((canvas, coordinates) => { --+ const context = canvas.getContext("2d"); --+ if (!context || !Number.isFinite(coordinates.gridSize) || coordinates.gridSize <= 0) { --+ return ""; --+ } --+ const cellSize = canvas.width / coordinates.gridSize; --+ const x = Math.max(0, Math.min(canvas.width - 1, Math.floor((coordinates.column - 0.5) * cellSize))); --+ const y = Math.max(0, Math.min(canvas.height - 1, Math.floor((coordinates.row - 0.5) * cellSize))); --+ const pixel = context.getImageData(x, y, 1, 1).data; --+ return `rgb(${pixel[0]}, ${pixel[1]}, ${pixel[2]})`; --+ }, { column, gridSize, row }); --+} --+ --+async function centerCellColor(page, row, column) { --+ return spriteCell(page, row, column).evaluate((cell) => getComputedStyle(cell).backgroundColor); --+} --+ -- async function canvasHasAnyPaint(locator) { -- return locator.evaluate((canvas) => { -- const context = canvas.getContext("2d"); --@@ -240,6 +259,9 @@ async function expectCenterAndPreviewPainted(page, row, column, colorClass = nul -- await expect(cell).toHaveClass(/is-painted/); -- if (colorClass) { -- await expect(cell).toHaveClass(new RegExp(colorClass)); --+ const centerColor = await centerCellColor(page, row, column); --+ expect(centerColor).not.toBe("rgb(255, 255, 255)"); --+ expect(await previewCellColor(page, row, column)).toBe(centerColor); -- } -- expect(await previewCellHasPaint(page, row, column)).toBe(true); -- } --@@ -337,6 +359,7 @@ test("Sprite Creator shell loads with visible tool, canvas, details, and status -- await expect(page.locator("[data-sprites-pixel-grid] [role='gridcell']")).toHaveCount(256); -- await expect(page.locator("[data-sprites-grid-status]")).toContainText("Canvas display mode: 16x16"); -- await expect(page.locator("[data-sprites-zoom-status]")).toContainText("100%"); --+ await expect(page.getByRole("button", { name: "50%" })).toBeVisible(); -- await page.getByRole("button", { name: "32x32" }).click(); -- await expect(page.locator("[data-sprites-pixel-grid]")).toHaveAttribute("aria-label", "Sprite Creator 32 by 32 pixel canvas"); -- await expect(page.locator("[data-sprites-pixel-grid] [role='gridcell']")).toHaveCount(1024); --@@ -412,6 +435,10 @@ test("Sprite Creator shell loads with visible tool, canvas, details, and status -- await expect(page.locator("[data-sprites-zoom-status]")).toContainText("400%"); -- await page.getByRole("button", { name: "100%" }).click(); -- await expect(page.locator("[data-sprites-grid-shell]")).toHaveAttribute("data-sprites-zoom-level", "1"); --+ await page.getByRole("button", { name: "50%" }).click(); --+ await expect(page.locator("[data-sprites-grid-shell]")).toHaveAttribute("data-sprites-zoom-level", "0.5"); --+ await expect(page.locator("[data-sprites-zoom-status]")).toContainText("50%"); --+ await expect(page.locator("[data-sprites-pixel-grid] [role='gridcell']")).toHaveCount(256); -- const gridCells = page.locator("[data-sprites-pixel-grid] [role='gridcell']"); -- await page.getByRole("button", { name: "Clear Canvas" }).click(); -- await page.getByRole("button", { name: "Green editor color" }).click(); --@@ -472,14 +499,14 @@ test("Sprite Creator canvas grid dimensions stay exact across modes and zoom", a -- await page.goto(`${server.baseUrl}/toolbox/sprites/index.html`, { waitUntil: "networkidle" }); -- -- await expectExactGridDimensions(page, 16); --- for (const zoomLabel of ["200%", "400%", "100%"]) { --+ for (const zoomLabel of ["50%", "200%", "400%", "100%"]) { -- await page.getByRole("button", { name: zoomLabel }).click(); -- await expectExactGridDimensions(page, 16); -- } -- -- await page.getByRole("button", { name: "32x32" }).click(); -- await expectExactGridDimensions(page, 32); --- for (const zoomLabel of ["200%", "400%", "100%"]) { --+ for (const zoomLabel of ["50%", "200%", "400%", "100%"]) { -- await page.getByRole("button", { name: zoomLabel }).click(); -- await expectExactGridDimensions(page, 32); -- } --diff --git a/docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md b/docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md --new file mode 100644 --index 000000000..aa665b793 ----- /dev/null --+++ b/docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md --@@ -0,0 +1,78 @@ --+# PR_26179_CHARLIE_039-sprites-color-and-zoom-fix --+ --+Team: CHARLIE --+ --+Mode: Batch governance stacked bug-fix workflow --+ --+Base branch: PR_26179_CHARLIE_038-sprites-grid-dimension-fix --+ --+Branch: PR_26179_CHARLIE_039-sprites-color-and-zoom-fix --+ --+## Summary --+ --+Fixed Sprite Creator center canvas selected-color rendering and added a 50% zoom option. The center grid now uses color-specific painted-cell selectors with enough specificity to override the generic painted fallback, so Pencil, Fill, and Shape tools display the selected palette color instead of defaulting visually to the fallback color. The Playwright coverage now compares the center cell computed color with the right preview canvas pixel color to prove both surfaces use the same selected-color page-session state. --+ --+## Branch Validation --+ --+PASS --+ --+- Built from `PR_26179_CHARLIE_038-sprites-grid-dimension-fix`. --+- Scope stayed limited to selected color rendering, 50% zoom, and regression coverage. --+- No DB/API/schema changes. --+- No browser-owned authoritative product data added. --+- No start_of_day files changed. --+- ZIP package created at the requested path. --+ --+## Requirement Checklist --+ --+PASS - Center canvas drawing color follows selected palette color. --+ --+PASS - Pencil applies selected color to center grid. --+ --+PASS - Fill applies selected color to center grid. --+ --+PASS - Shape tools apply selected color to center grid. --+ --+PASS - Center grid, right preview, frame data, animation preview, and exports use the same selected-color pixel state. --+ --+PASS - Painted pixels do not default to white unless that is the selected palette color. --+ --+PASS - 50% zoom option added. --+ --+PASS - Existing 100%, 200%, and 400% zoom options retained. --+ --+PASS - Zoom does not change grid dimensions or pixel state. --+ --+PASS - Export path still works. --+ --+PASS - No DB/API/schema changes. --+ --+PASS - No browser-owned authoritative product data. --+ --+PASS - No start_of_day changes. --+ --+## Validation Lane --+ --+PASS - `node --check assets/toolbox/sprites/js/index.js` --+ --+PASS - `node --check dev/tests/playwright/tools/SpritesToolShell.spec.mjs` --+ --+PASS - `git diff --check -- toolbox/sprites/index.html assets/toolbox/sprites/js/index.js assets/theme-v2/css/gamefoundrystudio.css dev/tests/playwright/tools/SpritesToolShell.spec.mjs` --+ --+PASS - Runtime guard scan found no prohibited inline style/script/event-handler or stale placeholder text in touched runtime files. --+ --+PASS - `npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs --workers=1 --reporter=list` --+ --+## Manual Validation Notes --+ --+1. Open `toolbox/sprites/index.html`. --+2. Select a non-white palette color such as Gold or Blue. --+3. Draw with Pencil and confirm the center grid cell uses the selected color. --+4. Confirm the right preview shows the same selected color. --+5. Use Fill and Shape tools with a selected color and confirm the center grid matches. --+6. Use 50%, 100%, 200%, and 400% zoom and confirm grid dimensions and pixels do not change. --+7. Download PNG and Animation Strip and confirm export status still completes. --+ --+## ZIP --+ --+`dev/workspace/zip/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix_delta.zip` --diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt --index 52e5e47e7..06b902964 100644 ----- a/docs_build/dev/reports/codex_changed_files.txt --+++ b/docs_build/dev/reports/codex_changed_files.txt --@@ -1,6 +1,7 @@ -- assets/theme-v2/css/gamefoundrystudio.css --+assets/toolbox/sprites/js/index.js -- dev/tests/playwright/tools/SpritesToolShell.spec.mjs ---docs_build/dev/reports/PR_26179_CHARLIE_038-sprites-grid-dimension-fix.md --+docs_build/dev/reports/PR_26179_CHARLIE_039-sprites-color-and-zoom-fix.md -- docs_build/dev/reports/codex_changed_files.txt -- docs_build/dev/reports/codex_review.diff -- toolbox/sprites/index.html --diff --git a/toolbox/sprites/index.html b/toolbox/sprites/index.html --index 78d0e76c4..46b480acb 100644 ----- a/toolbox/sprites/index.html --+++ b/toolbox/sprites/index.html --@@ -112,6 +112,7 @@ -- -- --
--+ -- -- -- ++toolbox/messages/messages.js +diff --git a/toolbox/messages/messages.js b/toolbox/messages/messages.js +index d4c6cd532..f6c54917d 100644 +--- a/toolbox/messages/messages.js ++++ b/toolbox/messages/messages.js +@@ -12,6 +12,7 @@ import { + validatePublishConfiguration, + } from "./messages-api-client.js"; + import { getSessionCurrent } from "../../src/api/session-api-client.js"; ++import { isFiniteNumber } from "../../src/shared/number/numbers.js"; + + const NEW_ROW_KEY = "__new__"; + const MESSAGE_TABLE_COLSPAN = 8; +@@ -323,7 +324,7 @@ function tagsForMessage(message) { + + function formatTypewriterSpeed(value) { + const speed = Number(value); +- return Number.isFinite(speed) ? `${speed} cps` : `${TYPEWRITER_SPEED_DEFAULT} cps`; ++ return isFiniteNumber(speed) ? `${speed} cps` : `${TYPEWRITER_SPEED_DEFAULT} cps`; + } + + function formatUpdated(value) { +@@ -991,7 +992,7 @@ function validateMessage(values) { + errors.push("Message text is required."); + } + const typewriterSpeed = Number(values.typewriterSpeed); +- if (!Number.isFinite(typewriterSpeed) || typewriterSpeed < 0) { ++ if (!isFiniteNumber(typewriterSpeed) || typewriterSpeed < 0) { + errors.push("Typewriter speed must be 0 or greater."); + } + if (!values.voiceProfileKey) { diff --git a/toolbox/messages/messages.js b/toolbox/messages/messages.js index d4c6cd532..f6c54917d 100644 --- a/toolbox/messages/messages.js +++ b/toolbox/messages/messages.js @@ -12,6 +12,7 @@ import { validatePublishConfiguration, } from "./messages-api-client.js"; import { getSessionCurrent } from "../../src/api/session-api-client.js"; +import { isFiniteNumber } from "../../src/shared/number/numbers.js"; const NEW_ROW_KEY = "__new__"; const MESSAGE_TABLE_COLSPAN = 8; @@ -323,7 +324,7 @@ function tagsForMessage(message) { function formatTypewriterSpeed(value) { const speed = Number(value); - return Number.isFinite(speed) ? `${speed} cps` : `${TYPEWRITER_SPEED_DEFAULT} cps`; + return isFiniteNumber(speed) ? `${speed} cps` : `${TYPEWRITER_SPEED_DEFAULT} cps`; } function formatUpdated(value) { @@ -991,7 +992,7 @@ function validateMessage(values) { errors.push("Message text is required."); } const typewriterSpeed = Number(values.typewriterSpeed); - if (!Number.isFinite(typewriterSpeed) || typewriterSpeed < 0) { + if (!isFiniteNumber(typewriterSpeed) || typewriterSpeed < 0) { errors.push("Typewriter speed must be 0 or greater."); } if (!values.voiceProfileKey) {