From a6cd320756e07d1b050034044654572661d1cd94 Mon Sep 17 00:00:00 2001 From: "Mr. Q" <97194984+ToolboxAid@users.noreply.github.com> Date: Sun, 21 Jun 2026 11:45:24 -0400 Subject: [PATCH] PR_26171_GAMMA_024 local api sqlite reference cleanup --- ...leanup-instruction-compliance-checklist.md | 35 ++++++++++++ ...ference-cleanup-manual-validation-notes.md | 19 +++++++ ..._024-local-api-sqlite-reference-cleanup.md | 53 ++++++++++++++++++ .../dev/reports/codex_changed_files.txt | 38 +++---------- docs_build/dev/reports/codex_review.diff | Bin 135982 -> 15694 bytes .../reports/coverage_changed_js_guardrail.txt | 4 -- .../reports/playwright_v8_coverage_report.txt | 22 +------- src/dev-runtime/server/local-api-router.mjs | 6 +- 8 files changed, 121 insertions(+), 56 deletions(-) create mode 100644 docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-instruction-compliance-checklist.md create mode 100644 docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-manual-validation-notes.md create mode 100644 docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup.md diff --git a/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-instruction-compliance-checklist.md b/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-instruction-compliance-checklist.md new file mode 100644 index 000000000..7e55465d3 --- /dev/null +++ b/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-instruction-compliance-checklist.md @@ -0,0 +1,35 @@ +# PR_26171_GAMMA_024 Instruction Compliance Checklist + +## Start Gate + +- PASS: Read `docs_build/dev/PROJECT_INSTRUCTIONS.md`. +- PASS: Read `docs_build/dev/PROJECT_MULTI_PC.txt`. +- PASS: PR name includes TEAM token `GAMMA`. +- PASS: Branch name mirrors TEAM token: `pr/26171-GAMMA-024-local-api-sqlite-reference-cleanup`. +- PASS: Started from `main`. +- PASS: Pulled latest `main`. +- PASS: Verified clean/synced `main` before branch creation. +- PASS: Verified PR #44 dependency head is in `main`. +- PASS: Verified PR #45 dependency head is in `main`. +- PASS: Implementation path is the active scoped Local API file: `src/dev-runtime/server/local-api-router.mjs`. + +## Scope Guard + +- PASS: One PR purpose only. +- PASS: Updated only scoped active files and required reports. +- PASS: Preserved Postgres-backed Messages routes. +- PASS: Preserved Postgres-backed Game Journey metrics routes. +- PASS: Did not pull or depend on PR #43 / `team/GAMMA/admin`. +- PASS: Did not touch archive/history references. +- PASS: Did not add feature work. +- PASS: Did not run samples. + +## Completion Gate + +- PASS: `docs_build/dev/reports/codex_review.diff` exists. +- PASS: `docs_build/dev/reports/codex_changed_files.txt` exists. +- PASS: PR-specific report exists. +- PASS: Manual validation notes exist. +- PASS: Instruction compliance checklist exists. +- PASS: Runtime JavaScript coverage notes were refreshed and included. +- PASS: Repo-structured ZIP path is documented: `tmp/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup_delta.zip`. diff --git a/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-manual-validation-notes.md b/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-manual-validation-notes.md new file mode 100644 index 000000000..162e58229 --- /dev/null +++ b/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-manual-validation-notes.md @@ -0,0 +1,19 @@ +# PR_26171_GAMMA_024 Manual Validation Notes + +Manual validation focused on the active Local API cleanup scope. + +## Notes + +- Confirmed `main` was clean/synced before branch creation. +- Confirmed PR #44 head commit `c62f16e49cfd5ae252f48ac9b9078a7f997a28c6` is in `main`. +- Confirmed PR #45 head commit `6f3c4d0b044eceb41dd207fe1e4786039e3f66ac` is in `main`. +- Confirmed the branch was created from fresh `main` and does not depend on open PR #43 / `team/GAMMA/admin`. +- Confirmed Local API still imports `createMessagesPostgresService` from `messages-postgres-service.mjs`. +- Confirmed Game Journey completion metrics still report Postgres through the targeted Playwright Local API route test. +- Confirmed no archive/history paths were changed. + +## Skipped Lanes + +- Samples: skipped because no sample files or sample runtime behavior changed. +- Full Playwright: skipped because the change is limited to Local API route metadata labels. +- Archive report rewrite: skipped because archive/history references are explicitly out of scope. diff --git a/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup.md b/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup.md new file mode 100644 index 000000000..d2c36baae --- /dev/null +++ b/docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup.md @@ -0,0 +1,53 @@ +# PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup + +TEAM ownership: GAMMA. + +## Scope + +Clean remaining Local API SQLite references after the Messages and Game Journey Postgres migrations landed in main. + +## Changes + +- Updated `src/dev-runtime/server/local-api-router.mjs`. +- Removed the remaining literal `SQLite` route metadata from Local API project workspace responses. +- Removed the stale `Local DB/SQLite metadata` promotion-planning label. +- Preserved the Postgres-backed Messages Local API route and response shapes. +- Preserved the Postgres-backed Game Journey completion metrics route and response shapes. +- Did not pull or depend on open PR #43 / `team/GAMMA/admin`. +- Did not touch archive/history references. + +## Validation + +Passed: +- `git diff --check` +- `node --check src/dev-runtime/server/local-api-router.mjs` +- `node --test --test-name-pattern "Messages Local API" tests/dev-runtime/DbSeedIntegrity.test.mjs` +- `npx playwright test tests/playwright/tools/GameJourneyTool.spec.mjs --config=codex_playwright_system_chrome.config.cjs --project=playwright -g "Game Journey Local API persists completion metrics to Postgres"` +- Inline Local API route check for `/api/project-workspace/projects`, verifying the cleaned `Local DB adapter` label and no `SQLite` text in that response. +- Targeted text check confirmed no `sqlite`, `messages-sqlite`, `createMessagesSqliteService`, `DatabaseSync`, `node:sqlite`, `messages.sqlite`, or `GAMEFOUNDRY_MESSAGES_SQLITE_PATH` match remains in `src/dev-runtime/server/local-api-router.mjs`. + +Observed outside scoped lane: +- A broad `node --test tests/dev-runtime/DbSeedIntegrity.test.mjs` run passed the Messages Local API case but failed two unrelated `/api/local-db/snapshot` seed/reseed cases. Those local-db snapshot cases are outside this cleanup scope and were not used as completion evidence. + +Skipped: +- Full samples smoke: no samples are in scope. +- Full Playwright suite: this PR only changes Local API route metadata labels and targeted route validation covered the touched surfaces. +- Archive/history cleanup: explicitly out of scope. + +## Reports + +- `docs_build/dev/reports/codex_review.diff` +- `docs_build/dev/reports/codex_changed_files.txt` +- `docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup.md` +- `docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-manual-validation-notes.md` +- `docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-instruction-compliance-checklist.md` +- `docs_build/dev/reports/playwright_v8_coverage_report.txt` +- `docs_build/dev/reports/coverage_changed_js_guardrail.txt` + +## ZIP + +`tmp/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup_delta.zip` + +## Merge Control + +Not merged. EOD merge remains owner-controlled and requires explicit approval. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index 9f07c7577..78783a10a 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,30 +1,8 @@ -## git status --short -A docs_build/dev/reports/PR_26171_ALPHA_023-game-journey-postgres-metrics-migration-data-preservation-notes.md -A docs_build/dev/reports/PR_26171_ALPHA_023-game-journey-postgres-metrics-migration-instruction-compliance-checklist.md -A docs_build/dev/reports/PR_26171_ALPHA_023-game-journey-postgres-metrics-migration-manual-validation-notes.md -A docs_build/dev/reports/PR_26171_ALPHA_023-game-journey-postgres-metrics-migration.md -M docs_build/dev/reports/coverage_changed_js_guardrail.txt -M docs_build/dev/reports/playwright_v8_coverage_report.txt -M src/dev-runtime/persistence/game-journey-completion-metrics-store.mjs -M src/dev-runtime/persistence/tool-repositories/game-journey-mock-repository.js -M src/dev-runtime/server/local-api-router.mjs -A tests/helpers/gameJourneyCompletionMetricsPostgresClientStub.mjs -M tests/helpers/playwrightRepoServer.mjs -M tests/playwright/tools/GameJourneyTool.spec.mjs - -## git diff --cached --stat - ...es-metrics-migration-data-preservation-notes.md | 19 ++ - ...s-migration-instruction-compliance-checklist.md | 16 + - ...es-metrics-migration-manual-validation-notes.md | 20 ++ - ..._023-game-journey-postgres-metrics-migration.md | 45 +++ - .../dev/reports/coverage_changed_js_guardrail.txt | 30 +- - .../dev/reports/playwright_v8_coverage_report.txt | 85 +---- - .../game-journey-completion-metrics-store.mjs | 369 ++++++++++++--------- - .../game-journey-mock-repository.js | 6 +- - src/dev-runtime/server/local-api-router.mjs | 41 ++- - ...eJourneyCompletionMetricsPostgresClientStub.mjs | 87 +++++ - tests/helpers/playwrightRepoServer.mjs | 11 +- - tests/playwright/tools/GameJourneyTool.spec.mjs | 108 ++++-- - 12 files changed, 518 insertions(+), 319 deletions(-) - -## git diff --stat +docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-instruction-compliance-checklist.md +docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup-manual-validation-notes.md +docs_build/dev/reports/PR_26171_GAMMA_024-local-api-sqlite-reference-cleanup.md +docs_build/dev/reports/codex_changed_files.txt +docs_build/dev/reports/codex_review.diff +docs_build/dev/reports/coverage_changed_js_guardrail.txt +docs_build/dev/reports/playwright_v8_coverage_report.txt +src/dev-runtime/server/local-api-router.mjs diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index 07d6bb81f19b025fed09c6b05672000ea49a1dd7..6544c848d9670050995e91abb056abf841d9c744 100644 GIT binary patch literal 15694 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 MH%+|<7^NBcA2UG{RsaA1 literal 135982 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 J|I``({{bvrptb-2 diff --git a/docs_build/dev/reports/coverage_changed_js_guardrail.txt b/docs_build/dev/reports/coverage_changed_js_guardrail.txt index aaedf0c8c..74a29674c 100644 --- a/docs_build/dev/reports/coverage_changed_js_guardrail.txt +++ b/docs_build/dev/reports/coverage_changed_js_guardrail.txt @@ -6,11 +6,7 @@ Missing changed runtime JS files are WARN, not FAIL. Source: Playwright/Chromium built-in V8 coverage from the active Playwright run. Changed runtime JS files considered: -(0%) src/dev-runtime/persistence/game-journey-completion-metrics-store.mjs - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only -(0%) src/dev-runtime/persistence/tool-repositories/game-journey-mock-repository.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only (0%) src/dev-runtime/server/local-api-router.mjs - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only Guardrail warnings: -(0%) src/dev-runtime/persistence/game-journey-completion-metrics-store.mjs - WARNING: changed runtime JS file missing from coverage; advisory only -(0%) src/dev-runtime/persistence/tool-repositories/game-journey-mock-repository.js - WARNING: changed runtime JS file missing from coverage; advisory only (0%) src/dev-runtime/server/local-api-router.mjs - WARNING: changed runtime JS file missing from coverage; advisory only diff --git a/docs_build/dev/reports/playwright_v8_coverage_report.txt b/docs_build/dev/reports/playwright_v8_coverage_report.txt index 750d7c7da..86cc56dfe 100644 --- a/docs_build/dev/reports/playwright_v8_coverage_report.txt +++ b/docs_build/dev/reports/playwright_v8_coverage_report.txt @@ -12,34 +12,18 @@ Note: entry percentages use function coverage when available, otherwise line cov Note: coverage entries are aggregated across every page/tool where coverageReporter.start(page) and coverageReporter.stop(page) ran. Exercised tool entry points detected: -(74%) Toolbox Index - exercised 3 runtime JS files +(0%) Toolbox Index - not exercised by this Playwright run (0%) Tool Template V2 - not exercised by this Playwright run -(63%) Theme V2 Shared JS - exercised 2 runtime JS files +(0%) Theme V2 Shared JS - not exercised by this Playwright run Changed runtime JS files covered: -(0%) src/dev-runtime/persistence/game-journey-completion-metrics-store.mjs - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only -(0%) src/dev-runtime/persistence/tool-repositories/game-journey-mock-repository.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only (0%) src/dev-runtime/server/local-api-router.mjs - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only Files with executed line/function counts where available: -(53%) src/api/server-api-client.js - executed lines 167/167; executed functions 10/19 -(63%) assets/theme-v2/js/gamefoundry-partials.js - executed lines 977/977; executed functions 54/86 -(64%) assets/theme-v2/js/tool-display-mode.js - executed lines 204/204; executed functions 9/14 -(65%) src/api/public-config-client.js - executed lines 209/209; executed functions 17/26 -(67%) src/api/game-journey-completion-api-client.js - executed lines 15/15; executed functions 2/3 -(74%) toolbox/game-journey/game-journey.js - executed lines 1652/1652; executed functions 110/149 -(76%) toolbox/tool-registry-api-client.js - executed lines 155/155; executed functions 22/29 -(100%) toolbox/game-journey/game-journey-api-client.js - executed lines 19/19; executed functions 2/2 +(100%) none - no covered runtime files Uncovered or low-coverage changed JS files: -(0%) src/dev-runtime/persistence/game-journey-completion-metrics-store.mjs - WARNING: uncovered changed runtime JS file; advisory only -(0%) src/dev-runtime/persistence/tool-repositories/game-journey-mock-repository.js - WARNING: uncovered changed runtime JS file; advisory only (0%) src/dev-runtime/server/local-api-router.mjs - WARNING: uncovered changed runtime JS file; advisory only Changed JS files considered: -(0%) src/dev-runtime/persistence/game-journey-completion-metrics-store.mjs - changed JS file not collected as browser runtime coverage -(0%) src/dev-runtime/persistence/tool-repositories/game-journey-mock-repository.js - changed JS file not collected as browser runtime coverage (0%) src/dev-runtime/server/local-api-router.mjs - changed JS file not collected as browser runtime coverage -(0%) tests/helpers/gameJourneyCompletionMetricsPostgresClientStub.mjs - changed JS file not collected as browser runtime coverage -(0%) tests/helpers/playwrightRepoServer.mjs - changed JS file not collected as browser runtime coverage -(0%) tests/playwright/tools/GameJourneyTool.spec.mjs - changed JS file not collected as browser runtime coverage diff --git a/src/dev-runtime/server/local-api-router.mjs b/src/dev-runtime/server/local-api-router.mjs index 0a4c82fca..314a35d03 100644 --- a/src/dev-runtime/server/local-api-router.mjs +++ b/src/dev-runtime/server/local-api-router.mjs @@ -2626,7 +2626,7 @@ class ApiRuntimeDataSource { return { action, database: "Local DB", - databaseEngine: "SQLite", + databaseEngine: "Local DB adapter", providerId: "local-api-project-workspace", serviceContract: "Web UI -> Local API/Service Contract -> Local DB", status: "PASS", @@ -3335,7 +3335,7 @@ class ApiRuntimeDataSource { safetyDiagnostic: "Read-only export planning only; no project records, asset references, or storage objects are changed.", safetyStatus: "PASS", status: "PLAN", - message: "Plan a read-only DEV export through Local API from Local DB/SQLite metadata, asset references, and configured project asset storage object keys.", + message: "Plan a read-only DEV export through Local API from project metadata, asset references, and configured project asset storage object keys.", }, { id: "ist-import-plan", @@ -3648,7 +3648,7 @@ LIMIT 1; : true, browserProductDataSsoT: false, database: "Local DB", - databaseEngine: "SQLite", + databaseEngine: "Local DB adapter", guestBrowsingAllowed: true, guestSavingAllowed: false, pageLocalProductDataArrays: false,