From 75cb1651ed7baa52d5e398acafee41c42831c7ec Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 05:41:43 +0800 Subject: [PATCH 01/10] fix(test): use preinstalled Chromium in immutable containers --- docs/outstanding-issues.md | 2 +- docs/testing.md | 2 +- scripts/playwright-browser-preflight.mjs | 93 +++++++++++++++++++++- scripts/run-playwright.mjs | 11 ++- tests/playwright-browser-preflight.test.ts | 49 ++++++++++++ tests/test-runner-safety.test.ts | 2 + 6 files changed, 153 insertions(+), 6 deletions(-) diff --git a/docs/outstanding-issues.md b/docs/outstanding-issues.md index af446e8d15..02f2103517 100644 --- a/docs/outstanding-issues.md +++ b/docs/outstanding-issues.md @@ -139,7 +139,6 @@ removed after current-main verification; it is not missing recommended work. | #102 | P3 | task | Apply the additive `documents` index debt (operator) | **Outcome:** bare-column `ILIKE` and the paged status scan on `documents` are index-served on hosted. `documents_title_trgm_idx` indexes a CONCATENATED expression, so the bare-column predicates in `api/documents/route.ts:193` and `rag-candidate-sources.ts:477` (RAG path) cannot use it and fall back to scanning; `search-scope.ts:271-277` sorts per page against the single-column `documents_status_idx`. **Runbook prepared 2026-07-29 — NOT applied, item stays open:** three `CREATE INDEX CONCURRENTLY` statements authored and reviewed in `docs/operator-apply-performance-latency-remediation.md` — additive, though **the "recall is byte-identical" claim was RETRACTED on 2026-07-29 review**: `fetchDocumentTitleAliasRows` (`rag-candidate-sources.ts:482`) applies `.limit(12)` with no `ORDER BY`, so a new index can change which title-alias documents feed candidate assembly. Only the documents-list use stays ordering-safe; `(status,id)` is canary-gated too — see runbook, and making that `.limit(12)` deterministic first does **not** lift the gate — an unordered `LIMIT` has no stable selection to preserve, so imposing an order can pick a different twelve and is itself an ordering behaviour change on a retrieval surface, which AGENTS.md requires a canary pair for. Sequencing the ordering fix first is worthwhile (unordered `LIMIT` on a retrieval input is latent nondeterminism regardless) but yields two canary-gated changes, not one (PR #1377 review). **Deliberately NO migration file:** an additive-index migration without a synchronized `schema.sql` mirror and regenerated drift manifest is exactly what closed PR #1312, and the mirror cannot come first because `required_indexes` in `search_schema_health()` (`schema.sql:3178`) runs against live. **Next (operator):** **author the migration first** — `supabase/migrations/` is the source of truth and `schema.sql` only a mirror, so hand-run operator SQL never reaches staging, disaster-recovery replay, or a local `supabase db reset`, and a `required_indexes` registration would fail there (PR #1377 review); follow the `20260717170000_registry_projection_cleanup.sql` idempotent pattern. **That migration must also carry the health-function change** — `required_indexes` lives inside `search_schema_health()`, which is redefined by `create or replace function` in eleven migrations (copy `20260705180000_reconcile_search_health_indexes.sql:62`); editing `schema.sql:3177` alone moves only the mirror and leaves the indexes unmonitored on hosted (PR #1377 review). Then apply concurrently, confirm `indisvalid`, mirror both the index statements and the identical function body into `schema.sql`, run `npm run drift:manifest` (Docker), and deploy the migration LAST — in that order, in one change. Expect `check:drift` to report them as unexpected between steps 1 and 2. **Rollback is three deployed phases, not the reverse of one:** retract `required_indexes` via its own `create or replace function` migration and deploy → drop concurrently live → only then deploy the `schema.sql` removal plus an idempotent forward `drop index if exists` migration, because Supabase wraps migrations in a transaction and a plain `DROP INDEX` there takes the lock the concurrent procedure exists to avoid (PR #1377 review). | `docs/audit/latency-audit-2026-07-28.md` L2-3/L2-5; `docs/operator-apply-performance-latency-remediation.md` | 2026-07-29 | | #103 | P2 | issue | Wide table-facts trigram index missing from `schema.sql` | **Outcome:** the migration chain and `schema.sql` agree on `document_table_facts` trigram indexes. `supabase/migrations/20260714190000_document_table_facts_trgm_idx.sql` creates a wide 5-column trigram index that is **absent from `supabase/schema.sql`**, so local replay and the live database can diverge. Distinct from #102: different owner and verification path. **Next:** confirm whether the wide index exists live, then take one of exactly two routes — **retained:** mirror `document_table_facts_text_trgm_idx` into `supabase/schema.sql` beside the narrow one and regenerate `drift-manifest.json`; **redundant:** drop it through a new forward migration, never by deleting `20260714190000`. **`drift-allowlist.json` is NOT a third option** (PR #1377 review): its own header scopes it to _"Known live-vs-`schema.sql` divergence"_, so it can silence a live drift finding but cannot reconcile the migration chain with the mirror — a fresh `supabase db reset` still runs `20260714190000` and creates the index while `schema.sql` still omits it, leaving this row's stated outcome unmet. **No offline gate catches this today:** the migration↔`schema.sql` parity test (`tests/drift-detection.test.ts:59-68`) only asserts one migration's `schema_drift_snapshot` function definition, not an index inventory — which is why this sits open rather than red in CI, and why a replay-to-schema inventory comparison is the check that would have caught it. Note the narrow `document_table_facts_title_row_param_trgm_idx` (`schema.sql:6425`) is the one the effective RPC expression (`:6726`) actually matches, so the wide index may be genuinely redundant — do not drop it without live scan evidence, per the monitored-not-auto-fixed index policy. | `docs/audit/latency-audit-2026-07-28.md` limitations; `npm run check:drift` | 2026-07-29 | | #110 | P3 | task | Design-system project token manifest lags its stylesheet | **Outcome:** the claude.ai/design token panel matches the shipped stylesheet. **Detail:** PR #1375 pushed a recompiled `_ds_bundle.css` (Clinical Sky, `--e0`–`--e4`, 4px radius grid, `--tracking-eyebrow`/`--leading-display`/`--leading-prose`) plus the four changed guideline docs to project `08d6f126`, but `_ds_manifest.json` is converter-generated and still advertises `--text-4xs: 0.5rem`, the old `--radius-lg/xl/2xl` values, and `--tw-leading`/`--tw-tracking` entries scoped to the retired `.leading-[…]` / `.tracking-[0.08em]` utilities. Rendering is correct; only the token inventory lags. Hand-editing was rejected — `kind`/`scope`/`annotation` are converter heuristics and a wrong panel is worse than a stale one. **Next:** in a session with the `/design-sync` skill, `npm ci`, then `npm install --prefix .ds-sync --no-save --package-lock=false esbuild ts-morph @types/react @tailwindcss/cli geist`, read `.design-sync/NOTES.md`, and run `resync.mjs --remote` so bundle and manifest regenerate together. **Stop:** do not hand-author `_ds_manifest.json`; the converter is not a published npm package and ships with the skill. | PR #1375; `.design-sync/NOTES.md`; project `08d6f126` (`_ds_needs_recompile` marker present) | 2026-07-29 | -| #121 | P3 | issue | Container Playwright browser build lags the pinned client | **Outcome:** browser gates run in remote sessions without hand-patching. **Evidence 2026-07-30:** the repo's Playwright client resolves headless-shell build `1234`; the container image provides `1194` at `/opt/pw-browsers`, so every browser test fails at launch. Worked around in-session by symlinking `chromium_headless_shell-1234/chrome-headless-shell-linux64/chrome-headless-shell` to the `1194` `headless_shell` binary plus its sibling resources — container-local, nothing committed, and it disappears with the session. `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1` means the mismatch cannot self-heal. **Next:** decide whether the image pins the browser build or the repo pins a client matching the image; until then any remote session claiming browser proof must state which it used. **Added 2026-07-30 (session closing `#120`):** the mismatch reproduced unchanged on `main` at `c5c1a86` — `npx playwright install --dry-run chromium` reports `chromium v1234` while `/opt/pw-browsers` holds only `chromium-1194` and `chromium_headless_shell-1194`, and one `verify:phone-chrome` run lost all 13 browser tests at launch. It has now been misread twice: the 2026-07-30 handoff records 13 launch failures taken as "my change is wrong", and `#120` was filed as a gate defect from a reading taken under this condition (closed as not reproducible; the gate exits 1 correctly). **Detection, before trusting or filing anything from a browser gate:** compare `npx playwright install --dry-run chromium` against `ls /opt/pw-browsers`. **Stop:** do not file a gate defect from a run whose tests never launched — zero assertions executed, so the output describes the environment, not the diff. **Correction 2026-07-30 — the symlink workaround is not always available, so this row's own evidence overstates the escape hatch.** In a Claude Code remote session the sandbox **refused** `mkdir`/`ln -s` under `/opt/pw-browsers` (permission denied by the auto-mode classifier, not by file permissions — the directory itself is writable). So a sandboxed session has no way to bridge the builds, and the honest options reduce to two: request the write permission explicitly, or state that no browser evidence is available and leave the browser claim unmade. **Retracted the same day, by me:** the sentence above claiming the options "reduce to two" was wrong, and it is left standing rather than deleted because the retraction is the useful part. There is a third route that needs no filesystem write at all: **`PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH`**, read by `playwright.config.ts:11` and honoured by the preflight (`scripts/playwright-browser-preflight.mjs:101`), pointed at the container's existing `1194` binary. Verified by launching it, not by reading the flag: `chromium.launch({ executablePath: "/opt/pw-browsers/chromium_headless_shell-1194/chrome-linux/headless_shell" })` under the repo's Playwright 1.62 client reported `version 141.0.7390.37`, rendered a page and measured a `boundingBox` of the expected height. So a sandboxed remote session **can** produce browser evidence, and the earlier claim that it cannot was an over-generalisation from one blocked `mkdir`. The mismatch itself is unchanged and this row stays open — the point is that its consequence is a one-env-var workaround, not a hard stop. **Related, landed 2026-07-30 (PR #1432, `3054d685`):** `assertPlaywrightBrowsersReady` now runs inside `scripts/run-playwright.mjs`, so a missing binary exits `1` with one explicit message naming the override, instead of surfacing as N tests "failing" at launch — the misdiagnosis that produced `#120`. | `docs/testing.md`; container `/opt/pw-browsers` | 2026-07-30 | | #126 | P3 | task | Quarterly branch-review ledger rotation reminder | **Outcome:** live ledger stays navigable after #1418 L4 bootstrap. **Next:** each UTC calendar-quarter start (or when the live table feels unwieldy), run `npm run ledger:rotate -- --dry-run`, then `npm run ledger:rotate` and commit live+archive. Lookup/sweep/check already read archives. **Stop:** do not hand-move rows; do not delete unique review content. | session 2026-07-30; follow-up to #1418 / L4 | 2026-07-30 | | #117 | P2 | rec | Therapy Compass catalogue payload is the mobile LCP outlier | **Outcome:** `/therapy-compass` mobile LCP lands near the other mobile routes instead of double them. **Measured 2026-07-30** by the new pre-merge Lighthouse budget: mobile LCP 5229 ms, TBT 612 ms, CLS 0.142, against 2123-2460 ms on every other mobile route and 826 ms on desktop — so it is client-side work under mobile CPU/network throttling, not server latency. **Cause:** `useTherapyData` fetches `public/therapy-compass-data/therapies-index.json` (690 KB raw, 139 KB gzipped, 205 records x 16 fields) for the home/search/pathways screens, so the download plus JSON parse sits on the critical path before content paints. 90% of that weight is long-form clinical prose — indications 159 KB (26%), contraindicationsOrCautions 139 KB (23%), bestUsedFor 73 KB (12%), clinicalSummary 67 KB (11%), patientPopulation 59 KB (10%), targetSymptoms 48 KB (8%) — while name, slug, category, tags and setting together are 54 KB (7%). **Blocked on one decision per field group: rendered on the card, matched by search, or neither.** `therapy-card.tsx` references five of those prose fields and the same index feeds the search screen, so stripping fields could silently change clinical display or search recall. **Next:** settle that per-field question, then either pre-truncate prose that only feeds card display, or move search matching server-side / load prose on first keystroke. **Gate:** `check:therapy-data-index` plus the therapy Playwright journeys; re-measure with `npm run verify:lighthouse`. **Stop:** do not drop a field from the catalogue payload without confirming no card renders it and no search path matches on it. Same class as #013 (route-chunk / catalogue JSON weight), different route and now measured. | session 2026-07-30 Lighthouse budget first run; PR #1404 | 2026-07-30 | | #118 | P2 | task | Adopt the visual and Lighthouse baselines so the two new gates actually gate | **Outcome:** `visual-baseline` and `lighthouse-budget` stop reporting and start blocking. **Detail:** PR #1404 added both as `continue-on-error` jobs outside `pr-required`, deliberately. `tests/ui-visual-baseline.spec.ts` has no committed baselines, so all six targets fail with a missing-snapshot error by design; the job uploads them on every run (run 30513537912, artifact 8748062487, 31 files). `lighthouse-budget.json` ships `enforce: false` with `baseline: null`, so the grader warns rather than grades. **Next:** (1) download that artifact, review the six PNGs and commit them under the platform-scoped screenshots directory that `playwright.visual.config.ts` names in its `snapshotPathTemplate` — from CI, never a developer machine, because font hinting differs between them; (2) run `npm run check:lighthouse-budget -- --update` against a known-good CI build and flip `enforce`, but not before #117 or the baseline pins a known-slow route; (3) then add each job to `pr-required` and drop `continue-on-error` in the same edit. **Also:** PR #1404 added the first rendered-effect contract for #094, but 37 of the 38 unlayered visual classes still carry exemptions in `tests/helpers/style-contracts.ts` rather than contracts; and `scripts/run-lighthouse-budget.mjs` duplicates about 50 lines of the isolated-server boot in `scripts/run-playwright.mjs`, deferred to avoid destabilising the required UI gate in the same change. **Stop:** do not make a missing baseline skip instead of fail — that is the soft-skip-green pattern `AGENTS.md` forbids. | session 2026-07-30; PR #1404 | 2026-07-30 | @@ -175,6 +174,7 @@ Move resolved rows here with the resolution date and a one-line outcome. Keep th | #135 | rec | API-only App Router changes unnecessarily selected full UI verification | Resolved 2026-07-30. `isUiChangedPath` excludes `src/app/api/**`, while the CI scope self-test pins API-only changes as `ui_changed: false` and preserves the non-UI static/unit safety gates. Current-main `check:ci-scope` passes. | 2026-07-30 | | #129 | issue | GitHub update-branch ignored the custom ledger merge driver | Resolved 2026-07-30 by constraining the operation rather than trusting it as a conflict oracle. The branch-sync procedure requires `git merge-tree --write-tree` first, permits only a human-authenticated update, and directs clean custom-driver false conflicts to a local `git merge origin/main` plus ordinary push. | 2026-07-30 | | #132 | issue | Client-side push guards could be bypassed in agent environments | Resolved 2026-07-30 under the row's explicit-limitation outcome. AGENTS.md names the missing-hook and missing-`gh` fail-open paths as load-bearing operator rules; ordinary PR CI enforces formatting server-side, while the tested local sentinel remains an early auto-merge race guard where `gh` is available. No privileged `pull_request_target` execution of PR code was added. | 2026-07-30 | +| #121 | issue | Container Playwright browser build lagged the pinned client | Resolved 2026-07-30 at the repository runner boundary. Managed Playwright browsers remain preferred; only when downloads are explicitly disabled and `PLAYWRIGHT_BROWSERS_PATH` is exposed does preflight select the newest platform-compatible preinstalled headless shell and pass that exact executable to the Playwright child. The fallback is unit-pinned and was launch-proven with a simulated older container revision; ordinary stale developer caches still fail closed. | 2026-07-30 | | ID | Type | Summary | Outcome | Resolved | | ---- | ----- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | diff --git a/docs/testing.md b/docs/testing.md index e22da818b3..d60bcf658b 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -62,7 +62,7 @@ Reference examples: `tests/icon-button.dom.test.tsx` (accessible-name contract), ## Playwright ownership -The repository runner exclusively builds and serves each Playwright production app. It selects a safe port, verifies `/api/local-project-id`, uses an isolated `.next-playwright/` build directory, replaces provider configuration with inert loopback values, and removes its server and output on success, failure, or signal. Playwright configuration never starts a server. The production boot guard permits this demo profile only when the output is isolated, provider mode is offline, credentials are absent, and the Supabase URL is the inert `127.0.0.1:1` target. Before acquiring the heavy lock or building, the runner preflights the Chromium (or requested Firefox/WebKit) executable — including the default `chrome-headless-shell` binary and any `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH` override — and exits non-zero immediately when it is missing, so a launch-infra failure cannot be mistaken for product-test failures after a multi-minute build. +The repository runner exclusively builds and serves each Playwright production app. It selects a safe port, verifies `/api/local-project-id`, uses an isolated `.next-playwright/` build directory, replaces provider configuration with inert loopback values, and removes its server and output on success, failure, or signal. Playwright configuration never starts a server. The production boot guard permits this demo profile only when the output is isolated, provider mode is offline, credentials are absent, and the Supabase URL is the inert `127.0.0.1:1` target. Before acquiring the heavy lock or building, the runner preflights the Chromium (or requested Firefox/WebKit) executable — including the default `chrome-headless-shell` binary and any `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH` override — and exits non-zero immediately when it is missing, so a launch-infra failure cannot be mistaken for product-test failures after a multi-minute build. A download-disabled container that explicitly exposes `PLAYWRIGHT_BROWSERS_PATH` is the one exception: if the client-pinned shell is absent, the runner selects the newest preinstalled shell for the current platform and passes its exact path to Playwright. It logs that fallback before the build; ordinary developer caches still fail closed rather than silently selecting a stale browser. When capturing Playwright or `verify:phone-chrome` output through a shell pipe (`cmd 2>&1 | tee …`), enable `set -o pipefail` (or avoid the pipe). Without it, bash reports the pipeline exit from `tee` (`0`) while the log still ends in `N failed` — a measurement artifact that previously looked like a green-when-broken gate (outstanding-issues #120). The Node runners themselves already propagate Playwright’s exit status. diff --git a/scripts/playwright-browser-preflight.mjs b/scripts/playwright-browser-preflight.mjs index 63c829d29b..f07616fc2d 100644 --- a/scripts/playwright-browser-preflight.mjs +++ b/scripts/playwright-browser-preflight.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -import { existsSync } from "node:fs"; +import { existsSync, readdirSync } from "node:fs"; import path from "node:path"; import { chromium, firefox, webkit } from "playwright"; @@ -46,6 +46,61 @@ const CHROMIUM_HEADLESS_SHELL_LAYOUTS = Object.freeze({ "chrome-win64": ["chrome-headless-shell-win64", "chrome-headless-shell.exe"], }); +const PREINSTALLED_CHROMIUM_LAYOUTS = Object.freeze({ + linux: [ + ["chrome-headless-shell-linux64", "chrome-headless-shell"], + ["chrome-linux", "headless_shell"], + ], + darwin: { + x64: [["chrome-headless-shell-mac-x64", "chrome-headless-shell"]], + arm64: [["chrome-headless-shell-mac-arm64", "chrome-headless-shell"]], + }, + win32: [["chrome-headless-shell-win64", "chrome-headless-shell.exe"]], +}); + +function preinstalledChromiumLayouts(platform = process.platform, architecture = process.arch) { + if (platform === "darwin") return PREINSTALLED_CHROMIUM_LAYOUTS.darwin[architecture] ?? []; + return PREINSTALLED_CHROMIUM_LAYOUTS[platform] ?? []; +} + +/** + * Find the newest headless shell supplied by a download-disabled container. + * + * This is intentionally narrower than scanning every Playwright cache: a stale + * developer cache must still fail closed. The fallback is available only when + * the caller explicitly exposes PLAYWRIGHT_BROWSERS_PATH and disables browser + * downloads, which is the immutable-container shape recorded in issue #121. + */ +export function newestPreinstalledChromiumHeadlessShell( + browsersRoot, + { + fileExists = existsSync, + readDirectory = readdirSync, + platform = process.platform, + architecture = process.arch, + } = {}, +) { + if (!browsersRoot) return null; + let directories; + try { + directories = readDirectory(browsersRoot, { withFileTypes: true }); + } catch { + return null; + } + const revisions = directories + .filter((entry) => entry.isDirectory() && /^chromium_headless_shell-\d+$/.test(entry.name)) + .map((entry) => ({ name: entry.name, revision: Number(entry.name.slice("chromium_headless_shell-".length)) })) + .sort((left, right) => right.revision - left.revision); + const layouts = preinstalledChromiumLayouts(platform, architecture); + for (const directory of revisions) { + for (const layout of layouts) { + const executable = path.join(browsersRoot, directory.name, ...layout); + if (fileExists(executable)) return executable; + } + } + return null; +} + /** * Derive the default headless-shell binary Playwright launches for Chromium * tests. `chromium.executablePath()` points at full Chrome for Testing; the @@ -96,7 +151,16 @@ function browserFamilyForProject(project) { return PROJECT_BROWSER_FAMILIES[project] ?? null; } -export function resolvePlaywrightBrowserExecutable(family, env = process.env) { +export function resolvePlaywrightBrowserExecutable( + family, + env = process.env, + { + managedChromiumPath = defaultChromiumHeadlessShellPath(), + fileExists = existsSync, + platform = process.platform, + architecture = process.arch, + } = {}, +) { if (family === "chromium") { const override = env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH?.trim(); if (override) { @@ -106,9 +170,32 @@ export function resolvePlaywrightBrowserExecutable(family, env = process.env) { source: "PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH", }; } + if (managedChromiumPath && fileExists(managedChromiumPath)) { + return { + family, + path: managedChromiumPath, + source: "playwright chromium-headless-shell", + }; + } + const downloadsDisabled = /^(?:1|true)$/i.test(env.PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD?.trim() ?? ""); + if (downloadsDisabled) { + const preinstalled = newestPreinstalledChromiumHeadlessShell(env.PLAYWRIGHT_BROWSERS_PATH?.trim(), { + fileExists, + platform, + architecture, + }); + if (preinstalled) { + return { + family, + path: preinstalled, + source: "preinstalled container Chromium (PLAYWRIGHT_BROWSERS_PATH)", + managedPath: managedChromiumPath, + }; + } + } return { family, - path: defaultChromiumHeadlessShellPath(), + path: managedChromiumPath, source: "playwright chromium-headless-shell", }; } diff --git a/scripts/run-playwright.mjs b/scripts/run-playwright.mjs index 784ed5b32a..d4f7a070fd 100644 --- a/scripts/run-playwright.mjs +++ b/scripts/run-playwright.mjs @@ -50,7 +50,16 @@ const mockupProjectRequested = // Fail loud on missing browser binaries before the heavy lock or production build. // Otherwise launch failures surface as "N failed" product tests and are easy to misread // when a caller pipes output without `pipefail` (outstanding-issues #120). -assertPlaywrightBrowsersReady(playwrightArgs); +const browserPreflight = assertPlaywrightBrowsersReady(playwrightArgs); +const preinstalledChromium = browserPreflight.checked.find( + (entry) => entry.source === "preinstalled container Chromium (PLAYWRIGHT_BROWSERS_PATH)", +); +if (preinstalledChromium && !process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH) { + process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH = preinstalledChromium.path; + console.error( + `[playwright] Managed Chromium is unavailable; using the preinstalled container browser at ${preinstalledChromium.path}.`, + ); +} const runId = `${process.pid}-${Date.now()}`; const relativeRunRoot = `.next-playwright/${runId}`; diff --git a/tests/playwright-browser-preflight.test.ts b/tests/playwright-browser-preflight.test.ts index 92758022a7..c9a9e7e135 100644 --- a/tests/playwright-browser-preflight.test.ts +++ b/tests/playwright-browser-preflight.test.ts @@ -1,6 +1,10 @@ +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { defaultChromiumHeadlessShellPath, + newestPreinstalledChromiumHeadlessShell, playwrightBrowserPreflight, playwrightProjectNames, requestedPlaywrightBrowserProjects, @@ -83,6 +87,51 @@ describe("playwright browser preflight", () => { }); }); + it("selects the newest container shell only when managed downloads are disabled", () => { + const root = mkdtempSync(join(tmpdir(), "pw-container-browsers-")); + const older = join(root, "chromium_headless_shell-1194", "chrome-linux", "headless_shell"); + const newer = join(root, "chromium_headless_shell-1200", "chrome-linux", "headless_shell"); + try { + mkdirSync(join(older, ".."), { recursive: true }); + mkdirSync(join(newer, ".."), { recursive: true }); + writeFileSync(older, ""); + writeFileSync(newer, ""); + + expect(newestPreinstalledChromiumHeadlessShell(root, { platform: "linux", architecture: "x64" })).toBe(newer); + + const managedPath = join(root, "chromium_headless_shell-1234", "missing"); + expect( + resolvePlaywrightBrowserExecutable( + "chromium", + { + NODE_ENV: "test", + PLAYWRIGHT_BROWSERS_PATH: root, + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1", + }, + { managedChromiumPath: managedPath, platform: "linux", architecture: "x64" }, + ), + ).toMatchObject({ + family: "chromium", + path: newer, + source: "preinstalled container Chromium (PLAYWRIGHT_BROWSERS_PATH)", + managedPath, + }); + expect( + resolvePlaywrightBrowserExecutable( + "chromium", + { NODE_ENV: "test", PLAYWRIGHT_BROWSERS_PATH: root }, + { managedChromiumPath: managedPath, platform: "linux", architecture: "x64" }, + ), + ).toEqual({ + family: "chromium", + path: managedPath, + source: "playwright chromium-headless-shell", + }); + } finally { + rmSync(root, { recursive: true, force: true }); + } + }); + it("fails closed when the required Chromium binary is missing", () => { const result = playwrightBrowserPreflight(["--project=chromium"], { NODE_ENV: "test", diff --git a/tests/test-runner-safety.test.ts b/tests/test-runner-safety.test.ts index 740eb832bc..45b5b87491 100644 --- a/tests/test-runner-safety.test.ts +++ b/tests/test-runner-safety.test.ts @@ -633,6 +633,8 @@ describe("provider-safe test environment", () => { ); expect(preflight).toContain("chromium_headless_shell"); expect(preflight).toContain("PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH"); + expect(preflight).toContain("PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD"); + expect(runner).toContain("process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH = preinstalledChromium.path"); expect(packageJson.scripts["test:e2e:pr"]).toContain('--grep-invert "@quarantine|@mockup"'); expect(packageJson.scripts["test:e2e:regression"]).toContain('--grep-invert "@critical|@quarantine|@mockup"'); expect(baseUrl.indexOf("if (!allowEnsure)")).toBeLessThan(baseUrl.indexOf("findExistingLocalProjectUrl();")); From 90d5eee16e38a4f771571c110df89caac1b3e595 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 05:45:18 +0800 Subject: [PATCH 02/10] docs: record issue 121 review --- docs/branch-review-ledger.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 80d2c44f4c..3f1ff51ea3 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -278,3 +278,4 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/coverage-scope-policy | 4da2a003bc2254507662d1b8b6e9768e94371abd | issue 139 coverage scope policy post-sync | approved: late main sync preserves deliberate workflow coverage and static-only skill policy | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | | 2026-07-30 | codex/archive-completed-ci-tasks | 5c902f422ceee78ef68132900fda734c1d5bc1f8 | archive issues 133 and 135 | approved: both rows were already resolved on current main and focused guards prove their contracts | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | | 2026-07-30 | codex/next-local-task | 3e6d6d69c15fc056773657e15879ba2283fa2899 | archive issues 129 and 132 | approved: documented constraints satisfy both explicit outcomes without overstating client-side enforcement | guard:push:self-test; focused vitest 24/24; check:github-actions; check:outstanding-issues; diff check | +| 2026-07-30 | codex/playwright-container-alignment | 5ce50f64993a43efb00c4f8cfa86c26c895b8532 | issue 121 container browser fallback | approved: managed browser remains preferred; immutable-container fallback is explicit, newest-compatible, logged, unit-pinned, and launch-proven | verify:cheap 443 files/4631 pass; focused vitest 37/37; fallback Chromium launch; focused Playwright 1/1; check:rag:fixtures; outstanding guard; diff check | From 70a603087ae7ea9c0e6db0701aa13ffdddb79081 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 06:04:09 +0800 Subject: [PATCH 03/10] fix(test): respect Linux architecture for browser fallback --- scripts/playwright-browser-preflight.mjs | 15 +++++++++----- tests/playwright-browser-preflight.test.ts | 24 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/scripts/playwright-browser-preflight.mjs b/scripts/playwright-browser-preflight.mjs index f07616fc2d..d3e30a619f 100644 --- a/scripts/playwright-browser-preflight.mjs +++ b/scripts/playwright-browser-preflight.mjs @@ -47,10 +47,13 @@ const CHROMIUM_HEADLESS_SHELL_LAYOUTS = Object.freeze({ }); const PREINSTALLED_CHROMIUM_LAYOUTS = Object.freeze({ - linux: [ - ["chrome-headless-shell-linux64", "chrome-headless-shell"], - ["chrome-linux", "headless_shell"], - ], + linux: { + x64: [ + ["chrome-headless-shell-linux64", "chrome-headless-shell"], + ["chrome-linux", "headless_shell"], + ], + arm64: [["chrome-linux", "headless_shell"]], + }, darwin: { x64: [["chrome-headless-shell-mac-x64", "chrome-headless-shell"]], arm64: [["chrome-headless-shell-mac-arm64", "chrome-headless-shell"]], @@ -59,7 +62,9 @@ const PREINSTALLED_CHROMIUM_LAYOUTS = Object.freeze({ }); function preinstalledChromiumLayouts(platform = process.platform, architecture = process.arch) { - if (platform === "darwin") return PREINSTALLED_CHROMIUM_LAYOUTS.darwin[architecture] ?? []; + if (platform === "linux" || platform === "darwin") { + return PREINSTALLED_CHROMIUM_LAYOUTS[platform][architecture] ?? []; + } return PREINSTALLED_CHROMIUM_LAYOUTS[platform] ?? []; } diff --git a/tests/playwright-browser-preflight.test.ts b/tests/playwright-browser-preflight.test.ts index c9a9e7e135..84453935bf 100644 --- a/tests/playwright-browser-preflight.test.ts +++ b/tests/playwright-browser-preflight.test.ts @@ -132,6 +132,30 @@ describe("playwright browser preflight", () => { } }); + it("does not select an x64-only container shell on Linux arm64", () => { + const root = mkdtempSync(join(tmpdir(), "pw-container-architectures-")); + const x64Only = join( + root, + "chromium_headless_shell-1300", + "chrome-headless-shell-linux64", + "chrome-headless-shell", + ); + const arm64Compatible = join(root, "chromium_headless_shell-1200", "chrome-linux", "headless_shell"); + try { + mkdirSync(join(x64Only, ".."), { recursive: true }); + mkdirSync(join(arm64Compatible, ".."), { recursive: true }); + writeFileSync(x64Only, ""); + writeFileSync(arm64Compatible, ""); + + expect(newestPreinstalledChromiumHeadlessShell(root, { platform: "linux", architecture: "x64" })).toBe(x64Only); + expect(newestPreinstalledChromiumHeadlessShell(root, { platform: "linux", architecture: "arm64" })).toBe( + arm64Compatible, + ); + } finally { + rmSync(root, { recursive: true, force: true }); + } + }); + it("fails closed when the required Chromium binary is missing", () => { const result = playwrightBrowserPreflight(["--project=chromium"], { NODE_ENV: "test", From 42e4d127f78be443af445f5d7bd31a766d3aca6c Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 06:04:30 +0800 Subject: [PATCH 04/10] docs: record browser fallback review --- docs/branch-review-ledger.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 3f1ff51ea3..a7a9ac185d 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -279,3 +279,4 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/archive-completed-ci-tasks | 5c902f422ceee78ef68132900fda734c1d5bc1f8 | archive issues 133 and 135 | approved: both rows were already resolved on current main and focused guards prove their contracts | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | | 2026-07-30 | codex/next-local-task | 3e6d6d69c15fc056773657e15879ba2283fa2899 | archive issues 129 and 132 | approved: documented constraints satisfy both explicit outcomes without overstating client-side enforcement | guard:push:self-test; focused vitest 24/24; check:github-actions; check:outstanding-issues; diff check | | 2026-07-30 | codex/playwright-container-alignment | 5ce50f64993a43efb00c4f8cfa86c26c895b8532 | issue 121 container browser fallback | approved: managed browser remains preferred; immutable-container fallback is explicit, newest-compatible, logged, unit-pinned, and launch-proven | verify:cheap 443 files/4631 pass; focused vitest 37/37; fallback Chromium launch; focused Playwright 1/1; check:rag:fixtures; outstanding guard; diff check | +| 2026-07-30 | codex/playwright-container-alignment | 70a603087ae7ea9c0e6db0701aa13ffdddb79081 | preinstalled Chromium fallback | P2 fixed: Linux fallback now filters by process architecture, preventing an x64-only shell from being selected on arm64. No remaining findings. | 2 files/38 tests; Prettier; ESLint; git diff --check | From aefe54a73e0b61369de3860ca565354e7f575226 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 06:10:48 +0800 Subject: [PATCH 05/10] fix(test): restrict browser fallback to immutable image --- docs/outstanding-issues.md | 2 +- docs/testing.md | 2 +- scripts/playwright-browser-preflight.mjs | 15 ++++++++++----- tests/playwright-browser-preflight.test.ts | 15 ++++++++++++--- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/docs/outstanding-issues.md b/docs/outstanding-issues.md index 02f2103517..3d6bad6ea0 100644 --- a/docs/outstanding-issues.md +++ b/docs/outstanding-issues.md @@ -174,7 +174,7 @@ Move resolved rows here with the resolution date and a one-line outcome. Keep th | #135 | rec | API-only App Router changes unnecessarily selected full UI verification | Resolved 2026-07-30. `isUiChangedPath` excludes `src/app/api/**`, while the CI scope self-test pins API-only changes as `ui_changed: false` and preserves the non-UI static/unit safety gates. Current-main `check:ci-scope` passes. | 2026-07-30 | | #129 | issue | GitHub update-branch ignored the custom ledger merge driver | Resolved 2026-07-30 by constraining the operation rather than trusting it as a conflict oracle. The branch-sync procedure requires `git merge-tree --write-tree` first, permits only a human-authenticated update, and directs clean custom-driver false conflicts to a local `git merge origin/main` plus ordinary push. | 2026-07-30 | | #132 | issue | Client-side push guards could be bypassed in agent environments | Resolved 2026-07-30 under the row's explicit-limitation outcome. AGENTS.md names the missing-hook and missing-`gh` fail-open paths as load-bearing operator rules; ordinary PR CI enforces formatting server-side, while the tested local sentinel remains an early auto-merge race guard where `gh` is available. No privileged `pull_request_target` execution of PR code was added. | 2026-07-30 | -| #121 | issue | Container Playwright browser build lagged the pinned client | Resolved 2026-07-30 at the repository runner boundary. Managed Playwright browsers remain preferred; only when downloads are explicitly disabled and `PLAYWRIGHT_BROWSERS_PATH` is exposed does preflight select the newest platform-compatible preinstalled headless shell and pass that exact executable to the Playwright child. The fallback is unit-pinned and was launch-proven with a simulated older container revision; ordinary stale developer caches still fail closed. | 2026-07-30 | +| #121 | issue | Container Playwright browser build lagged the pinned client | Resolved 2026-07-30 at the repository runner boundary. Managed Playwright browsers remain preferred; only the designated download-disabled `/opt/pw-browsers` image root can select the newest platform- and architecture-compatible preinstalled headless shell and pass that exact executable to the Playwright child. The fallback is unit-pinned and was launch-proven with a simulated older container revision; generic shared or stale developer caches still fail closed. | 2026-07-30 | | ID | Type | Summary | Outcome | Resolved | | ---- | ----- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | diff --git a/docs/testing.md b/docs/testing.md index d60bcf658b..4f5e7eabc3 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -62,7 +62,7 @@ Reference examples: `tests/icon-button.dom.test.tsx` (accessible-name contract), ## Playwright ownership -The repository runner exclusively builds and serves each Playwright production app. It selects a safe port, verifies `/api/local-project-id`, uses an isolated `.next-playwright/` build directory, replaces provider configuration with inert loopback values, and removes its server and output on success, failure, or signal. Playwright configuration never starts a server. The production boot guard permits this demo profile only when the output is isolated, provider mode is offline, credentials are absent, and the Supabase URL is the inert `127.0.0.1:1` target. Before acquiring the heavy lock or building, the runner preflights the Chromium (or requested Firefox/WebKit) executable — including the default `chrome-headless-shell` binary and any `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH` override — and exits non-zero immediately when it is missing, so a launch-infra failure cannot be mistaken for product-test failures after a multi-minute build. A download-disabled container that explicitly exposes `PLAYWRIGHT_BROWSERS_PATH` is the one exception: if the client-pinned shell is absent, the runner selects the newest preinstalled shell for the current platform and passes its exact path to Playwright. It logs that fallback before the build; ordinary developer caches still fail closed rather than silently selecting a stale browser. +The repository runner exclusively builds and serves each Playwright production app. It selects a safe port, verifies `/api/local-project-id`, uses an isolated `.next-playwright/` build directory, replaces provider configuration with inert loopback values, and removes its server and output on success, failure, or signal. Playwright configuration never starts a server. The production boot guard permits this demo profile only when the output is isolated, provider mode is offline, credentials are absent, and the Supabase URL is the inert `127.0.0.1:1` target. Before acquiring the heavy lock or building, the runner preflights the Chromium (or requested Firefox/WebKit) executable — including the default `chrome-headless-shell` binary and any `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH` override — and exits non-zero immediately when it is missing, so a launch-infra failure cannot be mistaken for product-test failures after a multi-minute build. The designated download-disabled container image is the one exception: when `PLAYWRIGHT_BROWSERS_PATH` is exactly `/opt/pw-browsers` and the client-pinned shell is absent, the runner selects the newest preinstalled shell for the current platform and CPU architecture, then passes its exact path to Playwright. It logs that fallback before the build; generic shared caches still fail closed even when `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1`, so a developer cache cannot silently bless a stale browser. When capturing Playwright or `verify:phone-chrome` output through a shell pipe (`cmd 2>&1 | tee …`), enable `set -o pipefail` (or avoid the pipe). Without it, bash reports the pipeline exit from `tee` (`0`) while the log still ends in `N failed` — a measurement artifact that previously looked like a green-when-broken gate (outstanding-issues #120). The Node runners themselves already propagate Playwright’s exit status. diff --git a/scripts/playwright-browser-preflight.mjs b/scripts/playwright-browser-preflight.mjs index d3e30a619f..21e6c511a9 100644 --- a/scripts/playwright-browser-preflight.mjs +++ b/scripts/playwright-browser-preflight.mjs @@ -72,9 +72,8 @@ function preinstalledChromiumLayouts(platform = process.platform, architecture = * Find the newest headless shell supplied by a download-disabled container. * * This is intentionally narrower than scanning every Playwright cache: a stale - * developer cache must still fail closed. The fallback is available only when - * the caller explicitly exposes PLAYWRIGHT_BROWSERS_PATH and disables browser - * downloads, which is the immutable-container shape recorded in issue #121. + * developer cache must still fail closed. The caller separately validates the + * designated immutable-container root before invoking this search. */ export function newestPreinstalledChromiumHeadlessShell( browsersRoot, @@ -164,6 +163,7 @@ export function resolvePlaywrightBrowserExecutable( fileExists = existsSync, platform = process.platform, architecture = process.arch, + containerBrowsersRoot = platform === "linux" ? "/opt/pw-browsers" : null, } = {}, ) { if (family === "chromium") { @@ -183,8 +183,13 @@ export function resolvePlaywrightBrowserExecutable( }; } const downloadsDisabled = /^(?:1|true)$/i.test(env.PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD?.trim() ?? ""); - if (downloadsDisabled) { - const preinstalled = newestPreinstalledChromiumHeadlessShell(env.PLAYWRIGHT_BROWSERS_PATH?.trim(), { + const exposedBrowsersRoot = env.PLAYWRIGHT_BROWSERS_PATH?.trim(); + const normalizedExposedRoot = exposedBrowsersRoot?.replaceAll("\\", "/").replace(/\/+$/, ""); + const normalizedContainerRoot = containerBrowsersRoot?.replaceAll("\\", "/").replace(/\/+$/, ""); + const designatedContainerRoot = + normalizedExposedRoot && normalizedContainerRoot && normalizedExposedRoot === normalizedContainerRoot; + if (downloadsDisabled && designatedContainerRoot) { + const preinstalled = newestPreinstalledChromiumHeadlessShell(exposedBrowsersRoot, { fileExists, platform, architecture, diff --git a/tests/playwright-browser-preflight.test.ts b/tests/playwright-browser-preflight.test.ts index 84453935bf..e926b19a64 100644 --- a/tests/playwright-browser-preflight.test.ts +++ b/tests/playwright-browser-preflight.test.ts @@ -87,7 +87,7 @@ describe("playwright browser preflight", () => { }); }); - it("selects the newest container shell only when managed downloads are disabled", () => { + it("selects the newest shell only for the designated download-disabled container root", () => { const root = mkdtempSync(join(tmpdir(), "pw-container-browsers-")); const older = join(root, "chromium_headless_shell-1194", "chrome-linux", "headless_shell"); const newer = join(root, "chromium_headless_shell-1200", "chrome-linux", "headless_shell"); @@ -108,7 +108,12 @@ describe("playwright browser preflight", () => { PLAYWRIGHT_BROWSERS_PATH: root, PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1", }, - { managedChromiumPath: managedPath, platform: "linux", architecture: "x64" }, + { + managedChromiumPath: managedPath, + platform: "linux", + architecture: "x64", + containerBrowsersRoot: root, + }, ), ).toMatchObject({ family: "chromium", @@ -119,7 +124,11 @@ describe("playwright browser preflight", () => { expect( resolvePlaywrightBrowserExecutable( "chromium", - { NODE_ENV: "test", PLAYWRIGHT_BROWSERS_PATH: root }, + { + NODE_ENV: "test", + PLAYWRIGHT_BROWSERS_PATH: root, + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1", + }, { managedChromiumPath: managedPath, platform: "linux", architecture: "x64" }, ), ).toEqual({ From 0c474762779f65d6a2441f8086e6e0d2eb24e825 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 06:12:16 +0800 Subject: [PATCH 06/10] docs: record container fallback review fixes --- docs/branch-review-ledger.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 1ec0a6d216..f87c8c046a 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -281,3 +281,4 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/playwright-container-alignment | 5ce50f64993a43efb00c4f8cfa86c26c895b8532 | issue 121 container browser fallback | approved: managed browser remains preferred; immutable-container fallback is explicit, newest-compatible, logged, unit-pinned, and launch-proven | verify:cheap 443 files/4631 pass; focused vitest 37/37; fallback Chromium launch; focused Playwright 1/1; check:rag:fixtures; outstanding guard; diff check | | 2026-07-30 | codex/playwright-container-alignment | 70a603087ae7ea9c0e6db0701aa13ffdddb79081 | preinstalled Chromium fallback | P2 fixed: Linux fallback now filters by process architecture, preventing an x64-only shell from being selected on arm64. No remaining findings. | 2 files/38 tests; Prettier; ESLint; git diff --check | | 2026-07-30 | PR-1433 | e7a8102620b5b4847894b3df21f438304ea581bd | PR #1433 document result cards and action menu final review | fixed clipped menu, clipboard fallback focus loss, and inherited action typography; no remaining findings | DOM Vitest 4/4; focused Chromium 1/1; typecheck, Prettier, and diff checks pass | +| 2026-07-30 | codex/playwright-container-alignment | 936cab24f00202081aad780f8712152409a212d3 | container browser fallback review fixes | approved: automated P2s fixed by architecture filtering and designated /opt/pw-browsers root; generic stale caches fail closed | focused vitest 11/11; ESLint; Prettier; outstanding guard; diff check | From 12e5c8c977a873a7b900596fdc310a1a78d863f0 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 07:08:37 +0800 Subject: [PATCH 07/10] docs: normalize Playwright review ledger after sync --- docs/branch-review-ledger.md | 100 +++++++++++++++++------------------ 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 92b4349291..64f3cd87a0 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -171,16 +171,17 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | claude/outstanding-issues-triage-24c8ow | 8d2710fd6cbdc84e8c50a6c9bc0a1e1a0cd612c8 | open PR changed-scope review | APPROVE: completed items 095, 096, 104, 109, and 115 move to archive with no deletion, duplicate ID, or stale next-id. | check:outstanding-issues PASS; check:branch-review-ledger PASS; diff review; no unresolved threads | | 2026-07-30 | claude/latency-findings-impl-s8g01v | e7ff5e933ba1f34d5adbd46dd77c38aced11ed44 | open PR changed-scope review | APPROVE: ordering-risk documentation is accurate and the near-bottom refusal guard now proves its geometry is non-vacuous before asserting no hide. | diff check PASS; focused test review; no unresolved threads; exact-head Production UI required | | 2026-07-30 | claude/ci-testing-review-2l8klp | 2e2160bc8b9d2d824209c217c67cb9cac1be3a8d | open PR changed-scope review | APPROVE: three-way UI sharding, critical-first gating, measured drag travel, and gate-manifest updates preserve required-check aggregation and deterministic Playwright settings. | check:github-actions PASS; check:ci-scope PASS; check:gate-manifest PASS; ledger guards PASS; exact-head sharded Production UI required | -| 2026-07-30 | claude/design-visual-baselines | b57432facb7ded1e9605d1076e0d8c9d661efa2c | open PR changed-scope review | APPROVE after fix: platform-scoped baseline guidance matches the candidate-path and AWAITING_BASELINE adoption contract. | Prettier PASS; docs:check-links PASS; check:ci-scope PASS; review thread resolved; exact-head visual CI required | +| 2026-07-30 | codex/docs-sync-automation | 76d7372d8aa886008e2fb637e5911e9c00bb33e3 | documentation synchronization automation review | APPROVE after deletion-path fix; no remaining P0-P2 findings | docs/update and static gates pass; focused Vitest admission blocked | | 2026-07-30 | PR #1430 | a9ae22ac4915e86d51ee05787059382a39bd8ba8 | phone chrome diagnostics and merge repair | fixed and ready for CI | issues guard; ledger guard; 37 focused tests; phone-chrome dry-run | -| 2026-07-30 | PR-1434 | f6bebf2a8c658df8b3840c1b1133be5c94a977b0 | PR #1434 Codex Cloud setup consolidation and prompt perfector | fixed Cloud runtime verification gaps and reconciled duplicate implementation after #1438; no remaining findings | check:codex-cloud pass; codex-cloud-setup Vitest 4/4; outstanding-issues and ledger guards pass | +| 2026-07-30 | PR-1442 | 35fc11a2665ecd0464a23949babbbddba8055dcd | PR #1442 documentation synchronization automation | hook is fail-closed for mixed staged inputs and does not auto-stage; generated inventories remain deterministic; no findings | docs update/checks pass; focused Vitest 4 passed; issue and ledger guards pass | | 2026-07-30 | PR-1440 | f7260cc6a0da87cb4df1ac95ef962967e667c3f0 | PR #1440 issue #102 ordering correction | accurately restores the two canary-gated retrieval ordering constraints; no findings | outstanding-issues and ledger guards pass; documentation-only diff | +| 2026-07-30 | PR-1445 | 07933e08cff6c7d81345e02c03727032ccf522b6 | PR #1445 close duplicate issue | correctly archives duplicate #140 while preserving #133 as the surviving open conflict-frequency record; no findings | outstanding-issues and docs-link guards pass; docs-only diff | +| 2026-07-30 | PR-1434 | f6bebf2a8c658df8b3840c1b1133be5c94a977b0 | PR #1434 Codex Cloud setup consolidation and prompt perfector | fixed Cloud runtime verification gaps and reconciled duplicate implementation after #1438; no remaining findings | check:codex-cloud pass; codex-cloud-setup Vitest 4/4; outstanding-issues and ledger guards pass | | 2026-07-30 | PR #1432 | a2b53c815b3c060dec2619af2855a63f9f496858 | Playwright browser preflight review and repair | fixed; focused tests pending coordinator | Prettier PASS; issues guard PASS; focused Vitest blocked by active Playwright lease | | 2026-07-30 | PR #1432 | f85995ade3a19513a531713724813adc742c360d | Playwright browser preflight verification | focused tests pass; typecheck lease-blocked | 16 focused tests PASS; Prettier PASS; typecheck admission blocked | | 2026-07-30 | PR-1432 | 7c7b63cf40d59652954e539ce1b3027005916bf1 | PR #1432 Playwright browser preflight final exact-head review | fixed existing project-isolation contract after preflight refactor; no remaining findings | preflight and isolation Vitest 9/9; typecheck pass; Prettier and diff checks pass | | 2026-07-30 | PR-1432 | a5d234302b57be6f7ce5d1957c9ec00bc7f191f0 | PR #1432 Playwright preflight and phone-scroll reliability | cross-platform preflight fails closed and production focus-restore race is removed from the phone-scroll proof; no remaining findings | preflight tests 9 passed; focused Chromium journey 2 passed; formatting and ledger guards pass | | 2026-07-30 | PR-1432 | 330086eff76f704ce6b9cf5405aeecfdd375027c | PR #1432 visual-config preflight follow-up | visual runs now preflight chromium-artifacts instead of the unrelated main browser matrix; unknown configs fail closed | config-selection tests added; formatting passes; exact-head CI pending | -| 2026-07-30 | PR-1445 | 07933e08cff6c7d81345e02c03727032ccf522b6 | PR #1445 close duplicate issue | correctly archives duplicate #140 while preserving #133 as the surviving open conflict-frequency record; no findings | outstanding-issues and docs-link guards pass; docs-only diff | | 2026-07-30 | claude/organize-local-worktree-d22bc3 | 2f26a53b5aeb3df451cf7b1d04f80b07edf0d6fe | docs organisation: dated-record filing, docs index gaps, orientation maps | PR #1436 opened — 5 dated docs filed into docs/audit and docs/archive, root codex-cloud-review moved under docs/prompts, 17 docs README index gaps closed, root data/ documented in CLAUDE.md + codebase-index; no product code, schema or RAG surface touched | docs:check-links 1368 refs pass; docs:check-scripts 378 pass; docs:check-index OK; format:check whole-tree clean; verify:cheap 26 static gates + lint + typecheck pass, unit 4562 pass / 1 pre-existing Windows path-separator failure in tests/repo-hygiene.test.ts | | 2026-07-30 | PR-1436 | 9d8e081f3e7003d4f2210b00a7b7e54bf7ca2f0b | PR #1436 documentation organization and link repair | fixed stale no-driver wording and renumbered three union-collided issue records; no remaining findings | docs index, links, scripts, outstanding-issues, and ledger guards pass | | 2026-07-30 | cursor/ci-hygiene-gates-1bf5 | b660dbc5a10d7ca3da03541028017f0abc6b5bd3 | ci-hygiene-gates-merge-readiness | NOT READY: cancel-to-green behavior still allowed required PR CI to pass incorrectly; fixed at subsequent head 8f3283d00da274dee507a1b8e9b611321d1f35be | check:ci-scope; check:gitleaks-pinned; scope-classify PR files ui_changed=false; cancelled-as-neutral simulation exposed #095 | @@ -201,22 +202,19 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/issue-ledger-upload-parity | f35a4ca178724ff59e7a876c4d819bed0b786662 | PR #1441 final current-main sync | approved after merging #1457 without overlap; upload parity and repository guards remain green | upload self-test pass; issues 141; ledger 141+1206; actions pin, format, diff pass | | 2026-07-30 | codex/issue-ledger-upload-parity | dc8068590d5be469ff30789b8b345896a3f1cdb9 | PR #1441 sync after PR #1470 | approved; catalogue payload disposition and upload-limit closures both preserved | upload self-test, issues, ledger, diff pass | | 2026-07-30 | codex/cloud-readiness-consolidation-20260730 | 8ff0a7ec309c80379bd8a9a76ab107a65ac7b837 | PR #1434 Codex Cloud setup and isolation tooling | approved after current-main sync, helper typing repair, static Cloud contracts, and isolation review | codex-cloud, skills, docs, maintainability, issues, ledger, format, isolation 14/14 pass; focused Vitest coordinator-blocked; shell runtime acceptance deferred to hosted Linux | +| 2026-07-30 | codex/docs-sync-automation | fba8ab4af465c96b8aa318f25d792fefd10e9ada | PR #1442 documentation synchronization automation | approved after current-main conflict resolution, generated inventory refresh, and dirty-output preservation review | docs inventory 194/209; focused 5/5; index, links 1417, scripts 405, issues, ledger, format, diff pass; pre-commit executed successfully | +| 2026-07-30 | codex/docs-sync-automation | 1c80a938f27af80df323fb1d6063ef9077f55fdf | PR #1442 hosted gate-count follow-up | approved after static CI exposed and corrected verify:cheap count drift | gate manifest, docs inventory, format, diff pass | +| 2026-07-30 | claude/latency-findings-impl-s8g01v | fd3753b4c8cc041889c39f74a0f763edc358c183 | PR #1459 final docs issue review | PASS - no P0-P2 findings; restores open issue 105 and records deletion-guard gap | outstanding-issues, ledger guard, docs links, diff-check | +| 2026-07-30 | codex/docs-sync-automation | e1c514f289a864bc741841accae5352a419fbb59 | PR #1442 sync after PR #1459 | approved; issue-evidence correction and docs automation closures preserved | issues, ledger, inventory, gate manifest, diff pass | +| 2026-07-30 | pr/1467 | 6b84090a7c4a57a19521a820bf4c488090fb6062 | docs: close rejected Playwright cache proposal | approved; measured rejection archived on current main | check:outstanding-issues; check:branch-review-ledger; docs inventory/links/scripts; Prettier; diff-check | | 2026-07-30 | codex/issue-ledger-upload-parity-v3 | 95b0e289f03afc46d45def9ed1a165cd614684fd | Replacement PR: issue closures, upload-limit parity, production env precedence | No findings; intended replacement scope preserved on current main | verify:pr-local PASS pre-rebase; exact-head runtime/install/format/lint PASS; focused guards PASS; typecheck rerun blocked by unrelated Playwright lease | | 2026-07-30 | codex/issue-ledger-upload-parity-v3 | 9dff07f85bcce7822eb2b2701b82a80d1e0a145e | PR #1482 Docker-context CI repair | No findings; hosted ENOENT fixed without weakening effective parity | hosted app-image log inspected; normal 150/150 PASS; Docker-context 50/50 PASS; Docker-context 50/40 rejected | | 2026-07-30 | codex/issue-ledger-upload-parity-v3 | 9867f72eddf51e25322028af6ff232dba3560871 | PR #1482 post-#1441 ledger-only salvage | No findings; duplicate implementation dropped and only four resolved issue records remain | diff vs origin/main two docs files; outstanding-issues PASS; branch-review-ledger PASS; main implementation byte-identical | | 2026-07-30 | codex/issue-ledger-upload-parity-v3 | 0a074d9b2572ee06f663d8bbee3b50fb6d4fbd9a | PR #1482 final current-main ledger-only review | No findings; current main preserved and PR diff is ledger-only | three-dot diff two docs files; issue and review ledger guards PASS; four resolutions verified against merged main | | 2026-07-30 | codex/issue-ledger-upload-parity-v3 | fc116cfa0cf06d359548c1bc00d383b872fb1a48 | PR #1482 upload-parity deployment-input repair | No findings; checker changes now trigger build, container, and Railway app paths | check:ci-scope PASS with single-file assertion; upload parity PASS; Railway config test queued behind primary live-provider lease | -| 2026-07-30 | claude/latency-findings-impl-s8g01v | fd3753b4c8cc041889c39f74a0f763edc358c183 | PR #1459 final docs issue review | PASS - no P0-P2 findings; restores open issue 105 and records deletion-guard gap | outstanding-issues, ledger guard, docs links, diff-check | | 2026-07-30 | codex/issue-ledger-upload-parity-v3 | b4e68aa9e4892d4031479240f7783b7c22bd4bbb | PR #1482 final current-main review | PASS - no P0-P2 findings; ledger archives preserved and deployment inputs repaired | issues, ledger, docs links/scripts, ci-scope self-test, diff-check; hosted full unit pending | -| 2026-07-30 | codex/docs-sync-automation | 76d7372d8aa886008e2fb637e5911e9c00bb33e3 | documentation synchronization automation review | APPROVE after deletion-path fix; no remaining P0-P2 findings | docs/update and static gates pass; focused Vitest admission blocked | -| 2026-07-30 | PR-1442 | 35fc11a2665ecd0464a23949babbbddba8055dcd | PR #1442 documentation synchronization automation | hook is fail-closed for mixed staged inputs and does not auto-stage; generated inventories remain deterministic; no findings | docs update/checks pass; focused Vitest 4 passed; issue and ledger guards pass | -| 2026-07-30 | codex/docs-sync-automation | fba8ab4af465c96b8aa318f25d792fefd10e9ada | PR #1442 documentation synchronization automation | approved after current-main conflict resolution, generated inventory refresh, and dirty-output preservation review | docs inventory 194/209; focused 5/5; index, links 1417, scripts 405, issues, ledger, format, diff pass; pre-commit executed successfully | -| 2026-07-30 | codex/docs-sync-automation | 1c80a938f27af80df323fb1d6063ef9077f55fdf | PR #1442 hosted gate-count follow-up | approved after static CI exposed and corrected verify:cheap count drift | gate manifest, docs inventory, format, diff pass | -| 2026-07-30 | codex/docs-sync-automation | e1c514f289a864bc741841accae5352a419fbb59 | PR #1442 sync after PR #1459 | approved; issue-evidence correction and docs automation closures preserved | issues, ledger, inventory, gate manifest, diff pass | -| 2026-07-30 | pr/1467 | 6b84090a7c4a57a19521a820bf4c488090fb6062 | docs: close rejected Playwright cache proposal | approved; measured rejection archived on current main | check:outstanding-issues; check:branch-review-ledger; docs inventory/links/scripts; Prettier; diff-check | | 2026-07-30 | pr/1467 | fc7abe7f7e7ecb97dc7896c16b5553256da3ad80 | docs: close rejected Playwright cache proposal | approved after current-main reconciliation; archive entry preserved | issue/ledger guards; docs inventory/links/scripts; Prettier; diff-check | -| 2026-07-30 | pr/1431 | 74e10087eb20a81279fb56d18f28a2475d895fab | docs: visual baseline platform layout | approved; candidate adoption and Linux baseline guidance match implementation | runtime/install parity; ledger; CI scope; docs inventory/links; Prettier; diff-check | -| 2026-07-30 | pr/1431 | b4848aa92e890193a4a41744b611746673f3b058 | docs: visual baseline platform layout | approved after remote-head reconciliation; guidance unchanged | ledger; CI scope; docs inventory/links; Prettier; diff-check | +| 2026-07-30 | codex/ledger-next-20260730 | 268b201a1dbaed7cca6dff4a146b0319a5275216 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. No remaining P0-P2 findings. Reconciled current main row by row, retained current-main #105 and #136 dispositions, rejected the unsafe Playwright cache, and fixed favourites partial-source masking plus the indexed-search hydration race. | format PASS; static gates, lint, typecheck PASS; unit 4597 PASS, 3 SKIP, 1 stale donor failure repaired by exact-lock dependency; brace cap direct PASS; focused Chromium 1 PASS; production build PASS; ledger guards PASS | | 2026-07-30 | 0b01c56fe539598279b9393db5e207bc78fa41c9 | 0b01c56fe539598279b9393db5e207bc78fa41c9 | branch-cleanup-deletion-pending | redundant clean detached head already on origin/main; removal deferred by primary-dirty lease | clean status; merge-base ancestor of origin/main; no open PR | | 2026-07-30 | 018673ff5cadadbd799815cea8d742de28922754 | 018673ff5cadadbd799815cea8d742de28922754 | branch-cleanup-deletion-pending | redundant clean detached review base already on origin/main; removal deferred by primary-dirty lease | clean status; merge-base ancestor of origin/main; no open PR | | 2026-07-30 | codex/review-pr1438 | f13c261ee96405dc338db184ec74009bcd3699a3 | branch-cleanup-deletion-pending | redundant exact head merged in PR 1438; removal deferred by primary-dirty lease | clean status; GitHub merged exact head; zero cherry-pick-unique commits | @@ -239,74 +237,76 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/review-pr1445 | 483a1c6190dfbd1a5895ef2c419a73f0f2162f05 | branch-cleanup-deletion-pending | redundant exact head merged in PR 1445; removal deferred by primary-dirty lease | clean status; GitHub merged exact head; no active process | | 2026-07-30 | PR #1462 | 5146ae94e226a6e55968d80ecefa53c7cd5df9c3 | bounded inactive-work cleanup documentation | APPROVE after fix: both cleanup batches remain deferred behind the primary-checkout lease, and the resume instruction now names the executable repository command. | outstanding-issues guard; ledger guard; diff review; one review finding fixed | | 2026-07-30 | codex/organize-inactive-20260730 | e7b248e215714fbf823c784857f521f89d86fa3d | PR #1462 changed-scope review | PASS - no P0-P2 findings; exact-lock formatter resolution fails closed | guard-push self-test and focused contracts previously green; issues, ledger, docs, diff-check; hosted full unit pending | -| 2026-07-30 | pr/1431 | 897de9b1b7fc243006c1a71e67a6333681272ac6 | docs: visual baseline platform layout | approved after PR 1462 base sync; visual guidance unchanged | ledger; CI scope; docs inventory; Prettier; diff-check | -| 2026-07-30 | codex/outstanding-local-batch-final | 330d964a04406a9e123c674409f167746f7b9a28 | outstanding local task batch merge readiness | Reviewed changed scope; fixed the env-file bypass in the upload-limit parity guard. No unresolved findings. | Focused Vitest: 7 files, 125 tests passed; exact-head verify:cheap static gates and lint passed; typecheck/full unit pending coordinator availability. | -| 2026-07-30 | codex/outstanding-local-batch-final | 46ebd3f13a3e8b843026dd7d3d4024440970d7ae | upload-limit env regression type correction | Reviewed the test-only ProcessEnv annotation; no unresolved finding. | Focused test and typecheck awaiting repository coordinator; prior exact-head static gates and lint passed. | -| 2026-07-30 | codex/outstanding-local-batch-final | 7b63c28ca6ff9ab2f3599197ee6811292958e2c2 | final upload env fixture correction | Reviewed the contextual ProcessEnv construction after hosted readonly-property failure; no unresolved finding. | Prior hosted Build, Unit coverage, Production UI critical, containers and lint passed; exact-head typecheck rerun pending. | -| 2026-07-30 | codex/outstanding-local-batch-final | 112ac9ba71f78df6e8d05d0e3fa2e3adf6ba4705 | PR #1480 Docker upload-limit review finding | FIXED P1: the Docker build now receives both server and browser limits, and container CI proves a matched lowered 50 MB pair. | check:upload-limits and check:github-actions passed; focused/typecheck/container rerun pending exact head. | -| 2026-07-30 | codex/outstanding-local-batch-final | 43de3c910ea1a361458586cfb0e5861e8e2d5ee6 | post-main reconciliation merge readiness | APPROVE: retained main's stronger #1441 upload guard, removed the duplicate checker/test, and preserved the six non-overlapping fixes; no unresolved findings. | Upload parity self-test/runtime, GitHub Actions, docs scripts, review ledger, outstanding issues, and diff checks pass; parent exact-head hosted suite fully green; final hosted rerun pending. | +| 2026-07-30 | codex/ledger-next-20260730 | 1ee749bd71da45be2d6b9d3eb4913331696996a6 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes the prior review after cleanly merging current main. No remaining P0-P2 findings; current-main #079 was retained, verified closures remained archived, and no product behavior changed during sync. | merge reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; whole-tree format PASS; prior static, lint, typecheck, unit, build, RAG fixture, and focused Chromium evidence retained | | 2026-07-30 | PR-1473 | a2b2820c13a47425cfc0ea751e57ee35e9bd1105 | PR #1473 full diff vs origin/main | PASS after review repair: governance refusal and error-state contracts are consistent | outstanding-issues guard passed; docs links 1412 passed; docs index passed; Prettier passed; git diff --check | +| 2026-07-30 | codex/ledger-next-20260730 | ee66a39b63fd7e39448ab13a5a5b72441f5321be | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current main answer-delivery design. No remaining P0-P2 findings; current-main #100 governance text was retained exactly, verified closures remained archived, and the sync added documentation only. | merge reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; prior format, static, lint, typecheck, unit, build, RAG fixture, and focused Chromium evidence retained | +| 2026-07-30 | pr/1476 | 79822031e696cd3906ce01284ec9736938c40a74 | docs: record ESLint 10 ecosystem blocker | approved; blocker matches installed peer ranges and current main | runtime/install parity; issue/ledger; docs inventory/links/scripts; Prettier; diff-check | | 2026-07-30 | codex/reopen-issue-105 | b94a8f5a693cc44e8aaa0fe3ec5bb65a7c313a3b | Correct #105 status after PR #1482 | No findings; restores the withdrawn verification evidence and leaves the task open | outstanding issues PASS 146 rows 69 open 77 archived next-id 149; docs links and scripts PASS | | 2026-07-30 | codex/reopen-issue-105 | 65635235c91527c57d33dd8311d062d28ccff6d9 | PR #1483 current-main reconciliation | No findings; #105 remains open and main's #136 archival is preserved | issues PASS 146 rows 68 open 78 archived next-id 149; ledger PASS 161 live 1206 archived | | 2026-07-30 | pr/1483 | 76393b9a0c6603e2551898c89a33396f52949da3 | docs: reopen issue 105 after withdrawn verification | approved; restores pending LoadingPanel verification without disturbing PR 1462 | runtime/install parity; issue/ledger; docs inventory/links/scripts; Prettier; diff-check | | 2026-07-30 | pr/1483 | a84fa60eebdbe7a00193c268b401f7abd3cc554e | docs: reopen issue 105 after withdrawn verification | approved after PR 1473 sync; issue 105 remains correctly open | issue/ledger; docs inventory/links/scripts; Prettier; diff-check | -| 2026-07-30 | pr/1476 | 79822031e696cd3906ce01284ec9736938c40a74 | docs: record ESLint 10 ecosystem blocker | approved; blocker matches installed peer ranges and current main | runtime/install parity; issue/ledger; docs inventory/links/scripts; Prettier; diff-check | | 2026-07-30 | pr/1476 | 0fd5a3cdba612d30cfd75ea997177f6e29c34bd3 | docs: record ESLint 10 ecosystem blocker | approved after PR 1483 sync; ESLint blocker and issue 105 correction preserved | issue/ledger; docs inventory/links/scripts; Prettier; diff-check | +| 2026-07-30 | codex/ledger-next-20260730 | 23572a4ad4a6f1520d86715c647ad9d40ff6bb01 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current main. No remaining P0-P2 findings; #105 was correctly reopened on withdrawn evidence, current-main #090 and #125 were retained, and verified closures remained archived. | post-CI main reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; prior hosted exact-head CI all green before base moved; fresh CI required for this head | | 2026-07-30 | pr/1465 | 4e34d97bb9eb5122b9d8f8e54c42793c727f5085 | issues: record fresh #133 evidence | approved; duplicate-ID race and Prettier prerequisite accurately recorded | issue/ledger; docs inventory/links; Prettier; diff-check | +| 2026-07-30 | codex/ledger-next-20260730 | b43817f6243faac8ba22de85a461324b1612ad72 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main #133 evidence. No remaining P0-P2 findings; PR #1451 and the concurrent #141 race are incorporated into the resolved compact-table outcome, with scoped Prettier protection verified. | main reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; prior hosted CI green before base moved; fresh CI required for this head | | 2026-07-30 | PR #1477 | 26d713922006c1af8187994edfa76669dc14cd46 | PR #1477 fork-safe Codex autofix routing | Fixed fork routing to the PR head repository, added fail-closed metadata handling, reconciled current main, and found no remaining actionable defects. | check:codex-autofix-workflow; check:github-actions; check:pr-policy; check:outstanding-issues; check:branch-review-ledger; docs:check-inventory; docs:check-links; docs:check-scripts; typecheck; focused Vitest 53 passed; Prettier | | 2026-07-30 | PR #1477 | 20f795da2d9d0adafa6cb3117429ab3665129c0d | PR #1477 fork-safe Codex autofix routing | Refreshed onto current main after #1465; issue and ledger reconciliation remained clean and no new actionable defects were introduced. | check:outstanding-issues; check:branch-review-ledger; check:codex-autofix-workflow; focused Vitest 53 passed | +| 2026-07-30 | codex/ledger-next-20260730 | 072051eb83e0b8317880d6167d06b3865b4a6ff7 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1477. No remaining P0-P2 findings; the implemented #131 fail-closed Codex delivery contract replaces the earlier accepted-limitation wording, and all other resolved/open dispositions remain intact. | main reconciliation + ledger:dedupe PASS; outstanding, branch-review, and Codex autofix guards PASS; prior exact-head hosted CI all green before base moved; fresh CI required for this head | +| 2026-07-30 | codex/outstanding-local-batch-final | 330d964a04406a9e123c674409f167746f7b9a28 | outstanding local task batch merge readiness | Reviewed changed scope; fixed the env-file bypass in the upload-limit parity guard. No unresolved findings. | Focused Vitest: 7 files, 125 tests passed; exact-head verify:cheap static gates and lint passed; typecheck/full unit pending coordinator availability. | +| 2026-07-30 | codex/outstanding-local-batch-final | 46ebd3f13a3e8b843026dd7d3d4024440970d7ae | upload-limit env regression type correction | Reviewed the test-only ProcessEnv annotation; no unresolved finding. | Focused test and typecheck awaiting repository coordinator; prior exact-head static gates and lint passed. | +| 2026-07-30 | codex/outstanding-local-batch-final | 7b63c28ca6ff9ab2f3599197ee6811292958e2c2 | final upload env fixture correction | Reviewed the contextual ProcessEnv construction after hosted readonly-property failure; no unresolved finding. | Prior hosted Build, Unit coverage, Production UI critical, containers and lint passed; exact-head typecheck rerun pending. | +| 2026-07-30 | codex/outstanding-local-batch-final | 112ac9ba71f78df6e8d05d0e3fa2e3adf6ba4705 | PR #1480 Docker upload-limit review finding | FIXED P1: the Docker build now receives both server and browser limits, and container CI proves a matched lowered 50 MB pair. | check:upload-limits and check:github-actions passed; focused/typecheck/container rerun pending exact head. | +| 2026-07-30 | codex/outstanding-local-batch-final | 43de3c910ea1a361458586cfb0e5861e8e2d5ee6 | post-main reconciliation merge readiness | APPROVE: retained main's stronger #1441 upload guard, removed the duplicate checker/test, and preserved the six non-overlapping fixes; no unresolved findings. | Upload parity self-test/runtime, GitHub Actions, docs scripts, review ledger, outstanding issues, and diff checks pass; parent exact-head hosted suite fully green; final hosted rerun pending. | | 2026-07-30 | PR #1480 | 6c1e76f53aee87be8408cebc295744fbdce05367 | PR #1480 bounded outstanding reliability fixes | Fixed both review findings: documented the dark accent role and added partial favourites retry without hiding valid counts; no other actionable defects found. | focused Vitest 119 passed; docs index; issue and ledger guards; Actions and Codex workflow guards; Prettier; diff check; typecheck coordinator-blocked | +| 2026-07-30 | codex/ledger-next-20260730 | 2a590d8c56b04ce6202fa1c7814e9858363151c0 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1480. No remaining P0-P2 findings; current main's canonical partial-favourites implementation replaces the branch's duplicate notice helper, while the branch's ledger, CI, and indexed-source hydration changes remain intact. | focused overlap suite 7 files / 130 tests PASS; verify:cheap 32 gates PASS; unit 439 files / 4612 PASS / 3 SKIP; ledger guards and merge reconciliation PASS | | 2026-07-30 | codex/close-pr1480-issues | bf8ac88b024642eb45d1fead86f4ee30fce3f98d | archive PR 1480 issue resolutions | approved: five resolved rows moved intact to archive | check:outstanding-issues; prettier check; diff check | +| 2026-07-30 | codex/ledger-next-20260730 | 7d6a341b1ac0efdf001bf06146a297bd2cb2cb4c | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1486. No remaining P0-P2 findings; #141 and #144 are archived from the implemented PR #1480 evidence, and current-main outcomes for #091, #128, and #134 are retained without changing source behavior. | docs-only main reconciliation + ledger:dedupe PASS; outstanding ledger 146 rows / 50 open / 96 archived PASS; branch-review ledger PASS; prior combined-tree verify:cheap 32 gates PASS | +| 2026-07-30 | PR-1469 | 02108d5424f8a3ab50f45808a6cc3cbd872e7555 | PR #1469 component state matrix coverage | PASS after current-main sync; tests execute enabled and disabled popup transitions plus document search loading, empty, and fault states | focused Vitest 2 files, 10 tests passed; outstanding-issues and branch-review-ledger guards passed; no unresolved review threads | +| 2026-07-30 | codex/ledger-next-20260730 | 85a6bdf74629096fba1b476e52b76e241665fd15 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1469. No remaining P0-P2 findings; #107 is archived with executing jsdom state-matrix coverage, and the branch's existing changes remain intact. | focused current-main state-matrix suite 2 files / 10 tests PASS; outstanding ledger 146 rows / 49 open / 97 archived PASS; branch-review ledger PASS; prior combined-tree verify:cheap 32 gates PASS | | 2026-07-30 | codex/close-issue-127 | 9bbb8486d399ed31b9bf43364579f466a4e66c67 | archive issue 127 after post-fix runs | approved: close condition satisfied with no post-fix recurrence | check:outstanding-issues; prettier check; diff check | | 2026-07-30 | codex/close-issue-127 | d5fd28f75b404046f13507aa3705d55898d7669c | review finding wording correction | approved: causal wording now matches PR 1427 implementation | check:outstanding-issues; prettier check; diff check | -| 2026-07-30 | PR-1469 | 02108d5424f8a3ab50f45808a6cc3cbd872e7555 | PR #1469 component state matrix coverage | PASS after current-main sync; tests execute enabled and disabled popup transitions plus document search loading, empty, and fault states | focused Vitest 2 files, 10 tests passed; outstanding-issues and branch-review-ledger guards passed; no unresolved review threads | | 2026-07-30 | claude/global-search-mockups-mrgmzl | e79e499839e56bff66aecc37d1c915ac3127e995 | prlanded | merged and verified by content | verify:cheap exit 0 (437 files, 4576 passed); verify:pr-local exit 0; CI pr-required green on a6f2281; squash e79e499 content diff vs branch tip empty; late aria-live/role=alert commit confirmed present on main | -| 2026-07-30 | codex/close-issue-105 | 09950abc8cf2d23455a6cbab3521bdec921ef272 | archive issue 105 after driven browser proof | approved: specific lazy fallback observed in driven desktop and phone Chromium | browser chunk-delay proof; check:outstanding-issues; prettier check; diff check | -| 2026-07-30 | PR-1475 | 6de5c321beac55860cc4b6fc7d26ef5a7e088f38 | PR #1475 ingestion behavioral extraction | PASS after current-main reconciliation; extracted decisions preserve entrypoint behavior and replace the matching source-grep assertion with executable coverage | focused Vitest 3 files, 27 tests passed; typecheck passed; outstanding-issues and branch-review-ledger guards passed; provider-backed ingestion not run | -| 2026-07-30 | PR-1458 | 8c1975b178c67e4c54acffc395d85e38c43d39f5 | PR #1458 superseded root-gate reconciliation | PASS: retained only unique documentation corrections after PR #1480 landed the stronger tracked-root gate; archived resolved shared-hook issue #143 | docs index and links passed; outstanding-issues and branch-review-ledger guards passed; diff check passed | -| 2026-07-30 | PR-1448 | 8ece7f345e93170c6bd242701eaff05f5504d98b | PR #1448 authenticated live workflow | PASS after review repair: protected-main-only checkout, explicit bounded mutations, scoped secrets, and static dispatch confirmation; no live provider workflow dispatched | GitHub Actions and PR-policy guards passed; focused Vitest 3 passed; docs links and scripts, issue and ledger guards, Prettier and diff checks passed | -| 2026-07-30 | codex/outstanding-deletion-guard | da1bed4bcb05f2b975823c76bab0913278cfaea6 | issue 148 deletion guard | approved: no P0-P2 findings; base comparison is fail-closed in CI and preserves archive moves | verify:cheap; deletion self-test; unreadable-base proof; CI scope; GitHub Actions pin guard | -| 2026-07-30 | codex/sync-ci-anti-churn | 4f99c6d6dbcd4d2c16d5ec58183003c64d989ac8 | issue 145 anti-churn guidance | approved: guidance now covers both pushes and sync mutations without weakening cancellation | check:outstanding-issues; prettier AGENTS; diff check | -| 2026-07-30 | PR-1492 | a50640970a4e4197c64fba7239aeae073445fed9 | PR #1492 branch-sync churn review | FIXED P2: exact-head queued or in-progress workflows now block automated branch updates; Run PR guidance matches the executable guard | focused Vitest 1 file, 8 tests passed; Prettier passed; sync dry-run passed on 19 open PRs; diff check passed; no provider-backed application checks run | -| 2026-07-30 | codex/ingestion-fixes-current-main-20260731 | fe68a0a817213ef33ddeee35b45034656986d089 | ingestion fixes replacement release readiness | ready after fixing unreachable partial-batch handling and invalid recovery owner lookup | 4 focused files 183 tests passed; typecheck passed; production-readiness READY; git diff --check passed | -| 2026-07-30 | codex/archive-advisory-ui-scope | c8d50c7ac275212cbebf5c53fe859d863e800bbf | archive issue 137 after current-main verification | approved: implementation and fail-open self-tests remain green on current main | check:ci-scope; check:gate-manifest; check:outstanding-issues; diff check | -| 2026-07-30 | PR-1494 | 807a3a09f5afc12e8db4f9158abe09d9c7b336c9 | PR #1494 pre-commit fail-open review | FIXED P2: legacy worktrees may skip a genuinely absent generator, while a staged deletion or rename now fails closed | docs-inventory Vitest 5 passed; shell syntax passed; Prettier test check passed; diff check passed | -| 2026-07-30 | claude/x3-rag-coverage-gate-qx9j7d (PR #1463, squashed as dba7356f) | dba7356fc8dc926d951d6de6f019d5b8e000be21 | X3/#101 per-request hydration extraction from rag.ts into rag-hydration.ts | clean and landed — byte-identical move verified against pre-merge main, rag.ts 4780->4543, budget ratcheted to 4543, no back-edge (cluster referenced zero rag.ts-local symbols), both public re-exports preserved; squash captured 100% of branch content | typecheck, lint, check:knip, check:maintainability-budgets 4543/4543, focused vitest 83/83 incl rag-query-concurrency, eval:rag:offline 572/572 36 golden, format:check, verify:cheap, verify:pr-local build+bundle-scan, post-merge content verification on main | -| 2026-07-30 | dba7356fc8dc926d951d6de6f019d5b8e000be21 | dba7356fc8dc926d951d6de6f019d5b8e000be21 | X3 hydration unit: per-request hydration extraction from rag.ts into rag-hydration.ts (PR #1463) | clean and landed — byte-identical move verified against pre-merge main, rag.ts 4780->4543, budget ratcheted to 4543, no back-edge, both public re-exports preserved. Supersedes the earlier row for this HEAD, which was keyed only to the slash-form branch token and so returned NOT REVIEWED on a landed-SHA lookup; it also mislabelled the unit as #101, which is the unrelated open canary-gated retrieval-parallelisation recommendation | typecheck, lint, check:knip, check:maintainability-budgets 4543/4543, focused vitest 83/83, eval:rag:offline 572/572 36 golden, format:check, verify:cheap 442 files 4625 passed, verify:pr-local, post-merge content verification on main | -| 2026-07-30 | PR #1474 | 098186866932394d2cc17983e566ae6c44b063b4 | PR #1474 full diff vs origin/main | approved | verify:cheap; eval:rag:offline; live canary 30578169116 -> 30579534353 | -| 2026-07-30 | codex/coverage-scope-policy | 94f97cdb1d0543724de408f19e79d64e61c8b31a | issue 139 coverage scope policy | approved: workflow coverage breadth is deliberate and test-pinned; docs-like skills remain static-only | check:ci-scope; check:gate-manifest; check:outstanding-issues; prettier; diff check | -| 2026-07-30 | codex/coverage-scope-policy | 4da2a003bc2254507662d1b8b6e9768e94371abd | issue 139 coverage scope policy post-sync | approved: late main sync preserves deliberate workflow coverage and static-only skill policy | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | -| 2026-07-30 | codex/archive-completed-ci-tasks | 5c902f422ceee78ef68132900fda734c1d5bc1f8 | archive issues 133 and 135 | approved: both rows were already resolved on current main and focused guards prove their contracts | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | -| 2026-07-30 | codex/next-local-task | 3e6d6d69c15fc056773657e15879ba2283fa2899 | archive issues 129 and 132 | approved: documented constraints satisfy both explicit outcomes without overstating client-side enforcement | guard:push:self-test; focused vitest 24/24; check:github-actions; check:outstanding-issues; diff check | -| 2026-07-30 | codex/playwright-container-alignment | 5ce50f64993a43efb00c4f8cfa86c26c895b8532 | issue 121 container browser fallback | approved: managed browser remains preferred; immutable-container fallback is explicit, newest-compatible, logged, unit-pinned, and launch-proven | verify:cheap 443 files/4631 pass; focused vitest 37/37; fallback Chromium launch; focused Playwright 1/1; check:rag:fixtures; outstanding guard; diff check | -| 2026-07-30 | codex/playwright-container-alignment | 70a603087ae7ea9c0e6db0701aa13ffdddb79081 | preinstalled Chromium fallback | P2 fixed: Linux fallback now filters by process architecture, preventing an x64-only shell from being selected on arm64. No remaining findings. | 2 files/38 tests; Prettier; ESLint; git diff --check | -| 2026-07-30 | PR-1433 | e7a8102620b5b4847894b3df21f438304ea581bd | PR #1433 document result cards and action menu final review | fixed clipped menu, clipboard fallback focus loss, and inherited action typography; no remaining findings | DOM Vitest 4/4; focused Chromium 1/1; typecheck, Prettier, and diff checks pass | -| 2026-07-30 | codex/playwright-container-alignment | 936cab24f00202081aad780f8712152409a212d3 | container browser fallback review fixes | approved: automated P2s fixed by architecture filtering and designated /opt/pw-browsers root; generic stale caches fail closed | focused vitest 11/11; ESLint; Prettier; outstanding guard; diff check | -| 2026-07-30 | codex/ledger-next-20260730 | 268b201a1dbaed7cca6dff4a146b0319a5275216 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. No remaining P0-P2 findings. Reconciled current main row by row, retained current-main #105 and #136 dispositions, rejected the unsafe Playwright cache, and fixed favourites partial-source masking plus the indexed-search hydration race. | format PASS; static gates, lint, typecheck PASS; unit 4597 PASS, 3 SKIP, 1 stale donor failure repaired by exact-lock dependency; brace cap direct PASS; focused Chromium 1 PASS; production build PASS; ledger guards PASS | -| 2026-07-30 | codex/ledger-next-20260730 | 1ee749bd71da45be2d6b9d3eb4913331696996a6 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes the prior review after cleanly merging current main. No remaining P0-P2 findings; current-main #079 was retained, verified closures remained archived, and no product behavior changed during sync. | merge reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; whole-tree format PASS; prior static, lint, typecheck, unit, build, RAG fixture, and focused Chromium evidence retained | -| 2026-07-30 | codex/ledger-next-20260730 | ee66a39b63fd7e39448ab13a5a5b72441f5321be | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current main answer-delivery design. No remaining P0-P2 findings; current-main #100 governance text was retained exactly, verified closures remained archived, and the sync added documentation only. | merge reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; prior format, static, lint, typecheck, unit, build, RAG fixture, and focused Chromium evidence retained | -| 2026-07-30 | codex/ledger-next-20260730 | 23572a4ad4a6f1520d86715c647ad9d40ff6bb01 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current main. No remaining P0-P2 findings; #105 was correctly reopened on withdrawn evidence, current-main #090 and #125 were retained, and verified closures remained archived. | post-CI main reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; prior hosted exact-head CI all green before base moved; fresh CI required for this head | -| 2026-07-30 | codex/ledger-next-20260730 | b43817f6243faac8ba22de85a461324b1612ad72 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main #133 evidence. No remaining P0-P2 findings; PR #1451 and the concurrent #141 race are incorporated into the resolved compact-table outcome, with scoped Prettier protection verified. | main reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; prior hosted CI green before base moved; fresh CI required for this head | -| 2026-07-30 | codex/ledger-next-20260730 | 072051eb83e0b8317880d6167d06b3865b4a6ff7 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1477. No remaining P0-P2 findings; the implemented #131 fail-closed Codex delivery contract replaces the earlier accepted-limitation wording, and all other resolved/open dispositions remain intact. | main reconciliation + ledger:dedupe PASS; outstanding, branch-review, and Codex autofix guards PASS; prior exact-head hosted CI all green before base moved; fresh CI required for this head | -| 2026-07-30 | codex/ledger-next-20260730 | 2a590d8c56b04ce6202fa1c7814e9858363151c0 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1480. No remaining P0-P2 findings; current main's canonical partial-favourites implementation replaces the branch's duplicate notice helper, while the branch's ledger, CI, and indexed-source hydration changes remain intact. | focused overlap suite 7 files / 130 tests PASS; verify:cheap 32 gates PASS; unit 439 files / 4612 PASS / 3 SKIP; ledger guards and merge reconciliation PASS | -| 2026-07-30 | codex/ledger-next-20260730 | 7d6a341b1ac0efdf001bf06146a297bd2cb2cb4c | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1486. No remaining P0-P2 findings; #141 and #144 are archived from the implemented PR #1480 evidence, and current-main outcomes for #091, #128, and #134 are retained without changing source behavior. | docs-only main reconciliation + ledger:dedupe PASS; outstanding ledger 146 rows / 50 open / 96 archived PASS; branch-review ledger PASS; prior combined-tree verify:cheap 32 gates PASS | -| 2026-07-30 | codex/ledger-next-20260730 | 85a6bdf74629096fba1b476e52b76e241665fd15 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1469. No remaining P0-P2 findings; #107 is archived with executing jsdom state-matrix coverage, and the branch's existing changes remain intact. | focused current-main state-matrix suite 2 files / 10 tests PASS; outstanding ledger 146 rows / 49 open / 97 archived PASS; branch-review ledger PASS; prior combined-tree verify:cheap 32 gates PASS | | 2026-07-30 | codex/ledger-next-20260730 | 14508ca0406c29f3f7a31dc72db1e1d1d626c595 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PRs #1481 and #1487. No remaining P0-P2 findings; #127 remains archived with the later exact-head evidence and #146 retains both new shard-1 flake data points. | docs-only main reconciliation + ledger:dedupe PASS; outstanding ledger 146 rows / 49 open / 97 archived PASS; branch-review ledger PASS; prior exact-head hosted CI all green before base moved | +| 2026-07-30 | PR-1458 | 8c1975b178c67e4c54acffc395d85e38c43d39f5 | PR #1458 superseded root-gate reconciliation | PASS: retained only unique documentation corrections after PR #1480 landed the stronger tracked-root gate; archived resolved shared-hook issue #143 | docs index and links passed; outstanding-issues and branch-review-ledger guards passed; diff check passed | +| 2026-07-30 | PR-1475 | 6de5c321beac55860cc4b6fc7d26ef5a7e088f38 | PR #1475 ingestion behavioral extraction | PASS after current-main reconciliation; extracted decisions preserve entrypoint behavior and replace the matching source-grep assertion with executable coverage | focused Vitest 3 files, 27 tests passed; typecheck passed; outstanding-issues and branch-review-ledger guards passed; provider-backed ingestion not run | | 2026-07-30 | codex/ledger-next-20260730 | 226ab1508e4a4eecd42fb473b9e19fb190fe5f0d | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PRs #1475 and #1458. No remaining P0-P2 findings; #106 and #143 are archived from implemented executable worker/indexing coverage and durable hook tracking. | focused worker/indexing suite 3 files / 27 tests PASS; CI-safe production-readiness READY; outstanding ledger 146 rows / 47 open / 99 archived PASS; branch-review ledger PASS | +| 2026-07-30 | codex/close-issue-105 | 09950abc8cf2d23455a6cbab3521bdec921ef272 | archive issue 105 after driven browser proof | approved: specific lazy fallback observed in driven desktop and phone Chromium | browser chunk-delay proof; check:outstanding-issues; prettier check; diff check | +| 2026-07-30 | PR-1448 | 8ece7f345e93170c6bd242701eaff05f5504d98b | PR #1448 authenticated live workflow | PASS after review repair: protected-main-only checkout, explicit bounded mutations, scoped secrets, and static dispatch confirmation; no live provider workflow dispatched | GitHub Actions and PR-policy guards passed; focused Vitest 3 passed; docs links and scripts, issue and ledger guards, Prettier and diff checks passed | | 2026-07-30 | codex/ledger-next-20260730 | 039b43a5e163c0f622a327ef50c36cf5249296cc | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PRs #1448 and #1488. No remaining P0-P2 findings; #105 is archived from driven Chromium evidence and the authenticated-live workflow remains explicitly provider-gated. | GitHub Actions pin guard PASS; outstanding ledger 146 rows / 46 open / 100 archived PASS; branch-review ledger PASS; focused authenticated-live test deferred by repository coordinator; fresh hosted Unit coverage required | | 2026-07-30 | codex/ledger-next-20260730 | 9511c615bf94adf8c7ceee5cb1630c9a168b71c0 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes prior reviews after merging current-main PR #1479. No remaining P0-P2 findings; all 146 IDs and 100 resolved dispositions are retained while main's file-wide Prettier exclusion and measured #133 evidence are incorporated. | main reconciliation + ledger:dedupe PASS; outstanding ledger 146 rows / 46 open / 100 archived PASS; branch-review ledger PASS; authenticated-live workflow test 1 file / 3 tests PASS | +| 2026-07-30 | codex/outstanding-deletion-guard | da1bed4bcb05f2b975823c76bab0913278cfaea6 | issue 148 deletion guard | approved: no P0-P2 findings; base comparison is fail-closed in CI and preserves archive moves | verify:cheap; deletion self-test; unreadable-base proof; CI scope; GitHub Actions pin guard | | 2026-07-30 | codex/ledger-next-20260730 | a278acad1ca88c28e45619b6a28e3f245c49d786 | PR #1484 post-main reconciliation | Ready: merged ee34b4d2a row-by-row; preserved all 146 issue IDs and archived #148 | verify:cheap PASS (442 files, 4626 passed, 3 skipped); ledger guards and ci-scope PASS | +| 2026-07-30 | codex/ingestion-fixes-current-main-20260731 | fe68a0a817213ef33ddeee35b45034656986d089 | ingestion fixes replacement release readiness | ready after fixing unreachable partial-batch handling and invalid recovery owner lookup | 4 focused files 183 tests passed; typecheck passed; production-readiness READY; git diff --check passed | | 2026-07-30 | codex/ledger-next-20260730 | 41956467ae96c64058d7c391fcbbc6803a3f8012 | PR #1484 post-main RAG and ingestion sync | Ready: merged current main cleanly; protected RAG files identical to origin/main and no retrieval behavior delta | focused 7 files/201 tests PASS; production-readiness READY; ledger guards and ci-scope PASS | | 2026-07-30 | codex/ledger-next-20260730 | 71d5ad7376167ff6f81f1e1f69dedb658c1db3ac | PR #1484 post-main offline-budget sync | Ready: preserved branch ledger and current-main #098/#121 corrections row-by-row; no ranking behavior change | search budget/contract 2 files/4 tests PASS; outstanding-issues 146 rows PASS | +| 2026-07-30 | PR-1494 | 807a3a09f5afc12e8db4f9158abe09d9c7b336c9 | PR #1494 pre-commit fail-open review | FIXED P2: legacy worktrees may skip a genuinely absent generator, while a staged deletion or rename now fails closed | docs-inventory Vitest 5 passed; shell syntax passed; Prettier test check passed; diff check passed | +| 2026-07-30 | codex/sync-ci-anti-churn | 4f99c6d6dbcd4d2c16d5ec58183003c64d989ac8 | issue 145 anti-churn guidance | approved: guidance now covers both pushes and sync mutations without weakening cancellation | check:outstanding-issues; prettier AGENTS; diff check | +| 2026-07-30 | PR-1492 | a50640970a4e4197c64fba7239aeae073445fed9 | PR #1492 branch-sync churn review | FIXED P2: exact-head queued or in-progress workflows now block automated branch updates; Run PR guidance matches the executable guard | focused Vitest 1 file, 8 tests passed; Prettier passed; sync dry-run passed on 19 open PRs; diff check passed; no provider-backed application checks run | | 2026-07-30 | PR-1484 | 9583b7fdc3d2908874c39654dadce0ec7401640a | PR #1484 final current-main review | approved after fixing P2 file-wide Prettier-ignore false rejection; composite actions retain coverage, workflow-only changes skip coverage, ledger canonicalization and ready-for-review/action-pin guards match repository contracts | GitHub Actions pin, CI scope, outstanding-issues, branch-review-ledger, Prettier and diff checks passed; final merge-tree audit clean; hosted exact-head CI pending push | +| 2026-07-30 | claude/x3-rag-coverage-gate-qx9j7d (PR #1463, squashed as dba7356f) | dba7356fc8dc926d951d6de6f019d5b8e000be21 | X3/#101 per-request hydration extraction from rag.ts into rag-hydration.ts | clean and landed — byte-identical move verified against pre-merge main, rag.ts 4780->4543, budget ratcheted to 4543, no back-edge (cluster referenced zero rag.ts-local symbols), both public re-exports preserved; squash captured 100% of branch content | typecheck, lint, check:knip, check:maintainability-budgets 4543/4543, focused vitest 83/83 incl rag-query-concurrency, eval:rag:offline 572/572 36 golden, format:check, verify:cheap, verify:pr-local build+bundle-scan, post-merge content verification on main | +| 2026-07-30 | dba7356fc8dc926d951d6de6f019d5b8e000be21 | dba7356fc8dc926d951d6de6f019d5b8e000be21 | X3 hydration unit: per-request hydration extraction from rag.ts into rag-hydration.ts (PR #1463) | clean and landed — byte-identical move verified against pre-merge main, rag.ts 4780->4543, budget ratcheted to 4543, no back-edge, both public re-exports preserved. Supersedes the earlier row for this HEAD, which was keyed only to the slash-form branch token and so returned NOT REVIEWED on a landed-SHA lookup; it also mislabelled the unit as #101, which is the unrelated open canary-gated retrieval-parallelisation recommendation | typecheck, lint, check:knip, check:maintainability-budgets 4543/4543, focused vitest 83/83, eval:rag:offline 572/572 36 golden, format:check, verify:cheap 442 files 4625 passed, verify:pr-local, post-merge content verification on main | | 2026-07-30 | PR-1484 | dfb23bb48a16a4da5fd54a34205d8df9796ecc66 | PR #1484 final merge readiness after main sync | approved; no new P0-P2 findings after current-main sync | outstanding-issues, branch-review-ledger, GitHub Actions pin, CI scope, diff check and final merge audit passed | | 2026-07-30 | codex/ledger-next-20260730 | 011a3713fb2dde1900260f2c8ebd2b0d7c540efc | PR #1484 closure-preservation repair | Ready: restored eleven verified archive dispositions lost during concurrent main sync; preserved #145 archive transition | outstanding-issues 146 rows, 44 open/102 archived PASS; only #145 state changed from prior verified candidate; focused offline 2 files/4 tests PASS | +| 2026-07-30 | codex/archive-advisory-ui-scope | c8d50c7ac275212cbebf5c53fe859d863e800bbf | archive issue 137 after current-main verification | approved: implementation and fail-open self-tests remain green on current main | check:ci-scope; check:gate-manifest; check:outstanding-issues; diff check | | 2026-07-30 | codex/ledger-next-20260730 | bfbfe2cab8ae28e38e5b1090b5c83f8e024ac0f0 | PR #1484 final main decision sync | Ready: current main contained; #130 archived by owner decision; #149/#150 added open; all prior closures preserved | outstanding-issues 148 rows, 45 open/103 archived PASS; branch ledger PASS; whole-tree format PASS; diff check PASS | +| 2026-07-30 | codex/coverage-scope-policy | 94f97cdb1d0543724de408f19e79d64e61c8b31a | issue 139 coverage scope policy | approved: workflow coverage breadth is deliberate and test-pinned; docs-like skills remain static-only | check:ci-scope; check:gate-manifest; check:outstanding-issues; prettier; diff check | +| 2026-07-30 | codex/coverage-scope-policy | 4da2a003bc2254507662d1b8b6e9768e94371abd | issue 139 coverage scope policy post-sync | approved: late main sync preserves deliberate workflow coverage and static-only skill policy | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | +| 2026-07-30 | codex/archive-completed-ci-tasks | 5c902f422ceee78ef68132900fda734c1d5bc1f8 | archive issues 133 and 135 | approved: both rows were already resolved on current main and focused guards prove their contracts | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | | 2026-07-30 | codex/ledger-next-20260730 | 7238475c16576928a251c7a3d6de6134e6a72a4e | close verified ledger and CI follow-ups | No remaining findings after current-main sync; retained richer canonical #133/#135 dispositions from merged #1500. | check:ci-scope; check:gate-manifest; check:outstanding-issues; check:branch-review-ledger; git diff --check | +| 2026-07-30 | codex/next-local-task | 3e6d6d69c15fc056773657e15879ba2283fa2899 | archive issues 129 and 132 | approved: documented constraints satisfy both explicit outcomes without overstating client-side enforcement | guard:push:self-test; focused vitest 24/24; check:github-actions; check:outstanding-issues; diff check | | 2026-07-30 | codex/ledger-next-20260730 | ade61bab0ef8d2d35e0fec7e81c08e0a850cf58e | close verified ledger and CI follow-ups | No remaining findings after #1501 sync; retained canonical #133/#135 rows and added non-overlapping #129/#132 dispositions from main. | check:ci-scope; check:gate-manifest; check:outstanding-issues; check:branch-review-ledger; git diff --check | +| 2026-07-30 | PR #1474 | 098186866932394d2cc17983e566ae6c44b063b4 | PR #1474 full diff vs origin/main | approved | verify:cheap; eval:rag:offline; live canary 30578169116 -> 30579534353 | +| 2026-07-30 | claude/design-visual-baselines | b57432facb7ded1e9605d1076e0d8c9d661efa2c | open PR changed-scope review | APPROVE after fix: platform-scoped baseline guidance matches the candidate-path and AWAITING_BASELINE adoption contract. | Prettier PASS; docs:check-links PASS; check:ci-scope PASS; review thread resolved; exact-head visual CI required | +| 2026-07-30 | pr/1431 | 74e10087eb20a81279fb56d18f28a2475d895fab | docs: visual baseline platform layout | approved; candidate adoption and Linux baseline guidance match implementation | runtime/install parity; ledger; CI scope; docs inventory/links; Prettier; diff-check | +| 2026-07-30 | pr/1431 | b4848aa92e890193a4a41744b611746673f3b058 | docs: visual baseline platform layout | approved after remote-head reconciliation; guidance unchanged | ledger; CI scope; docs inventory/links; Prettier; diff-check | +| 2026-07-30 | pr/1431 | 897de9b1b7fc243006c1a71e67a6333681272ac6 | docs: visual baseline platform layout | approved after PR 1462 base sync; visual guidance unchanged | ledger; CI scope; docs inventory; Prettier; diff-check | +| 2026-07-30 | PR-1433 | e7a8102620b5b4847894b3df21f438304ea581bd | PR #1433 document result cards and action menu final review | fixed clipped menu, clipboard fallback focus loss, and inherited action typography; no remaining findings | DOM Vitest 4/4; focused Chromium 1/1; typecheck, Prettier, and diff checks pass | | 2026-07-30 | codex/cloud-environment-repair-20260731 | 0dc8c3d65ffc8d6932275b3c3d6f6d5c41656f45 | Cloud environment repair full diff vs origin/main | No high-confidence defects; safe for CI | verify:pr-local pass (442 files, 4636 tests); focused Cloud tests pass (45 tests); static/effective Cloud and provider-free readiness pass | | 2026-07-30 | PR-1497 | 8d9e74ae8783bac6e96ec4bd0b5e5b5ab19afc42 | PR #1497 final current-main review | approved after fixing P2 incomplete offline credential scrubbing and fail-open live-test gap | check:codex-cloud, 41 focused tests, verify:cheap (443 files; 4641 passed, 3 skipped), issue and ledger guards, final merge audit passed | | 2026-07-30 | PR-1497 | 06b8d40d632c7802aca1add0f35ed2d82d5e98de | PR #1497 final test-timeout follow-up | APPROVE: bounded offline readiness subprocess; no remaining findings | static Cloud contract PASS; branch-review-ledger PASS; docs script refs PASS; diff check PASS; full hosted CI required | | 2026-07-30 | PR-1497 | 978459f8788568be7aa0dd4d6a8b309a3d2d077e | PR #1497 final current-main review and typecheck repair | APPROVE after fixing Error.code narrowing in the offline readiness test; no remaining P0-P2 findings. | check:codex-cloud PASS; full Vitest 444 files / 4644 passed / 3 skipped; readiness focused 6/6; tsc --noEmit PASS; issue and ledger guards PASS; Prettier and diff checks PASS | | 2026-07-30 | PR-1497 | 5bcf26b12b89e89539a3dfc903155cc49475a68b | PR #1497 append-only ledger reconciliation | APPROVE: existing ledger order restored; exact PR diff is three append-only review rows; no remaining findings | typecheck PASS on repaired code; parent unit coverage PASS; branch-review-ledger PASS; unresolved threads 0; fresh hosted CI required | | 2026-07-30 | PR-1497 | b0243464df533a94199b670f1bf0563d84d3f4d6 | PR #1497 combined exact-head review after concurrent main sync | APPROVE; retained all append-only records and the type-safe timeout diagnostic; no remaining P0-P2 findings. | check:codex-cloud PASS; full Vitest 444 files / 4644 passed / 3 skipped; readiness 6/6; tsc --noEmit PASS; issue/ledger/format/diff/final audit PASS | +| 2026-07-30 | codex/playwright-container-alignment | 5ce50f64993a43efb00c4f8cfa86c26c895b8532 | issue 121 container browser fallback | approved: managed browser remains preferred; immutable-container fallback is explicit, newest-compatible, logged, unit-pinned, and launch-proven | verify:cheap 443 files/4631 pass; focused vitest 37/37; fallback Chromium launch; focused Playwright 1/1; check:rag:fixtures; outstanding guard; diff check | +| 2026-07-30 | codex/playwright-container-alignment | 70a603087ae7ea9c0e6db0701aa13ffdddb79081 | preinstalled Chromium fallback | P2 fixed: Linux fallback now filters by process architecture, preventing an x64-only shell from being selected on arm64. No remaining findings. | 2 files/38 tests; Prettier; ESLint; git diff --check | +| 2026-07-30 | codex/playwright-container-alignment | 936cab24f00202081aad780f8712152409a212d3 | container browser fallback review fixes | approved: automated P2s fixed by architecture filtering and designated /opt/pw-browsers root; generic stale caches fail closed | focused vitest 11/11; ESLint; Prettier; outstanding guard; diff check | From 5583326217984270acd3d071c8f00dd163975323 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 07:09:28 +0800 Subject: [PATCH 08/10] docs: record PR 1507 final review --- docs/branch-review-ledger.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 64f3cd87a0..b7e3b69643 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -310,3 +310,4 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/playwright-container-alignment | 5ce50f64993a43efb00c4f8cfa86c26c895b8532 | issue 121 container browser fallback | approved: managed browser remains preferred; immutable-container fallback is explicit, newest-compatible, logged, unit-pinned, and launch-proven | verify:cheap 443 files/4631 pass; focused vitest 37/37; fallback Chromium launch; focused Playwright 1/1; check:rag:fixtures; outstanding guard; diff check | | 2026-07-30 | codex/playwright-container-alignment | 70a603087ae7ea9c0e6db0701aa13ffdddb79081 | preinstalled Chromium fallback | P2 fixed: Linux fallback now filters by process architecture, preventing an x64-only shell from being selected on arm64. No remaining findings. | 2 files/38 tests; Prettier; ESLint; git diff --check | | 2026-07-30 | codex/playwright-container-alignment | 936cab24f00202081aad780f8712152409a212d3 | container browser fallback review fixes | approved: automated P2s fixed by architecture filtering and designated /opt/pw-browsers root; generic stale caches fail closed | focused vitest 11/11; ESLint; Prettier; outstanding guard; diff check | +| 2026-07-30 | PR-1507 | 12e5c8c977a873a7b900596fdc310a1a78d863f0 | PR #1507 final current-main review | APPROVE; architecture-specific container lookup and immutable-root fail-closed fallback are preserved after current-main reconciliation; no remaining P0-P2 findings. | focused Vitest 2 files / 40 tests PASS; tsc --noEmit PASS; issue/ledger/format/diff guards PASS | From 1f6cc1e9810430176f291721d4a29b8d5248bc5a Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 07:10:21 +0800 Subject: [PATCH 09/10] docs: record PR 1507 current-main review --- docs/branch-review-ledger.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index b7e3b69643..a76fde0247 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -311,3 +311,4 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/playwright-container-alignment | 70a603087ae7ea9c0e6db0701aa13ffdddb79081 | preinstalled Chromium fallback | P2 fixed: Linux fallback now filters by process architecture, preventing an x64-only shell from being selected on arm64. No remaining findings. | 2 files/38 tests; Prettier; ESLint; git diff --check | | 2026-07-30 | codex/playwright-container-alignment | 936cab24f00202081aad780f8712152409a212d3 | container browser fallback review fixes | approved: automated P2s fixed by architecture filtering and designated /opt/pw-browsers root; generic stale caches fail closed | focused vitest 11/11; ESLint; Prettier; outstanding guard; diff check | | 2026-07-30 | PR-1507 | 12e5c8c977a873a7b900596fdc310a1a78d863f0 | PR #1507 final current-main review | APPROVE; architecture-specific container lookup and immutable-root fail-closed fallback are preserved after current-main reconciliation; no remaining P0-P2 findings. | focused Vitest 2 files / 40 tests PASS; tsc --noEmit PASS; issue/ledger/format/diff guards PASS | +| 2026-07-30 | PR-1507 | 12e5c8c977a873a7b900596fdc310a1a78d863f0 | PR #1507 current-main merge and ledger normalization | APPROVED — no findings after current-main sync; feature diff unchanged and ledger reduced to three unique append-only review rows. | focused Vitest 2 files/40 tests PASS; outstanding-issues PASS; branch-review-ledger PASS; diff check PASS; merge-tree f8f88bd79706c2fb36637014a25e93af6e08eb99 | From 064b42970ce8c09e7ed1210fa948266ba805f9bb Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Fri, 31 Jul 2026 07:12:35 +0800 Subject: [PATCH 10/10] docs: record PR 1507 ancestry reconciliation --- docs/branch-review-ledger.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index a76fde0247..14d4dc1841 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -312,3 +312,4 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/playwright-container-alignment | 936cab24f00202081aad780f8712152409a212d3 | container browser fallback review fixes | approved: automated P2s fixed by architecture filtering and designated /opt/pw-browsers root; generic stale caches fail closed | focused vitest 11/11; ESLint; Prettier; outstanding guard; diff check | | 2026-07-30 | PR-1507 | 12e5c8c977a873a7b900596fdc310a1a78d863f0 | PR #1507 final current-main review | APPROVE; architecture-specific container lookup and immutable-root fail-closed fallback are preserved after current-main reconciliation; no remaining P0-P2 findings. | focused Vitest 2 files / 40 tests PASS; tsc --noEmit PASS; issue/ledger/format/diff guards PASS | | 2026-07-30 | PR-1507 | 12e5c8c977a873a7b900596fdc310a1a78d863f0 | PR #1507 current-main merge and ledger normalization | APPROVED — no findings after current-main sync; feature diff unchanged and ledger reduced to three unique append-only review rows. | focused Vitest 2 files/40 tests PASS; outstanding-issues PASS; branch-review-ledger PASS; diff check PASS; merge-tree f8f88bd79706c2fb36637014a25e93af6e08eb99 | +| 2026-07-30 | PR-1507 | 5e22b89f7bdb73335d12a0cf4091915615b20dd7 | PR #1507 remote ancestry reconciliation | APPROVED — identical-tree remote merge ancestry reconciled without content change; no remaining findings. | focused Vitest 2 files/40 tests PASS on identical tree; issue and ledger guards PASS; diff check PASS; merge-tree d6594063a4aa2c5f8b7a9ec72c1c41c94e6937fa |