From 78d8b0aa0b0a7877c6a73ba1754c99b026ee57ca Mon Sep 17 00:00:00 2001 From: Delta Team Date: Wed, 24 Jun 2026 13:38:07 -0400 Subject: [PATCH] PR_26175_ALFA_018: consolidate Alfa Idea Board polish runtime changes --- assets/toolbox/idea-board/js/index.js | 6 +- ...18-alfa-idea-board-polish-consolidation.md | 60 +++ .../dev/reports/codex_changed_files.txt | 33 +- docs_build/dev/reports/codex_review.diff | 380 +----------------- .../tools/IdeaBoardTableNotes.spec.mjs | 16 + 5 files changed, 87 insertions(+), 408 deletions(-) create mode 100644 docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.md diff --git a/assets/toolbox/idea-board/js/index.js b/assets/toolbox/idea-board/js/index.js index 47a5ed91e..25607bc8d 100644 --- a/assets/toolbox/idea-board/js/index.js +++ b/assets/toolbox/idea-board/js/index.js @@ -129,6 +129,10 @@ function previousStatusForRestore(record) { : "Refining"; } +function isEditableStatus(status) { + return editableStatusOptions.includes(status); +} + function rememberPreviousStatus(record) { if (record.status !== "Archived") { record.previousStatus = record.status; @@ -436,7 +440,7 @@ function saveIdeaRow(root, row) { const idea = row.querySelector("[data-idea-board-idea-input]")?.value.trim(); const pitch = row.querySelector("[data-idea-board-pitch-input]")?.value.trim(); const status = row.querySelector("[data-idea-board-idea-status-input]")?.value; - if (!idea || !pitch || !status) { + if (!idea || !pitch || !isEditableStatus(status)) { updateStatus(root, "Enter an idea, pitch, and status before saving."); return; } diff --git a/docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.md b/docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.md new file mode 100644 index 000000000..dc24d4ee4 --- /dev/null +++ b/docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.md @@ -0,0 +1,60 @@ +# PR_26175_ALFA_018 - Alfa Idea Board Polish Consolidation + +## Executive Summary + +PASS - Consolidated the remaining current-main-safe Alfa Batch D Idea Board status dropdown guard. + +Current `main` already contained the #114, #115, and #116 structural work: the status filter is in the left accordion, the Idea Board parent table no longer has the Updated column, idea labels wrap, editable status dropdowns list only `New`, `Exploring`, `Refining`, and `Ready`, and status filters list `New`, `Exploring`, `Refining`, `Ready`, `Project`, and `Archived`. + +This PR adds a runtime save guard so stale or injected editable dropdown values cannot persist non-editable statuses such as `Project` or `Archived`. + +## Runtime Files Changed + +| File | Change | +| --- | --- | +| `assets/toolbox/idea-board/js/index.js` | Adds an editable-status validation helper and rejects add/edit saves when the submitted status is not one of the editable statuses. | +| `tests/playwright/tools/IdeaBoardTableNotes.spec.mjs` | Adds focused coverage that injects a stale `Project` option into the editable row and verifies it cannot create an Idea Board row. | + +## Source PR Coverage + +| Source PR | Batch D Area | Current-Main Resolution | +| --- | --- | --- | +| #114 | Idea Board cleanup | Already present on current main; Game Hub changes were not touched. | +| #115 | Status filter table polish | Already present on current main; no Updated column, wrapped idea labels, themed status filters. | +| #116 | Editable status dropdown fix | Present and hardened by this PR with save-path validation. | + +## Requirement Checklist + +| Requirement | Status | Notes | +| --- | --- | --- | +| Start from `main` | PASS | `main` was checked, pulled, clean, and synced before branch creation. | +| Hard stop if branch/worktree/sync invalid | PASS | Branch `main`, clean worktree, local/origin sync `0 0` confirmed after pull. | +| Read all Project Instructions | PASS | All files under `docs_build/dev/ProjectInstructions/` were read before edits. | +| Implement current-main-safe Batch D runtime changes | PASS | Added runtime validation for editable-only Idea Board statuses. | +| Editable statuses limited to New/Exploring/Refining/Ready | PASS | UI already did this; save path now enforces it. | +| Filter statuses include Project and Archived | PASS | Existing filter behavior preserved. | +| Preserve Game Hub changes | PASS | No Game Hub files changed. | +| Do not change status bar work | PASS | Status bar diff check was empty. | +| Do not install Chromium | PASS | Chromium was not installed. | +| Required reports and ZIP | PASS | Reports generated and delta ZIP created under `tmp/`. | + +## Validation Lane + +| Command | Status | Result | +| --- | --- | --- | +| `node --check assets/toolbox/idea-board/js/index.js` | PASS | JavaScript syntax valid. | +| `node --check tests/playwright/tools/IdeaBoardTableNotes.spec.mjs` | PASS | Test file syntax valid. | +| `git diff --check -- assets/toolbox/idea-board/js/index.js tests/playwright/tools/IdeaBoardTableNotes.spec.mjs` | PASS | Exit code 0; Git emitted a non-blocking CRLF warning for the test file. | +| `git diff -- toolbox/game-hub/game-hub.js toolbox/game-hub/index.html assets/theme-v2/css/status.css assets/theme-v2/js/toolbox-status-bar.js tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs` | PASS | Empty diff; Game Hub and status bar work untouched. | +| `npx playwright test tests/playwright/tools/IdeaBoardTableNotes.spec.mjs --workers=1 --reporter=line --timeout=30000` | BLOCKED | Browser executable missing at `C:\Users\davidq\AppData\Local\ms-playwright\chromium-1217\chrome-win64\chrome.exe`; Chromium was not installed per instruction. | + +## Manual Validation Notes + +- Compared GitHub PR #114, #115, and #116 metadata and patches against current main. +- Confirmed the historical `toolbox/idea-board/index.js` path has moved on current main to `assets/toolbox/idea-board/js/index.js`. +- Confirmed current main already preserves the Batch D status filter/table/dropdown shape. +- Confirmed this PR does not modify `toolbox/game-hub/*`, `assets/theme-v2/css/status.css`, `assets/theme-v2/js/toolbox-status-bar.js`, or status bar Playwright coverage. + +## Branch Validation + +PASS - Work began from clean, synced `main`; implementation was made on `PR_26175_ALFA_018-alfa-idea-board-polish-consolidation`. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index 6ec0304a3..96fb4553c 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,28 +1,5 @@ -# git status --short -M docs_build/dev/PROJECT_INSTRUCTIONS.md -M docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md -M docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md -M docs_build/dev/ProjectInstructions/addendums/multi_team.md -M docs_build/dev/ProjectInstructions/addendums/pr_workflow.md -M docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md -M docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md -M docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md -A docs_build/dev/reports/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance.md - -# git ls-files --others --exclude-standard - - -# git diff --stat - - -# git diff --cached --stat - docs_build/dev/PROJECT_INSTRUCTIONS.md | 61 ++++++++++++++ - .../addendums/branch_context_governance.md | 14 ++++ - .../addendums/branch_lock_governance.md | 4 + - .../ProjectInstructions/addendums/multi_team.md | 19 +++++ - .../ProjectInstructions/addendums/pr_workflow.md | 59 ++++++++++--- - .../addendums/team_release_readiness.md | 3 + - .../addendums/team_start_and_release.md | 24 +++++- - .../team_assignments/TEAM_ASSIGNMENTS.md | 6 ++ - ...048-pr-open-to-closed-main-return-governance.md | 97 ++++++++++++++++++++++ - 9 files changed, 273 insertions(+), 14 deletions(-) +assets/toolbox/idea-board/js/index.js +docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.md +docs_build/dev/reports/codex_changed_files.txt +docs_build/dev/reports/codex_review.diff +tests/playwright/tools/IdeaBoardTableNotes.spec.mjs diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index 25ac7f943..5b11b9157 100644 --- a/docs_build/dev/reports/codex_review.diff +++ b/docs_build/dev/reports/codex_review.diff @@ -1,379 +1 @@ -diff --git a/docs_build/dev/PROJECT_INSTRUCTIONS.md b/docs_build/dev/PROJECT_INSTRUCTIONS.md -index 588db96d3..ad63e3ad2 100644 ---- a/docs_build/dev/PROJECT_INSTRUCTIONS.md -+++ b/docs_build/dev/PROJECT_INSTRUCTIONS.md -@@ -7,0 +8,5 @@ PLAN_PR → BUILD_PR → APPLY_PR -+PR lifecycle gate: -+PR Open → Building → Validation → Approved → Merged → Main Verified → Closed -+ -+The PLAN_PR → BUILD_PR → APPLY_PR workflow remains preserved. PR Open is the first lifecycle status for active work, and Closed is the final repository-state gate. -+ -@@ -46,0 +52,54 @@ Rules: -+## PR LIFECYCLE STATE GATE -+ -+Required state order: -+ -+1. PR Open -+2. Building -+3. Validation -+4. Approved -+5. Merged -+6. Main Verified -+7. Closed -+ -+Definitions: -+- PR Open is the first active lifecycle state. -+- PR Open means the PR or branch has been created and named, and the work has a tracked PR identity before implementation begins. -+- No BUILD_PR may proceed without a PR name and active branch/PR identity unless it is explicitly marked `PLAN_ONLY`. -+- Building means scoped implementation, audit, report, validation, governance, or cleanup work is in progress for that PR identity. -+- Validation means requested checks, required report creation, manual validation notes, and ZIP packaging are being completed. -+- Approved means the owner or required reviewer has approved the PR outcome or intentionally approved closure without merge. -+- Merged means the PR has merged or has been intentionally closed without merge with the reason recorded. -+- Main Verified means Codex is back on `main`, `main` includes the merge commit or recorded final commit, the worktree is clean, local/origin sync is `0/0`, and no untracked files remain. -+- Closed means every Closed gate below is PASS. -+ -+Closed is valid only when all are PASS: -+- PR merged or intentionally closed without merge with reason recorded. -+- Changes pushed. -+- Current branch is `main`. -+- `main` includes the merge commit or recorded final commit. -+- Worktree clean. -+- Local/origin sync is `0/0`. -+- No untracked files. -+- Branch disposition recorded as `deleted`, `retained for follow-up`, or `archived`. -+- Required reports exist. -+- Required repo-structured ZIP under `tmp/` exists. -+ -+Hard stop: -+- A team must not begin another PR if its previous PR is not Closed. -+- Exception is allowed only for explicitly documented stacked PR chains. -+ -+Required final closeout output: -+ -+```text -+FINAL REPOSITORY STATE: -+- Branch -+- Worktree -+- Local/origin sync -+- PR number/name -+- PR status -+- Merge/final commit -+- Branch disposition -+- ZIP path -+- Closeout PASS/FAIL -+``` -+ -@@ -1664,0 +1724,2 @@ Codex must not package partially completed PRs. -+PR completion is not the same as Closed. Closed requires the final repository-state gate from `PR LIFECYCLE STATE GATE`. -+ -diff --git a/docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md b/docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md -index 9baa13442..f1eac45dd 100644 ---- a/docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md -+++ b/docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md -@@ -20,0 +21,2 @@ At the start of work, report or validate: -+- active PR number/name or explicit `PLAN_ONLY` -+- previous PR Closed status unless this is an explicitly documented stacked PR chain -@@ -30,0 +33,2 @@ Stop and report before changing files when: -+- BUILD_PR work has no PR name and active branch/PR identity, unless explicitly marked `PLAN_ONLY` -+- the team's previous PR is not Closed and no stacked PR chain is documented -@@ -47,0 +52,10 @@ Return to `main` only after the PR is merged, the branch is retired, or OWNER ex -+Returning to `main` is required before Closed can be recorded. -+ -+Closed branch context requires: -+- current branch is `main` -+- `main` includes the merge commit or recorded final commit -+- worktree clean -+- local/origin sync is `0/0` -+- no untracked files -+- branch disposition recorded as `deleted`, `retained for follow-up`, or `archived` -+ -diff --git a/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md b/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md -index 42fe1d0bf..b9da2de1b 100644 ---- a/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md -+++ b/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md -@@ -15,0 +16,3 @@ Keep active work attached to the correct assigned team, branch, and OWNER decisi -+- A team with a previous PR that is not Closed must not begin another PR unless OWNER documented an explicit stacked PR chain. -+- PR Open begins only after the branch and PR identity are named. -+- Closed ends only after the final main-return, clean-worktree, local/origin `0/0`, no-untracked-files, required-report, required-ZIP, and branch-disposition gates pass. -@@ -24,0 +28 @@ Keep active work attached to the correct assigned team, branch, and OWNER decisi -+- Record branch disposition before Closed as one of: `deleted`, `retained for follow-up`, or `archived`. -diff --git a/docs_build/dev/ProjectInstructions/addendums/multi_team.md b/docs_build/dev/ProjectInstructions/addendums/multi_team.md -index 286626ebb..f8e58e24c 100644 ---- a/docs_build/dev/ProjectInstructions/addendums/multi_team.md -+++ b/docs_build/dev/ProjectInstructions/addendums/multi_team.md -@@ -124,0 +125 @@ Required gate: -+ - final repository state block -@@ -152,0 +154,2 @@ Required steps: -+8. Record branch disposition as `deleted`, `retained for follow-up`, or `archived`. -+9. Mark the PR Closed only when every Closed gate passes. -@@ -169,0 +173 @@ Rules: -+- A PR is not Closed until the PR merged or an intentional no-merge close reason is recorded, changes are pushed, the repository is on `main`, `main` includes the merge or final commit, the worktree is clean, local/origin sync is `0/0`, no untracked files exist, branch disposition is recorded, required reports exist, and the required repo-structured ZIP exists under `tmp/`. -@@ -174,0 +179,15 @@ Rules: -+Required final closeout output: -+ -+```text -+FINAL REPOSITORY STATE: -+- Branch -+- Worktree -+- Local/origin sync -+- PR number/name -+- PR status -+- Merge/final commit -+- Branch disposition -+- ZIP path -+- Closeout PASS/FAIL -+``` -+ -diff --git a/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md b/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md -index 16539243e..422486a72 100644 ---- a/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md -+++ b/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md -@@ -15,10 +15,47 @@ Define the standard pull request workflow for Game Foundry Studio. --4. Create a PR branch. --5. Make scoped changes only. --6. Validate the change. --7. Commit with a clear OWNER/team message. --8. Push the branch. --9. Open a draft PR. --10. Review the PR. --11. OWNER approves merge. --12. Merge to main. --13. Pull latest main before starting the next PR. -+4. Create a PR branch and PR identity. -+5. Mark lifecycle state as PR Open. -+6. Make scoped changes only. -+7. Validate the change. -+8. Commit with a clear OWNER/team message. -+9. Push the branch. -+10. Open or update the draft PR. -+11. Review the PR. -+12. OWNER approves merge or intentional close without merge. -+13. Merge to main or record the approved no-merge close reason. -+14. Pull latest main before starting the next PR. -+15. Verify Main Verified and Closed gates. -+ -+## PR Lifecycle States -+ -+Required state order: -+ -+1. PR Open -+2. Building -+3. Validation -+4. Approved -+5. Merged -+6. Main Verified -+7. Closed -+ -+Definitions: -+- PR Open is the first active lifecycle state. -+- PR Open means the branch and PR identity are created and named before implementation begins. -+- No BUILD_PR may proceed without a PR name and active branch/PR identity unless explicitly marked `PLAN_ONLY`. -+- Building means scoped work is in progress. -+- Validation means requested checks, required reports, manual validation notes, and ZIP packaging are underway. -+- Approved means OWNER or required reviewer approval exists for merge or intentional close without merge. -+- Merged means the PR merged, or the approved no-merge close reason is recorded. -+- Main Verified means current branch is `main`, `main` includes the merge or final commit, worktree is clean, local/origin sync is `0/0`, and no untracked files remain. -+- Closed is valid only after every Closed gate passes. -+ -+Closed gates: -+- PR merged or intentionally closed without merge with reason recorded. -+- Changes pushed. -+- Current branch is `main`. -+- `main` includes the merge commit or recorded final commit. -+- Worktree clean. -+- Local/origin sync is `0/0`. -+- No untracked files. -+- Branch disposition is recorded as `deleted`, `retained for follow-up`, or `archived`. -+- Required reports exist. -+- Required repo-structured ZIP under `tmp/` exists. -@@ -33,0 +71,2 @@ Define the standard pull request workflow for Game Foundry Studio. -+- A team must not begin another PR if its previous PR is not Closed. -+- Exception is allowed only for explicitly documented stacked PR chains. -diff --git a/docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md b/docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md -index 521758eeb..f405ca3e6 100644 ---- a/docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md -+++ b/docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md -@@ -22,0 +23,3 @@ Teams may start only when all of the following are true: -+- PR lifecycle states exist in order: PR Open, Building, Validation, Approved, Merged, Main Verified, Closed. -+- Previous-PR Closed gate exists before a team starts another PR, except explicitly documented stacked PR chains. -+- Final closeout output includes branch, worktree, local/origin sync, PR number/name, PR status, merge/final commit, branch disposition, ZIP path, and Closeout PASS/FAIL. -diff --git a/docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md b/docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md -index d6af3271c..b2ebbe2a6 100644 ---- a/docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md -+++ b/docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md -@@ -21,0 +22 @@ Before a team starts, validate: -+- the team's previous PR is Closed, unless OWNER documented an explicit stacked PR chain -@@ -63,4 +64,6 @@ For backlog-driven work: --4. Create or use the approved team branch. --5. Record active work in the active team registry when required. --6. Open a draft PR after validation. --7. Merge only through OWNER-approved PR workflow. -+4. Confirm the previous PR for the team is Closed, unless this is an explicitly documented stacked PR chain. -+5. Create or use the approved team branch and PR identity. -+6. Mark lifecycle state as PR Open before BUILD_PR work begins. -+7. Record active work in the active team registry when required. -+8. Open or update a draft PR during active work. -+9. Merge only through OWNER-approved PR workflow. -@@ -89,0 +93,13 @@ A team or OWNER PR is release-ready when: -+- lifecycle state is at least Validation -+- required reports and repo-structured ZIP under `tmp/` exist before Closed -+ -+Closed readiness requires: -+- PR merged or intentionally closed without merge with reason recorded -+- current branch is `main` -+- worktree clean -+- local/origin sync is `0/0` -+- no untracked files -+- merge or final commit recorded -+- branch disposition recorded as `deleted`, `retained for follow-up`, or `archived` -+- required reports exist -+- required repo-structured ZIP under `tmp/` exists -diff --git a/docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md b/docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md -index afe4efa91..992eda712 100644 ---- a/docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md -+++ b/docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md -@@ -19,0 +20 @@ Rules: -+- Registry must record when a team PR reaches Closed before that team begins another PR, unless OWNER documented an explicit stacked PR chain. -@@ -140,0 +142,3 @@ Rules: -+- Each PR starts at PR Open after the branch and PR identity are named. -+- Each PR reaches Closed only after main-return, clean-worktree, local/origin `0/0`, no-untracked-files, required-report, required-ZIP, and branch-disposition gates pass. -+- A team must not begin another PR until its previous PR is Closed unless OWNER documented an explicit stacked PR chain. -@@ -166,0 +171,2 @@ Rules: -+- Each PR must move through PR Open, Building, Validation, Approved, Merged, Main Verified, and Closed in order. -+- A team must not begin another PR until its previous PR is Closed unless OWNER documented an explicit stacked PR chain. -diff --git a/docs_build/dev/reports/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance.md b/docs_build/dev/reports/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance.md -new file mode 100644 -index 000000000..85e5726c8 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance.md -@@ -0,0 +1,97 @@ -+# PR_26175_OWNER_048 PR Open To Closed Main Return Governance -+ -+## Summary -+This governance-only PR defines the active PR lifecycle as: -+ -+`PR Open -> Building -> Validation -> Approved -> Merged -> Main Verified -> Closed` -+ -+It clarifies that PR Open is the first active lifecycle state, that BUILD_PR work requires a PR name and active branch/PR identity unless explicitly marked `PLAN_ONLY`, and that Closed is valid only after the merge/no-merge decision, push, main return, clean/synced repo state, branch disposition, required reports, and required ZIP all pass. -+ -+No runtime code changed. -+ -+## Located Active Governance Files -+| File | Role | Change | -+| --- | --- | --- | -+| `docs_build/dev/PROJECT_INSTRUCTIONS.md` | Root instructions for PLAN_PR -> BUILD_PR -> APPLY_PR, required reports, PR completion, ZIP output, and EOD hard stops. | Updated | -+| `docs_build/dev/ProjectInstructions/addendums/pr_workflow.md` | Standard PR workflow and sequencing rules. | Updated | -+| `docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md` | Team start and release-readiness governance. | Updated | -+| `docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md` | Team release-readiness gate. | Updated | -+| `docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md` | Branch context, stop conditions, and return-to-main rules. | Updated | -+| `docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md` | Active work branch lock and branch disposition rules. | Updated | -+| `docs_build/dev/ProjectInstructions/addendums/multi_team.md` | Multi-team and EOD closeout governance. | Updated | -+| `docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md` | Active team registry and sequential PR execution rules. | Updated | -+ -+## Requirement Checklist -+| Requirement | Result | Evidence | -+| --- | --- | --- | -+| Use main branch only | PASS | `git branch --show-current` returned `main`. | -+| Governance docs only | PASS | Changed paths are limited to `docs_build/dev/` governance and report files. | -+| No runtime code changes | PASS | No `src/`, `assets/`, `toolbox/`, runtime, or Playwright test files changed. | -+| Locate active PR workflow / team release / branch governance docs | PASS | Active files are listed in this report. | -+| Add lifecycle states in required order | PASS | Root instructions and PR workflow define `PR Open -> Building -> Validation -> Approved -> Merged -> Main Verified -> Closed`. | -+| Define PR Open | PASS | Root and PR workflow define PR Open as the first active lifecycle state after PR/branch identity exists. | -+| Block BUILD_PR without PR identity unless PLAN_ONLY | PASS | Root, PR workflow, and branch context governance include the hard stop. | -+| Define Closed gates | PASS | Root and PR workflow list merge/no-merge reason, push, main branch, final commit, clean worktree, sync `0/0`, no untracked files, branch disposition, reports, and ZIP. | -+| Add previous-PR hard stop | PASS | Root, PR workflow, team start, branch context, branch lock, and team assignment registry now require previous PR Closed unless a stacked PR chain is documented. | -+| Add final closeout output | PASS | Root and multi-team closeout require `FINAL REPOSITORY STATE` fields. | -+| Preserve PLAN_PR -> BUILD_PR -> APPLY_PR language | PASS | Existing workflow language remains and is clarified as separate from lifecycle status. | -+| Create required reports | PASS | This report, `codex_review.diff`, and `codex_changed_files.txt` are created/updated. | -+| Create repo-structured ZIP under `tmp/` | PASS | Planned artifact path: `tmp/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance_delta.zip`. | -+ -+## Branch Validation -+| Check | Result | Evidence | -+| --- | --- | --- | -+| Current branch is `main` | PASS | Branch command returned `main`. | -+| Worktree before edits | PASS | Worktree was clean at start. | -+| Local/origin sync before edits | WARN | Local `main` was already ahead of `origin/main` by 1 prior governance commit. | -+ -+## Validation Lane Report -+| Lane | Result | Evidence | -+| --- | --- | --- | -+| Docs-only validation | PASS | Path check returned only `docs_build/dev/` changed files. | -+| Whitespace validation | PASS | `git diff --check` passed. | -+| Playwright impacted | PASS | No; governance docs only. | -+| Runtime validation | PASS | Not applicable; no runtime files changed. | -+ -+## Manual Validation Notes -+| Step | Result | Notes | -+| --- | --- | --- | -+| Reviewed root workflow language | PASS | PLAN_PR -> BUILD_PR -> APPLY_PR remains preserved and lifecycle gate is additive. | -+| Reviewed PR workflow addendum | PASS | Standard flow now begins with PR branch/identity and PR Open before build work. | -+| Reviewed team release docs | PASS | Team start/release gates now block new PR starts until previous PR is Closed unless stacked. | -+| Reviewed branch governance docs | PASS | Branch context and lock rules now require PR identity, main return before Closed, and branch disposition. | -+| Reviewed EOD governance | PASS | Final repository state block and Closed gate are required in closeout. | -+ -+## Final Closeout Output Added To Governance -+```text -+FINAL REPOSITORY STATE: -+- Branch -+- Worktree -+- Local/origin sync -+- PR number/name -+- PR status -+- Merge/final commit -+- Branch disposition -+- ZIP path -+- Closeout PASS/FAIL -+``` -+ -+## Changed Files -+| File | Purpose | -+| --- | --- | -+| `docs_build/dev/PROJECT_INSTRUCTIONS.md` | Adds lifecycle gate, PR Open/Closed definitions, previous-PR hard stop, final-state output, and completion clarification. | -+| `docs_build/dev/ProjectInstructions/addendums/pr_workflow.md` | Adds lifecycle states, standard flow updates, and Closed gates. | -+| `docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md` | Adds previous-PR Closed check and release/Closed readiness rules. | -+| `docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md` | Adds lifecycle, previous-PR, and final closeout readiness requirements. | -+| `docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md` | Adds PR identity, previous-PR, and Closed branch context checks. | -+| `docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md` | Adds PR Open/Closed branch lock and disposition rules. | -+| `docs_build/dev/ProjectInstructions/addendums/multi_team.md` | Adds final repository state block and EOD Closed gate. | -+| `docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md` | Adds registry and sequential PR Closed rules. | -+| `docs_build/dev/reports/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance.md` | Required PR-specific report. | -+| `docs_build/dev/reports/codex_review.diff` | Required review diff artifact. | -+| `docs_build/dev/reports/codex_changed_files.txt` | Required changed-files artifact. | -+ -+## ZIP -+| Artifact | Result | -+| --- | --- | -+| `tmp/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance_delta.zip` | PASS - repo-structured ZIP created for this run. | -diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt -index aa5252e75..6ec0304a3 100644 ---- a/docs_build/dev/reports/codex_changed_files.txt -+++ b/docs_build/dev/reports/codex_changed_files.txt -@@ -2,0 +3,2 @@ M docs_build/dev/PROJECT_INSTRUCTIONS.md -+M docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md -+M docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md -@@ -5,3 +7,4 @@ M docs_build/dev/ProjectInstructions/addendums/pr_workflow.md --A docs_build/dev/reports/PR_26175_OWNER_047-codex-zip-required-for-all-runs.md --M docs_build/dev/reports/codex_changed_files.txt --M docs_build/dev/reports/codex_review.diff -+M docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md -+M docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md -+M docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md -+A docs_build/dev/reports/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance.md -@@ -16,7 +19,10 @@ M docs_build/dev/reports/codex_review.diff -- docs_build/dev/PROJECT_INSTRUCTIONS.md | 39 +- -- .../ProjectInstructions/addendums/multi_team.md | 4 + -- .../ProjectInstructions/addendums/pr_workflow.md | 4 + -- ...75_OWNER_047-codex-zip-required-for-all-runs.md | 67 ++ -- docs_build/dev/reports/codex_changed_files.txt | 27 +- -- docs_build/dev/reports/codex_review.diff | 818 +++++---------------- -- 6 files changed, 307 insertions(+), 652 deletions(-) -+ docs_build/dev/PROJECT_INSTRUCTIONS.md | 61 ++++++++++++++ -+ .../addendums/branch_context_governance.md | 14 ++++ -+ .../addendums/branch_lock_governance.md | 4 + -+ .../ProjectInstructions/addendums/multi_team.md | 19 +++++ -+ .../ProjectInstructions/addendums/pr_workflow.md | 59 ++++++++++--- -+ .../addendums/team_release_readiness.md | 3 + -+ .../addendums/team_start_and_release.md | 24 +++++- -+ .../team_assignments/TEAM_ASSIGNMENTS.md | 6 ++ -+ ...048-pr-open-to-closed-main-return-governance.md | 97 ++++++++++++++++++++++ -+ 9 files changed, 273 insertions(+), 14 deletions(-) +diff --git a/assets/toolbox/idea-board/js/index.js b/assets/toolbox/idea-board/js/index.jsindex 47a5ed91e..25607bc8d 100644--- a/assets/toolbox/idea-board/js/index.js+++ b/assets/toolbox/idea-board/js/index.js@@ -129,6 +129,10 @@ function previousStatusForRestore(record) { : "Refining"; } +function isEditableStatus(status) {+ return editableStatusOptions.includes(status);+}+ function rememberPreviousStatus(record) { if (record.status !== "Archived") { record.previousStatus = record.status;@@ -436,7 +440,7 @@ function saveIdeaRow(root, row) { const idea = row.querySelector("[data-idea-board-idea-input]")?.value.trim(); const pitch = row.querySelector("[data-idea-board-pitch-input]")?.value.trim(); const status = row.querySelector("[data-idea-board-idea-status-input]")?.value;- if (!idea || !pitch || !status) {+ if (!idea || !pitch || !isEditableStatus(status)) { updateStatus(root, "Enter an idea, pitch, and status before saving."); return; }diff --git a/docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.md b/docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.mdnew file mode 100644index 000000000..dc24d4ee4--- /dev/null+++ b/docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.md@@ -0,0 +1,60 @@+# PR_26175_ALFA_018 - Alfa Idea Board Polish Consolidation++## Executive Summary++PASS - Consolidated the remaining current-main-safe Alfa Batch D Idea Board status dropdown guard.++Current `main` already contained the #114, #115, and #116 structural work: the status filter is in the left accordion, the Idea Board parent table no longer has the Updated column, idea labels wrap, editable status dropdowns list only `New`, `Exploring`, `Refining`, and `Ready`, and status filters list `New`, `Exploring`, `Refining`, `Ready`, `Project`, and `Archived`.++This PR adds a runtime save guard so stale or injected editable dropdown values cannot persist non-editable statuses such as `Project` or `Archived`.++## Runtime Files Changed++| File | Change |+| --- | --- |+| `assets/toolbox/idea-board/js/index.js` | Adds an editable-status validation helper and rejects add/edit saves when the submitted status is not one of the editable statuses. |+| `tests/playwright/tools/IdeaBoardTableNotes.spec.mjs` | Adds focused coverage that injects a stale `Project` option into the editable row and verifies it cannot create an Idea Board row. |++## Source PR Coverage++| Source PR | Batch D Area | Current-Main Resolution |+| --- | --- | --- |+| #114 | Idea Board cleanup | Already present on current main; Game Hub changes were not touched. |+| #115 | Status filter table polish | Already present on current main; no Updated column, wrapped idea labels, themed status filters. |+| #116 | Editable status dropdown fix | Present and hardened by this PR with save-path validation. |++## Requirement Checklist++| Requirement | Status | Notes |+| --- | --- | --- |+| Start from `main` | PASS | `main` was checked, pulled, clean, and synced before branch creation. |+| Hard stop if branch/worktree/sync invalid | PASS | Branch `main`, clean worktree, local/origin sync `0 0` confirmed after pull. |+| Read all Project Instructions | PASS | All files under `docs_build/dev/ProjectInstructions/` were read before edits. |+| Implement current-main-safe Batch D runtime changes | PASS | Added runtime validation for editable-only Idea Board statuses. |+| Editable statuses limited to New/Exploring/Refining/Ready | PASS | UI already did this; save path now enforces it. |+| Filter statuses include Project and Archived | PASS | Existing filter behavior preserved. |+| Preserve Game Hub changes | PASS | No Game Hub files changed. |+| Do not change status bar work | PASS | Status bar diff check was empty. |+| Do not install Chromium | PASS | Chromium was not installed. |+| Required reports and ZIP | PASS | Reports generated and delta ZIP created under `tmp/`. |++## Validation Lane++| Command | Status | Result |+| --- | --- | --- |+| `node --check assets/toolbox/idea-board/js/index.js` | PASS | JavaScript syntax valid. |+| `node --check tests/playwright/tools/IdeaBoardTableNotes.spec.mjs` | PASS | Test file syntax valid. |+| `git diff --check -- assets/toolbox/idea-board/js/index.js tests/playwright/tools/IdeaBoardTableNotes.spec.mjs` | PASS | Exit code 0; Git emitted a non-blocking CRLF warning for the test file. |+| `git diff -- toolbox/game-hub/game-hub.js toolbox/game-hub/index.html assets/theme-v2/css/status.css assets/theme-v2/js/toolbox-status-bar.js tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs` | PASS | Empty diff; Game Hub and status bar work untouched. |+| `npx playwright test tests/playwright/tools/IdeaBoardTableNotes.spec.mjs --workers=1 --reporter=line --timeout=30000` | BLOCKED | Browser executable missing at `C:\Users\davidq\AppData\Local\ms-playwright\chromium-1217\chrome-win64\chrome.exe`; Chromium was not installed per instruction. |++## Manual Validation Notes++- Compared GitHub PR #114, #115, and #116 metadata and patches against current main.+- Confirmed the historical `toolbox/idea-board/index.js` path has moved on current main to `assets/toolbox/idea-board/js/index.js`.+- Confirmed current main already preserves the Batch D status filter/table/dropdown shape.+- Confirmed this PR does not modify `toolbox/game-hub/*`, `assets/theme-v2/css/status.css`, `assets/theme-v2/js/toolbox-status-bar.js`, or status bar Playwright coverage.++## Branch Validation++PASS - Work began from clean, synced `main`; implementation was made on `PR_26175_ALFA_018-alfa-idea-board-polish-consolidation`.diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txtindex 6ec0304a3..96fb4553c 100644--- a/docs_build/dev/reports/codex_changed_files.txt+++ b/docs_build/dev/reports/codex_changed_files.txt@@ -1,28 +1,5 @@-# git status --short-M docs_build/dev/PROJECT_INSTRUCTIONS.md-M docs_build/dev/ProjectInstructions/addendums/branch_context_governance.md-M docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md-M docs_build/dev/ProjectInstructions/addendums/multi_team.md-M docs_build/dev/ProjectInstructions/addendums/pr_workflow.md-M docs_build/dev/ProjectInstructions/addendums/team_release_readiness.md-M docs_build/dev/ProjectInstructions/addendums/team_start_and_release.md-M docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md-A docs_build/dev/reports/PR_26175_OWNER_048-pr-open-to-closed-main-return-governance.md--# git ls-files --others --exclude-standard---# git diff --stat---# git diff --cached --stat- docs_build/dev/PROJECT_INSTRUCTIONS.md | 61 ++++++++++++++- .../addendums/branch_context_governance.md | 14 ++++- .../addendums/branch_lock_governance.md | 4 +- .../ProjectInstructions/addendums/multi_team.md | 19 +++++- .../ProjectInstructions/addendums/pr_workflow.md | 59 ++++++++++---- .../addendums/team_release_readiness.md | 3 +- .../addendums/team_start_and_release.md | 24 +++++-- .../team_assignments/TEAM_ASSIGNMENTS.md | 6 ++- ...048-pr-open-to-closed-main-return-governance.md | 97 ++++++++++++++++++++++- 9 files changed, 273 insertions(+), 14 deletions(-)+assets/toolbox/idea-board/js/index.js+docs_build/dev/reports/PR_26175_ALFA_018-alfa-idea-board-polish-consolidation.md+docs_build/dev/reports/codex_changed_files.txt+docs_build/dev/reports/codex_review.diff+tests/playwright/tools/IdeaBoardTableNotes.spec.mjsdiff --git a/tests/playwright/tools/IdeaBoardTableNotes.spec.mjs b/tests/playwright/tools/IdeaBoardTableNotes.spec.mjsindex 61d8fdc68..573e896f6 100644--- a/tests/playwright/tools/IdeaBoardTableNotes.spec.mjs+++ b/tests/playwright/tools/IdeaBoardTableNotes.spec.mjs@@ -329,6 +329,22 @@ test("Idea Board uses accordion table ideas and notes", async ({ page }) => { await expect(ideaInputRow.locator("[data-idea-board-idea-status-input]")).toHaveCount(1); await expect(ideaInputRow.locator("[data-idea-board-idea-status-input] option")).toHaveText(EDITABLE_STATUS_OPTIONS); await expect(ideaInputRow.locator("td").nth(2)).toHaveText("0 Notes");+ await ideaInputRow.locator("[data-idea-board-idea-status-input]").evaluate((select) => {+ const option = document.createElement("option");+ option.value = "Project";+ option.textContent = "Project";+ select.append(option);+ select.value = "Project";+ });+ await page.locator("[data-idea-board-idea-input]").fill("Project Trap");+ await page.locator("[data-idea-board-pitch-input]").fill("Project status cannot be saved from the editable row.");+ await page.locator("[data-idea-board-idea-action='save']").click();+ await expect(page.locator("[data-idea-board-status]")).toHaveText("Enter an idea, pitch, and status before saving.");+ await expect(page.locator("[data-idea-board-idea-row='project-trap']")).toHaveCount(0);+ await ideaInputRow.locator("[data-idea-board-idea-status-input]").evaluate((select) => {+ select.querySelector("option[value='Project']")?.remove();+ select.value = "Refining";+ }); await page.locator("[data-idea-board-idea-input]").fill("Lantern Reef"); await page.locator("[data-idea-board-pitch-input]").fill("Guide light through a reef that rearranges at dusk."); await page.locator("[data-idea-board-idea-status-input]").selectOption("Refining"); \ No newline at end of file diff --git a/tests/playwright/tools/IdeaBoardTableNotes.spec.mjs b/tests/playwright/tools/IdeaBoardTableNotes.spec.mjs index 61d8fdc68..573e896f6 100644 --- a/tests/playwright/tools/IdeaBoardTableNotes.spec.mjs +++ b/tests/playwright/tools/IdeaBoardTableNotes.spec.mjs @@ -329,6 +329,22 @@ test("Idea Board uses accordion table ideas and notes", async ({ page }) => { await expect(ideaInputRow.locator("[data-idea-board-idea-status-input]")).toHaveCount(1); await expect(ideaInputRow.locator("[data-idea-board-idea-status-input] option")).toHaveText(EDITABLE_STATUS_OPTIONS); await expect(ideaInputRow.locator("td").nth(2)).toHaveText("0 Notes"); + await ideaInputRow.locator("[data-idea-board-idea-status-input]").evaluate((select) => { + const option = document.createElement("option"); + option.value = "Project"; + option.textContent = "Project"; + select.append(option); + select.value = "Project"; + }); + await page.locator("[data-idea-board-idea-input]").fill("Project Trap"); + await page.locator("[data-idea-board-pitch-input]").fill("Project status cannot be saved from the editable row."); + await page.locator("[data-idea-board-idea-action='save']").click(); + await expect(page.locator("[data-idea-board-status]")).toHaveText("Enter an idea, pitch, and status before saving."); + await expect(page.locator("[data-idea-board-idea-row='project-trap']")).toHaveCount(0); + await ideaInputRow.locator("[data-idea-board-idea-status-input]").evaluate((select) => { + select.querySelector("option[value='Project']")?.remove(); + select.value = "Refining"; + }); await page.locator("[data-idea-board-idea-input]").fill("Lantern Reef"); await page.locator("[data-idea-board-pitch-input]").fill("Guide light through a reef that rearranges at dusk."); await page.locator("[data-idea-board-idea-status-input]").selectOption("Refining");