From c2300f1665de0e2aca277bec0b4eb140f40bf505 Mon Sep 17 00:00:00 2001 From: Charlie Team <97194984+ToolboxAid@users.noreply.github.com> Date: Fri, 26 Jun 2026 20:20:37 -0400 Subject: [PATCH 1/3] Align Project Instructions workflow and testability governance --- .../addendums/branch_lock_governance.md | 7 ++- .../environment_configuration_standards.md | 2 + .../addendums/environment_governance_model.md | 2 + .../no_mock_repository_runtime_source.md | 6 ++ .../addendums/pr_workflow.md | 45 +++++++++++++- ...ect_instructions_single_source_eod_lock.md | 9 ++- .../test_structure_standardization.md | 36 ++++++++++++ .../addendums/tool_mvp_stacked_pr_standard.md | 25 +++++++- .../backlog/BACKLOG_MASTER.md | 5 +- .../team_assignments/TEAM_ASSIGNMENTS.md | 20 +++---- .../team_assignments/team_ownership.md | 6 ++ ...tions-workflow-testable-tests-alignment.md | 55 ++++++++++++++++++ ...table-tests-alignment_branch-validation.md | 18 ++++++ ...tests-alignment_manual-validation-notes.md | 19 ++++++ ...-tests-alignment_requirements-checklist.md | 22 +++++++ ...estable-tests-alignment_validation-lane.md | 31 ++++++++++ .../dev/reports/codex_changed_files.txt | 18 +++++- docs_build/dev/reports/codex_review.diff | Bin 7658 -> 59060 bytes 18 files changed, 304 insertions(+), 22 deletions(-) create mode 100644 docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md diff --git a/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md b/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md index 61b95cfae..39ec22516 100644 --- a/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md +++ b/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md @@ -13,7 +13,7 @@ Keep active work attached to the correct assigned team, branch, and OWNER decisi - An assigned work item keeps its owner of record until complete or OWNER reassignment. - Work must not move to another team, branch, or PR without OWNER approval. - A team with no active assignment, active branch, or active PR is inactive. -- A team with a previous PR that is not Closed must not begin another PR unless OWNER documented an explicit stacked PR chain. +- A team with a previous PR that is not Closed must not begin another unrelated PR unless OWNER documented an explicit stacked/sequential workstream. - PR Open begins only after the branch and PR identity are named. - Plan, Build, validation, reports, ZIP packaging, and closeout stay tied to the same PR identity and source branch. - Closed ends only after the final main-return, clean-worktree, local/origin `0/0`, no-untracked-files, required-report, required-ZIP, backlog, applicable tool-state, and branch-disposition gates pass. @@ -25,7 +25,8 @@ Keep active work attached to the correct assigned team, branch, and OWNER decisi - Pull latest `origin/main` before creating a work branch. - Do not create a PR branch unless current branch is `main`, worktree is clean, `main...origin/main` is `0 0`, and `HEAD` SHA matches the published EOD SHA. - Follow the canonical START / WORK / END lifecycle in `docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md`. -- Keep work on the active branch until the PR is merged, the branch is retired, or OWNER says to return to `main`. +- Keep work on the active branch until the PR is merged, the branch is retired, EOD closeout begins, or OWNER says to return to `main`. +- For OWNER-approved stacked/sequential workstreams, sequential PR work stays on the active branch/workstream during the day and does not return to `main` between PRs. - Do not commit directly to `main`. - HARD STOP before committing if current branch is `main`. - HARD STOP if the branch changes unexpectedly during implementation. @@ -51,7 +52,7 @@ Branch lock governance enforces: - START on synchronized `main`. - WORK only on the PR branch. - END by merging, returning to synchronized `main`, publishing branch, HEAD SHA, and date/time, then stopping all work. -- Mandatory hard stops before commits on `main`, dirty branch creation, non-`0 0` main sync, baseline SHA mismatch, unvalidated merge, or new PR work before synchronized main return. +- Mandatory hard stops before commits on `main`, dirty branch creation, non-`0 0` main sync, baseline SHA mismatch, unvalidated merge, or new unrelated workstream before synchronized main return. ## OWNER Override diff --git a/docs_build/dev/ProjectInstructions/addendums/environment_configuration_standards.md b/docs_build/dev/ProjectInstructions/addendums/environment_configuration_standards.md index d08f4317b..5a91f904c 100644 --- a/docs_build/dev/ProjectInstructions/addendums/environment_configuration_standards.md +++ b/docs_build/dev/ProjectInstructions/addendums/environment_configuration_standards.md @@ -92,6 +92,8 @@ One shared API/service contract is required across Local (VS Code), DEV, IST, UA Rules: +- Browser/UI/runtime code must follow `Browser -> API -> Database` for authoritative product data. +- `Local API` means the same shared API/service contract running locally, not a separate local-only API implementation. - API URLs may differ by `.env` only. - Do not split Local API and Public API contracts. - Do not create environment-specific API/service contracts. diff --git a/docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md b/docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md index de7c90331..0196571a0 100644 --- a/docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md +++ b/docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md @@ -48,7 +48,9 @@ One shared API/service contract is required across all environments. Rules: +- Browser/UI/runtime product data must flow through `Browser -> API -> Database`. - Browser/UI/runtime code must consume the same API/service contract in Local (VS Code), DEV, IST, UAT, and PROD. +- `Local API` means the shared API/service contract running locally, not a separate API implementation. - Environment-specific endpoints, keys, buckets, credentials, and prefixes are configuration values only. - Do not create environment-specific API/service contracts. - Do not branch API/service behavior by environment name. diff --git a/docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md b/docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md index 2df16f830..3c4c5b516 100644 --- a/docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md +++ b/docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md @@ -11,6 +11,12 @@ Browser → API → Database Runtime product data must flow through the API/service contract backed by the database. +Canonical ASCII wording for this required flow is: + +```text +Browser -> API -> Database +``` + ## Rules - Mock repositories are 100% technical debt. diff --git a/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md b/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md index 278717326..06adda05e 100644 --- a/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md +++ b/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md @@ -23,9 +23,26 @@ Define the standard pull request workflow for Game Foundry Studio. 12. Review the PR. 13. OWNER approves merge. 14. Merge to main. -15. Pull latest main before starting the next PR. +15. Pull latest main before starting the next unrelated workstream, or before a new PR when the work is not an OWNER-approved stacked/sequential workstream. 16. Verify Main Verified and Closed gates. +## Daily Branch Workflow + +OWNER-approved daily workflow: + +- SOD starts from the latest synchronized `main`. +- SOD creates or updates one active team, OWNER, or scoped workstream branch. +- All implementation commits go to the active branch, not `main`. +- Sequential PRs stay on the active branch/workstream during the day when OWNER assigned a stacked or sequential workstream. +- Do not return to `main` between stacked/sequential PRs in the same active workstream. +- `main` is only the SOD baseline and the EOD return target, unless OWNER explicitly approves an intermediate merge checkpoint. +- EOD merges or closes OWNER-approved work, pushes, returns to `main`, and verifies: + - current branch is `main` + - worktree clean + - local/origin sync is `0 0` + +This section supersedes older active wording that implies returning to `main` between every PR inside an OWNER-approved stacked/sequential workstream. + ## Branch Lifecycle (Canonical) Every PR follows exactly three phases: @@ -101,7 +118,8 @@ Closed gates: - Source branches are retained by default after merge and closeout. - Do not mix unrelated scopes. - Do not start dependent PRs until the required base PR is merged. -- Always return to main before starting the next PR. +- Return to `main` before starting an unrelated PR or new workstream. +- Do not return to `main` between PRs in the same OWNER-approved stacked/sequential workstream unless OWNER approves an EOD or intermediate merge checkpoint. - A team must not begin another PR if its previous PR is not Closed. - Exception is allowed only for explicitly documented stacked PR chains. - If validation fails, stop and report. @@ -140,6 +158,29 @@ Each tool MVP PR plan or template must include: Visible acceptance must be Creator-facing first. Architecture can be handled under the covers, but the PR purpose must be user-testable. +## Product Owner Testable Definition + +A request to complete a page, tool, or testable MVP means Product Owner testable. + +Not acceptable as a completed/testable page or tool: + +- shell-only page +- `Not implemented yet` +- placeholder-only workspace, inspector, or output sections +- planned-only tile +- template-only page +- route that loads but cannot be used + +Required for Product Owner testable completion: + +- visible working controls +- API-backed data where required +- validation and error states +- empty states +- save/load behavior where applicable +- manual validation steps for Product Owner +- targeted Playwright coverage where impacted. + ## OWNER Shortcut: PRs Keyword: diff --git a/docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md b/docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md index ff606135a..f0d4f8675 100644 --- a/docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md +++ b/docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md @@ -68,7 +68,7 @@ END ## START -Every team begins on `main`. +Every team begins SOD from `main`. Required: @@ -91,7 +91,7 @@ main...origin/main HEAD equals published EOD SHA ``` -Only after ALL four pass may a branch be created. +Only after ALL four pass may a branch be created or the active OWNER-approved workstream branch be updated. Create the PR branch: @@ -115,6 +115,8 @@ From branch creation until merge: - Push only the PR branch. - Execute validation from the PR branch. - Open/update the PR from the PR branch. +- For OWNER-approved stacked/sequential workstreams, remain on the active workstream branch between sequential PRs during the day. +- Do not return to `main` between sequential PRs in the same active workstream unless OWNER explicitly approves an EOD or intermediate merge checkpoint. Hard Stops: @@ -192,7 +194,8 @@ STOP if: - `main...origin/main` is not `0 0` before creating PR branch - `HEAD` SHA differs from published baseline - merge attempted without successful validation -- new PR started before returning to synchronized `main` +- new unrelated PR or workstream started before returning to synchronized `main` +- sequential work continues without an OWNER-approved stacked/sequential workstream model ## Start Of Day Boundary diff --git a/docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md b/docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md index 997b16730..bb51300ed 100644 --- a/docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md +++ b/docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md @@ -6,6 +6,9 @@ Standardize testing locations and ensure independent tool validation. ## Canonical Test Structure +Page-level Playwright tests: +- tests/playwright/{runtime-page-path}/index.spec.mjs + Tool tests: - tests/toolbox/{tool-name}/ @@ -31,3 +34,36 @@ Regression tests: - Tool tests validate tool functionality. - Regression tests validate platform behavior. - New tests follow the canonical structure. +- Every user-accessible page must have at least one page-level Playwright test. +- Runtime page path determines the page-level Playwright test path. +- Primary page-level Playwright test file should be `index.spec.mjs`. +- Do not organize new page-level Playwright tests only by feature nickname or technology bucket when a page path exists. +- Legacy broad tests may remain while migration is planned; document migration/deprecation instead of moving broad legacy tests unless the PR scope requires it. + +## Page-Level Playwright Examples + +- `/admin/index.html` -> `tests/playwright/admin/index/index.spec.mjs` +- `/toolbox/sprites/index.html` -> `tests/playwright/toolbox/sprites/index.spec.mjs` +- `/toolbox/game-hub/index.html` -> `tests/playwright/toolbox/game-hub/index.spec.mjs` +- `/toolbox/messages/index.html` -> `tests/playwright/toolbox/messages/index.spec.mjs` +- `/toolbox/game-configuration/index.html` -> `tests/playwright/toolbox/game-configuration/index.spec.mjs` + +## Minimum Page-Level Playwright Coverage + +Minimum page-level test: + +- route loads +- page renders +- navigation works +- no visible placeholder-only state for completed/testable pages +- no runtime console errors when feasible + +Additional scenario files may use: + +- `create.spec.mjs` +- `edit.spec.mjs` +- `delete.spec.mjs` +- `archive.spec.mjs` +- `navigation.spec.mjs` +- `permissions.spec.mjs` +- `validation.spec.mjs` diff --git a/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md b/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md index a44e7fcd5..28f1690ce 100644 --- a/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md +++ b/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md @@ -40,6 +40,27 @@ For tool MVP PR planning, visible acceptance must be Creator-facing first. Architecture can be handled under the covers, but PR purpose must be user-testable. +A request to complete a page, tool, or testable MVP means Product Owner testable. + +Not acceptable as complete/testable: + +- shell-only page +- `Not implemented yet` +- placeholder-only workspace, inspector, or output sections +- planned-only tile +- template-only page +- route that loads but cannot be used + +Required for Product Owner testable completion: + +- visible working controls +- API-backed data where required +- validation and error states +- empty states +- save/load behavior where applicable +- manual validation steps for Product Owner +- targeted Playwright coverage where impacted. + Each tool MVP PR must state: - Creator-testable outcome - What Playwright tests @@ -81,4 +102,6 @@ Each PR in the stack still follows the canonical START / WORK / END lifecycle an When OWNER gives one large Codex command for a tool MVP stack, Codex may continue from one completed PR to the next without stopping for a conversational checkpoint, unless a blocker listed in this standard occurs. -The final PR in the stack must perform normal closeout and stop all work after returning to synchronized main. +During an OWNER-approved day workstream, sequential PRs stay on the active workstream branch and do not return to `main` between PRs. + +The final PR in the stack must perform normal EOD closeout or OWNER-approved merge-checkpoint closeout and stop all work after returning to synchronized main. diff --git a/docs_build/dev/ProjectInstructions/backlog/BACKLOG_MASTER.md b/docs_build/dev/ProjectInstructions/backlog/BACKLOG_MASTER.md index 37fe942aa..10ed1c93e 100644 --- a/docs_build/dev/ProjectInstructions/backlog/BACKLOG_MASTER.md +++ b/docs_build/dev/ProjectInstructions/backlog/BACKLOG_MASTER.md @@ -26,7 +26,10 @@ 0% Complete — Create the visual look of your game - [ ] Bravo - Asset Studio V2 -- [ ] Bravo - Sprite Studio V2 +- [ ] Charlie - Sprites canvas editor MVP + - Sprites is a creator tool, not only an asset metadata library. + - MVP requires canvas/grid editor behavior, width/height controls, Palette/Colors-only reusable colors, color selection from Palette/Colors, pixel painting, save/load sprite grid data through the API/database, and Product Owner manual validation. + - Category is removed from Sprites MVP planning. - [ ] Bravo - Animation Studio V2 - [ ] Bravo - Palette Manager - [ ] Bravo - Video Studio diff --git a/docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md b/docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md index d35cf888f..4253971d9 100644 --- a/docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md +++ b/docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md @@ -48,15 +48,11 @@ Current OWNER clarification: ## Team Alfa -Status: Active - -Active assignment: PR_26177_DELTA_056-shared-validation-assertions. - -Active branch: PR_26177_DELTA_056-shared-validation-assertions. +Status: Available -Active PR: PR_26177_DELTA_056-shared-validation-assertions. +Active assignment: none. -OWNER override approved: Continue Team Delta random utility stack with PR_26177_DELTA_056-shared-validation-assertions. +Active branch: none. ## Team Bravo @@ -76,11 +72,15 @@ Active branch: none. ## Team Delta -Status: Available +Status: Active -Active assignment: none. +Active assignment: PR_26177_DELTA_056-shared-validation-assertions. -Active branch: none. +Active branch: PR_26177_DELTA_056-shared-validation-assertions. + +Active PR: PR_26177_DELTA_056-shared-validation-assertions. + +OWNER override approved: Continue Team Delta random utility stack with PR_26177_DELTA_056-shared-validation-assertions. ## Team Golf diff --git a/docs_build/dev/ProjectInstructions/team_assignments/team_ownership.md b/docs_build/dev/ProjectInstructions/team_assignments/team_ownership.md index 1e2e47843..4e6548811 100644 --- a/docs_build/dev/ProjectInstructions/team_assignments/team_ownership.md +++ b/docs_build/dev/ProjectInstructions/team_assignments/team_ownership.md @@ -34,6 +34,7 @@ This section is the current OWNER-approved active ownership alignment. - Environment management - System Health - Operations +- Sprites canvas editor MVP Team Charlie System Health owns: - Environment Summary @@ -42,6 +43,11 @@ Team Charlie System Health owns: - Runtime Health - Health Check History +Team Charlie Sprites ownership: +- Sprites is a creator tool, not only an asset metadata library. +- Sprites MVP requires canvas/grid editor behavior, width/height controls, Palette/Colors-only reusable colors, color selection from Palette/Colors, pixel painting, save/load sprite grid data through the API/database, and Product Owner manual validation. +- Sprites must not own reusable color definitions. + ## Team Delta - Engine diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md new file mode 100644 index 000000000..72901bcd7 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md @@ -0,0 +1,55 @@ +# PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment + +Date: 2026-06-26 +Team: OWNER +Branch: PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment + +## Purpose + +Align active Project Instructions with current OWNER decisions for daily workflow, Product Owner testable completion, environment/API invariance, page-level Playwright organization, active team registry consistency, and Sprites ownership/backlog. + +## Scope + +Governance and backlog documentation only. + +No runtime code, UI code, API code, database code, start_of_day files, history snapshots, or unrelated cleanup were changed. + +## Changes + +- Clarified SOD/day-work/EOD workflow: + - SOD starts from latest synchronized `main`. + - Active work happens on one active team, OWNER, or scoped workstream branch. + - Sequential PRs stay on the active workstream branch during the day. + - `main` is only the SOD baseline and EOD return target unless OWNER approves a merge checkpoint. +- Added Product Owner testable completion definition. +- Confirmed `Browser -> API -> Database`, one API/service contract across environments, and `Local API` as the shared API running locally. +- Added page-path Playwright organization rules and examples. +- Fixed active team registry mismatch in `TEAM_ASSIGNMENTS.md`. +- Moved Sprites ownership/backlog from Bravo Sprite Studio V2 wording to Team Charlie Sprites canvas editor MVP. +- Removed Category as a Sprites MVP planning requirement. + +## Validation + +- PASS: documentation-only changed-file check. +- PASS: no runtime files changed. +- PASS: no UI files changed. +- PASS: no API files changed. +- PASS: no database files changed. +- PASS: no `start_of_day` files changed. +- PASS: no history snapshots rewritten. +- PASS: no active instruction permits direct PR commits to `main`. +- PASS: EOD/main-return wording is clarified as closeout or OWNER-approved merge checkpoint, not between stacked/sequential PRs. +- PASS: Product Owner testable definition exists. +- PASS: page-level Playwright organization exists. +- PASS: API/environment wording is consistent. +- PASS: active registry and assignment table agree for current Delta active assignment. + +## Artifact + +- `tmp/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_delta.zip` + +## Manual Validation Notes + +Reviewers should verify that daily team work now has one clear model: + +SOD from synchronized `main`, work on active workstream branch, no return to `main` between stacked/sequential PRs, and EOD return to synchronized `main`. diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md new file mode 100644 index 000000000..2fb14e1d7 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md @@ -0,0 +1,18 @@ +# Branch Validation + +Task: PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment +Date: 2026-06-26 + +| Check | Result | Notes | +| --- | --- | --- | +| Started from `main` | PASS | `main...origin/main` was `0 0` before branch creation. | +| Worktree clean before branch | PASS | Start gate passed. | +| Work committed only to OWNER branch | PASS | Branch is `PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment`. | +| No direct commit to `main` | PASS | No commit was made on `main`. | +| Active instruction files only | PASS | Changes are under `docs_build/dev/ProjectInstructions/` plus required reports. | +| Runtime files changed | PASS | None. | +| start_of_day files changed | PASS | None. | + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md new file mode 100644 index 000000000..13314c5de --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md @@ -0,0 +1,19 @@ +# Manual Validation Notes + +Task: PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment +Date: 2026-06-26 + +## Reviewer Checklist + +- Confirm `main` is described as SOD baseline and EOD return target, not the place for day-work commits. +- Confirm stacked/sequential PRs stay on the active workstream branch during the day. +- Confirm Product Owner testable excludes shell-only, placeholder-only, planned-only, or route-only completion. +- Confirm page-level Playwright tests follow runtime page paths. +- Confirm `Local API` means the shared API running locally. +- Confirm Team Charlie owns Sprites canvas editor MVP. +- Confirm Sprites planning requires canvas/grid editor, width/height controls, Palette/Colors-only reusable colors, pixel painting, API/database save/load, and Product Owner manual validation. +- Confirm Bravo no longer owns `Sprite Studio V2` in active backlog. + +## Manual Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md new file mode 100644 index 000000000..1f8de0718 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md @@ -0,0 +1,22 @@ +# Requirement Checklist + +Task: PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment +Date: 2026-06-26 + +| Requirement | Result | Notes | +| --- | --- | --- | +| Daily branch workflow documented | PASS | Added SOD/day-work/EOD wording. | +| Product Owner testable definition documented | PASS | Added in PR workflow and Tool MVP standard. | +| API/environment rule confirmed | PASS | Added `Browser -> API -> Database`, shared API contract, and Local API definition. | +| Page-level Playwright organization added | PASS | Added runtime path to test path rules and examples. | +| Active team registry consistency fixed | PASS | `TEAM_ASSIGNMENTS.md` now matches the active registry for Delta assignment. | +| Sprites ownership/backlog aligned | PASS | Team Charlie owns Sprites canvas editor MVP; Bravo Sprite Studio V2 line removed. | +| Category removed from Sprites planning | PASS | Backlog notes state Category is removed from Sprites MVP planning. | +| No runtime behavior changes | PASS | Documentation/governance only. | +| No history snapshots rewritten | PASS | No archive/history files changed. | +| Required reports generated | PASS | Report, branch validation, checklist, validation lane, manual notes, review diff, changed files. | +| Repo ZIP generated | PASS | ZIP is generated under `tmp/`. | + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md new file mode 100644 index 000000000..62834b32c --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md @@ -0,0 +1,31 @@ +# Validation Lane + +Task: PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment +Date: 2026-06-26 + +## Commands + +```text +git diff --check +git diff --name-only +rg -n "Always return to main before starting the next PR|Sprite Studio V2" docs_build/dev/ProjectInstructions +rg -n "Product Owner testable|page-level Playwright|Browser -> API -> Database|Local API" docs_build/dev/ProjectInstructions +``` + +## Results + +- PASS: `git diff --check` +- PASS: changed files are active Project Instructions plus required reports only. +- PASS: no runtime/UI/API/database/start_of_day files changed. +- PASS: no `Sprite Studio V2` active backlog owner remains. +- PASS: Product Owner testable text exists. +- PASS: page-level Playwright organization text exists. +- PASS: API/environment contract text exists. + +## Playwright + +Not run. This is a documentation/governance-only PR with no runtime page, API, or UI behavior changes. + +## Result + +PASS diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index 1feb80f42..084473945 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,4 +1,18 @@ +docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md +docs_build/dev/ProjectInstructions/addendums/environment_configuration_standards.md +docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md +docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md +docs_build/dev/ProjectInstructions/addendums/pr_workflow.md +docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md +docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md +docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md +docs_build/dev/ProjectInstructions/backlog/BACKLOG_MASTER.md +docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md +docs_build/dev/ProjectInstructions/team_assignments/team_ownership.md +docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md +docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md +docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md +docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md +docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md docs_build/dev/reports/codex_changed_files.txt docs_build/dev/reports/codex_review.diff -docs_build/dev/reports/PR_26177_BRAVO_015-final-eod-closeout.md -docs_build/dev/reports/PR_26177_BRAVO_EOD-closeout.md diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index 6861698654757c9328dcdcf1b936f3798f42c9ab..d83c08e982f78251519c1edce6e23b6faba480d9 100644 GIT binary patch literal 59060 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 Mmj<2po;TnB1CMW;5&!@I literal 7658 zcmcgxTT|n>5`Oou=&JJ=oO=k9t*shvQ#EzwLIFGHg(|GrGVzXMd2Kns{`&K^Bs&g- za2a-a01~UER$ssV93^o~zJHTw61_-;<@LNu(x?~7Rj-h_Ds*-~kEi0QD~jr-&Nw0|J?Y0&TQkH?vTGA*6ia)@+W&AsKdYT;iwQaN*YZyLTKQ!zWw;2su!PxWMyD{E5nhTU>k@oH3sFRVsa2la zC%bl{xeP^BN;*r${cVxlEHoW23bjnCB_&y@MVgu$QY?}b`^{yn3Q5T_7a^-XFVt-* z3tBa{piot5L`9VuHSI0`r;49Rc0;<5lEPGqj6|#O!*BN)ihxV8oaLyST?+2PCqHZbeC%(v(-_!d%~)i|yRHvNcZE>+En#eHa}5t{!16 zcew+`oTn=MiEFcdTl~Ryv_5g(wPrT1nK;+@DogK4Mu{$4*ZlV^93_$QLtLfMBNrvq zcvaSYmBkGlcy?ZToX*2B=QDl}`Yxl_sTavyBCWFUo>UPbNDH}2N$l1s%^!rGv?2BF6_(h=7jOGB+36Ef2xbmSZQ-ma~*oq;3nI=YLbQWEY^SX#9%= zGr1+SmdhN8-lb+msIoXsLS53WM6H1%RF$DvwDM0cq^WZ#11cvKhE-u7o9eWsC~=m! z=r(6V3wcwR(uR0$j{X;vv&pq_{;LAH)paqMD~kxmaIgm(a=lLdxiK#?DIgeX}&Mw>g((mFgJ{N2Vm8 z!|YMtv?~1D>XPd~#+Swn4|*JOo4$Q_4?o+!XSxw=h5k?n>5QdWKFIPrldrC4x>iZt zVz_q(@4gVOLTrc9?Cev0^ZH>(!Wiz{jvLCwspq4L}uoIGzmBA z4auMZ3!wB+2B5%E1c^7E#zIWL~`?1o(7BCut4gKG*^-7L_l_WNThB`R9PeUnc-%~lC; z$Wmt7HRfX0z@0Vtf~Ueti+PHQS<*5oOU6(Cl5>-?(U? zxrIo7=^Ri)O^!GA;8WhWUXNAEEw$x*XO~uG+VnuHLal?cRje+RtyZ6^EabK-(k_RG zDOtV`W&Z?{{CzDNSU=PmG`4lE4m{T+auhcd0NfUEyg|vwP1$H%@+;ccCGir4_f*-MDf-V#s~;ut`H zOafDuk>47ILqbsSWI;!Q*E(?rB7g+z)-FI+h!G_+z^dYg2J|OUVHBV{BSA*Cjqs_% zR%Z@@t;K6=1IwEZ)N>$h=XMO{9&goxcsr$=Birr1xzDzz+qP>^`|Az!TT^pexNqx3 z@E&%1`Dt%3>&rLaX4frY(DKP+t3P|%t1#O+n3FQms<`KQA9L%gq>mZgaxk?0T-_Ze(V7E0IsI~Zc-^1ugNP8ALHu>1`Rh6rylz<9r33-sX`^A<0^ z%|EO%ba|li<8c#2!L}*k{gKS8kEv_piy#LYvMexlERil*1wjA!ri90|*_RA3aOa@h zRZ*f`61U-#SOK3iyv1OOb3m^d@MxpmRyuH^K+twH01s&xg>`n>*3WaT@3Pj)qO3c9 z;l<+SbW;%+(>TJ>0HMe1p`#3V^qv|HX}a$?q+d^3`fAO*o{e9b@;{g>O#qb~t%@RY zk5A7~js`t7qK%UnqPOM_hW0fp+a3;Voydh=n0*fGS-HKY*>j`p02G1^=E8e_=IC>wZzx6P2y23Vy9rywbK^k6g*9-2 zr^j7@0rQJbjqGikr+>r??_`9VJvdcuDxRIAiSj!mVnQIs8v`cxQTaCyWs<6g5v0wi z8(d$4*y#;NX7xI*EP=M&9&ACpwW@f!cCO|40v*zmkLPZ)@j1_T3NII$7F4^;k_@~h zGm=Tc#0rAt-i(Shn<(-eT&0ZzGcQJ!fgN=K)_R(=9>m6*gQ3+VZN#@Y{^$j7@L18i z>u@15aN^g7sqShFT~EHcdqTjyvzzxP12G&;<8F5l%lSb+9uHsi&hDvgcfPE9N{CDH zU~fzv{`K*r$APfz_2pCYyVqNezRTA2{3mvPOu@HkG(U9YK?@<`b*a~R>1Gq(M7}Ro R)PCRk Date: Fri, 26 Jun 2026 20:27:15 -0400 Subject: [PATCH 2/3] Clarify team-neutral branch workflow wording --- .../PROJECT_INSTRUCTIONS.md | 2 +- .../addendums/branch_lock_governance.md | 5 +++-- .../addendums/pr_workflow.md | 9 +++++---- ...ect_instructions_single_source_eod_lock.md | 6 ++++-- .../addendums/tool_mvp_stacked_pr_standard.md | 4 +++- ...tions-workflow-testable-tests-alignment.md | 8 +++++--- ...table-tests-alignment_branch-validation.md | 2 +- ...tests-alignment_manual-validation-notes.md | 3 ++- ...-tests-alignment_requirements-checklist.md | 1 + ...estable-tests-alignment_validation-lane.md | 2 ++ .../dev/reports/codex_changed_files.txt | 10 ++-------- docs_build/dev/reports/codex_review.diff | Bin 59060 -> 31850 bytes 12 files changed, 29 insertions(+), 23 deletions(-) diff --git a/docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md b/docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md index d9efb1741..55f4a69ec 100644 --- a/docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md +++ b/docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md @@ -93,7 +93,7 @@ OWNER override wording: `OWNER override approved: ` OWNER follows the same safety rules: -- One active OWNER branch at a time. +- One active Team OWNER branch at a time. - One active OWNER assignment at a time. - OWNER may override team locks, but may not silently delete, rewrite, or remove protected instructions. - OWNER override must be explicitly documented. diff --git a/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md b/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md index 39ec22516..6f797306d 100644 --- a/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md +++ b/docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md @@ -9,7 +9,8 @@ Keep active work attached to the correct assigned team, branch, and OWNER decisi ## Active Work Lock -- Work must occur on the assigned team or OWNER branch. +- Work must occur on the active team branch. +- This rule applies to all teams: OWNER, Team Alfa, Team Bravo, Team Charlie, Team Delta, and any future team. - An assigned work item keeps its owner of record until complete or OWNER reassignment. - Work must not move to another team, branch, or PR without OWNER approval. - A team with no active assignment, active branch, or active PR is inactive. @@ -26,7 +27,7 @@ Keep active work attached to the correct assigned team, branch, and OWNER decisi - Do not create a PR branch unless current branch is `main`, worktree is clean, `main...origin/main` is `0 0`, and `HEAD` SHA matches the published EOD SHA. - Follow the canonical START / WORK / END lifecycle in `docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md`. - Keep work on the active branch until the PR is merged, the branch is retired, EOD closeout begins, or OWNER says to return to `main`. -- For OWNER-approved stacked/sequential workstreams, sequential PR work stays on the active branch/workstream during the day and does not return to `main` between PRs. +- For OWNER-approved stacked/sequential workstreams, PR branches/commits stay on the active team branch/workstream during the day and do not return to `main` between PRs. - Do not commit directly to `main`. - HARD STOP before committing if current branch is `main`. - HARD STOP if the branch changes unexpectedly during implementation. diff --git a/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md b/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md index 06adda05e..a648e78ea 100644 --- a/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md +++ b/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md @@ -28,18 +28,19 @@ Define the standard pull request workflow for Game Foundry Studio. ## Daily Branch Workflow -OWNER-approved daily workflow: +Team-neutral daily workflow: - SOD starts from the latest synchronized `main`. -- SOD creates or updates one active team, OWNER, or scoped workstream branch. -- All implementation commits go to the active branch, not `main`. -- Sequential PRs stay on the active branch/workstream during the day when OWNER assigned a stacked or sequential workstream. +- SOD creates or updates one active team branch/workstream. +- Work must be committed only to the active team branch. +- PR branches/commits stay on the active team branch/workstream during the day when OWNER assigned a stacked or sequential workstream. - Do not return to `main` between stacked/sequential PRs in the same active workstream. - `main` is only the SOD baseline and the EOD return target, unless OWNER explicitly approves an intermediate merge checkpoint. - EOD merges or closes OWNER-approved work, pushes, returns to `main`, and verifies: - current branch is `main` - worktree clean - local/origin sync is `0 0` +- This rule applies to all teams: OWNER, Team Alfa, Team Bravo, Team Charlie, Team Delta, and any future team. This section supersedes older active wording that implies returning to `main` between every PR inside an OWNER-approved stacked/sequential workstream. diff --git a/docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md b/docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md index f0d4f8675..114b3b39f 100644 --- a/docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md +++ b/docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md @@ -91,7 +91,7 @@ main...origin/main HEAD equals published EOD SHA ``` -Only after ALL four pass may a branch be created or the active OWNER-approved workstream branch be updated. +Only after ALL four pass may a branch be created or the active team branch/workstream be updated. Create the PR branch: @@ -112,11 +112,13 @@ From branch creation until merge: - Remain on the PR branch. - Never checkout `main`. - Commit only on the PR branch. +- Work must be committed only to the active team branch. - Push only the PR branch. - Execute validation from the PR branch. - Open/update the PR from the PR branch. -- For OWNER-approved stacked/sequential workstreams, remain on the active workstream branch between sequential PRs during the day. +- For OWNER-approved stacked/sequential workstreams, PR branches/commits stay on the active team branch/workstream between sequential PRs during the day. - Do not return to `main` between sequential PRs in the same active workstream unless OWNER explicitly approves an EOD or intermediate merge checkpoint. +- This rule applies to all teams: OWNER, Team Alfa, Team Bravo, Team Charlie, Team Delta, and any future team. Hard Stops: diff --git a/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md b/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md index 28f1690ce..a90e80e19 100644 --- a/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md +++ b/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md @@ -102,6 +102,8 @@ Each PR in the stack still follows the canonical START / WORK / END lifecycle an When OWNER gives one large Codex command for a tool MVP stack, Codex may continue from one completed PR to the next without stopping for a conversational checkpoint, unless a blocker listed in this standard occurs. -During an OWNER-approved day workstream, sequential PRs stay on the active workstream branch and do not return to `main` between PRs. +During an OWNER-approved day workstream, PR branches/commits stay on the active team branch/workstream and do not return to `main` between PRs. + +This rule applies to all teams: OWNER, Team Alfa, Team Bravo, Team Charlie, Team Delta, and any future team. The final PR in the stack must perform normal EOD closeout or OWNER-approved merge-checkpoint closeout and stop all work after returning to synchronized main. diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md index 72901bcd7..68c6c85e3 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md @@ -18,8 +18,10 @@ No runtime code, UI code, API code, database code, start_of_day files, history s - Clarified SOD/day-work/EOD workflow: - SOD starts from latest synchronized `main`. - - Active work happens on one active team, OWNER, or scoped workstream branch. - - Sequential PRs stay on the active workstream branch during the day. + - Active work happens on one active team branch/workstream. + - Work must be committed only to the active team branch. + - PR branches/commits stay on the active team branch/workstream during the day. + - The rule applies to all teams: OWNER, Team Alfa, Team Bravo, Team Charlie, Team Delta, and any future team. - `main` is only the SOD baseline and EOD return target unless OWNER approves a merge checkpoint. - Added Product Owner testable completion definition. - Confirmed `Browser -> API -> Database`, one API/service contract across environments, and `Local API` as the shared API running locally. @@ -52,4 +54,4 @@ No runtime code, UI code, API code, database code, start_of_day files, history s Reviewers should verify that daily team work now has one clear model: -SOD from synchronized `main`, work on active workstream branch, no return to `main` between stacked/sequential PRs, and EOD return to synchronized `main`. +SOD from synchronized `main`, work on the active team branch/workstream, no return to `main` between stacked/sequential PRs, and EOD return to synchronized `main`. diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md index 2fb14e1d7..4fd37a376 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md @@ -7,7 +7,7 @@ Date: 2026-06-26 | --- | --- | --- | | Started from `main` | PASS | `main...origin/main` was `0 0` before branch creation. | | Worktree clean before branch | PASS | Start gate passed. | -| Work committed only to OWNER branch | PASS | Branch is `PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment`. | +| Work committed only to active team branch | PASS | Branch is `PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment`; no commit was made to `main`. | | No direct commit to `main` | PASS | No commit was made on `main`. | | Active instruction files only | PASS | Changes are under `docs_build/dev/ProjectInstructions/` plus required reports. | | Runtime files changed | PASS | None. | diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md index 13314c5de..e39c6fb20 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md @@ -6,7 +6,8 @@ Date: 2026-06-26 ## Reviewer Checklist - Confirm `main` is described as SOD baseline and EOD return target, not the place for day-work commits. -- Confirm stacked/sequential PRs stay on the active workstream branch during the day. +- Confirm stacked/sequential PR branches/commits stay on the active team branch/workstream during the day. +- Confirm this branch workflow applies to all teams: OWNER, Team Alfa, Team Bravo, Team Charlie, Team Delta, and any future team. - Confirm Product Owner testable excludes shell-only, placeholder-only, planned-only, or route-only completion. - Confirm page-level Playwright tests follow runtime page paths. - Confirm `Local API` means the shared API running locally. diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md index 1f8de0718..bfafe6af3 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md @@ -6,6 +6,7 @@ Date: 2026-06-26 | Requirement | Result | Notes | | --- | --- | --- | | Daily branch workflow documented | PASS | Added SOD/day-work/EOD wording. | +| Branch workflow is team-neutral | PASS | Active wording says work commits and sequential PR branches/commits stay on the active team branch/workstream and applies to all teams. | | Product Owner testable definition documented | PASS | Added in PR workflow and Tool MVP standard. | | API/environment rule confirmed | PASS | Added `Browser -> API -> Database`, shared API contract, and Local API definition. | | Page-level Playwright organization added | PASS | Added runtime path to test path rules and examples. | diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md index 62834b32c..8954b319b 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md @@ -18,6 +18,8 @@ rg -n "Product Owner testable|page-level Playwright|Browser -> API -> Database|L - PASS: changed files are active Project Instructions plus required reports only. - PASS: no runtime/UI/API/database/start_of_day files changed. - PASS: no `Sprite Studio V2` active backlog owner remains. +- PASS: no OWNER-only branch workflow wording remains. +- PASS: active branch workflow says commits and sequential PR branches/commits stay on the active team branch/workstream. - PASS: Product Owner testable text exists. - PASS: page-level Playwright organization text exists. - PASS: API/environment contract text exists. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index 084473945..cc6e91d79 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,14 +1,8 @@ -docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md -docs_build/dev/ProjectInstructions/addendums/environment_configuration_standards.md -docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md -docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md +docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md +docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md docs_build/dev/ProjectInstructions/addendums/pr_workflow.md docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md -docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md -docs_build/dev/ProjectInstructions/backlog/BACKLOG_MASTER.md -docs_build/dev/ProjectInstructions/team_assignments/TEAM_ASSIGNMENTS.md -docs_build/dev/ProjectInstructions/team_assignments/team_ownership.md docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index d83c08e982f78251519c1edce6e23b6faba480d9..94dcb3ae63d4581e48fb57266c3a23ee928678e0 100644 GIT binary patch delta 4641 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 Mmj<2po;TnB1CMW;5&!@I From 7f36b7d3dc98a9ae2ec9ccc29aa20a814ffce5a8 Mon Sep 17 00:00:00 2001 From: Charlie Team <97194984+ToolboxAid@users.noreply.github.com> Date: Fri, 26 Jun 2026 20:37:39 -0400 Subject: [PATCH 3/3] Strengthen Product Owner testable governance --- .../codex_artifact_and_reporting_standard.md | 4 +-- .../no_mock_repository_runtime_source.md | 6 ++-- .../addendums/pr_workflow.md | 26 +++++++++++++++--- .../test_structure_standardization.md | 4 ++- .../addendums/tool_mvp_stacked_pr_standard.md | 26 ++++++++++++++---- ...tions-workflow-testable-tests-alignment.md | 6 +++- ...tests-alignment_manual-validation-notes.md | 3 ++ ...-tests-alignment_requirements-checklist.md | 4 +++ ...estable-tests-alignment_validation-lane.md | 8 ++++-- .../dev/reports/codex_changed_files.txt | 7 ++--- docs_build/dev/reports/codex_review.diff | Bin 31850 -> 39988 bytes 11 files changed, 72 insertions(+), 22 deletions(-) diff --git a/docs_build/dev/ProjectInstructions/addendums/codex_artifact_and_reporting_standard.md b/docs_build/dev/ProjectInstructions/addendums/codex_artifact_and_reporting_standard.md index 7bf38c1f8..1c3671363 100644 --- a/docs_build/dev/ProjectInstructions/addendums/codex_artifact_and_reporting_standard.md +++ b/docs_build/dev/ProjectInstructions/addendums/codex_artifact_and_reporting_standard.md @@ -37,7 +37,7 @@ Codex responses must include: ## Tool MVP PR Report Requirements Every tool MVP PR report must include: -- Creator-testable outcome +- Product Owner testable outcome - What Playwright tests - What Mr. Q should manually test - Whether the PR is part of a stacked MVP sequence @@ -50,7 +50,7 @@ The report must answer: What can Mr. Q test after applying this ZIP? ``` -If a tool MVP PR has no Playwright lane, the report must state why and list the manual Creator validation instead. +If a tool MVP PR has no Playwright lane, the report must state why and list the manual Product Owner validation instead. ## Code Change Reporting diff --git a/docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md b/docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md index 3c4c5b516..c859e78e5 100644 --- a/docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md +++ b/docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md @@ -20,7 +20,7 @@ Browser -> API -> Database ## Rules - Mock repositories are 100% technical debt. -- "Mock repository ready" is not a valid Creator-testable completion state. +- "Mock repository ready" is not a valid Product Owner testable completion state. - Page arrays are not product-data sources of truth. - JSON source files are not product-data sources of truth. - `/tmp` files are not product-data sources of truth. @@ -38,7 +38,7 @@ If a temporary mock repository exists for transition, it must be documented as t - affected files - removal PR - replacement API/DB path -- Creator-testable limitation +- Product Owner testable limitation Temporary mock repositories do not make a feature complete. They may only document a transition state. @@ -52,4 +52,4 @@ Completion requires Game Configuration data to load through: Browser → API → Database ``` -The Creator-testable completion state must prove that browser-visible Game Configuration data was read back through the API/service contract backed by the database. +The Product Owner testable completion state must prove that browser-visible Game Configuration data was read back through the API/service contract backed by the database. diff --git a/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md b/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md index a648e78ea..145d08536 100644 --- a/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md +++ b/docs_build/dev/ProjectInstructions/addendums/pr_workflow.md @@ -143,14 +143,14 @@ Tool MVP work must follow: `docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md` -For tool MVPs, use one large Codex command, multiple focused stacked PRs, and one testable Creator outcome per PR. +For tool MVPs, use one large Codex command, multiple focused stacked PRs, and one Product Owner testable outcome per PR. Do not create one giant PR. Do not stop after every small PR unless blocked by branch state, failed validation, missing source files, Project Instructions conflict, or an unresolved dependency from a prior PR. Each tool MVP PR plan or template must include: -- Creator-testable outcome +- Product Owner testable outcome - What Playwright tests - What Mr. Q should manually test - Whether the PR is part of a stacked MVP sequence @@ -161,15 +161,29 @@ Visible acceptance must be Creator-facing first. Architecture can be handled und ## Product Owner Testable Definition -A request to complete a page, tool, or testable MVP means Product Owner testable. +A request to complete a page, tool, MVP, or testable experience means Product Owner testable by default. Codex must deliver a working Product Owner testable feature, not a shell or foundation page, unless the Product Owner explicitly requests a shell/foundation PR. + +A Product Owner testable outcome means the Product Owner can: + +- open the page/tool +- perform the primary workflow +- save/load data where applicable +- observe expected results +- validate success and failure states +- follow manual validation steps from the PR report Not acceptable as a completed/testable page or tool: - shell-only page +- route-only page +- navigation-only PR +- template-only page +- placeholder controls +- static table with no workflow - `Not implemented yet` +- `coming soon` - placeholder-only workspace, inspector, or output sections - planned-only tile -- template-only page - route that loads but cannot be used Required for Product Owner testable completion: @@ -182,6 +196,10 @@ Required for Product Owner testable completion: - manual validation steps for Product Owner - targeted Playwright coverage where impacted. +## No-Shell Completion Rule + +A PR requested to complete a page, tool, MVP, or testable experience must not stop after route creation, shell creation, placeholder UI, static mock layout, or navigation activation unless the Product Owner explicitly requested a shell/foundation PR. + ## OWNER Shortcut: PRs Keyword: diff --git a/docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md b/docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md index bb51300ed..93a67afb4 100644 --- a/docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md +++ b/docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md @@ -34,7 +34,7 @@ Regression tests: - Tool tests validate tool functionality. - Regression tests validate platform behavior. - New tests follow the canonical structure. -- Every user-accessible page must have at least one page-level Playwright test. +- Every user-accessible page must have at least one matching page-level Playwright test before it can be considered complete. - Runtime page path determines the page-level Playwright test path. - Primary page-level Playwright test file should be `index.spec.mjs`. - Do not organize new page-level Playwright tests only by feature nickname or technology bucket when a page path exists. @@ -56,6 +56,8 @@ Minimum page-level test: - page renders - navigation works - no visible placeholder-only state for completed/testable pages +- primary workflow is covered where the PR claims Product Owner testable completion +- save/load and validation are covered where applicable - no runtime console errors when feasible Additional scenario files may use: diff --git a/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md b/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md index a90e80e19..2bcc52a60 100644 --- a/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md +++ b/docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md @@ -12,7 +12,7 @@ Define how Codex plans and executes Creator-facing tool MVP work without creatin For tool MVPs, use: ```text -One large Codex command -> multiple focused stacked PRs -> each PR has a testable Creator outcome. +One large Codex command -> multiple focused stacked PRs -> each PR has a Product Owner testable outcome. ``` ## Rules @@ -20,7 +20,7 @@ One large Codex command -> multiple focused stacked PRs -> each PR has a testabl - Do not create one giant PR. - Do not stop after every small PR unless blocked. - Each PR must be independently scoped. -- Each PR must produce a Creator-testable outcome. +- Each PR must produce a Product Owner testable outcome. - Each PR must answer: ```text @@ -40,15 +40,29 @@ For tool MVP PR planning, visible acceptance must be Creator-facing first. Architecture can be handled under the covers, but PR purpose must be user-testable. -A request to complete a page, tool, or testable MVP means Product Owner testable. +A request to complete a page, tool, MVP, or testable experience means Product Owner testable by default. Codex must deliver a working Product Owner testable feature, not a shell or foundation page, unless the Product Owner explicitly requests a shell/foundation PR. + +A Product Owner testable outcome means the Product Owner can: + +- open the page/tool +- perform the primary workflow +- save/load data where applicable +- observe expected results +- validate success and failure states +- follow manual validation steps from the PR report Not acceptable as complete/testable: - shell-only page +- route-only page +- navigation-only PR +- template-only page +- placeholder controls +- static table with no workflow - `Not implemented yet` +- `coming soon` - placeholder-only workspace, inspector, or output sections - planned-only tile -- template-only page - route that loads but cannot be used Required for Product Owner testable completion: @@ -62,7 +76,7 @@ Required for Product Owner testable completion: - targeted Playwright coverage where impacted. Each tool MVP PR must state: -- Creator-testable outcome +- Product Owner testable outcome - What Playwright tests - What Mr. Q should manually test - Whether the PR is part of a stacked MVP sequence @@ -71,6 +85,8 @@ Each tool MVP PR must state: ## Runtime Data Completion Boundary +A PR requested to complete a page, tool, MVP, or testable experience must not stop after route creation, shell creation, placeholder UI, static mock layout, or navigation activation unless the Product Owner explicitly requested a shell/foundation PR. + A PR outcome must not be described as complete if the visible data is coming from: - mock repositories diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md index 68c6c85e3..96bc721e6 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md @@ -24,6 +24,9 @@ No runtime code, UI code, API code, database code, start_of_day files, history s - The rule applies to all teams: OWNER, Team Alfa, Team Bravo, Team Charlie, Team Delta, and any future team. - `main` is only the SOD baseline and EOD return target unless OWNER approves a merge checkpoint. - Added Product Owner testable completion definition. +- Replaced validation/completion-gate `Creator-testable` wording with Product Owner testable wording while preserving product-facing Creator language where appropriate. +- Added the no-shell completion rule for page/tool/MVP requests. +- Strengthened page-level Playwright completion gates for primary workflows, save/load, and validation coverage where applicable. - Confirmed `Browser -> API -> Database`, one API/service contract across environments, and `Local API` as the shared API running locally. - Added page-path Playwright organization rules and examples. - Fixed active team registry mismatch in `TEAM_ASSIGNMENTS.md`. @@ -42,7 +45,8 @@ No runtime code, UI code, API code, database code, start_of_day files, history s - PASS: no active instruction permits direct PR commits to `main`. - PASS: EOD/main-return wording is clarified as closeout or OWNER-approved merge checkpoint, not between stacked/sequential PRs. - PASS: Product Owner testable definition exists. -- PASS: page-level Playwright organization exists. +- PASS: shell/template/navigation-only completion is explicitly disallowed unless requested by Product Owner. +- PASS: page-level Playwright completion gate exists. - PASS: API/environment wording is consistent. - PASS: active registry and assignment table agree for current Delta active assignment. diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md index e39c6fb20..c275c0c72 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md @@ -9,7 +9,10 @@ Date: 2026-06-26 - Confirm stacked/sequential PR branches/commits stay on the active team branch/workstream during the day. - Confirm this branch workflow applies to all teams: OWNER, Team Alfa, Team Bravo, Team Charlie, Team Delta, and any future team. - Confirm Product Owner testable excludes shell-only, placeholder-only, planned-only, or route-only completion. +- Confirm Product Owner testable means the Product Owner can open the page/tool, perform the primary workflow, save/load where applicable, observe expected results, validate success/failure states, and follow PR-report manual steps. +- Confirm page/tool/MVP completion PRs cannot stop at route creation, shell creation, placeholder UI, static mock layout, or navigation activation unless Product Owner requested a shell/foundation PR. - Confirm page-level Playwright tests follow runtime page paths. +- Confirm page-level Playwright completion gates cover primary workflows and save/load/validation where applicable. - Confirm `Local API` means the shared API running locally. - Confirm Team Charlie owns Sprites canvas editor MVP. - Confirm Sprites planning requires canvas/grid editor, width/height controls, Palette/Colors-only reusable colors, pixel painting, API/database save/load, and Product Owner manual validation. diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md index bfafe6af3..75b5ad8b6 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md @@ -8,6 +8,10 @@ Date: 2026-06-26 | Daily branch workflow documented | PASS | Added SOD/day-work/EOD wording. | | Branch workflow is team-neutral | PASS | Active wording says work commits and sequential PR branches/commits stay on the active team branch/workstream and applies to all teams. | | Product Owner testable definition documented | PASS | Added in PR workflow and Tool MVP standard. | +| Ambiguous Creator-testable completion wording replaced | PASS | Completion/validation gates now use Product Owner testable wording; product-facing Creator language is preserved. | +| No-shell PR rule added | PASS | Completion requests may not stop at routes, shells, placeholder UI, static mock layouts, or navigation activation unless explicitly requested. | +| Product Owner testable outcome definition expanded | PASS | Defines opening the page/tool, primary workflow, save/load where applicable, expected results, success/failure states, and PR-report manual steps. | +| Page-level Playwright completion gate strengthened | PASS | Requires matching page-level tests before completion, including primary workflow and save/load/validation where applicable. | | API/environment rule confirmed | PASS | Added `Browser -> API -> Database`, shared API contract, and Local API definition. | | Page-level Playwright organization added | PASS | Added runtime path to test path rules and examples. | | Active team registry consistency fixed | PASS | `TEAM_ASSIGNMENTS.md` now matches the active registry for Delta assignment. | diff --git a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md index 8954b319b..f098579ae 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md +++ b/docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md @@ -9,7 +9,8 @@ Date: 2026-06-26 git diff --check git diff --name-only rg -n "Always return to main before starting the next PR|Sprite Studio V2" docs_build/dev/ProjectInstructions -rg -n "Product Owner testable|page-level Playwright|Browser -> API -> Database|Local API" docs_build/dev/ProjectInstructions +rg -n "Creator-testable|testable Creator outcome|manual Creator validation" docs_build/dev/ProjectInstructions +rg -n "Product Owner testable|no-shell|route-only page|static table with no workflow|page-level Playwright|primary workflow is covered|Browser -> API -> Database|Local API" docs_build/dev/ProjectInstructions ``` ## Results @@ -20,8 +21,11 @@ rg -n "Product Owner testable|page-level Playwright|Browser -> API -> Database|L - PASS: no `Sprite Studio V2` active backlog owner remains. - PASS: no OWNER-only branch workflow wording remains. - PASS: active branch workflow says commits and sequential PR branches/commits stay on the active team branch/workstream. +- PASS: no `Creator-testable`, `testable Creator outcome`, or `manual Creator validation` completion-gate wording remains. +- PASS: Product Owner testable outcome definition includes primary workflow, save/load where applicable, expected results, success/failure states, and PR-report manual steps. +- PASS: no-shell completion rule exists. - PASS: Product Owner testable text exists. -- PASS: page-level Playwright organization text exists. +- PASS: page-level Playwright completion gate includes primary workflow and save/load/validation coverage where applicable. - PASS: API/environment contract text exists. ## Playwright diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index cc6e91d79..98a71e332 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,10 +1,9 @@ -docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md -docs_build/dev/ProjectInstructions/addendums/branch_lock_governance.md +docs_build/dev/ProjectInstructions/addendums/codex_artifact_and_reporting_standard.md +docs_build/dev/ProjectInstructions/addendums/no_mock_repository_runtime_source.md docs_build/dev/ProjectInstructions/addendums/pr_workflow.md -docs_build/dev/ProjectInstructions/addendums/project_instructions_single_source_eod_lock.md +docs_build/dev/ProjectInstructions/addendums/test_structure_standardization.md docs_build/dev/ProjectInstructions/addendums/tool_mvp_stacked_pr_standard.md docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment.md -docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_branch-validation.md docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_manual-validation-notes.md docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_requirements-checklist.md docs_build/dev/reports/PR_26177_OWNER_009-project-instructions-workflow-testable-tests-alignment_validation-lane.md diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index 94dcb3ae63d4581e48fb57266c3a23ee928678e0..246e75adfa83fde73e4ce82f92b9e708e7006f54 100644 GIT binary patch literal 39988 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 D0uoR4 literal 31850 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 Hdc6M!=`^hz