From 4e724ec189ed9901d3c3c9b7dd826a8544311da7 Mon Sep 17 00:00:00 2001 From: Alfa Team Date: Sun, 28 Jun 2026 08:37:45 -0400 Subject: [PATCH] Add Owner PR stack realignment plan --- ...-pr-stack-realignment_branch-validation.md | 10 + ...ack-realignment_manual-validation-notes.md | 20 ++ ...9_OWNER_009-pr-stack-realignment_report.md | 160 +++++++++ ...stack-realignment_requirement-checklist.md | 13 + ...-pr-stack-realignment_validation-report.md | 54 +++ dev/reports/codex_changed_files.txt | 28 +- dev/reports/codex_review.diff | 319 +----------------- 7 files changed, 282 insertions(+), 322 deletions(-) create mode 100644 dev/reports/PR_26179_OWNER_009-pr-stack-realignment_branch-validation.md create mode 100644 dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md create mode 100644 dev/reports/PR_26179_OWNER_009-pr-stack-realignment_report.md create mode 100644 dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md create mode 100644 dev/reports/PR_26179_OWNER_009-pr-stack-realignment_validation-report.md diff --git a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_branch-validation.md b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_branch-validation.md new file mode 100644 index 000000000..e9e9ffc52 --- /dev/null +++ b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_branch-validation.md @@ -0,0 +1,10 @@ +# PR_26179_OWNER_009 Branch Validation + +| Check | Result | Evidence | +| --- | --- | --- | +| Start branch was `main` | PASS | `git branch --show-current` returned `main` before branch creation. | +| Worktree was clean before branch creation | PASS | `git status --short --branch` showed clean `main`. | +| Local main was synced with origin/main | PASS | `git rev-list --left-right --count main...origin/main` returned `0 0`. | +| PR branch created | PASS | Created `PR_26179_OWNER_009-pr-stack-realignment`. | +| Scope is governance/report only | PASS | Planned changes are limited to `dev/reports/` and ZIP output. | +| Rebased after main advanced | PASS | `origin/main` advanced through merged #250 during PR preparation; branch was rebased onto latest `origin/main` and only generated evidence conflicts were resolved. | diff --git a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md new file mode 100644 index 000000000..1552e7096 --- /dev/null +++ b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md @@ -0,0 +1,20 @@ +# PR_26179_OWNER_009 Manual Validation Notes + +## Manual Review + +Reviewed the focused open PR set and produced recommendations without changing PR state. + +## Decisions + +- Charlie Sprites implementation PRs should be rebuilt from current `main` rather than rebased. +- Tool Display PRs should be rebuilt or closed depending on whether the feature remains desired. +- Legal governance leftover PR #176 should be closed unless Owner still needs the content, in which case it should be recreated from current `main`. +- Stale report-only Charlie PR #219 should be closed after confirming no unique content must be preserved. + +## Non-Impact + +- No runtime files changed. +- No production pages changed. +- No API files changed. +- No database files changed. +- No GitHub PRs were merged or closed. diff --git a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_report.md b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_report.md new file mode 100644 index 000000000..29f2c290f --- /dev/null +++ b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_report.md @@ -0,0 +1,160 @@ +# PR_26179_OWNER_009-pr-stack-realignment + +## Purpose + +Produce a no-code Owner governance plan for the remaining open PRs that require rebase, rebuild, close, or preservation decisions. + +This PR does not modify runtime code, production pages, branches, or open PR state. + +## Review Scope + +Focused PRs: + +- #228 `PR_26177_CHARLIE_018-sprites-testable-mvp-completion` +- #227 `PR_26177_CHARLIE_017-sprites-toolbox-entry-active` +- #226 `PR_26177_CHARLIE_016-sprites-playwright-final-polish` +- #225 `PR_26177_CHARLIE_015-sprites-reference-protection` +- #224 `PR_26177_CHARLIE_014-sprites-tags-categories-search` +- #223 `PR_26177_CHARLIE_013-sprites-import-preview-metadata-palette` +- #222 `PR_26177_CHARLIE_012-sprites-library-crud` +- #221 `PR_26177_CHARLIE_011-sprites-tool-shell` +- #220 `PR_26177_CHARLIE_010-sprites-api-db-foundation` +- #219 `PR_26177_CHARLIE_009-sprites-legacy-audit-plan` +- #198 `PR_26176_006 Alfa Tool Display validation closeout` +- #196 `PR_26176_005 Tool Display Mode single-line layout` +- #176 `PR_26175_OWNER_055: retain legal governance leftovers` + +Non-focus PR #250 `PR_26171_ALFA_009-team-aware-bootstrap` merged while this report branch was being prepared. It was not modified by this plan and remains outside the requested focus set. + +## Method + +Read-only GitHub inspection was performed with `gh pr view`, `gh pr list`, GitHub compare data against `main`, and review-thread checks. + +Evidence captured: + +- base branch +- head branch +- draft status +- merge state +- mergeability +- CI/check rollup +- unresolved review conversations +- ahead/behind counts relative to `main` +- changed-file roots + +## Executive Recommendation + +Do not merge any focused PR in its current state. + +The Charlie Sprites stack and the Tool Display pair were created before the current repository structure and are substantially behind `main`. Many still reference obsolete `docs_build/` paths and several are based on other PR branches instead of `main`. + +Recommended governance action: + +1. Close stale report/audit-only PRs. +2. Rebuild implementation PRs from current `main` using canonical paths. +3. Preserve useful intent and test evidence in recreated PRs. +4. Do not rebase old branches unless the PR has no obsolete path references and no scope overlap. + +## PR-by-PR Realignment Plan + +| PR | Current State | Evidence | Recommendation | Owner Action | +| ---: | --- | --- | --- | --- | +| #228 | Draft, conflicting, 115 behind `main`, 3 commits ahead | Touches `assets/`, `src/`, `tests/`, `toolbox/`, and obsolete `docs_build/` reports | Rebuild | Recreate from current `main` after lower Sprites dependencies are rebuilt and merged. Preserve the Creator-testable completion intent, but do not rebase this branch. | +| #227 | Draft, conflicting, 115 behind `main`, 2 commits ahead | Touches local API/tool metadata/tests and obsolete `docs_build/` reports | Rebuild | Recreate from current `main` after the Sprites tool shell and metadata path are current. Preserve route/toolbox-entry intent only. | +| #226 | Draft, clean against PR base, 117 behind `main`, target is #225 branch | Targets a PR branch, not `main`; includes obsolete `docs_build/` reports | Rebuild | Close/recreate after #225 replacement lands. Do not merge as stacked branch targeting another open PR. | +| #225 | Draft, clean against PR base, 117 behind `main`, target is #224 branch | Targets a PR branch, not `main`; touches Sprites UI/test files plus obsolete reports | Rebuild | Recreate from current `main` after #224 replacement lands. Preserve reference-protection behavior and tests. | +| #224 | Draft, clean against PR base, 117 behind `main`, target is #223 branch | Targets a PR branch, not `main`; touches Sprites UI/test files plus obsolete reports | Rebuild | Recreate from current `main` after #223 replacement lands. Preserve tags/categories/search intent only. | +| #223 | Draft, clean against PR base, 117 behind `main`, target is #222 branch | Targets a PR branch, not `main`; touches Sprites UI/test files plus obsolete reports | Rebuild | Recreate from current `main` after #222 replacement lands. Preserve import/preview/metadata/palette intent only. | +| #222 | Draft, clean against PR base, 117 behind `main`, target is #221 branch | Targets a PR branch, not `main`; touches Sprites UI/test files plus obsolete reports | Rebuild | Recreate from current `main` after #221 replacement lands. Preserve library CRUD intent and tests. | +| #221 | Draft, conflicting, 117 behind `main`, no current checks | Base `main`, but conflicts and obsolete reports remain | Rebuild | Recreate from current `main` after #220 replacement lands. Do not rebase because no checks and path drift are present. | +| #220 | Draft, conflicting, 117 behind `main`, 1 commit ahead | Touches DB/API/test files and obsolete `docs_build/database` / `docs_build/dev` paths | Rebuild first | Recreate from current `main` using canonical `dev/build/database/`, `dev/tests/`, and `dev/reports/` paths. This is the first active Sprites implementation dependency. | +| #219 | Draft, conflicting, 117 behind `main`, report-only audit plan | Only obsolete `docs_build/dev/reports` files | Close | Close as superseded by the later Sprites implementation stack. Preserve any useful audit findings only if a future current-path report is needed. | +| #198 | Draft, clean against PR base, 200 behind `main`, target is #196 branch | Report-only validation closeout based on stale Tool Display branch | Close or rebuild after #196 | Close if #196 is abandoned. If Tool Display is rebuilt, create a new validation closeout from current `main` only after the rebuilt implementation PR exists. | +| #196 | Draft, conflicting, 200 behind `main`, no current checks | Touches theme CSS/JS/tests and obsolete `docs_build` reports | Rebuild | Recreate from current `main` if the single-line Tool Display change is still desired. Do not rebase the stale branch. | +| #176 | Open, conflicting, 200 behind `main`, 5 unresolved threads | Retains legal governance leftovers in obsolete `docs_build/` paths | Close or recreate | Close unless Owner still needs the legal governance content. If needed, recreate from current `main` under canonical `dev/build/` or production `docs/` ownership after resolving review feedback. | + +## Recommended Dependency Order + +### Charlie Sprites + +Recommended rebuild order: + +1. #220 replacement: Sprites API/database foundation +2. #221 replacement: Sprites tool shell +3. #222 replacement: Sprites library CRUD +4. #223 replacement: import, preview, metadata, palette +5. #224 replacement: tags, categories, search +6. #225 replacement: reference protection +7. #226 replacement: Playwright final polish +8. #227 replacement: toolbox entry active +9. #228 replacement: testable MVP completion + +Current #219 should be closed before this rebuild sequence begins. + +### Tool Display + +Recommended sequence: + +1. Decide whether the Tool Display single-line layout remains desired. +2. If yes, rebuild #196 from current `main`. +3. Recreate #198 only if a separate validation closeout is still useful after the #196 replacement. + +### Legal Governance Leftovers + +Recommended sequence: + +1. Resolve whether the content in #176 is still needed. +2. If not needed, close #176. +3. If needed, recreate from current `main` with canonical paths and resolved review feedback. + +## Duplicate Or Overlapping Implementations + +- #220 through #228 overlap as a single Sprites implementation chain and should be managed as one ordered rebuild. +- #227 and #228 overlap with earlier Sprites tool metadata, route, and UI work; they should not be rebuilt until lower dependencies land. +- #196 and #198 are a stale Tool Display implementation/validation pair. +- #176 overlaps with already-completed repository restructuring because it uses obsolete `docs_build/` locations. + +## Branch And Target Issues + +PRs targeting a non-main branch: + +- #222 targets `PR_26177_CHARLIE_011-sprites-tool-shell` +- #223 targets `PR_26177_CHARLIE_012-sprites-library-crud` +- #224 targets `PR_26177_CHARLIE_013-sprites-import-preview-metadata-palette` +- #225 targets `PR_26177_CHARLIE_014-sprites-tags-categories-search` +- #226 targets `PR_26177_CHARLIE_015-sprites-reference-protection` +- #198 targets `PR_26176_005-tool-display-mode-single-line-layout` + +These should not be merged as-is under current governance. + +## Merge Risk + +High-risk PRs: + +- #228, #227, #221, #220, #196, and #176 because they are conflicting. +- #176 because it also has unresolved review conversations. +- #220 because it touches database/API paths and must be rebuilt using current Postgres/API governance. + +Medium-risk PRs: + +- #222 through #226 because they are clean only against stale PR branches and are far behind current `main`. +- #198 because it is report-only but depends on stale #196. + +Low-risk closure: + +- #219, because it is report-only and superseded by later Sprites work. + +## Owner Action Queue + +1. Close #219 after confirming no unique audit content needs preservation. +2. Decide whether #176 content is still needed; close or recreate. +3. Decide whether #196 Tool Display work is still desired. +4. Rebuild #220 from current `main` before any other Sprites implementation PR. +5. Rebuild each remaining Sprites PR one at a time from current `main`. +6. Treat merged #250 as current `main` baseline context only; it is not part of the requested focus set. + +## No-Code Confirmation + +This PR is documentation/governance only. + +No runtime code, production page, API, database, branch, or GitHub PR state changes are included in this PR. diff --git a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md new file mode 100644 index 000000000..f5b8efdfa --- /dev/null +++ b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md @@ -0,0 +1,13 @@ +# PR_26179_OWNER_009 Requirement Checklist + +| Requirement | Status | Notes | +| --- | --- | --- | +| Review remaining open PRs in requested focus set | PASS | Reviewed #228, #227, #226, #225, #224, #223, #222, #221, #220, #219, #198, #196, and #176. | +| Produce no-code Owner plan | PASS | Plan added in `dev/reports/PR_26179_OWNER_009-pr-stack-realignment_report.md`. | +| Recommend rebase, rebuild, close, or preserve for each PR | PASS | Each PR has an explicit recommendation and Owner action. | +| Do not modify code | PASS | Only governance/report files are changed. | +| Do not merge PRs | PASS | No PRs were merged. | +| Do not close PRs unless explicitly instructed | PASS | No PRs were closed by this PR. | +| Produce recommendation report only | PASS | Report-only governance deliverable. | +| Use canonical report location | PASS | Reports are under `dev/reports/`. | +| Produce outcome ZIP | PASS | ZIP to be generated under `dev/workspace/zips/`. | diff --git a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_validation-report.md b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_validation-report.md new file mode 100644 index 000000000..305fdbccf --- /dev/null +++ b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_validation-report.md @@ -0,0 +1,54 @@ +# PR_26179_OWNER_009 Validation Report + +## Validation Scope + +This is a no-code governance/report PR. + +Runtime, product UI, API, database, and branch state changes are intentionally out of scope. + +## Commands + +Required validation: + +```text +git diff --check +``` + +Additional repository-structure validation: + +```text +npm run validate:canonical-structure +``` + +## Results + +| Command | Result | Notes | +| --- | --- | --- | +| `git diff --check` | PASS | No whitespace errors. | +| `npm run validate:canonical-structure` | PASS | Canonical repository structure guardrail passed with 0 blocking violations. | + +Playwright and platform runtime validation were not run because this PR is documentation/governance only and does not modify runtime, UI, API, database, or production page files. + +## GitHub Review Evidence + +Read-only GitHub inspection was used to verify: + +- PR status +- base branch +- mergeability +- CI/check rollups +- review-thread state +- ahead/behind counts relative to `main` +- changed-file roots + +## No-Code Validation + +Expected changed paths are limited to: + +- `dev/reports/PR_26179_OWNER_009-pr-stack-realignment_report.md` +- `dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md` +- `dev/reports/PR_26179_OWNER_009-pr-stack-realignment_validation-report.md` +- `dev/reports/PR_26179_OWNER_009-pr-stack-realignment_branch-validation.md` +- `dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md` +- `dev/reports/codex_changed_files.txt` +- `dev/reports/codex_review.diff` diff --git a/dev/reports/codex_changed_files.txt b/dev/reports/codex_changed_files.txt index a5f9b8a5e..5de14f86d 100644 --- a/dev/reports/codex_changed_files.txt +++ b/dev/reports/codex_changed_files.txt @@ -1,21 +1,7 @@ -# git status --short -M dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_manual-validation-notes.md - M dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_report.md - M dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_requirement-checklist.md - M dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_validation-report.md - M dev/scripts/start-dev.mjs - M dev/scripts/team-port-config.mjs - M dev/tests/dev-runtime/TeamAwareBootstrap.test.mjs - -# git ls-files --others --exclude-standard -(no output) - -# git diff --stat -...team-aware-bootstrap_manual-validation-notes.md | 2 +- - ...R_26171_ALFA_009-team-aware-bootstrap_report.md | 6 +- - ...9-team-aware-bootstrap_requirement-checklist.md | 3 +- - ...A_009-team-aware-bootstrap_validation-report.md | 3 +- - dev/scripts/start-dev.mjs | 2 +- - dev/scripts/team-port-config.mjs | 31 ++++++++-- - dev/tests/dev-runtime/TeamAwareBootstrap.test.mjs | 71 ++++++++++++++++------ - 7 files changed, 87 insertions(+), 31 deletions(-) \ No newline at end of file +dev/reports/PR_26179_OWNER_009-pr-stack-realignment_branch-validation.md +dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md +dev/reports/PR_26179_OWNER_009-pr-stack-realignment_report.md +dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md +dev/reports/PR_26179_OWNER_009-pr-stack-realignment_validation-report.md +dev/reports/codex_changed_files.txt +dev/reports/codex_review.diff diff --git a/dev/reports/codex_review.diff b/dev/reports/codex_review.diff index 25b5215b9..032966996 100644 --- a/dev/reports/codex_review.diff +++ b/dev/reports/codex_review.diff @@ -1,301 +1,18 @@ -diff --git a/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_manual-validation-notes.md b/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_manual-validation-notes.md -index de2ee4a6b..d416b4c0f 100644 ---- a/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_manual-validation-notes.md -+++ b/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_manual-validation-notes.md -@@ -26,7 +26,7 @@ Expected diagnostics: - - `Role: codex` - - `Web URL: http://127.0.0.1:5512` - - `API URL: http://127.0.0.1:5513/api` --- `Browser launch: suppressed for codex role` -+- `Browser launch: skipped for codex role` - - ## Legacy Command - -diff --git a/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_report.md b/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_report.md -index e0279d948..9f8343dfb 100644 ---- a/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_report.md -+++ b/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_report.md -@@ -29,7 +29,7 @@ Per OWNER instruction, those uncommitted changes were discarded with `git reset - - Added `dev/scripts/start-dev.mjs` as the bootstrap orchestrator. - - Added focused node tests for team resolution, role offsets, invalid team/role validation, script wiring, `.env` loading behavior, and bootstrap diagnostics. - - Added automatic browser launch for owner-role `dev:bootstrap` after the API and web servers are both ready. --- Suppressed automatic browser launch for the `codex` role. -+- Skipped automatic browser launch for the `codex` role. - - Fixed npm argument forwarding/parsing so both `--team charlie` and positional `charlie` select the same team after the package script's `--mode bootstrap` argument. - - Treats `.env` `GAMEFOUNDRY_SITE_URL` and `GAMEFOUNDRY_API_URL` as legacy/default local values for bootstrap mode, then overwrites runtime URLs from the resolved team/role ports. - -@@ -94,10 +94,10 @@ npm run dev:bootstrap -- --team alfa --role codex - ## Browser Launch Behavior - - - `owner` role launches the browser automatically to the selected team's `index.html`. --- `codex` role suppresses browser launch. -+- `codex` role skips browser launch. - - Browser launch happens only after both API and web servers are ready. - - The Alfa owner launch target is `http://127.0.0.1:5510/index.html`. --- The Alfa codex launch target is suppressed while using web `5512` and API `5513`. -+- The Alfa codex browser launch is skipped while using web `5512` and API `5513`. - - The Charlie launch target is `http://127.0.0.1:5530/index.html` for both `npm run dev:bootstrap -- --team charlie` and `npm run dev:bootstrap -- charlie`. - - Computed team/role ports override any `.env` or inherited process `GAMEFOUNDRY_SITE_URL` / `GAMEFOUNDRY_API_URL` values loaded before bootstrap startup. - - Bootstrap runtime sets `GAMEFOUNDRY_SITE_URL=http://127.0.0.1:` and `GAMEFOUNDRY_API_URL=http://127.0.0.1:/api` after team/role resolution. -diff --git a/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_requirement-checklist.md b/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_requirement-checklist.md -index fc4b68f78..27d45e7ac 100644 ---- a/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_requirement-checklist.md -+++ b/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_requirement-checklist.md -@@ -18,6 +18,7 @@ - | Validate unknown role names | PASS | `reviewer` fails clearly with supported role list. | - | Support `--team` argument forwarding | PASS | `npm run dev:bootstrap -- --team charlie` resolves Charlie ports. | - | Support positional team forwarding | PASS | `npm run dev:bootstrap -- charlie` resolves Charlie ports. | -+| Support positional team/role forwarding | PASS | `npm run dev:bootstrap -- alfa codex` resolves Alfa codex ports and skips browser launch. | - | Prevent `.env` and process URL port override | PASS | Unit and live startup tests confirm computed team/role ports overwrite loaded or inherited API/site URL port values. | - | Load environment | PASS | Orchestrator loads `.env` values without overriding existing environment values. | - | Resolve team ports | PASS | Unit tests cover all teams and both roles. | -@@ -25,7 +26,7 @@ - | Start web server when requested | PASS | `dev:bootstrap` starts web plus API; `dev:web` mode is wired. | - | Print startup diagnostics | PASS | Diagnostics include mode, team, role, web URL, API URL, environment source, supported teams, and supported roles. | - | Owner role launches browser automatically | PASS | Live startup validation opened `http://127.0.0.1:5510/index.html` after API and web were ready. | --| Codex role suppresses browser launch | PASS | Live startup validation reported `Browser launch: suppressed for codex role`. | -+| Codex role skips browser launch | PASS | Live startup validation reported `Browser launch: skipped for codex role`. | - | Wait for both servers before browser launch | PASS | Targeted unit test asserts API ready, web ready, then browser launch order. | - | Preserve legacy behavior | PASS | `dev:local-api` command unchanged and startup validation passed. | - | No unrelated cleanup | PASS | Scope limited to package scripts, new dev scripts, targeted tests, and reports. | -diff --git a/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_validation-report.md b/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_validation-report.md -index 370accd63..8881d8d98 100644 ---- a/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_validation-report.md -+++ b/dev/reports/PR_26171_ALFA_009-team-aware-bootstrap_validation-report.md -@@ -12,7 +12,8 @@ - | Unsupported team token scan in new bootstrap files | PASS | No unsupported old team names or single-letter public team commands found in package scripts, bootstrap scripts, or targeted bootstrap tests. | - | `npm run validate:canonical-structure` | PASS | Canonical repository structure guardrail passed. | - | `npm run dev:bootstrap -- --team alfa` | PASS | Started with team `alfa`, role `owner`, web `5510`, API `5511`, launched browser to `http://127.0.0.1:5510/index.html`, then process tree was stopped. | --| `npm run dev:bootstrap -- --team alfa --role codex` | PASS | Started with team `alfa`, role `codex`, web `5512`, API `5513`, suppressed browser launch, then process tree was stopped. | -+| `npm run dev:bootstrap -- --team alfa --role codex` | PASS | Started with team `alfa`, role `codex`, web `5512`, API `5513`, skipped browser launch, then process tree was stopped. | -+| `npm run dev:bootstrap -- alfa codex` | PASS | Positional team/role forwarding selected team `alfa`, role `codex`, web `5512`, API `5513`, and skipped browser launch. | - | `npm run dev:bootstrap -- --team charlie` with inherited stale URL env values | PASS | Started with team `charlie`, role `owner`, web `5530`, API `5531`, launched browser to `http://127.0.0.1:5530/index.html`, and ignored inherited `GAMEFOUNDRY_SITE_URL` / `GAMEFOUNDRY_API_URL` port values before process cleanup. | - | `npm run dev:bootstrap -- charlie` | PASS | Positional team forwarding selected team `charlie`, web `5530`, API `5531`, and browser target `http://127.0.0.1:5530/index.html`. | - | `npm run dev:bootstrap -- --team bravo` | PASS | Started with team `bravo`, role `owner`, web `5520`, API `5521`, and browser target `http://127.0.0.1:5520/index.html`. | -diff --git a/dev/scripts/start-dev.mjs b/dev/scripts/start-dev.mjs -index e1b58491a..a58a53697 100644 ---- a/dev/scripts/start-dev.mjs -+++ b/dev/scripts/start-dev.mjs -@@ -364,7 +364,7 @@ export async function startBootstrapRuntime( - : { - enabled: false, - reason: options.role === "codex" -- ? "suppressed for codex role" -+ ? "skipped for codex role" - : "requires bootstrap mode with API and web servers", - url: browserUrl, - }; -diff --git a/dev/scripts/team-port-config.mjs b/dev/scripts/team-port-config.mjs -index 9d11f9b7f..f8b5c3423 100644 ---- a/dev/scripts/team-port-config.mjs -+++ b/dev/scripts/team-port-config.mjs -@@ -80,9 +80,10 @@ function parseNamedArgument(args, name, fallback, supportedLabel) { - return fallback; - } - --function firstPositionalArgument(args = []) { -+function positionalArguments(args = []) { - const values = Array.from(args); - const optionsWithValues = new Set(["mode", "role", "team"]); -+ const positional = []; - for (let index = 0; index < values.length; index += 1) { - const argument = values[index]; - if (!argument) { -@@ -98,13 +99,21 @@ function firstPositionalArgument(args = []) { - } - continue; - } -- return argument; -+ positional.push(argument); - } -- return ""; -+ return positional; - } - - export function parseRoleArgument(args = []) { -- return parseNamedArgument(args, "role", DEFAULT_BOOTSTRAP_ROLE, supportedBootstrapRolesLabel); -+ const explicitRole = parseNamedArgument(args, "role", "", supportedBootstrapRolesLabel); -+ if (explicitRole) { -+ return explicitRole; -+ } -+ const positionalRole = positionalArguments(args).find((argument) => { -+ const normalizedRole = normalizeToken(argument, ""); -+ return ROLE_PORT_OFFSETS[normalizedRole] !== undefined; -+ }); -+ return normalizeToken(positionalRole, DEFAULT_BOOTSTRAP_ROLE); - } - - export function parseTeamArgument(args = []) { -@@ -112,5 +121,17 @@ export function parseTeamArgument(args = []) { - if (explicitTeam) { - return explicitTeam; - } -- return normalizeToken(firstPositionalArgument(args), DEFAULT_BOOTSTRAP_TEAM); -+ const positional = positionalArguments(args); -+ const positionalTeam = positional.find((argument) => { -+ const normalizedTeam = normalizeToken(argument, ""); -+ return TEAM_BASE_PORTS[normalizedTeam] !== undefined; -+ }); -+ if (positionalTeam) { -+ return normalizeToken(positionalTeam, DEFAULT_BOOTSTRAP_TEAM); -+ } -+ const unknownTeam = positional.find((argument) => { -+ const normalizedArgument = normalizeToken(argument, ""); -+ return ROLE_PORT_OFFSETS[normalizedArgument] === undefined; -+ }); -+ return normalizeToken(unknownTeam, DEFAULT_BOOTSTRAP_TEAM); - } -diff --git a/dev/tests/dev-runtime/TeamAwareBootstrap.test.mjs b/dev/tests/dev-runtime/TeamAwareBootstrap.test.mjs -index c746f1b3b..0f7b91480 100644 ---- a/dev/tests/dev-runtime/TeamAwareBootstrap.test.mjs -+++ b/dev/tests/dev-runtime/TeamAwareBootstrap.test.mjs -@@ -62,10 +62,14 @@ test("team and role parsers accept canonical argument forms", () => { - assert.equal(parseTeamArgument(["--team=bravo"]), "bravo"); - assert.equal(parseTeamArgument(["--mode", "bootstrap", "charlie"]), "charlie"); - assert.equal(parseTeamArgument(["--mode=bootstrap", "charlie"]), "charlie"); -+ assert.equal(parseTeamArgument(["--mode", "bootstrap", "alfa", "codex"]), "alfa"); -+ assert.equal(parseTeamArgument(["--mode", "bootstrap", "codex", "alfa"]), "alfa"); - assert.equal(parseTeamArgument(["charlie", "--role", "codex"]), "charlie"); - assert.equal(parseRoleArgument([]), "owner"); - assert.equal(parseRoleArgument(["--role", "codex"]), "codex"); - assert.equal(parseRoleArgument(["--role=owner"]), "owner"); -+ assert.equal(parseRoleArgument(["--mode", "bootstrap", "alfa", "codex"]), "codex"); -+ assert.equal(parseRoleArgument(["--mode", "bootstrap", "codex", "alfa"]), "codex"); - }); - - test("invalid teams and roles fail with supported values", () => { -@@ -114,6 +118,32 @@ test("bootstrap option parser maps npm script modes to server startup plan", () - team: "alfa", - web: true, - }); -+ assert.deepEqual(parseBootstrapOptions(["--mode", "bootstrap", "--team", "alfa", "--role", "codex"]), { -+ api: true, -+ mode: "bootstrap", -+ ports: { -+ apiPort: 5513, -+ role: "codex", -+ team: "alfa", -+ webPort: 5512, -+ }, -+ role: "codex", -+ team: "alfa", -+ web: true, -+ }); -+ assert.deepEqual(parseBootstrapOptions(["--mode", "bootstrap", "alfa", "codex"]), { -+ api: true, -+ mode: "bootstrap", -+ ports: { -+ apiPort: 5513, -+ role: "codex", -+ team: "alfa", -+ webPort: 5512, -+ }, -+ role: "codex", -+ team: "alfa", -+ web: true, -+ }); - assert.deepEqual(parseBootstrapOptions(["--mode=api", "--team=charlie", "--role=codex"]), { - api: true, - mode: "api", -@@ -195,7 +225,7 @@ test("startup diagnostics and package scripts expose team-aware bootstrap comman - apiBaseUrl: "http://127.0.0.1:5513", - browserLaunch: { - enabled: false, -- reason: "suppressed for codex role", -+ reason: "skipped for codex role", - url: "http://127.0.0.1:5512/index.html", - }, - mode: "bootstrap", -@@ -212,7 +242,7 @@ test("startup diagnostics and package scripts expose team-aware bootstrap comman - assert.equal(lines.includes("Role: codex"), true); - assert.equal(lines.includes("Web URL: http://127.0.0.1:5512"), true); - assert.equal(lines.includes("API URL: http://127.0.0.1:5513/api"), true); -- assert.equal(lines.includes("Browser launch: suppressed for codex role"), true); -+ assert.equal(lines.includes("Browser launch: skipped for codex role"), true); - assert.equal(lines.includes(`Supported teams: ${supportedBootstrapTeamsLabel()}`), true); - assert.equal(lines.includes(`Supported roles: ${supportedBootstrapRolesLabel()}`), true); - -@@ -236,7 +266,7 @@ test("runtime env loader applies .env values without overriding existing process - assert.equal(env.GAMEFOUNDRY_API_URL, "http://127.0.0.1:5999/api"); - }); - --test("browser launch targets team index after API and web servers are ready for owner role", async () => { -+test("browser launch targets team index after API and web servers are ready for bravo owner role", async () => { - const events = []; - const env = { - GAMEFOUNDRY_LOCAL_API_HOST: "0.0.0.0", -@@ -244,7 +274,7 @@ test("browser launch targets team index after API and web servers are ready for - GAMEFOUNDRY_SITE_URL: "http://127.0.0.1:5500", - }; - const runtime = await startBootstrapRuntime( -- parseBootstrapOptions(["--mode=bootstrap", "--team=alfa"]), -+ parseBootstrapOptions(["--mode=bootstrap", "--team=bravo"]), - { - apiServerStarter: async ({ port }) => { - events.push(`api:${port}`); -@@ -274,25 +304,26 @@ test("browser launch targets team index after API and web servers are ready for - ); - - assert.deepEqual(events, [ -- "api:5511", -- "web:5510", -- "browser:http://127.0.0.1:5510/index.html", -+ "api:5521", -+ "web:5520", -+ "browser:http://127.0.0.1:5520/index.html", - ]); - assert.equal(env.GAMEFOUNDRY_LOCAL_API_HOST, "127.0.0.1"); -- assert.equal(env.GAMEFOUNDRY_API_URL, "http://127.0.0.1:5511/api"); -- assert.equal(env.GAMEFOUNDRY_SITE_URL, "http://127.0.0.1:5510"); -- assert.equal(runtime.diagnostics.includes("Browser launch: http://127.0.0.1:5510/index.html"), true); -+ assert.equal(env.GAMEFOUNDRY_API_URL, "http://127.0.0.1:5521/api"); -+ assert.equal(env.GAMEFOUNDRY_SITE_URL, "http://127.0.0.1:5520"); -+ assert.equal(runtime.diagnostics.includes("Browser launch: http://127.0.0.1:5520/index.html"), true); - await runtime.close(); - assert.deepEqual(events.slice(-2), ["api:closed", "web:closed"]); - }); - --test("codex role suppresses browser launch even after API and web servers are ready", async () => { -+test("alfa codex role skips browser launch even after API and web servers are ready", async () => { - const events = []; -+ const env = {}; - const runtime = await startBootstrapRuntime( -- parseBootstrapOptions(["--mode=bootstrap", "--team=alfa", "--role=codex"]), -+ parseBootstrapOptions(["--mode=bootstrap", "--team", "alfa", "--role", "codex"]), - { -- apiServerStarter: async () => { -- events.push("api"); -+ apiServerStarter: async ({ port }) => { -+ events.push(`api:${port}`); - return { - close: async () => {}, - }; -@@ -304,13 +335,13 @@ test("codex role suppresses browser launch even after API and web servers are re - url, - }; - }, -- env: {}, -+ env, - loadEnv: () => ({ - loaded: false, - loadedKeys: 0, - }), -- webServerStarter: async () => { -- events.push("web"); -+ webServerStarter: async ({ port }) => { -+ events.push(`web:${port}`); - return { - close: async () => {}, - }; -@@ -318,8 +349,10 @@ test("codex role suppresses browser launch even after API and web servers are re - }, - ); - -- assert.deepEqual(events, ["api", "web"]); -- assert.equal(runtime.diagnostics.includes("Browser launch: suppressed for codex role"), true); -+ assert.deepEqual(events, ["api:5513", "web:5512"]); -+ assert.equal(env.GAMEFOUNDRY_API_URL, "http://127.0.0.1:5513/api"); -+ assert.equal(env.GAMEFOUNDRY_SITE_URL, "http://127.0.0.1:5512"); -+ assert.equal(runtime.diagnostics.includes("Browser launch: skipped for codex role"), true); - await runtime.close(); - }); +diff --git a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md +index 9e58e9340..1552e7096 100644 +--- a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md ++++ b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_manual-validation-notes.md +@@ -18,4 +18,3 @@ Reviewed the focused open PR set and produced recommendations without changing P + - No API files changed. + - No database files changed. + - No GitHub PRs were merged or closed. +- +diff --git a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md +index f7b11b506..f5b8efdfa 100644 +--- a/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md ++++ b/dev/reports/PR_26179_OWNER_009-pr-stack-realignment_requirement-checklist.md +@@ -11,4 +11,3 @@ + | Produce recommendation report only | PASS | Report-only governance deliverable. | + | Use canonical report location | PASS | Reports are under `dev/reports/`. | + | Produce outcome ZIP | PASS | ZIP to be generated under `dev/workspace/zips/`. | +-