From 8bf4de8f8240a8ac3e2d6d7b97d5845ade00ae4a Mon Sep 17 00:00:00 2001 From: Alfa Team Date: Thu, 25 Jun 2026 20:55:16 -0400 Subject: [PATCH 1/2] Document environment governance model --- .env.example | 39 +++++- docs_build/dev/BUILD_PR.md | 130 +++++++----------- docs_build/dev/PROJECT_INSTRUCTIONS.md | 59 ++++++-- .../PROJECT_INSTRUCTIONS.md | 5 + docs_build/dev/ProjectInstructions/README.txt | 1 + .../addendums/environment_governance_model.md | 114 +++++++++++++++ .../addendums/postgres_only.md | 5 +- .../addendums/release_gate.md | 1 + docs_build/dev/admin-notes/index.txt | 2 +- ..._OWNER_050-environment-governance-model.md | 72 ++++++++++ ...ment-governance-model_branch-validation.md | 26 ++++ ...-model_instruction-compliance-checklist.md | 24 ++++ ...overnance-model_manual-validation-notes.md | 20 +++ ...-governance-model_requirement-checklist.md | 38 +++++ ...onment-governance-model_validation-lane.md | 22 +++ .../dev/reports/codex_changed_files.txt | 40 ++---- docs_build/dev/reports/codex_review.diff | Bin 212382 -> 34339 bytes 17 files changed, 473 insertions(+), 125 deletions(-) create mode 100644 docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md create mode 100644 docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md diff --git a/.env.example b/.env.example index 9d5e4301b..e4fd3594e 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,22 @@ -# Game Foundry Studio local development environment +# Game Foundry Studio environment-managed configuration example # ENVIRONMENT -# Configure the runtime auth and database connections here. +# Official environment model: +# Local (VS Code) -> DEV -> IST -> UAT -> PROD +# +# Environment invariance: +# Use an identical deployable artifact in every environment. +# Only .env values and environment-managed secret values differ. +# +# Approved guest seed data for all tools belongs in every environment. +# Do not store guest seed payloads in .env. +# +# Required services in every environment: +# - Supabase Auth +# - Supabase Postgres +# - Cloudflare R2 +# +# Configure runtime auth, database, and storage connections here. # Missing connection configuration reports diagnostics instead of falling back. # Browser-safe public site configuration exposed through the server API. @@ -9,11 +24,12 @@ GAMEFOUNDRY_SITE_URL= GAMEFOUNDRY_API_URL= # Valid environment banner labels: +# - Local Development Environment # - Development Environment # - Integration Testing Environment # - User Acceptance Testing Environment # - Production -GAMEFOUNDRY_ENVIRONMENT_LABEL="Development Environment" +GAMEFOUNDRY_ENVIRONMENT_LABEL="Local Development Environment" # Database SSL mode is required and authoritative. # Supported values: @@ -33,13 +49,14 @@ GAMEFOUNDRY_DATABASE_URL= # Server-only Postgres backup storage. # Copy this file to .env and keep the active deployment target's prefix: +# LOCAL /local/backups/postgres/ # DEV /dev/backups/postgres/ # IST /ist/backups/postgres/ # UAT /uat/backups/postgres/ -# PRD /prd/backups/postgres/ +# PROD /prod/backups/postgres/ # R2 object prefixes are created by object upload; no manual folder creation is required. GAMEFOUNDRY_DB_BACKUP_STORAGE_PROVIDER=r2 -GAMEFOUNDRY_DB_BACKUP_PREFIX=/dev/backups/postgres/ +GAMEFOUNDRY_DB_BACKUP_PREFIX=/local/backups/postgres/ # Optional temporary server-side pg_dump staging override. # Leave blank to use the OS temp directory. Do not point this at repo tmp/. @@ -50,17 +67,25 @@ GAMEFOUNDRY_DB_BACKUP_DIR= # Server-only project asset storage configuration. # Browser uploads must go through the server API and must not receive these secrets. +# Official Cloudflare R2 top-level prefixes: +# LOCAL /local/ +# DEV /dev/ +# IST /ist/ +# UAT /uat/ +# PROD /prod/ +# # Approved GAMEFOUNDRY_STORAGE_PROJECTS_PREFIX values: +# LOCAL /local/projects/ # DEV /dev/projects/ # IST /ist/projects/ # UAT /uat/projects/ -# PRD /prod/projects/ +# PROD /prod/projects/ GAMEFOUNDRY_STORAGE_ENDPOINT= GAMEFOUNDRY_STORAGE_ACCESS_KEY_ID= GAMEFOUNDRY_STORAGE_SECRET_ACCESS_KEY= GAMEFOUNDRY_STORAGE_BUCKET= -GAMEFOUNDRY_STORAGE_PROJECTS_PREFIX= +GAMEFOUNDRY_STORAGE_PROJECTS_PREFIX=/local/projects/ # Environment-specific service limit placeholders. # Leave empty when live usage/limit reporting is not configured. diff --git a/docs_build/dev/BUILD_PR.md b/docs_build/dev/BUILD_PR.md index 0a9dd074a..2b1d4dcba 100644 --- a/docs_build/dev/BUILD_PR.md +++ b/docs_build/dev/BUILD_PR.md @@ -1,109 +1,75 @@ -# PR_26175_ALFA_047-theme-v2-svg-icon-registry +# PR_26177_OWNER_050-environment-governance-model ## Purpose -Create a shared Theme V2 SVG icon asset registry and authoritative validation specification so toolbox and platform UI can use approved standalone SVG files from one repo-owned source instead of page-local SVG, ad hoc CSS drawings, Font Awesome glyphs, conversation screenshots, vague row references, CSS-only generation, or a JS-only registry. + +Establish the official Game Foundry Studio environment governance model and align the active configuration example comments/placeholders with that model. ## Source Of Truth -This `BUILD_PR.md` is the source of truth for `PR_26175_ALFA_047-theme-v2-svg-icon-registry`. + +This `BUILD_PR.md` and the user request are the source of truth for `PR_26177_OWNER_050-environment-governance-model`. ## Exact Scope -- Remove the incorrect JS-only icon registry implementation from the ALFA_047 delta. -- Use the user-authored SVG files already present under `assets/theme-v2/svg/` as the authoritative source. -- Do not regenerate, redesign, simplify, optimize, or redraw any SVG icon artwork in this PR. -- Required SVG files: - - `gfs-chevron-left.svg` - - `gfs-chevron-right.svg` - - `gfs-chevron-up.svg` - - `gfs-chevron-down.svg` - - `gfs-add.svg` - - `gfs-subtract.svg` - - `gfs-trash.svg` - - `gfs-close.svg` - - `gfs-warning.svg` - - `gfs-error.svg` - - `gfs-success.svg` - - `gfs-info.svg` - - `gfs-fullscreen.svg` - - `gfs-exit-fullscreen.svg` - - `gfs-menu.svg` - - `gfs-search.svg` - - `gfs-settings.svg` -- Validate each required SVG is well-formed XML. -- Validate each SVG uses `viewBox="0 0 24 24"`, `fill="none"`, `stroke="currentColor"`, `stroke-linecap="round"`, and `stroke-linejoin="round"`. -- Do not create `expand` or `collapse` icon naming. -- Do not create `delete` icon naming. -- Do not replace the standalone SVG assets with a JS-only icon registry. -- Do not replace the standalone SVG assets with CSS-only icon generation. -- Create `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md` as the authoritative specification for all future Theme V2 SVG icons. -- Create or update `assets/theme-v2/svg/README.md` as the registry documentation for the authoritative SVG asset pack. -- Document the approved validation rules and the no-regeneration/no-redesign policy. -- If any required SVG is missing, report validation failure instead of generating a replacement. -- Do not convert existing UI controls in this PR. + +- Documentation/governance only unless `.env.example` comment or placeholder updates are required. +- Establish `Local (VS Code) -> DEV -> IST -> UAT -> PROD` as the official environment model. +- Define the environment invariance rule: the deployable artifact is identical across all environments; only `.env` values and environment-managed secret values differ. +- Define one shared API/service contract across all environments. +- Define Supabase Auth, Supabase Postgres, and Cloudflare R2 as required for every environment. +- Define R2 top-level prefixes: + - `/local/` + - `/dev/` + - `/ist/` + - `/uat/` + - `/prod/` +- Define that all environments receive approved guest seed data for all tools. +- State SQLite is deprecated/retired and is not an active runtime database. +- Review `.env.example` and update comments/placeholders to match the official model. +- Create required Codex reports under `docs_build/dev/reports/`. +- Create repo-structured delta ZIP under `tmp/`. ## Exact Targets + - `docs_build/dev/BUILD_PR.md` -- `assets/theme-v2/svg/gfs-chevron-left.svg` -- `assets/theme-v2/svg/gfs-chevron-right.svg` -- `assets/theme-v2/svg/gfs-chevron-up.svg` -- `assets/theme-v2/svg/gfs-chevron-down.svg` -- `assets/theme-v2/svg/gfs-add.svg` -- `assets/theme-v2/svg/gfs-subtract.svg` -- `assets/theme-v2/svg/gfs-trash.svg` -- `assets/theme-v2/svg/gfs-close.svg` -- `assets/theme-v2/svg/gfs-warning.svg` -- `assets/theme-v2/svg/gfs-error.svg` -- `assets/theme-v2/svg/gfs-success.svg` -- `assets/theme-v2/svg/gfs-info.svg` -- `assets/theme-v2/svg/gfs-fullscreen.svg` -- `assets/theme-v2/svg/gfs-exit-fullscreen.svg` -- `assets/theme-v2/svg/gfs-menu.svg` -- `assets/theme-v2/svg/gfs-search.svg` -- `assets/theme-v2/svg/gfs-settings.svg` -- `assets/theme-v2/svg/README.md` -- `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md` -- `tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs` -- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_report.md` -- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_validation-lane.md` -- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_requirements-checklist.md` -- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_manual-validation-notes.md` +- `docs_build/dev/PROJECT_INSTRUCTIONS.md` +- `docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md` +- `docs_build/dev/ProjectInstructions/README.txt` +- `docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md` +- `docs_build/dev/ProjectInstructions/addendums/postgres_only.md` +- `docs_build/dev/ProjectInstructions/addendums/release_gate.md` +- `docs_build/dev/admin-notes/index.txt` +- `.env.example` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md` - `docs_build/dev/reports/codex_review.diff` - `docs_build/dev/reports/codex_changed_files.txt` -## Evidence Sources -- `docs_build/pr/PLAN_PR_26175_ALFA_047-theme-v2-svg-icon-registry.md` -- `assets/theme-v2/images/gfs-chevron-down.svg` -- `assets/theme-v2/images/gfs-chevron-up.svg` - ## Out Of Scope -- No chevron conversion. -- No status/action icon conversion. -- No layout utility icon conversion. -- No JS-only icon registry. -- No CSS-only icon generation. -- No Theme V2 CSS changes. -- No runtime UI conversion. -- No accordion conversion. -- No Font Awesome removal. -- No broad visual redesign. -- No page-local CSS. -- No inline styles. -- No style blocks. -- No browser-owned product data as source of truth. -- No API/service/repository contract changes. + +- No runtime code changes. +- No UI changes. - No engine core changes. - No `start_of_day` folder changes. +- No `.env`, `.env.dev`, `.env.ist`, `.env.uat`, or `.env.prd` secret/value edits. +- No API implementation changes. +- No storage implementation changes. +- No database migration or DDL changes. ## Validation + Run exactly: ```powershell -npx playwright test tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs --workers=1 -rg -n "<[s]tyle|[s]tyle=" docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs +git diff --check ``` ## Artifact + Create repo-structured delta ZIP: ```text -tmp/PR_26175_ALFA_047-theme-v2-svg-icon-registry_delta.zip +tmp/PR_26177_OWNER_050-environment-governance-model_delta.zip ``` diff --git a/docs_build/dev/PROJECT_INSTRUCTIONS.md b/docs_build/dev/PROJECT_INSTRUCTIONS.md index 1fdd9fc64..2eee7be67 100644 --- a/docs_build/dev/PROJECT_INSTRUCTIONS.md +++ b/docs_build/dev/PROJECT_INSTRUCTIONS.md @@ -441,12 +441,13 @@ Toolbox and Admin tool metadata must use a shared DB-backed tool metadata source ## DATABASE DIRECTION -SQLite is deprecated. -Postgres is authoritative. +Postgres is the authoritative active runtime database. + +SQLite is deprecated/retired and is not an active runtime database for Local (VS Code), DEV, IST, UAT, or PROD. Rules: - New database work must target Postgres. -- Local API -> Postgres is the required direction. +- Local (VS Code) API -> Postgres is the required direction. - New PRs must not introduce SQLite persistence. - Do not add new SQLite services. - Do not add new SQLite DDL. @@ -478,17 +479,58 @@ Rules: Runtime startup loads `.env` only. +Official environment model: +- `Local (VS Code)` +- `DEV` +- `IST` +- `UAT` +- `PROD` + +Promotion order: +- `Local (VS Code) -> DEV -> IST -> UAT -> PROD` + +Environment invariance rule: +- The deployable artifact is identical across every environment. +- Only `.env` values and environment-managed secret values differ between environments. +- Application code, runtime code, API/service code, database runtime scripts, migrations, and bundles must not fork by environment name. + +Shared API/service contract: +- One shared API/service contract is required across Local (VS Code), DEV, IST, UAT, and PROD. +- Browser/UI/runtime code must consume the same contract in every environment. +- Environment-specific endpoints, keys, buckets, and prefixes are configuration values only. +- Do not create environment-specific API/service contracts. + +Required services in every environment: +- Supabase Auth +- Supabase Postgres +- Cloudflare R2 + +Guest seed data rule: +- All environments receive approved guest seed data for all tools. +- Guest seed data is shared environment setup data, not an environment-specific behavior fork. +- Guest seed data must be applied through the shared data/service contract and must not require per-environment application code. + +Required Cloudflare R2 top-level prefixes: +- Local (VS Code): `/local/` +- DEV: `/dev/` +- IST: `/ist/` +- UAT: `/uat/` +- PROD: `/prod/` + +Derived R2 paths for projects, backups, exports, or future storage lanes must stay under the matching top-level prefix for the active environment. + The following files are copy-source files only: - `.env.dev` - `.env.ist` - `.env.uat` -- `.env.prd` +- `.env.prd` is the legacy copy-source filename for PROD values; new environment governance uses the `PROD` environment name. -Valid deployment targets are: +Valid environment stages are: +- `Local (VS Code)` - `DEV` - `IST` - `UAT` -- `PRD` +- `PROD` Manual deployment-target flow: 1. Copy the selected `.env.` file to `.env`. @@ -501,11 +543,12 @@ Runtime environment parameters are prohibited. Do not introduce runtime parameters such as: - `--env` - `--environment` +- `ENVIRONMENT=LOCAL` - `ENVIRONMENT=DEV` - `ENVIRONMENT=UAT` -- `ENVIRONMENT=PRD` +- `ENVIRONMENT=PROD` -`DEV`, `IST`, `UAT`, and `PRD` are deployment targets, not application behaviors. +`Local (VS Code)`, `DEV`, `IST`, `UAT`, and `PROD` are environment stages, not application behaviors. Application code, runtime code, API/service code, and DB runtime scripts must not branch behavior by deployment target name. diff --git a/docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md b/docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md index 640ca6792..16238a317 100644 --- a/docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md +++ b/docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md @@ -16,6 +16,7 @@ The Project Instructions operating system provides additive governance for: - deprecation workflow - archive and history preservation - recognized project instruction/reference files +- environment governance ## Preservation @@ -34,6 +35,10 @@ Existing Project Instructions remain preserved in their current locations. This `docs_build/dev/ProjectInstructions/addendums/project_reference_files.md` defines additional valid project instruction/reference files that must be included in future Project Instructions reviews when present in `ProjectInstructions.zip`, the active project instruction directory, or `docs_build/dev/admin-notes/`. +## Environment Governance + +`docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md` defines the official environment model, environment invariance rule, shared API/service contract rule, required Supabase/Postgres/R2 services, required R2 prefixes, and SQLite retired status. + ## Merge Control No PR in this operating system is merged without explicit owner approval. diff --git a/docs_build/dev/ProjectInstructions/README.txt b/docs_build/dev/ProjectInstructions/README.txt index 262b216e7..0e4f9b470 100644 --- a/docs_build/dev/ProjectInstructions/README.txt +++ b/docs_build/dev/ProjectInstructions/README.txt @@ -49,3 +49,4 @@ Addendum index: - Codex Artifact and Reporting Standard: project-instructions/addendums/codex-artifact-and-reporting-standard.md - Codex Project Instructions Startup: project-instructions/addendums/codex-project-instructions-startup.md - Project Reference Files Governance: docs_build/dev/ProjectInstructions/addendums/project_reference_files.md +- Environment Governance Model: docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md diff --git a/docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md b/docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md new file mode 100644 index 000000000..ef3c0e1cd --- /dev/null +++ b/docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md @@ -0,0 +1,114 @@ +# Environment Governance Model + +Status: Approved +Owner: OWNER + +## Purpose + +Define the official Game Foundry Studio environment model and the invariance rules that keep promotion, deployment, API/service contracts, auth, database, and storage consistent from local development through production. + +## Official Environment Model + +The official environment model is: + +```text +Local (VS Code) -> DEV -> IST -> UAT -> PROD +``` + +Environment stages: + +- `Local (VS Code)` +- `DEV` +- `IST` +- `UAT` +- `PROD` + +The old three-letter production abbreviation is not an official environment name for new governance text. Existing `.env.prd` file naming is treated only as a legacy copy-source filename for PROD values until a separately scoped rename is approved. + +## Environment Invariance Rule + +The deployable artifact must be identical across Local (VS Code), DEV, IST, UAT, and PROD. + +Only `.env` values and environment-managed secret values may differ between environments. + +Do not vary these by environment name: + +- application code +- runtime code +- API/service code +- API/service contract shape +- database runtime scripts +- migration shape +- bundles +- product behavior + +## Shared API/Service Contract + +One shared API/service contract is required across all environments. + +Rules: + +- Browser/UI/runtime code must consume the same API/service contract in Local (VS Code), DEV, IST, UAT, and PROD. +- 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. + +## Required Services + +Every environment requires: + +- Supabase Auth +- Supabase Postgres +- Cloudflare R2 + +Mock, memory, fixture, or legacy database adapters may be used only when separately scoped as test/dev tooling. They are not the official runtime service model. + +## Guest Seed Data + +All environments receive approved guest seed data for all tools. + +Rules: + +- Guest seed data is shared environment setup data, not an environment-specific behavior fork. +- Guest seed data must be applied through the shared data/service contract. +- Guest seed data must not require per-environment application code. + +## R2 Prefixes + +Required Cloudflare R2 top-level prefixes: + +- Local (VS Code): `/local/` +- DEV: `/dev/` +- IST: `/ist/` +- UAT: `/uat/` +- PROD: `/prod/` + +Derived paths must stay under the matching top-level prefix. Examples: + +- Local project assets: `/local/projects/` +- DEV project assets: `/dev/projects/` +- IST project assets: `/ist/projects/` +- UAT project assets: `/uat/projects/` +- PROD project assets: `/prod/projects/` +- Local Postgres backups: `/local/backups/postgres/` +- DEV Postgres backups: `/dev/backups/postgres/` +- IST Postgres backups: `/ist/backups/postgres/` +- UAT Postgres backups: `/uat/backups/postgres/` +- PROD Postgres backups: `/prod/backups/postgres/` + +## Database Direction + +Postgres is the authoritative active runtime database for the official environment model. + +SQLite is deprecated/retired and is not an active runtime database for Local (VS Code), DEV, IST, UAT, or PROD. + +Rules: + +- New database work must target Postgres. +- Do not introduce new SQLite runtime persistence. +- Do not introduce new SQLite services, DDL, or seed data. +- Existing SQLite references may remain only as documented technical debt when already present. + +## Scope Boundary + +This governance addendum defines documentation and configuration contract rules only. It does not change runtime code, API implementation code, storage implementation code, database DDL, or secret values. diff --git a/docs_build/dev/ProjectInstructions/addendums/postgres_only.md b/docs_build/dev/ProjectInstructions/addendums/postgres_only.md index 55af64381..369ce2006 100644 --- a/docs_build/dev/ProjectInstructions/addendums/postgres_only.md +++ b/docs_build/dev/ProjectInstructions/addendums/postgres_only.md @@ -1,4 +1,4 @@ -SQLite is deprecated. +SQLite is deprecated/retired and is not an active runtime database. Game Foundry Studio standard database: PostgreSQL @@ -7,5 +7,6 @@ Rules: - No new SQLite implementations - No new SQLite dependencies - Existing SQLite references are technical debt -- New persistence work targets PostgreSQL +- New persistence work targets PostgreSQL/Postgres +- Local (VS Code), DEV, IST, UAT, and PROD runtime database work targets Postgres - PRs introducing SQLite should be rejected diff --git a/docs_build/dev/ProjectInstructions/addendums/release_gate.md b/docs_build/dev/ProjectInstructions/addendums/release_gate.md index a509f1791..79af94858 100644 --- a/docs_build/dev/ProjectInstructions/addendums/release_gate.md +++ b/docs_build/dev/ProjectInstructions/addendums/release_gate.md @@ -37,6 +37,7 @@ The release gate should confirm these files when relevant to the PR: - `docs_build/dev/ProjectInstructions/addendums/governance_phase1_complete.md` - `docs_build/dev/ProjectInstructions/addendums/pr_workflow.md` - `docs_build/dev/ProjectInstructions/addendums/project_reference_files.md` +- `docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md` - `docs_build/dev/ProjectInstructions/team_assignments/team_ownership.md` - `docs_build/dev/admin-notes/Installs required.txt` when present - `docs_build/dev/admin-notes/Table layout.txt` when present diff --git a/docs_build/dev/admin-notes/index.txt b/docs_build/dev/admin-notes/index.txt index 93654fa6e..4744bea93 100644 --- a/docs_build/dev/admin-notes/index.txt +++ b/docs_build/dev/admin-notes/index.txt @@ -2,7 +2,7 @@ [.] Start the server npm run dev:local-api -[x] Deploy DEV, IST, UAT, PRD +[x] Deploy Local (VS Code), DEV, IST, UAT, PROD node .\scripts\validate-supabase-dev.mjs node .\scripts\apply-supabase-dev-ddl.mjs node .\scripts\validate-supabase-dev.mjs diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md new file mode 100644 index 000000000..1c06cdb73 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md @@ -0,0 +1,72 @@ +# PR_26177_OWNER_050-environment-governance-model + +Date: 2026-06-25 +Team: OWNER +Scope: Documentation/governance only, plus `.env.example` comment/placeholders +Status: PASS + +## Summary + +- Established `Local (VS Code) -> DEV -> IST -> UAT -> PROD` as the official environment model. +- Defined the environment invariance rule: the deployable artifact is identical across environments; only `.env` values and environment-managed secret values differ. +- Defined one shared API/service contract across Local (VS Code), DEV, IST, UAT, and PROD. +- Defined Supabase Auth, Supabase Postgres, and Cloudflare R2 as required services in every environment. +- Defined required Cloudflare R2 top-level prefixes: `/local/`, `/dev/`, `/ist/`, `/uat/`, and `/prod/`. +- Documented that all environments receive approved guest seed data for all tools. +- Clarified that SQLite is deprecated/retired and is not an active runtime database. +- Updated `.env.example` comments/placeholders to use the official model and local R2 prefixes. +- No runtime code, UI, engine core, secret, DDL, or storage implementation changes were made. + +## Branch Validation + +PASS. Current branch is `PR_26177_OWNER_050-environment-governance-model`, created from clean `main` at `0c0f2ebc0`. + +## Instruction Compliance + +- PASS: Current branch was `main` before branch creation. +- PASS: PR name includes OWNER team token. +- PASS: Team OWNER owns environment strategy and governance. +- PASS: Scope is documentation/governance only except approved `.env.example` comments/placeholders. +- PASS: No runtime, UI, engine core, `start_of_day`, migration, DDL, or secret files changed. +- PASS: Required reports and ZIP artifact are produced for the BUILD. + +## Changed Files + +- `.env.example` +- `docs_build/dev/BUILD_PR.md` +- `docs_build/dev/PROJECT_INSTRUCTIONS.md` +- `docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md` +- `docs_build/dev/ProjectInstructions/README.txt` +- `docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md` +- `docs_build/dev/ProjectInstructions/addendums/postgres_only.md` +- `docs_build/dev/ProjectInstructions/addendums/release_gate.md` +- `docs_build/dev/admin-notes/index.txt` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md` +- `docs_build/dev/reports/codex_changed_files.txt` +- `docs_build/dev/reports/codex_review.diff` + +## Required Reports + +- `docs_build/dev/reports/codex_review.diff` +- `docs_build/dev/reports/codex_changed_files.txt` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md` +- `docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md` + +## Validation + +- PASS: `git diff --check`. +- PASS: Documentation review confirmed the official environment model, invariance rule, shared API/service contract, required services, R2 prefixes, guest seed data rule, and SQLite retired status. +- SKIP: Playwright was not run because no runtime files changed. + +## Artifact + +- `tmp/PR_26177_OWNER_050-environment-governance-model_delta.zip` diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md new file mode 100644 index 000000000..8118bb8be --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md @@ -0,0 +1,26 @@ +# PR_26177_OWNER_050-environment-governance-model Branch Validation + +## Branch + +`PR_26177_OWNER_050-environment-governance-model` + +## Base + +- Base branch: `main` +- Base commit at branch creation: `0c0f2ebc0` + +## Checks + +- Current branch was `main` before branch creation: PASS. +- Worktree before BUILD was clean: PASS. +- Current branch is the scoped OWNER_050 branch: PASS. +- Scope is limited to environment governance, `.env.example` comments/placeholders, reports, and Codex review artifacts: PASS. +- No runtime files changed: PASS. +- No UI files changed: PASS. +- No engine core files changed: PASS. +- No `start_of_day` files changed: PASS. +- No `.env`, `.env.dev`, `.env.ist`, `.env.uat`, or `.env.prd` secret/value files changed: PASS. + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md new file mode 100644 index 000000000..ba0b0b4c7 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md @@ -0,0 +1,24 @@ +# PR_26177_OWNER_050-environment-governance-model Instruction Compliance Checklist + +- [x] Read repo BUILD instructions before task actions. +- [x] Hard-stopped condition checked: current branch was `main` before branch creation. +- [x] Created branch `PR_26177_OWNER_050-environment-governance-model` from `main`. +- [x] Continued on existing branch `PR_26177_OWNER_050-environment-governance-model` without switching branches. +- [x] Read active `docs_build/dev/BUILD_PR.md`; it was for an older unrelated PR. +- [x] Replaced active `docs_build/dev/BUILD_PR.md` with this PR's source-of-truth scope. +- [x] Read `docs_build/dev/PROJECT_INSTRUCTIONS.md`. +- [x] Read `docs_build/dev/PROJECT_MULTI_PC.txt`. +- [x] Confirmed OWNER owns environment strategy and governance. +- [x] Kept the PR to one purpose: environment governance model. +- [x] Avoided runtime code changes. +- [x] Avoided UI changes. +- [x] Avoided engine core changes. +- [x] Avoided `start_of_day` changes. +- [x] Did not run Playwright because no runtime files changed. +- [x] Avoided persisted `imageDataUrl` contract changes. +- [x] Created required Codex reports under `docs_build/dev/reports/`. +- [x] Created repo-structured delta ZIP under `tmp/`. + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md new file mode 100644 index 000000000..ef593d111 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md @@ -0,0 +1,20 @@ +# PR_26177_OWNER_050-environment-governance-model Manual Validation Notes + +Manual validation was limited to governance/documentation review because this PR establishes environment governance and updates `.env.example` comments/placeholders only. + +## Notes + +- Confirmed the active Project Instructions define `Local (VS Code) -> DEV -> IST -> UAT -> PROD`. +- Confirmed the new addendum defines the same environment model. +- Confirmed the environment invariance rule states the deployable artifact is identical across environments. +- Confirmed only `.env` values and environment-managed secret values differ by environment. +- Confirmed one shared API/service contract is required across all environments. +- Confirmed Supabase Auth, Supabase Postgres, and Cloudflare R2 are required in every environment. +- Confirmed R2 top-level prefixes are `/local/`, `/dev/`, `/ist/`, `/uat/`, and `/prod/`. +- Confirmed all environments receive approved guest seed data for all tools. +- Confirmed SQLite is documented as deprecated/retired and not an active runtime database. +- Confirmed `.env.example` comments/placeholders align to the official model. + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md new file mode 100644 index 000000000..2dc6fab1a --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md @@ -0,0 +1,38 @@ +# PR_26177_OWNER_050-environment-governance-model Requirement Checklist + +- [x] Establish `Local (VS Code) -> DEV -> IST -> UAT -> PROD` as the official environment model. +- [x] Define the environment invariance rule. +- [x] State the deployable artifact is identical across all environments. +- [x] State only `.env` values and environment-managed secret values differ. +- [x] Define one shared API/service contract across all environments. +- [x] Define Supabase Auth as required for every environment. +- [x] Define Postgres as required for every environment. +- [x] Define Cloudflare R2 as required for every environment. +- [x] Define R2 top-level prefix `/local/`. +- [x] Define R2 top-level prefix `/dev/`. +- [x] Define R2 top-level prefix `/ist/`. +- [x] Define R2 top-level prefix `/uat/`. +- [x] Define R2 top-level prefix `/prod/`. +- [x] Document that all environments receive approved guest seed data for all tools. +- [x] State SQLite is deprecated/retired. +- [x] State SQLite is not an active runtime database. +- [x] Review `.env.example`. +- [x] Update `.env.example` comments/placeholders to match the official model. +- [x] Keep scope documentation/governance only except `.env.example` comments/placeholders. +- [x] Make no runtime code changes. +- [x] Make no UI changes. +- [x] Make no engine core changes. +- [x] Make no `start_of_day` folder changes. +- [x] Do not run Playwright because no runtime files changed. +- [x] Produce PR-specific report. +- [x] Produce branch validation report. +- [x] Produce validation lane report. +- [x] Produce manual validation notes. +- [x] Produce instruction compliance checklist. +- [x] Produce `codex_review.diff`. +- [x] Produce `codex_changed_files.txt`. +- [x] Produce repo-structured ZIP under `tmp/`. + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md new file mode 100644 index 000000000..272e1756c --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md @@ -0,0 +1,22 @@ +# PR_26177_OWNER_050-environment-governance-model Validation Lane + +## Lane + +Documentation/governance lane. + +## Commands + +- `git diff --check` + +## Skipped Lanes + +- Runtime validation skipped: no runtime files changed. +- UI/browser validation skipped: no UI files changed. +- Playwright skipped: no runtime files changed. +- Engine validation skipped: no engine core files changed. +- Database migration validation skipped: no DDL, migration, or runtime database implementation changed. +- Storage runtime validation skipped: no storage implementation changed. + +## Result + +PASS diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index 4cb4ab3d9..f122725d9 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,27 +1,17 @@ -assets/theme-v2/js/gamefoundry-partials.js -assets/theme-v2/js/legal-document-page.js -assets/theme-v2/partials/footer.html -docs_build/dev/reports/PR_26175_OWNER_054-legal-corrected-package.md +.env.example +docs_build/dev/BUILD_PR.md +docs_build/dev/PROJECT_INSTRUCTIONS.md +docs_build/dev/ProjectInstructions/PROJECT_INSTRUCTIONS.md +docs_build/dev/ProjectInstructions/README.txt +docs_build/dev/ProjectInstructions/addendums/environment_governance_model.md +docs_build/dev/ProjectInstructions/addendums/postgres_only.md +docs_build/dev/ProjectInstructions/addendums/release_gate.md +docs_build/dev/admin-notes/index.txt +docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md +docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md +docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md +docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md +docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md +docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md docs_build/dev/reports/codex_changed_files.txt docs_build/dev/reports/codex_review.diff -docs_build/dev/reports/coverage_changed_js_guardrail.txt -docs_build/dev/reports/playwright_v8_coverage_report.txt -legal/community-guidelines.html -legal/community-guidelines.md -legal/cookie-policy.html -legal/cookie-policy.md -legal/cookies-policy.html -legal/copyright-policy.html -legal/copyright-policy.md -legal/disclaimer.html -legal/dmca-policy.html -legal/dmca-policy.md -legal/index.html -legal/index.md -legal/legal-nav.js -legal/privacy-policy.html -legal/privacy-policy.md -legal/terms.html -legal/terms-of-service.html -legal/terms-of-service.md -tests/playwright/tools/RemainingLegalPages.spec.mjs \ No newline at end of file diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index fdfeac55a30526c21627c2184b6692766d4426d7..0b463482953495eb8bb2633e2d0d9945008062fa 100644 GIT binary patch literal 34339 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 Date: Thu, 25 Jun 2026 21:12:08 -0400 Subject: [PATCH 2/2] Refresh environment governance conflict reports --- ..._OWNER_050-environment-governance-model.md | 11 ++++- ...ment-governance-model_branch-validation.md | 2 + ...-model_instruction-compliance-checklist.md | 2 + ...overnance-model_manual-validation-notes.md | 4 +- ...-governance-model_requirement-checklist.md | 2 + ...onment-governance-model_validation-lane.md | 2 + docs_build/dev/reports/codex_review.diff | 47 +++++++++++++------ 7 files changed, 54 insertions(+), 16 deletions(-) diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md index e99a11c36..fff326ad4 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md @@ -27,6 +27,15 @@ Status: PASS - Preserved the OWNER_050 environment governance purpose and decisions. - Final PR delta remains documentation/governance plus `.env.example` comments/placeholders. +## Latest Mainline Check + +- Rechecked PR #202 against `origin/main` at `f237619cf`. +- Current branch was `PR_26177_OWNER_050-environment-governance-model`: PASS. +- `git merge origin/main` reported `Already up to date.`: PASS. +- No new merge conflicts were present: PASS. +- OWNER_050 environment governance decisions remain preserved: PASS. +- No OWNER_051 scope was added: PASS. + ## Branch Validation PASS. Current branch is `PR_26177_OWNER_050-environment-governance-model`, created from clean `main` at `0c0f2ebc0`. @@ -76,7 +85,7 @@ PASS. Current branch is `PR_26177_OWNER_050-environment-governance-model`, creat - PASS: `git status`. - PASS: `git diff --check`. - PASS: Documentation review confirmed the official environment model, invariance rule, shared API/service contract, required services, R2 prefixes, guest seed data rule, and SQLite retired status. -- SKIP: Playwright was not run because conflict resolution changed only docs/report/template files in the PR delta. +- SKIP: Playwright was not run because the final PR delta contains only docs/template/report files and `.env.example` comments/placeholders. ## Artifact diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md index f2d6ed6d1..767c0b5a8 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md @@ -16,6 +16,8 @@ - Current branch is the scoped OWNER_050 branch: PASS. - Conflict resolution was performed against `origin/main` only: PASS. - Merge conflicts were limited to generated Codex report artifacts: PASS. +- Latest `origin/main` recheck reported `Already up to date.`: PASS. +- No OWNER_051 scope was added: PASS. - Scope is limited to environment governance, `.env.example` comments/placeholders, reports, and Codex review artifacts: PASS. - No runtime files changed: PASS. - No UI files changed: PASS. diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md index 966ffca9a..29aa4800a 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md @@ -21,6 +21,8 @@ - [x] Merged `origin/main` only for conflict resolution. - [x] Resolved only generated Codex artifact conflicts. - [x] Refreshed reports and ZIP after conflict resolution. +- [x] Rechecked PR #202 against latest `origin/main`; Git reported `Already up to date.`. +- [x] Added no OWNER_051 scope. ## Result diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md index 8ea5147fe..5fa971bb3 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md @@ -16,7 +16,9 @@ Manual validation was limited to governance/documentation review because this PR - Confirmed `.env.example` comments/placeholders align to the official model. - Confirmed merge conflicts against `origin/main` were limited to generated Codex report artifacts. - Confirmed OWNER_050 environment governance decisions were preserved after conflict resolution. -- Confirmed Playwright is not impacted because conflict resolution changed only docs/report/template files in the PR delta. +- Confirmed latest `origin/main` recheck reported `Already up to date.` with no new conflicts. +- Confirmed no OWNER_051 scope was added. +- Confirmed Playwright is not impacted because the final PR delta contains only docs/template/report files and `.env.example` comments/placeholders. ## Result diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md index a53166b57..8059b0047 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md @@ -35,6 +35,8 @@ - [x] Resolve merge conflicts against `origin/main` only. - [x] Preserve OWNER_050 environment governance decisions after conflict resolution. - [x] Refresh repo-structured ZIP after conflict resolution. +- [x] Recheck PR #202 against latest `origin/main`. +- [x] Add no OWNER_051 scope. ## Result diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md index 66eed6016..3637d7dd0 100644 --- a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md @@ -23,6 +23,8 @@ Documentation/governance lane. - `origin/main` was merged into the branch. - Conflicts were limited to `docs_build/dev/reports/codex_changed_files.txt` and `docs_build/dev/reports/codex_review.diff`. - Both generated artifacts were regenerated after the merge. +- Latest `origin/main` recheck reported `Already up to date.`. +- No new merge conflicts were present. ## Result diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index c69a53ba0..331a2c9a9 100644 --- a/docs_build/dev/reports/codex_review.diff +++ b/docs_build/dev/reports/codex_review.diff @@ -544,10 +544,10 @@ index 93654fa6e..4744bea93 100644 node .\scripts\validate-supabase-dev.mjs diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md new file mode 100644 -index 000000000..e99a11c36 +index 000000000..fff326ad4 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model.md -@@ -0,0 +1,83 @@ +@@ -0,0 +1,92 @@ +# PR_26177_OWNER_050-environment-governance-model + +Date: 2026-06-25 @@ -577,6 +577,15 @@ index 000000000..e99a11c36 +- Preserved the OWNER_050 environment governance purpose and decisions. +- Final PR delta remains documentation/governance plus `.env.example` comments/placeholders. + ++## Latest Mainline Check ++ ++- Rechecked PR #202 against `origin/main` at `f237619cf`. ++- Current branch was `PR_26177_OWNER_050-environment-governance-model`: PASS. ++- `git merge origin/main` reported `Already up to date.`: PASS. ++- No new merge conflicts were present: PASS. ++- OWNER_050 environment governance decisions remain preserved: PASS. ++- No OWNER_051 scope was added: PASS. ++ +## Branch Validation + +PASS. Current branch is `PR_26177_OWNER_050-environment-governance-model`, created from clean `main` at `0c0f2ebc0`. @@ -626,17 +635,17 @@ index 000000000..e99a11c36 +- PASS: `git status`. +- PASS: `git diff --check`. +- PASS: Documentation review confirmed the official environment model, invariance rule, shared API/service contract, required services, R2 prefixes, guest seed data rule, and SQLite retired status. -+- SKIP: Playwright was not run because conflict resolution changed only docs/report/template files in the PR delta. ++- SKIP: Playwright was not run because the final PR delta contains only docs/template/report files and `.env.example` comments/placeholders. + +## Artifact + +- `tmp/PR_26177_OWNER_050-environment-governance-model_delta.zip` diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md new file mode 100644 -index 000000000..f2d6ed6d1 +index 000000000..767c0b5a8 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_branch-validation.md -@@ -0,0 +1,28 @@ +@@ -0,0 +1,30 @@ +# PR_26177_OWNER_050-environment-governance-model Branch Validation + +## Branch @@ -655,6 +664,8 @@ index 000000000..f2d6ed6d1 +- Current branch is the scoped OWNER_050 branch: PASS. +- Conflict resolution was performed against `origin/main` only: PASS. +- Merge conflicts were limited to generated Codex report artifacts: PASS. ++- Latest `origin/main` recheck reported `Already up to date.`: PASS. ++- No OWNER_051 scope was added: PASS. +- Scope is limited to environment governance, `.env.example` comments/placeholders, reports, and Codex review artifacts: PASS. +- No runtime files changed: PASS. +- No UI files changed: PASS. @@ -667,10 +678,10 @@ index 000000000..f2d6ed6d1 +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md new file mode 100644 -index 000000000..966ffca9a +index 000000000..29aa4800a --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_instruction-compliance-checklist.md -@@ -0,0 +1,27 @@ +@@ -0,0 +1,29 @@ +# PR_26177_OWNER_050-environment-governance-model Instruction Compliance Checklist + +- [x] Read repo BUILD instructions before task actions. @@ -694,16 +705,18 @@ index 000000000..966ffca9a +- [x] Merged `origin/main` only for conflict resolution. +- [x] Resolved only generated Codex artifact conflicts. +- [x] Refreshed reports and ZIP after conflict resolution. ++- [x] Rechecked PR #202 against latest `origin/main`; Git reported `Already up to date.`. ++- [x] Added no OWNER_051 scope. + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md new file mode 100644 -index 000000000..8ea5147fe +index 000000000..5fa971bb3 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_manual-validation-notes.md -@@ -0,0 +1,23 @@ +@@ -0,0 +1,25 @@ +# PR_26177_OWNER_050-environment-governance-model Manual Validation Notes + +Manual validation was limited to governance/documentation review because this PR establishes environment governance and updates `.env.example` comments/placeholders only. @@ -722,17 +735,19 @@ index 000000000..8ea5147fe +- Confirmed `.env.example` comments/placeholders align to the official model. +- Confirmed merge conflicts against `origin/main` were limited to generated Codex report artifacts. +- Confirmed OWNER_050 environment governance decisions were preserved after conflict resolution. -+- Confirmed Playwright is not impacted because conflict resolution changed only docs/report/template files in the PR delta. ++- Confirmed latest `origin/main` recheck reported `Already up to date.` with no new conflicts. ++- Confirmed no OWNER_051 scope was added. ++- Confirmed Playwright is not impacted because the final PR delta contains only docs/template/report files and `.env.example` comments/placeholders. + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md new file mode 100644 -index 000000000..a53166b57 +index 000000000..8059b0047 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_requirement-checklist.md -@@ -0,0 +1,41 @@ +@@ -0,0 +1,43 @@ +# PR_26177_OWNER_050-environment-governance-model Requirement Checklist + +- [x] Establish `Local (VS Code) -> DEV -> IST -> UAT -> PROD` as the official environment model. @@ -770,16 +785,18 @@ index 000000000..a53166b57 +- [x] Resolve merge conflicts against `origin/main` only. +- [x] Preserve OWNER_050 environment governance decisions after conflict resolution. +- [x] Refresh repo-structured ZIP after conflict resolution. ++- [x] Recheck PR #202 against latest `origin/main`. ++- [x] Add no OWNER_051 scope. + +## Result + +PASS diff --git a/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md new file mode 100644 -index 000000000..66eed6016 +index 000000000..3637d7dd0 --- /dev/null +++ b/docs_build/dev/reports/PR_26177_OWNER_050-environment-governance-model_validation-lane.md -@@ -0,0 +1,29 @@ +@@ -0,0 +1,31 @@ +# PR_26177_OWNER_050-environment-governance-model Validation Lane + +## Lane @@ -805,6 +822,8 @@ index 000000000..66eed6016 +- `origin/main` was merged into the branch. +- Conflicts were limited to `docs_build/dev/reports/codex_changed_files.txt` and `docs_build/dev/reports/codex_review.diff`. +- Both generated artifacts were regenerated after the merge. ++- Latest `origin/main` recheck reported `Already up to date.`. ++- No new merge conflicts were present. + +## Result +