From 9f67776f896bd2237e08ab1dbe4113d175507679 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 23 Jun 2026 18:16:21 -0400 Subject: [PATCH] PR_26175_OWNER_042 github PR inventory audit --- ...175_OWNER_042-github-pr-inventory-audit.md | 133 ++++ .../dev/reports/codex_changed_files.txt | 10 +- docs_build/dev/reports/codex_review.diff | 586 +----------------- 3 files changed, 148 insertions(+), 581 deletions(-) create mode 100644 docs_build/dev/reports/PR_26175_OWNER_042-github-pr-inventory-audit.md diff --git a/docs_build/dev/reports/PR_26175_OWNER_042-github-pr-inventory-audit.md b/docs_build/dev/reports/PR_26175_OWNER_042-github-pr-inventory-audit.md new file mode 100644 index 000000000..182db445b --- /dev/null +++ b/docs_build/dev/reports/PR_26175_OWNER_042-github-pr-inventory-audit.md @@ -0,0 +1,133 @@ +# PR_26175_OWNER_042-github-pr-inventory-audit + +OWNER override approved: GitHub PR inventory audit only. + +## Summary + +GitHub PR inventory audit only. No runtime code, branch deletion, PR closure, or merge action was performed. GitHub API was used as authority for open PR state. + +- Repository: ToolboxAid/HTML-JavaScript-Gaming +- Source API: https://api.github.com/repos/ToolboxAid/HTML-JavaScript-Gaming/pulls?state=open&per_page=100&sort=created&direction=asc +- Open PRs found: 33 +- Open ready PRs: 3 +- Open draft PRs: 30 +- Classification counts: keep 2, merge-review 2, close-candidate 5, defer 21, needs-owner-decision 3 + +## Branch Validation + +| Check | Result | Evidence | +|---|---|---| +| Started from main | PASS | main and origin/main were synced at `6d94477bb0ae9f63dd1466dbb89e4a437b8749b0` before branch restart. | +| Current branch | PASS | `PR_26175_OWNER_042-github-pr-inventory-audit` | +| Expected branch | PASS | `PR_26175_OWNER_042-github-pr-inventory-audit` | +| Branch base commit | PASS | HEAD `6d94477bb0ae9f63dd1466dbb89e4a437b8749b0`; main `6d94477bb0ae9f63dd1466dbb89e4a437b8749b0`; origin/main `6d94477bb0ae9f63dd1466dbb89e4a437b8749b0` | +| Worktree before report generation | PASS | Clean after approved scratch cleanup and branch restart. | +| Local/origin sync before branch restart | PASS | main == origin/main at `6d94477bb0ae9f63dd1466dbb89e4a437b8749b0` | + +## Requirement Checklist + +| Requirement | Result | Notes | +|---|---|---| +| Audit GitHub PR list only | PASS | Used GitHub PR API; report-only output. | +| Use GitHub as authority | PASS | Source API listed above; no local branch guesses used for PR state. | +| List open PRs | PASS | 33 open PRs listed below. | +| List draft PRs | PASS | Draft status included per PR; 30 draft PRs found. | +| List branch names | PASS | Head branch included per PR. | +| List age | PASS | Age calculated from GitHub `created_at` as of 2026-06-23. | +| List title | PASS | Title included per PR. | +| List owner/team | PASS | Derived from PR naming and governance ownership model; ambiguous entries flagged. | +| List status | PASS | Status column shows open ready vs open draft. | +| Classify each PR | PASS | Classification column uses keep, merge-review, close-candidate, defer, or needs-owner-decision. | +| Identify dependency/order risks | PASS | See dependency/order risks section. | +| Identify stale branch cleanup candidates | PASS | See stale cleanup candidates section; recommendation-only. | +| Do not close PRs | PASS | No PR close action performed. | +| Do not delete branches | PASS | No branch deletion performed. | +| Do not merge PRs | PASS | No merge performed. | +| Do not modify runtime code | PASS | Only reports were generated. | +| Produce required reports | PASS | This report, `codex_review.diff`, and `codex_changed_files.txt` generated. | +| Create repo-structured ZIP under tmp/ | PASS | `tmp/PR_26175_OWNER_042-github-pr-inventory-audit_delta.zip` generated after report creation. | + +## Validation Lane Report + +| Lane | Result | Evidence | +|---|---|---| +| GitHub inventory | PASS | Fetched open PRs from GitHub API; 33 returned. | +| Scope validation | PASS | Generated reports only; no runtime code paths changed. | +| Branch validation | PASS | Expected branch and clean main sync confirmed before branch creation. | +| Diff whitespace validation | PASS | `git diff --check` completed successfully; Git emitted only a CRLF normalization warning for the generated diff file. | +| ZIP validation | PASS | `tmp/PR_26175_OWNER_042-github-pr-inventory-audit_delta.zip` created and verified to contain repo-structured `docs_build/dev/reports/...` entries. | + +## Open PR Inventory + +| PR | Title | Branch | Age | Owner/team | Status | Classification | Notes | +|---|---|---|---:|---|---|---|---| +| #3 | Pr/PR 26171 006 message emotion profile management | pr/PR_26171_006-message-emotion-profile-management | 4d 3h | Team Bravo | open ready | needs-owner-decision | Ownership, relevance, or supersession cannot be confirmed from PR list alone. | +| #26 | PR_26171_ALPHA_046 game hub table standard rebuild | pr/26171-ALPHA-046-game-hub-table-standard-rebuild | 3d 6h | Team Alfa | open ready | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #30 | PR_26171_GAMMA_006-sqlite-deprecation-audit | pr/26171-GAMMA-006-sqlite-deprecation-audit | 3d 5h | Team Charlie (legacy GAMMA/compliance) | open draft | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #41 | PR_26171_ALPHA_048 idea project journey execution flow | pr/26171-ALPHA-048-idea-project-journey-execution-flow | 3d 2h | Team Alfa | open ready | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #43 | PR_26171_GAMMA_021-sqlite-active-runtime-removal-plan | team/GAMMA/admin | 3d 1h | Team Charlie (legacy GAMMA/compliance) | open draft | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #50 | PR_26171_GAMMA_028-final-sqlite-clean-status-report | pr/26171-GAMMA-028-final-sqlite-clean-status-report | 2d 12h | Team Charlie (legacy GAMMA/compliance) | open draft | merge-review | Draft appears to be the latest summary/final report for its lane; owner merge review needed before any action. | +| #51 | PR_26172_MASTER_001-project-instructions-readme-and-root | pr/26172-MASTER-001-project-instructions-readme-and-root | 2d 11h | Team OWNER (legacy MASTER wording) | open draft | needs-owner-decision | Ownership, relevance, or supersession cannot be confirmed from PR list alone. | +| #85 | [codex] Add Project Instructions governance addendums | codex/canonical-repository-structure-instructions | 1d 12h | Needs owner/team decision | open draft | needs-owner-decision | Ownership, relevance, or supersession cannot be confirmed from PR list alone. | +| #96 | PR_26174_ALFA_002-game-hub-project-intake-display | pr/26174-ALFA-002-game-hub-project-intake-display | 1d 10h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #97 | PR_26174_ALFA_003-game-hub-journey-bootstrap | pr/26174-ALFA-003-game-hub-journey-bootstrap | 1d 10h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #98 | PR_26174_ALFA_004-game-hub-progress-count-model | pr/26174-ALFA-004-game-hub-progress-count-model | 1d 9h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #99 | PR_26174_ALFA_005-idea-project-validation-polish | pr/26174-ALFA-005-idea-project-validation-polish | 1d 7h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #100 | PR_26174_ALFA_006-game-hub-empty-and-error-states | pr/26174-ALFA-006-game-hub-empty-and-error-states | 1d 7h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #101 | PR_26174_ALFA_007-game-journey-count-ui-polish | pr/26174-ALFA-007-game-journey-count-ui-polish | 1d 7h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #102 | PR_26174_ALFA_008-alpha-stack-final-validation | pr/26174-ALFA-008-alpha-stack-final-validation | 1d 7h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #103 | PR_26174_ALFA_009-game-hub-parent-child-table-layout | pr/26174-ALFA-009-game-hub-parent-child-table-layout | 1d 6h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #104 | PR_26174_ALFA_010-game-hub-source-idea-child-table-polish | pr/26174-ALFA-010-game-hub-source-idea-child-table-polish | 1d 6h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #105 | PR_26174_ALFA_011-game-hub-readiness-output-child-table | pr/26174-ALFA-011-game-hub-readiness-output-child-table | 1d 6h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #106 | PR_26174_ALFA_012-game-hub-parent-child-final-validation | pr/26174-ALFA-012-game-hub-parent-child-final-validation | 1d 6h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #107 | PR_26174_ALFA_013-game-hub-game-row-child-rows | pr/26174-ALFA-013-game-hub-game-row-child-rows | 1d 6h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #108 | PR_26174_ALFA_014-game-hub-parent-columns-center | pr/26174-ALFA-014-game-hub-parent-columns-center | 1d 4h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #109 | PR_26174_ALFA_015-game-hub-actions-and-setup-cleanup | pr/26174-ALFA-015-game-hub-actions-and-setup-cleanup | 1d 4h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #110 | PR_26174_ALFA_016-game-hub-row-edit-add-selected-state | pr/26174-ALFA-016-game-hub-row-edit-add-selected-state | 1d 3h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #111 | PR_26174_ALFA_017-game-hub-guest-save-and-crew-cleanup | pr/26174-ALFA-017-game-hub-guest-save-and-crew-cleanup | 1d 3h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #112 | PR_26174_ALFA_018-game-selection-button-state | pr/26174-ALFA-018-game-selection-button-state | 1d 3h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #113 | PR_26174_ALFA_019-game-hub-selected-button-and-crew-label | pr/26174-ALFA-019-game-hub-selected-button-and-crew-label | 1d 2h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #114 | PR_26174_ALFA_020-game-hub-idea-board-cleanup | pr/26174-ALFA-020-game-hub-idea-board-cleanup | 1d 1h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #115 | PR_26174_ALFA_021-idea-board-status-filter-table-polish | pr/26174-ALFA-021-idea-board-status-filter-table-polish | 12h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #116 | PR_26174_ALFA_022-idea-board-status-dropdown-fix | pr/26174-ALFA-022-idea-board-status-dropdown-fix | 10h | Team Alfa | open draft | defer | Part of stacked ALFA workstream; defer until dependency order is owner-approved. | +| #117 | PR_26174_ALFA_EOD-workstream-closeout | pr/26174-ALFA-EOD-workstream-closeout | 10h | Team Alfa | open draft | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #118 | PR_26174_ALFA_EOD-final-closeout | pr/26174-ALFA-EOD-final-closeout | 10h | Team Alfa | open draft | merge-review | Draft appears to be the latest summary/final report for its lane; owner merge review needed before any action. | +| #120 | [codex] PR_26175_ALFA_003 toolbox status bar single row polish | codex/pr-26175-alfa-003-toolbox-status-bar-single-row-polish | 7h | Team Alfa | open draft | keep | Recent PR_26175 draft; keep active until owner reviews current lane. | +| #121 | [codex] PR_26175_ALFA_004 game hub completion status audit | codex/pr-26175-alfa-004-game-hub-completion-status-audit | 6h | Team Alfa | open draft | keep | Recent PR_26175 draft; keep active until owner reviews current lane. | + +## Dependency And Order Risks + +- ALFA PRs #96 through #116 are a stacked workstream. They should not be merged out of sequence without owner approval because later PR bodies explicitly reference prior branches or cumulative validation. +- #117 and #118 are EOD/final closeout reports for the ALFA stack. #118 appears to supersede #117 for final owner review, making #117 a close-candidate only after owner confirmation. +- Older ALFA PRs #26 and #41 overlap the later PR_26174 ALFA stack and should be reviewed for supersession before any merge decision. +- SQLite/GAMMA report PRs #30, #43, and #50 appear sequential. #50 is the likely final status report; #30 and #43 are close-candidates if owner confirms #50 contains the retained decision trail. +- Governance docs PRs #51 and #85 overlap ProjectInstructions material now present on main. They need an owner decision before merge or closure because instruction preservation rules prohibit silent deletion or weakening. +- #3 lacks a clear current team/stack relation from the PR list alone. Treat as needs-owner-decision before merge, closure, or branch cleanup. +- #120 and #121 are recent PR_26175 drafts. Keep active unless owner decides to merge-review, stack, or supersede them. + +## Stale Branch Cleanup Candidates + +Recommendation-only. No branch deletion was performed. + +| PR | Branch | Age signal | Classification | Reason | +|---|---|---|---|---| +| #3 | pr/PR_26171_006-message-emotion-profile-management | 4d 3h since update | needs-owner-decision | Ownership, relevance, or supersession cannot be confirmed from PR list alone. | +| #26 | pr/26171-ALPHA-046-game-hub-table-standard-rebuild | 3d 6h since update | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #30 | pr/26171-GAMMA-006-sqlite-deprecation-audit | 3d 5h since update | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #41 | pr/26171-ALPHA-048-idea-project-journey-execution-flow | 3d 2h since update | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #43 | team/GAMMA/admin | 3d 1h since update | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | +| #117 | pr/26174-ALFA-EOD-workstream-closeout | 10h since update | close-candidate | Appears superseded or overlapped by newer reports/stack entries; do not close without explicit owner decision. | + +## Manual Validation Notes + +- Manually verified the user-approved cleanup removed only prior generated scratch files before returning to main. +- Manually verified main was pulled with `--ff-only` and already up to date before branch restart. +- Manually verified the audit scope remained report-only. +- Manual owner review is still required before closing PRs, deleting branches, or merging any PR in this inventory. + +## Governance Notes + +- OWNER override is documented above. +- GitHub remains authoritative for PR state. +- This audit does not change active team assignments, backlog status, runtime code, or Project Instructions. +- Classification is advisory and intentionally conservative where supersession cannot be proven from the PR list alone. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index fb32c88ea..4a755d0ac 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,9 +1,3 @@ -assets/theme-v2/css/status.css -assets/theme-v2/js/toolbox-status-bar.js -docs_build/dev/BUILD_PR.md -docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_report.md -docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_validation-lane.md -docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_requirements-checklist.md -docs_build/dev/reports/codex_changed_files.txt docs_build/dev/reports/codex_review.diff -tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs +docs_build/dev/reports/codex_changed_files.txt +docs_build/dev/reports/PR_26175_OWNER_042-github-pr-inventory-audit.md diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index 10a76dad1..57ec2a3e4 100644 --- a/docs_build/dev/reports/codex_review.diff +++ b/docs_build/dev/reports/codex_review.diff @@ -1,576 +1,16 @@ -diff --git a/assets/theme-v2/css/status.css b/assets/theme-v2/css/status.css -index 5ea748263..88e0d5e64 100644 ---- a/assets/theme-v2/css/status.css -+++ b/assets/theme-v2/css/status.css -@@ -54,11 +54,19 @@ - - .toolbox-status-bar__game { - min-width: var(--space-0); -- display: grid; -- gap: var(--space-3); -+ display: flex; -+ align-items: center; -+ flex-wrap: wrap; -+ gap: var(--space-14); - text-align: left - } - -+.toolbox-status-bar__field { -+ min-width: var(--space-0); -+ display: grid; -+ gap: var(--space-3) -+} -+ - .toolbox-status-bar__label { - color: var(--muted); - font-size: var(--font-size-xs); -@@ -73,7 +81,7 @@ - overflow-wrap: anywhere - } - --.toolbox-status-bar__meta { -+.toolbox-status-bar__purpose { - color: var(--muted); - font-size: var(--font-size-sm); - overflow-wrap: anywhere -@@ -89,6 +97,10 @@ - text-align: center - } - -+.toolbox-status-bar__context-type { -+ flex: 0 0 auto -+} -+ - .toolbox-status-bar__message { - margin: var(--space-0); - max-width: var(--measure-lg); -@@ -104,13 +116,27 @@ - } - - .toolbox-status-bar[data-selected-game-state="missing"] { -- border-color: var(--gold-border-muted); -- background: var(--gold-soft) -+ border-color: var(--gold-border-muted) - } - - .toolbox-status-bar[data-selected-game-state="error"] { -- border-color: color-mix(in srgb, var(--red) 52%, var(--line)); -- background: color-mix(in srgb, var(--red) 14%, var(--panel)) -+ border-color: color-mix(in srgb, var(--red) 52%, var(--line)) -+} -+ -+.toolbox-status-bar[data-toolbox-status-context-kind="error"] .toolbox-status-bar__context-type { -+ border-color: color-mix(in srgb, var(--red) 62%, var(--line)); -+ color: var(--red) -+} -+ -+.toolbox-status-bar[data-toolbox-status-context-kind="warning"] .toolbox-status-bar__context-type, -+.toolbox-status-bar[data-toolbox-status-context-kind="validation"] .toolbox-status-bar__context-type { -+ border-color: var(--gold-border-muted); -+ color: var(--gold) -+} -+ -+.toolbox-status-bar[data-toolbox-status-context-kind="save"] .toolbox-status-bar__context-type { -+ border-color: color-mix(in srgb, var(--green) 62%, var(--line)); -+ color: var(--green) - } - - body.tool-focus-mode .toolbox-status-bar { -@@ -240,6 +266,7 @@ body.tool-focus-mode .toolbox-status-bar { - } - - .toolbox-status-bar__game { -+ justify-content: center; - text-align: center - } - } -diff --git a/assets/theme-v2/js/toolbox-status-bar.js b/assets/theme-v2/js/toolbox-status-bar.js -index 5a611d33d..fdb367328 100644 ---- a/assets/theme-v2/js/toolbox-status-bar.js -+++ b/assets/theme-v2/js/toolbox-status-bar.js -@@ -7,6 +7,7 @@ let repository = null; - let messageObserver = null; - let listenersInstalled = false; - let latestToolMessage = ""; -+let pendingToolMessageRefresh = 0; - let mountOptions = { - gameHubHref: "toolbox/game-hub/index.html", - pagePath: "", -@@ -89,16 +90,29 @@ function createStatusBar() { - game.className = "toolbox-status-bar__game"; - game.dataset.toolboxSelectedGame = ""; - -- const label = createText("span", "toolbox-status-bar__label", "toolboxSelectedGameLabel"); -- label.textContent = "Selected Game"; -+ const nameField = document.createElement("div"); -+ nameField.className = "toolbox-status-bar__field"; -+ nameField.dataset.toolboxSelectedGameNameField = ""; -+ const nameLabel = createText("span", "toolbox-status-bar__label", "toolboxSelectedGameNameLabel"); -+ nameLabel.textContent = "Selected Game Name"; - const name = createText("strong", "toolbox-status-bar__game-name", "toolboxSelectedGameName"); -- const meta = createText("span", "toolbox-status-bar__meta", "toolboxSelectedGameMeta"); -- game.append(label, name, meta); -+ nameField.append(nameLabel, name); -+ -+ const purposeField = document.createElement("div"); -+ purposeField.className = "toolbox-status-bar__field"; -+ purposeField.dataset.toolboxSelectedGamePurposeField = ""; -+ const purposeLabel = createText("span", "toolbox-status-bar__label", "toolboxSelectedGamePurposeLabel"); -+ purposeLabel.textContent = "Selected Game Purpose"; -+ const purpose = createText("span", "toolbox-status-bar__purpose", "toolboxSelectedGamePurpose"); -+ purpose.dataset.toolboxSelectedGameMeta = ""; -+ purposeField.append(purposeLabel, purpose); -+ game.append(nameField, purposeField); - - const center = document.createElement("div"); - center.className = "toolbox-status-bar__center"; - center.dataset.toolboxStatusCenter = ""; - -+ const contextType = createText("span", "pill toolbox-status-bar__context-type", "toolboxStatusContextType"); - const message = createText("p", "toolbox-status-bar__message status", "toolboxStatusMessage"); - message.setAttribute("role", "status"); - const action = document.createElement("a"); -@@ -106,7 +120,7 @@ function createStatusBar() { - action.dataset.toolboxStatusAction = ""; - action.href = mountOptions.gameHubHref; - action.textContent = "Open Game Hub"; -- center.append(message, action); -+ center.append(contextType, message, action); - - inner.append(game, center); - bar.append(inner); -@@ -172,6 +186,12 @@ function updateLatestToolMessage() { - } - } - -+function scheduleToolMessageRefresh() { -+ window.clearTimeout(pendingToolMessageRefresh); -+ pendingToolMessageRefresh = window.setTimeout(updateLatestToolMessage, 0); -+ window.setTimeout(updateLatestToolMessage, 120); -+} -+ - function observeToolMessages() { - messageObserver?.disconnect(); - const main = document.querySelector("main"); -@@ -211,51 +231,76 @@ function publishSelectedGameContext(selectedGame, state) { - })); - } - --function selectedGameMeta(selectedGame) { -- return [selectedGame.purpose, selectedGame.status] -- .map((value) => String(value || "").trim()) -- .filter(Boolean) -- .join(" - "); -+function classifyToolContext(messageText, state, required) { -+ const text = String(messageText || "").trim(); -+ if (state === "error") { -+ return { kind: "error", label: "Error" }; -+ } -+ if (required && state === "missing") { -+ return { kind: "action", label: "Tool Action" }; -+ } -+ if (/\b(error|failed|malformed|unavailable|could not)\b/i.test(text)) { -+ return { kind: "error", label: "Error" }; -+ } -+ if (/\b(sign in|refresh|try again|temporarily|blocked)\b/i.test(text)) { -+ return { kind: "warning", label: "Warning" }; -+ } -+ if (/\b(validation|requirement|requirements|missing|required|open or seed)\b/i.test(text)) { -+ return { kind: "validation", label: "Validation" }; -+ } -+ if (/\b(saved|created|deleted|updated|loaded|save changes)\b/i.test(text)) { -+ return { kind: "save", label: "Save State" }; -+ } -+ return { kind: "action", label: "Tool Action" }; - } - - function renderSelectedGame(bar, selectedGame, state, messageText) { - const required = pageRequiresSelectedGame(); - const name = bar.querySelector("[data-toolbox-selected-game-name]"); -- const meta = bar.querySelector("[data-toolbox-selected-game-meta]"); -+ const purpose = bar.querySelector("[data-toolbox-selected-game-purpose]"); -+ const contextType = bar.querySelector("[data-toolbox-status-context-type]"); - const message = bar.querySelector("[data-toolbox-status-message]"); - const action = bar.querySelector("[data-toolbox-status-action]"); -+ const nextMessage = messageText || latestToolMessage || (selectedGame -+ ? `Tool context is filtered to ${selectedGame.name}.` -+ : required -+ ? "Select or create a game in Game Hub before using this toolbox page." -+ : "Idea Board can capture ideas before a Game Hub game exists."); -+ const context = classifyToolContext(nextMessage, state, required); - - bar.dataset.selectedGameState = state; - bar.dataset.selectedGameRequired = String(required); -+ bar.dataset.toolboxStatusContextKind = context.kind; -+ contextType.textContent = context.label; - action.hidden = false; - action.href = mountOptions.gameHubHref; - - if (selectedGame) { - name.textContent = selectedGame.name; -- meta.textContent = selectedGameMeta(selectedGame) || "Game Hub selected game"; -- message.textContent = messageText || latestToolMessage || `Data filtered to ${selectedGame.name}.`; -+ purpose.textContent = selectedGame.purpose || "Game"; -+ message.textContent = nextMessage; - action.textContent = "Open Game Hub"; - return; - } - - if (!required) { -- name.textContent = "Optional"; -- meta.textContent = "Idea Board can start before Game Hub creation"; -- message.textContent = latestToolMessage || "Idea Board can capture ideas before a Game Hub game exists."; -+ name.textContent = "No game selected"; -+ purpose.textContent = "Idea Board optional"; -+ message.textContent = nextMessage; - action.textContent = "Open Game Hub"; - return; - } - - if (state === "error") { - name.textContent = "Unavailable"; -- meta.textContent = "Game Hub selected game could not be read"; -- message.textContent = messageText || "Game Hub selected game is unavailable. Refresh or restore the Local API."; -+ purpose.textContent = "Game Hub selected game could not be read"; -+ message.textContent = nextMessage; - action.textContent = "Open Game Hub"; - return; - } - - name.textContent = "No game selected"; -- meta.textContent = "Game Hub owns game selection"; -+ purpose.textContent = "Game Hub owns game selection"; - message.textContent = "Select or create a game in Game Hub before using this toolbox page."; - action.textContent = "Select or Create in Game Hub"; - } -@@ -284,6 +329,9 @@ function installEventListeners() { - return; - } - listenersInstalled = true; -+ document.addEventListener("click", scheduleToolMessageRefresh, true); -+ document.addEventListener("submit", scheduleToolMessageRefresh, true); -+ document.addEventListener("change", scheduleToolMessageRefresh, true); - window.addEventListener("gamefoundry:toolbox-selected-game-changed", refreshToolboxStatusBar); - window.addEventListener("gamefoundry:data-changed", refreshToolboxStatusBar); - } -diff --git a/docs_build/dev/BUILD_PR.md b/docs_build/dev/BUILD_PR.md -index 51d6abdeb..65c4d9709 100644 ---- a/docs_build/dev/BUILD_PR.md -+++ b/docs_build/dev/BUILD_PR.md -@@ -1,41 +1,42 @@ --# PR_26175_ALFA_001-toolbox-selected-game-status-bar -+# PR_26175_ALFA_002-toolbox-status-bar-context-polish - - ## Purpose --Add one shared Theme V2 toolbox status bar that surfaces the Game Hub selected game and current tool messages across toolbox pages. -+Polish the shared toolbox status bar context display so it shows only selected-game name/purpose on the left and categorized tool context in the center. - - ## Source Of Truth --This `BUILD_PR.md` is the source of truth for `PR_26175_ALFA_001-toolbox-selected-game-status-bar`. -+This `BUILD_PR.md` is the source of truth for `PR_26175_ALFA_002-toolbox-status-bar-context-polish`. - - ## Exact Scope --- Add a shared toolbox status bar renderer loaded through Theme V2 shared partial bootstrapping. --- Render the status bar above the footer in normal page mode. --- Anchor the status bar to the viewport bottom while `body.tool-focus-mode` is active. --- Read the selected game only from the Game Hub repository through the existing Local API/service contract. --- Display the selected Game Hub game on the left side of the status bar. --- Display tool actions, warnings, errors, save state, validation messages, or the missing-game prompt in the center of the status bar. --- Expose the selected Game Hub game as derived page context for toolbox pages without persisting browser-owned product data. --- Require selected-game context on toolbox pages except Idea Board, which remains excluded because ideas can exist before game creation. --- Show a creator-safe prompt to select or create a game in Game Hub when no selected game exists. --- Notify the shared status bar when Game Hub changes the selected game. --- Add targeted Playwright coverage for placement, fullscreen anchoring, selected-game display/update, missing-game prompt, and Idea Board exclusion. -+- Do not include environment text in the status bar because environment already appears in the platform banner. -+- On the left side, display the selected Game Hub game name and selected Game Hub game purpose. -+- On the center side, display tool context messages for tool actions, save state, validation messages, warnings, or errors. -+- Preserve normal placement above the footer. -+- Preserve fullscreen/tool display mode bottom anchoring. -+- Preserve Idea Board selected-game filtering exclusion. -+- Preserve Game Hub as selected-game owner through the existing repository contract. -+- Keep the shared Theme V2 toolbox component model. -+- Update targeted Playwright coverage for the polished left and center context. - - ## Exact Targets --- `assets/theme-v2/js/gamefoundry-partials.js` -+- `docs_build/dev/BUILD_PR.md` - - `assets/theme-v2/js/toolbox-status-bar.js` - - `assets/theme-v2/css/status.css` --- `toolbox/game-hub/game-hub.js` - - `tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs` --- `docs_build/dev/reports/PR_26175_ALFA_001-toolbox-selected-game-status-bar_report.md` --- `docs_build/dev/reports/PR_26175_ALFA_001-toolbox-selected-game-status-bar_validation-lane.md` --- `docs_build/dev/reports/PR_26175_ALFA_001-toolbox-selected-game-status-bar_requirements-checklist.md` -+- `docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_report.md` -+- `docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_validation-lane.md` -+- `docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_requirements-checklist.md` -+- `docs_build/dev/reports/codex_review.diff` -+- `docs_build/dev/reports/codex_changed_files.txt` - - ## Out Of Scope -+- No environment status in the toolbox status bar. -+- No row highlights. -+- No large banners. -+- No modal-style status messages. -+- No inline styles, style blocks, or page-local CSS. -+- No API/service contract changes. - - No engine core changes. - - No `start_of_day` folder changes. --- No API/service contract changes. --- No page-local CSS, inline styles, or style blocks. --- No browser storage or browser-owned product data as selected-game source of truth. --- No Idea Board selected-game filtering. - - ## Validation - Run: -@@ -47,12 +48,12 @@ npx playwright test tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs - Also verify the changed source does not introduce inline styles or style blocks: - - ```powershell --rg -n " { -+ await route.fulfill({ -+ contentType: "application/json", -+ body: JSON.stringify({ -+ data: { -+ authenticated: true, -+ displayName: options.session.displayName || "User 1", -+ roleSlugs: options.session.roleSlugs || ["creator"], -+ userKey, -+ }, -+ ok: true, -+ }), -+ }); -+ }); -+ await page.request.post(`${server.baseUrl}/api/session/user`, { -+ data: { userKey }, -+ }); -+ } - - await workspaceV2CoverageReporter.start(page); - await page.goto(`${server.baseUrl}${pathName}`, { waitUntil: "networkidle" }); -@@ -84,6 +105,14 @@ function expectNoPageFailures(failures) { - expect(failures.consoleErrors).toEqual([]); - } - -+function creatorSession() { -+ return { -+ displayName: "User 1", -+ roleSlugs: ["creator"], -+ userKey: MOCK_DB_KEYS.users.user1, -+ }; -+} -+ - async function statusBarSnapshot(page) { - return page.locator("[data-toolbox-status-bar]").evaluate((bar) => { - const footer = document.querySelector("footer.footer"); -@@ -111,8 +140,13 @@ test("shared toolbox status bar shows selected Game Hub game above the footer", - const statusBar = page.locator("[data-toolbox-status-bar]"); - await expect(statusBar).toBeVisible(); - await expect(page.locator("style, [style], script:not([src])")).toHaveCount(0); -+ await expect(statusBar).not.toContainText("Environment"); -+ await expect(statusBar.locator("[data-toolbox-selected-game-name-label]")).toHaveText("Selected Game Name"); - await expect(statusBar.locator("[data-toolbox-selected-game-name]")).toHaveText("Demo Game"); -- await expect(statusBar.locator("[data-toolbox-selected-game-meta]")).toHaveText("Game - Under Construction"); -+ await expect(statusBar.locator("[data-toolbox-selected-game-purpose-label]")).toHaveText("Selected Game Purpose"); -+ await expect(statusBar.locator("[data-toolbox-selected-game-purpose]")).toHaveText("Game"); -+ await expect(statusBar.locator("[data-toolbox-selected-game]")).not.toContainText("Under Construction"); -+ await expect(statusBar.locator("[data-toolbox-status-context-type]")).toHaveText("Tool Action"); - await expect(statusBar.locator("[data-toolbox-status-message]")).toContainText("Game Design mock repository ready."); - await expect(page.locator("body")).toHaveAttribute("data-toolbox-selected-game-id", "demo-game"); - await expect(page.locator("body")).toHaveAttribute("data-toolbox-selected-game-filter", "active"); -@@ -130,6 +164,29 @@ test("shared toolbox status bar shows selected Game Hub game above the footer", - } - }); - -+test("shared toolbox status bar center reports save state after Game Hub saves", async ({ page }) => { -+ const failures = await openRepoPage(page, "/toolbox/game-hub/index.html", { session: creatorSession() }); -+ -+ try { -+ await page.getByRole("button", { name: "Add Game" }).click(); -+ const addGameRow = page.locator("[data-game-add-row='input']"); -+ await addGameRow.getByLabel("Game").fill("Status Bar Save"); -+ await addGameRow.getByLabel("Purpose").selectOption("Learning Game"); -+ await addGameRow.getByLabel("Status").selectOption("Ready for Testing"); -+ await addGameRow.getByRole("button", { name: "Save" }).click(); -+ -+ await expect(page.locator("[data-toolbox-status-context-type]")).toHaveText("Save State"); -+ await expect(page.locator("[data-toolbox-status-message]")).toHaveText("Created and opened Status Bar Save."); -+ await expect(page.locator("[data-toolbox-selected-game-name]")).toHaveText("Status Bar Save"); -+ await expect(page.locator("[data-toolbox-selected-game-purpose]")).toHaveText("Learning Game"); -+ await expect(page.locator("[data-toolbox-status-bar]")).not.toContainText("Environment"); -+ -+ expectNoPageFailures(failures); -+ } finally { -+ await failures.server.close(); -+ } -+}); -+ - test("shared toolbox status bar anchors to the bottom in tool display mode", async ({ page }) => { - const failures = await openRepoPage(page, "/toolbox/game-design/index.html"); - -@@ -156,9 +213,11 @@ test("Game Hub owner selection updates the global toolbox status bar", async ({ - await expect(page.locator("[data-toolbox-selected-game-name]")).toHaveText("Demo Game"); - await page.locator("[data-game-toggle='gravity-demo']").click(); - await expect(page.locator("[data-toolbox-selected-game-name]")).toHaveText("Gravity Demo"); -- await expect(page.locator("[data-toolbox-selected-game-meta]")).toHaveText("Capability Demo - Wireframe"); -+ await expect(page.locator("[data-toolbox-selected-game-purpose]")).toHaveText("Capability Demo"); -+ await expect(page.locator("[data-toolbox-selected-game]")).not.toContainText("Wireframe"); - await expect(page.locator("body")).toHaveAttribute("data-toolbox-selected-game-id", "gravity-demo"); - await expect(page.locator("body")).toHaveAttribute("data-toolbox-selected-game-filter", "active"); -+ await expect(page.locator("[data-toolbox-status-context-type]")).toHaveText("Warning"); - await expect(page.locator("[data-toolbox-status-message]")).toContainText("Sign in to create or update Game Hub projects."); - - expectNoPageFailures(failures); -@@ -173,6 +232,8 @@ test("non-Idea Board toolbox pages show a creator-safe prompt when no Game Hub g - try { - const statusBar = page.locator("[data-toolbox-status-bar]"); - await expect(statusBar.locator("[data-toolbox-selected-game-name]")).toHaveText("No game selected"); -+ await expect(statusBar.locator("[data-toolbox-selected-game-purpose]")).toHaveText("Game Hub owns game selection"); -+ await expect(statusBar.locator("[data-toolbox-status-context-type]")).toHaveText("Tool Action"); - await expect(statusBar.locator("[data-toolbox-status-message]")).toHaveText("Select or create a game in Game Hub before using this toolbox page."); - await expect(statusBar.locator("[data-toolbox-status-action]")).toHaveText("Select or Create in Game Hub"); - await expect(statusBar.locator("[data-toolbox-status-action]")).toHaveAttribute("href", /toolbox\/game-hub\/index\.html$/); -@@ -195,8 +256,9 @@ test("Idea Board is excluded from selected-game filtering and does not show the - try { - const statusBar = page.locator("[data-toolbox-status-bar]"); - await expect(statusBar).toBeVisible(); -- await expect(statusBar.locator("[data-toolbox-selected-game-name]")).toHaveText("Optional"); -- await expect(statusBar.locator("[data-toolbox-selected-game-meta]")).toHaveText("Idea Board can start before Game Hub creation"); -+ await expect(statusBar.locator("[data-toolbox-selected-game-name]")).toHaveText("No game selected"); -+ await expect(statusBar.locator("[data-toolbox-selected-game-purpose]")).toHaveText("Idea Board optional"); -+ await expect(statusBar.locator("[data-toolbox-status-context-type]")).toHaveText("Tool Action"); - await expect(statusBar.locator("[data-toolbox-status-message]")).toContainText("Ready to shape ideas and notes."); - await expect(statusBar.locator("[data-toolbox-status-message]")).not.toContainText("Select or create a game"); - await expect(page.locator("body")).toHaveAttribute("data-toolbox-selected-game-filter", "optional"); +@@ -1,9 +1,3 @@ +-assets/theme-v2/css/status.css +-assets/theme-v2/js/toolbox-status-bar.js +-docs_build/dev/BUILD_PR.md +-docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_report.md +-docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_validation-lane.md +-docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_requirements-checklist.md +-docs_build/dev/reports/codex_changed_files.txt + docs_build/dev/reports/codex_review.diff +-tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs ++docs_build/dev/reports/codex_changed_files.txt ++docs_build/dev/reports/PR_26175_OWNER_042-github-pr-inventory-audit.md