From 69f92eb25ae168fe5a1885ba53d623c7de6004e2 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Wed, 26 Aug 2026 09:21:18 +0800 Subject: [PATCH 1/6] fix(sidebar): route Medication to shared home --- .../clinical-dashboard/ClinicalSidebar.tsx | 9 ++++++-- tests/sidebar-production.dom.test.tsx | 1 + tests/ui-smoke.spec.ts | 21 +++++++++++++++---- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/components/clinical-dashboard/ClinicalSidebar.tsx b/src/components/clinical-dashboard/ClinicalSidebar.tsx index a7e2cdaeaf..5e006f62b6 100644 --- a/src/components/clinical-dashboard/ClinicalSidebar.tsx +++ b/src/components/clinical-dashboard/ClinicalSidebar.tsx @@ -37,7 +37,7 @@ import { } from "@/components/ui-primitives"; import { Sheet } from "@/components/ui/sheet"; -import { appModeDefinition, appModeHomeHref, type AppModeId } from "@/lib/app-modes"; +import { appModeDefinition, appModeHomeHref, appModeSelectionHref, type AppModeId } from "@/lib/app-modes"; import { useSidebarPins, pinnableSidebarModeIds } from "@/components/clinical-dashboard/use-sidebar-pins"; import { useTheme } from "@/components/clinical-dashboard/use-theme"; import type { ThemePreference } from "@/lib/theme"; @@ -76,7 +76,12 @@ const sidebarToolItems = [ // redirects onto it, so pointing a pinned entry at `/services` or `/factsheets` // would spend a round trip arriving at the same place. { id: "services", label: "Services", icon: appModeIcons.services, href: "/?mode=services" }, - { id: "prescribing", label: appModeDefinition("prescribing").label, icon: Pill, href: "/medications" }, + { + id: "prescribing", + label: appModeDefinition("prescribing").label, + icon: Pill, + href: appModeSelectionHref("prescribing"), + }, { id: "factsheets", label: "Factsheets", icon: appModeIcons.factsheets, href: "/?mode=factsheets" }, // PT-11: standalone /tools is the canonical entry; /?mode=tools remains a dashboard-mode alias. { id: "tools", label: "Tools", icon: Wrench, href: "/tools" }, diff --git a/tests/sidebar-production.dom.test.tsx b/tests/sidebar-production.dom.test.tsx index c6d237c94f..4fef800a12 100644 --- a/tests/sidebar-production.dom.test.tsx +++ b/tests/sidebar-production.dom.test.tsx @@ -85,6 +85,7 @@ describe("production Clinical Guide sidebar", () => { "Factsheets", "Tools", ]); + expect(navigation.getByRole("link", { name: "Medication" })).toHaveAttribute("href", "/?mode=prescribing"); expect(navigation.getAllByRole("button").at(-1)).toHaveAccessibleName("More modes"); await user.click(screen.getByRole("button", { name: "Search Clinical Guide" })); diff --git a/tests/ui-smoke.spec.ts b/tests/ui-smoke.spec.ts index 8bf1a1e431..8bd6e6bce3 100644 --- a/tests/ui-smoke.spec.ts +++ b/tests/ui-smoke.spec.ts @@ -813,12 +813,12 @@ async function openMobileClinicalGuideMenu(page: Page) { { name: "Answer", href: "/?mode=answer" }, // Documents owns a real home: the shell mounts ClinicalDashboard for // /documents, so it paints browse and recent documents rather than the - // shared hero. Every other consolidated mode links at the shared home - // directly — pointing a pinned entry at its old bare path would spend a - // 307 arriving in the same place. + // shared hero. Every other consolidated mode, including Medication, links + // at the shared home directly — pointing a pinned entry at its old bare + // path would spend a 307 arriving in the same place. { name: "Documents", href: "/documents" }, { name: "Services", href: "/?mode=services" }, - { name: "Medication", href: "/medications" }, + { name: "Medication", href: "/?mode=prescribing" }, { name: "Factsheets", href: "/?mode=factsheets" }, { name: "Tools", href: "/tools" }, ]); @@ -1175,6 +1175,19 @@ test.describe("Clinical KB UI smoke coverage", () => { await expect(page.locator('[data-testid="global-search-input"]:visible').first()).toBeEnabled(); }); + test("Medication shortcut opens the shared Medication home", async ({ page }) => { + await page.setViewportSize({ width: 390, height: 820 }); + await mockPrivateUnauthenticatedApi(page); + await gotoApp(page, "/"); + await waitForDemoDashboardReady(page); + + const menu = await openMobileClinicalGuideMenu(page); + await menu.getByRole("link", { name: "Medication" }).click(); + + await expect(page).toHaveURL(/\/?mode=prescribing$/); + await expect(page.getByRole("button", { name: "Mode Medication" })).toBeVisible(); + }); + test("mobile search focus is singular, visible, and contained at clipped edges", async ({ page }) => { await page.setViewportSize({ width: 390, height: 820 }); await mockPrivateUnauthenticatedApi(page); From 3e3138d06ecee7b07479e2dfc86957042a8394b1 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Thu, 27 Aug 2026 06:54:25 +0800 Subject: [PATCH 2/6] fix(tooling): harden git hooks, stabilize pre-push baselines, and optimize agent token payload Harden git hooks, stabilize pre-push guards and merge-base baselines, reduce snapshot merge contention, add Windows Dev Drive cache check, and optimize agent token payload across documentation. --- AGENTS.md | 382 +++--------------- data/outstanding-issues-snapshot.json | 62 ++- docs/agents-guide.md | 16 +- .../4921f31f-cdb9-48a3-9a15-774d7d4c0e73.json | 11 + .../57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json | 11 + .../6c377d37-8b95-4ea6-8c02-d83e87e60093.json | 11 + .../85b2009a-0c94-4a62-a732-7fa38836c4f3.json | 11 + .../957765c0-c367-4eb1-8481-345f743a86f1.json | 11 + .../c4e26cf8-4e75-4fdf-9863-7fbd5a645b77.json | 11 + .../d4e5d89a-c05b-4be4-8b1d-fa328e86370e.json | 11 + .../e4e2cc34-02da-472e-a065-287a4a50640d.json | 11 + .../e64773d1-b02a-433e-99e7-9a16c06fe150.json | 11 + .../ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json | 11 + docs/scripts-index.md | 2 +- docs/testing.md | 18 +- package.json | 1 + scripts/check-dev-drive-cache.mjs | 132 ++++++ tests/guard-push.test.ts | 4 +- tests/hosted-migration-role-guard.test.ts | 2 +- tests/session-start-hook.test.ts | 14 + 20 files changed, 406 insertions(+), 337 deletions(-) create mode 100644 docs/outstanding-issues-inbox/4921f31f-cdb9-48a3-9a15-774d7d4c0e73.json create mode 100644 docs/outstanding-issues-inbox/57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json create mode 100644 docs/outstanding-issues-inbox/6c377d37-8b95-4ea6-8c02-d83e87e60093.json create mode 100644 docs/outstanding-issues-inbox/85b2009a-0c94-4a62-a732-7fa38836c4f3.json create mode 100644 docs/outstanding-issues-inbox/957765c0-c367-4eb1-8481-345f743a86f1.json create mode 100644 docs/outstanding-issues-inbox/c4e26cf8-4e75-4fdf-9863-7fbd5a645b77.json create mode 100644 docs/outstanding-issues-inbox/d4e5d89a-c05b-4be4-8b1d-fa328e86370e.json create mode 100644 docs/outstanding-issues-inbox/e4e2cc34-02da-472e-a065-287a4a50640d.json create mode 100644 docs/outstanding-issues-inbox/e64773d1-b02a-433e-99e7-9a16c06fe150.json create mode 100644 docs/outstanding-issues-inbox/ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json create mode 100644 scripts/check-dev-drive-cache.mjs diff --git a/AGENTS.md b/AGENTS.md index 66f50b11c3..1bd1c56c41 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -926,209 +926,67 @@ review sessions on someone else's PR still function normally. ## Automated review coverage (owner decision, 2026-08-22) -CodeRabbit's included allowance is exhausted and the organisation has reached its usage spending -cap, so it declines most reviews with "Review limit reached" — measured on PRs #2113, #2252, #2255, -#2256, #2263 and #2278 between 2026-08-18 and 2026-08-22. The owner has decided to **leave the cap -as it is and accept that CodeRabbit review is intermittent**, rather than raise it (`#CCZ4HB`). - -**Read `docs/decisions/ccz4hb-review-coverage.md` before acting on this.** A separate analysis -written the same day measured the cause and it is not primarily billing: CodeRabbit's included -reviews refill at one per hour (24/day) while this repo merged 25.4 PRs/day on average over the -preceding month. It also found that 285 of the last 1,190 merged PRs (24%) changed only -documentation and 190 (16%) changed only the repo's own record-keeping files — roughly six review -credits a day spent on files a code-review bot has nothing to say about. Two levers therefore remain -open at **no cost and no loss of safety**, and the owner's decision above does not foreclose them: -configure CodeRabbit to skip documentation-only PRs, and stop opening PRs whose only content is a -bookkeeping record. Do those before anyone proposes raising the cap again. - -What the decision means in practice, and what it does not mean: - -- The ChatGPT Codex connector reviewed PR #2278 on 2026-08-22 in the same run CodeRabbit skipped, so - as of that date automated review is reduced rather than absent. Do not treat that as permanent — - the connector reported its own usage limit on PR #2113 on 2026-08-18, so it can lapse too. -- Draft PRs are skipped by CodeRabbit outright, so a PR that stays in draft gets nothing from it - even when allowance is available. Undrafting mid-CI also cancels the in-flight run. -- **Do not weaken, skip, or relax any required check to compensate.** The required gates are now - carrying more of the load, not less, and the whole point of accepting reduced bot review is that - the deterministic checks stay strict. -- Clinical-risk and RAG-surface diffs still require their PR-body preflight sections in full; those - are enforced by `scripts/pr-policy.mjs` and are unaffected by review-bot availability. - -Reducing PR churn (below) remains the cheapest way to get more value from the allowance that exists. +CodeRabbit's included allowance is capped and review is intermittent (`#CCZ4HB`). The decision and root-cause analysis are documented in `docs/decisions/ccz4hb-review-coverage.md`. + +- Draft PRs are skipped by CodeRabbit outright; undrafting mid-CI cancels the in-flight run. +- **Do not weaken, skip, or relax any required check to compensate.** Required gates carry the deterministic safety net and must stay strict. +- Clinical-risk and RAG-surface diffs still require their PR-body preflight sections in full (`scripts/pr-policy.mjs`). +- Reduce PR churn by bundling low-risk append-only paperwork with product PRs (see below). ## PR bundling (reduce one-task-one-PR churn) -Every `newtask`/`handoff` cycle mints a dedicated `claude/` branch and PR, so a -single docs/ledger-append line pays the same required-CI bill as a large change: -`static-pr`, `pr-required`, and whatever path-scoped job the diff happens to trigger. -Measured 2026-07-30 (PR #1406, sampling the last 500 CI workflow runs, ~3 days of PR -traffic): 437 PR-triggered runs, ~40% cancelled mid-run (mostly superseded by a newer -push before Production UI finished), roughly 12 Production-UI-hours burned on runs that -never completed. More PRs also means more `docs/branch-review-ledger.md` rows and more -of the anti-churn re-syncing described above. - -Before opening a new branch, check whether the task can ride an **already-open PR you -still own** or be bundled with **other currently-queued low-risk work** instead of -minting a new one. If the target PR's CI is already running, either wait for it to settle -before pushing the addition or assemble every commit before that PR's first push — -`.github/workflows/ci.yml` cancels in-progress runs for pull requests, so a push mid-run -cancels and restarts CI rather than saving an invocation, reproducing the exact cancellation waste -this rule exists to cut (reproduced 2026-07-30 pushing a second commit to PR #1406: the -in-flight `static-pr` run was cancelled, failing `pr-required` on the now-stale head). -A settle-then-push addition also lands after this repo's one automatic Codex review may -already have run against the earlier head — in practice the connector re-reviews each new -push (observed on this same PR), but if it doesn't, request a fresh review explicitly -before merging rather than assuming the addition was covered. **If the target PR has -auto-merge armed, an ordinary fast-forward push is still safe to bundle onto** — GitHub -re-validates required checks against the new head before merging. Per-PR auto-merge state is -user-owned: automation must not disable or re-enable it, and a force-push or base/target change -while armed still hard-blocks with no override — that is the actual race, not an additive -commit. `guard-push.mjs` enforces the force-push block for every locally pushed PR branch when -authenticated `gh` is available; agent -policy remains the backstop in environments where local hooks or `gh` are unavailable. +Before opening a new branch, check whether the task can ride an **already-open PR you still own** or be bundled with **other currently-queued low-risk work** instead of minting a new one. If the target PR's CI is already running, wait for it to settle before pushing the addition or assemble every commit before that PR's first push (pushes mid-run cancel and restart CI). + +**If the target PR has auto-merge armed, an ordinary fast-forward push is still safe to bundle onto** — GitHub re-validates required checks against the new head before merging. Per-PR auto-merge state is user-owned: automation must not disable or re-enable it, and a force-push or base/target change while armed still hard-blocks with no override. `guard-push.mjs` enforces the force-push block for locally pushed PR branches when authenticated `gh` is available; agent policy remains the backstop. + Bundle only when every item being combined is: -- **Independently low-risk, checked two ways — neither is exhaustive alone.** - First, `scripts/pr-policy.mjs` / `classifyPullRequestFiles` must return - `clinicalRisk: false`, `operationalRisk: false` (dependency manifests, lockfiles, - `.github/workflows/**`, build/test-runner config), and no RAG-ranking-surface path. - Second, the diff must not touch anything in this repo's own broader "PR risk - detection" list below (auth, privacy, migrations/RLS, clinical/RAG/retrieval, - **background jobs/workers/queue processing**, payment/billing, public API contracts, - production config/deployment, file upload/download, provider/paid-API calls) — - that list catches real high-risk paths the narrower classifier doesn't flag at all - (e.g. `worker/**` trips neither `clinicalRisk` nor `operationalRisk`, but ingestion - workers are exactly the kind of change this exclusion exists for). When a path's risk - category is genuinely unclear under either check, default to its own PR rather than - extending the exclusion list further — the two checks together are a floor, not a - closed enumeration. -- **Still its own committed, separately revertible commit while the PR is open** — - bundling means one PR with multiple commits, never one squashed diff; `git revert ` - must undo any one item without touching the others before merge. That guarantee ends at - merge: this repo's normal squash-merge folds every commit into one on `main`, and once - the feature branch is deleted those original SHAs are unreachable. Reverting a single - bundled item after merge means reverting the relevant hunks of the squash commit by - hand, not `git revert ` on an item's original commit — keep an item out of the - bundle if it might need its own durable post-merge revert. -- **Listed as its own bullet** in the PR body's Summary, not blended into one narrative - — a reviewer (and `pr-policy.mjs`) still needs to find each item's own - governance/RAG-impact statement if it needs one. -- **Not already mid-edit** in another open PR or session — check local context first - (`docs/branch-review-ledger.md`, `git branch`/`git log`). Confirming against the live - open-PR list means a GitHub API read: only do that with this session's already- - authorized GitHub access, or ask before querying GitHub, per "API and provider - confirmation boundary" — do not treat it as a silent, unconditional prerequisite that - blocks starting ordinary work. - -**Best candidates:** small same-scope documentation or low-risk follow-up changes. Review records -and issue requests now use independent immutable files, so they should travel with their owning -product PR instead of receiving a dedicated ledger-only branch. +- **Independently low-risk, checked two ways:** + 1. `scripts/pr-policy.mjs` / `classifyPullRequestFiles` must return `clinicalRisk: false`, `operationalRisk: false`, and no RAG-ranking-surface path. + 2. The diff must not touch anything in this repo's broader "PR risk detection" list (auth, privacy, migrations/RLS, clinical/RAG/retrieval, background jobs/workers/queue processing, payment/billing, public API contracts, production config/deployment, file upload/download, provider/paid-API calls). +- **Committed as its own separately revertible commit** while the PR is open (one PR with multiple commits, not one squashed diff). +- **Listed as its own bullet** in the PR body's Summary. +- **Not already mid-edit** in another open PR or session (check local context / review ledger first). + +**Best candidates:** small same-scope documentation, immutable review records (`docs/branch-review-records/`), or queued issue requests (`docs/outstanding-issues-inbox/`). **Never bundle:** -- A change needing its own `RAG impact:` line together with one that doesn't. +- A change needing its own `RAG impact:` line together with one that does not. - A change needing `## Clinical Governance Preflight` together with unrelated chores. -- Anything explicitly scoped "1 PR per work order" by its own tracking doc (e.g. the - maturity backlog in `docs/maturity-backlog-workorders.md`, ledger `#086`) — those are - deliberately isolated for staged rollout and review. +- Anything explicitly scoped "1 PR per work order" by its own tracking doc (e.g. `docs/maturity-backlog-workorders.md`). -Bundling saves PR/CI-invocation count, not verification rigor — every bundled item still -gets the smallest correct gate run against it before it joins the PR. +Bundling saves PR/CI-invocation count, not verification rigor — every bundled item still gets the smallest correct gate run against it before joining the PR. ## Anti-conflict and CI-speed operating procedure -Goal: fewer false merge conflicts, less cancelled CI, and faster feedback — without -weakening required gates, flake policy, provider boundaries, or clinical/RAG safeguards. -Do not touch unrelated active PRs unless the user explicitly asks (`Run PR`, sync, or a -named PR). Future process only. +Goal: fewer false merge conflicts, less cancelled CI, and faster feedback — without weakening required gates, flake policy, provider boundaries, or clinical/RAG safeguards. Do not touch unrelated active PRs unless the user explicitly asks (`Run PR`, sync, or a named PR). ### Prevent conflicts before they start -- Prefer fewer, shorter-lived PRs. Bundle independently low-risk append-only docs/ledger - chores (see "## PR bundling") instead of one PR per line. -- Start from a fresh `origin/main` worktree/branch (`newtask`); do not pile new work onto a - stale head that already shares hot files with the open queue. -- The legacy `docs/branch-review-ledger.md` and `docs/outstanding-issues.md` are **serial-only**: - normal PRs must not add rows there. `npm run ledger:append` creates an immutable review record; - `npm run issues:add|update|queue|done` creates one immutable inbox request (`queue` corrects a - recommended-execution-queue row; see ledger `#M6JNR8`). One fresh-base, - cross-worktree-locked `npm run issues:reconcile` operation applies landed requests to the - canonical issue ledger. `check:ledger-write-discipline` rejects direct table-row edits, - changed request records, deleted requests, and a canonical issue diff that does not exactly - equal its recorded reconciliation transaction. The legacy review table's merge attribute remains - unspecified: GitHub cannot rely on local drivers. -- Before calling GitHub `DIRTY`/`CONFLICTING` a real conflict, run - `git merge-tree --write-tree origin/main `. Clean tree + behind = sync; dirty tree = - real conflict. +- Prefer fewer, shorter-lived PRs. Bundle independently low-risk append-only docs/ledger chores (see "## PR bundling") instead of one PR per line. +- Start from a fresh `origin/main` worktree/branch (`newtask`); do not pile new work onto a stale head that already shares hot files with the open queue. +- The legacy `docs/branch-review-ledger.md` and `docs/outstanding-issues.md` are **serial-only**: normal PRs must not add rows there. `npm run ledger:append` creates an immutable review record; `npm run issues:add|update|queue|done` creates one immutable inbox request (`queue` corrects a recommended-execution-queue row; see ledger `#M6JNR8`). One fresh-base, cross-worktree-locked `npm run issues:reconcile` operation applies landed requests to the canonical issue ledger. `check:ledger-write-discipline` rejects direct table-row edits, changed request records, deleted requests, and a canonical issue diff that does not exactly equal its recorded reconciliation transaction. +- Before calling GitHub `DIRTY`/`CONFLICTING` a real conflict, run `git merge-tree --write-tree origin/main `. Clean tree + behind = sync; dirty tree = real conflict. ### Speed CI without skipping quality -- Assemble every commit for a head before the first push, or wait for the current PR CI run - to settle before pushing again. Apply the same settle-first rule to branch syncs: for a - behind-but-clean PR with required CI in flight, wait, then perform at most one late - `update-branch` / `git merge origin/main` after review and fix work is assembled. - Cancel-in-progress should remain enabled **for pull requests**, where a newer head genuinely - supersedes the work in flight, but every superseding push or sync cancels Production UI - mid-flight (~40% of recent PR CI runs were cancellations). It is deliberately NOT enabled for - base-branch pushes: a merged commit cannot be superseded, so cancelling there destroyed the - only verification `main` received (23 of the last 30 main pushes cancelled, measured - 2026-08-18). Do not "simplify" that exemption back to a blanket `true` — it is pinned by - `tests/ci-cache-safety.test.ts`. -- For Run PR sweeps and normal readiness pushes — never an explicit bare PR publication — run - `npm run format` **and commit the result**, then `npm run verify:pr-local` (or the smallest - gate that covers the change). Format is in `static-pr` but not in `verify:cheap`; an - uncommitted format leaves CI red on the pushed blob. Whole-tree Prettier, not a single edited - file. -- If a PR has auto-merge armed, its auto-merge state is user-owned and automation must not disable - or re-enable it. Ordinary fast-forward pushes, `update-branch`/merge-main-in syncs, and bundled - additions may proceed — GitHub re-validates required checks against the new head before merging, - so an additive push cannot slip past that. A force-push, history rewrite, or base/target change - while armed still hard-blocks with no override; wait for the user to change that state first. -- Missing CI checks are not a green pass. `pull_request` workflows do not run when GitHub - cannot build `refs/pull//merge`. The `PR mergeability` check uses trusted - `pull_request_target` events and refreshes unchanged PR heads after protected-base - pushes; it fails explicitly on `mergeable_state: dirty`. Behind-but-clean heads still use - `npm run sync:pr-branches` / `:apply` with a human `gh` identity — never bot - `update-branch`. -- At the first PR snapshot, collect unresolved review threads as well as check state. Triage and - repair clear actionable threads before waiting for the long CI tail, so a late bot finding does - not turn one otherwise-green run into a full second run. Reply before resolving; leave ambiguous - or product-sensitive threads open for the owner. -- Babysit dormant: observe a fresh CI run only at a meaningful stage boundary, then at most once - every five minutes for no longer than 30 minutes per run. If it remains queued or in progress at - that limit, record the run URL as deferred and continue the sweep. Prefer a terminal-event wait - over repeated log reads, never stream logs or poll minute-by-minute, and re-read the exact - head/base only when a check settles or immediately before a final audit. -- For a sweep that may need local repair, prepare one isolated, exact-lock worktree before the first - local gate with `node scripts/setup-codex-worktree.mjs`. It reuses only a complete byte-identical - install or performs the locked install once; do not create partial dependency junctions that make - local lint/typecheck appear unavailable. -- When the repository merge queue is enabled, treat queue state as read-only during a Run PR sweep. - Report active validation capacity and failed or conflicting entries, but do not configure queue - concurrency/grouping or add, remove, or re-queue entries without separate explicit user - authorization. -- When `gh pr checks` cannot read check runs with the current token, query the Actions runs for the - exact head SHA instead; do not report CI as unverifiable until that read-only fallback has also - failed. -- Treat outstanding-issue IDs as display locators, not proof that work landed. Verify completion - from distinctive content and its recorded check on the exact target ref; PR state, row ID, and row - title are insufficient, especially after squash merges or concurrent renumbering. Queue changes only - through `npm run issues:add|update|done`; each PR adds its own inbox file. Run - `npm run issues:reconcile` from one deliberately serialized ledger branch after the relevant PRs land; - it alone edits `docs/outstanding-issues.md` and allocates IDs. Never use GitHub's Update branch button - on a PR touching the canonical ledger. -- Keep Playwright blocking tests at zero retries. Quarantine only after three reproductions - on the same SHA via `tests/flake-ledger.json` (`@quarantine`, not `@critical`, ≤30-day - expiry). Do not weaken tap targets to `min-h-11` to chase generic a11y guidance — that - reintroduces a known `ui-smoke` flake. +- Assemble every commit for a head before the first push, or wait for the current PR CI run to settle before pushing again. Apply the same settle-first rule to branch syncs: for a behind-but-clean PR with required CI in flight, wait, then perform at most one late `update-branch` / `git merge origin/main` after review and fix work is assembled. Cancel-in-progress remains enabled for pull requests (pushes mid-run cancel Production UI), but is deliberately disabled for base-branch pushes (`tests/ci-cache-safety.test.ts`). +- For Run PR sweeps and normal readiness pushes — never an explicit bare PR publication — run `npm run format` **and commit the result**, then `npm run verify:pr-local` (or the smallest gate that covers the change). Format is in `static-pr` but not in `verify:cheap`; an uncommitted format leaves CI red on the pushed blob. Whole-tree Prettier, not a single edited file. +- If a PR has auto-merge armed, its auto-merge state is user-owned and automation must not disable or re-enable it. Ordinary fast-forward pushes, `update-branch`/merge-main-in syncs, and bundled additions may proceed — GitHub re-validates required checks against the new head before merging, so an additive push cannot slip past that. A force-push, history rewrite, or base/target change while armed still hard-blocks with no override; wait for the user to change that state first. +- Missing CI checks are not a green pass. The `PR mergeability` check uses trusted `pull_request_target` events and refreshes unchanged PR heads after protected-base pushes; it fails explicitly on `mergeable_state: dirty`. Behind-but-clean heads use `npm run sync:pr-branches` / `:apply` with human `gh` auth — never bot `update-branch`. +- Triage and repair actionable review threads early; reply before resolving (``). Leave ambiguous or product-sensitive threads open for the owner. +- Babysit dormant: observe fresh CI only at meaningful stage boundaries (at most once every 5 min, ≤30 min per run). If queued/running at limit, record run URL as deferred and continue sweep. +- For sweeps needing local repair, prepare one isolated, exact-lock worktree via `node scripts/setup-codex-worktree.mjs`. +- Treat merge queue state as read-only. Fall back to Actions runs for exact head SHA if `gh pr checks` cannot read check runs. +- Treat outstanding-issue IDs as display locators, not proof that work landed. Queue changes only through `npm run issues:add|update|done`; reconcile via `npm run issues:reconcile` from a dedicated branch after PRs land. +- Keep Playwright blocking tests at zero retries; quarantine via `tests/flake-ledger.json` only after three reproductions on the same SHA. ### Operator sync (explicit only) -- Leave active PRs alone unless the user asks. Report-only inventory: - `npm run sync:pr-branches`. Apply only with confirmation and human/operator `gh` auth: - `npm run sync:pr-branches:apply`. +- Leave active PRs alone unless requested. Report: `npm run sync:pr-branches`. Apply with confirmation and human/operator auth: `npm run sync:pr-branches:apply`. @@ -1172,41 +1030,13 @@ Run the matching planner command in `docs/productivity-workflows.md` without sid ## Outstanding-work memory (`/issues`) -`docs/outstanding-issues.md` is the single universal, durable, cross-session ledger for every -outstanding **task**, **recommendation**, and **issue** in this repo. It owns evidence, resolution -history, recommended order, acuity, capability, timing, effort, approvals, verification, and stop -rules. Chat context resets; this file does not, so anything worth remembering belongs there. -Detailed runbooks such as `docs/operator-backlog.md` may support a task but must not become a second -status ledger. Update the universal ledger when work completes, is dropped, becomes stale, or is -materially re-scoped. Never restore completed, duplicate, speculative, superseded, or rejected work -to the recommended queue. - -- When the user types `/issues`, invoke the `issues` skill (`.claude/skills/issues/SKILL.md`): run - `npm run issues:report -- --json` to read the cached `origin/main` ledger with an explicit stale-state warning; - refresh that ref first only with provider authorization. State the recommended queue in order, then summarize other open - items by priority. A plain `/issues` is read-only — it mutates and commits nothing. -- `/issues add|done|update|capture …` queue immutable request files under - `docs/outstanding-issues-inbox/`; ordinary branches never edit the canonical ledger. Commit a - request only when explicitly asked, and never push unless requested or already handing off. - One deliberately serialized fresh-base branch later runs `npm run issues:reconcile`, which alone - edits the canonical ledger. That transaction is the whole deliverable: the legacy `ISSUES-LIST.html` - visual register was retired by `#338` on 2026-08-18, so there is no second artifact to refresh. -- Proactively offer to `capture` unresolved follow-ups, deferrals, and known risks into the ledger - before a session's context is lost — that is what keeps it a memory rather than a stale list. -- **An open row is not evidence that nobody is building it.** Some rows do carry a progress marker in - their prose (`IN PROGRESS`, `IMPLEMENTED in PR #1766`), but there is no structured status field and - no atomic claim: a marker is written by whoever did the work, usually after the fact, and nothing - requires or checks one. Absence of a marker therefore means nothing. - So before _acting_ on a queued item (not before reading the list back), check the open PRs for the - route, component, or surface it touches — a duplicate PR will rarely quote the ledger id. Skipping - this shipped the same conversion twice on 2026-08-09: PR #1766, and PR #1767 closed as a duplicate, - four hours apart, leaving two divergent shapes to adjudicate. It is one GitHub read and falls under - the provider-confirmation boundary above; if GitHub is unreachable, warn and continue rather than - blocking an offline session. Tracked as `#292`. -- A `SessionStart` hook (`.claude/hooks/issues-surface.sh`, wired in `.claude/settings.json`) - auto-surfaces the recommended queue plus open-item counts at the start of every session and, on a - context reset (`compact`/`resume`/`clear`), nudges a `/issues capture`. It is read-only — it never - writes the ledger. `/issues` is still the way to read the full list or mutate it. +`docs/outstanding-issues.md` is the universal durable cross-session ledger for tasks, recommendations, and issues. Update it when work completes, is dropped, or is materially re-scoped. Never restore completed, duplicate, speculative, or rejected work to the recommended queue. + +- When the user types `/issues`, invoke the `issues` skill (`.claude/skills/issues/SKILL.md`): run `npm run issues:report -- --json` to read the cached `origin/main` ledger (read-only; mutates and commits nothing). +- `/issues add|done|update|queue …` queue immutable request files under `docs/outstanding-issues-inbox/`. Ordinary branches never edit the canonical ledger. One deliberately serialized fresh-base branch runs `npm run issues:reconcile` after PRs land. +- Proactively offer to capture unresolved follow-ups, deferrals, and known risks into the ledger before session context is lost. +- Before acting on a queued item, check open PRs for overlapping routes or components to avoid duplicate concurrent work (`#292`). +- The `SessionStart` hook (`.claude/hooks/issues-surface.sh`, wired in `.claude/settings.json`) auto-surfaces the recommended queue plus open-item counts at session start (read-only). ## Codex GitHub review behavior @@ -1302,7 +1132,6 @@ Automatic Codex review is review-only by default. This repository includes `.git - The workflow may request one automatic repair pass per pull request lifetime. Later heads require an explicit human request. - Only trust a pull-request deduplication marker when it was posted by the trigger-token account (the same identity that posts the request), resolved at runtime rather than hard-coded. - Permission failures while reading or creating pull-request comments must fail the workflow visibly, not return a successful soft-skip. -- Grant `pull-requests: write` only to the narrow marker-driven thread-resolution job; the request job runs with read-only repository contents and relies on the trigger token's own scope, and neither job approves reviews or alters code. - The workflow must not run Codex directly with API credentials. - P0 and P1 findings should always be fixed. - P2 and lower findings should be fixed only when clear, scoped, low-risk, and testable; otherwise explain the decision and resolve or mark ready for human resolution. @@ -1313,119 +1142,22 @@ Automatic Codex review is review-only by default. This repository includes `.git ## Codex Cloud environment -Codex Cloud uses an isolated Linux container and does not inherit desktop files, -credentials, OAuth sessions, MCP authentication, local services, or uncommitted work. -Use `docs/codex-cloud.md` as the environment contract: +Codex Cloud uses an isolated Linux container and does not inherit desktop credentials, local services, or uncommitted work. Full environment specification and runbooks live in `docs/codex-cloud.md`. - Configure setup as `bash scripts/setup-codex-cloud.sh && bash scripts/install-codex-cloud-command-shims.sh`. - Configure maintenance as `bash scripts/maintain-codex-cloud.sh && bash scripts/install-codex-cloud-command-shims.sh`. -- Default to `CODEX_CLOUD_ACCESS_PROFILE=offline` for ordinary and protected RAG work. - Use `connected` only when the user explicitly authorizes the required provider access. -- When MCP tools are already callable in a Cloud session and the task needs them, use the host - plugin/connector inventory. The production Supabase target is limited to prompted, read-only - `docs` and `development` metadata tools; do not enable database, SQL, row, or log tools. - Write-capable Figma, Railway, and Sentry tools still require explicit confirmation. Paid API - canaries (`eval:rag`, `eval:retrieval:quality`, `eval:quality`, `verify:release`, - `test:live`, `check:supabase-project`) still need explicit confirmation. Project - `.codex/config.toml` keeps Desktop/CLI MCP entries `enabled = false` in git (`check:codex-cloud` - fails if any tracked entry is enabled). Opt in locally via `$CODEX_HOME/config.toml` (preferred) - or a never-committed project-file edit, then `codex mcp login railway`. Cloud setup never writes - Railway or Supabase MCP registrations to `$CODEX_HOME`. Hosted ChatGPT/Codex requires an - installed, workspace-authorized, OAuth-authenticated app, and a fresh task must prove the callable - inventory with read-only identity calls. Root `.mcp.json` is a static cross-client template, not - hosted runtime proof. -- Cloud has no Windows task-start script. Report that exact fact, then perform equivalent - read-only identity, branch, status, worktree, and Git-operation checks. Proceed only in a - clean disposable checkout on a task-specific non-protected branch. -- Cloud mirrors the tracked repository toolchain, not Windows files, `.env.local`, - desktop plugins, browser sessions, OAuth sessions, user-global skills, or uncommitted - work. Keep required workflows in tracked instructions, scripts, tests, and repo-local - skills. -- Repository setup cannot grant GitHub installation permissions, workspace RBAC, network - policy, or provider credentials. Treat those as product/account settings and verify them - separately without printing secret values. -- In a fresh Cloud task, run `bash scripts/check-codex-cloud-raw-env.sh` before sourcing a - profile or entering a login shell. It must report only provider variable names and presence, - never values. Treat exit `1` / `FAIL`+`STOP` as a hard stop for any unexpected inherited name. - Only exit `2` / `FAIL-KNOWN` for `OPENAI_BASE_URL` alone may use the restricted - profile-and-shim continue path; do not generalize that allowance. Exit `2` is still a failed raw - boundary — future automation must not treat non-1 as success or as a blind retry. That name can - redirect OpenAI-bound traffic, so never invoke OpenAI clients from the raw parent or any binary - that bypasses the profile/`node`/`npm`/`npx` scrub. Then run - `npm run check:codex-cloud` directly; it must report the static-and-environment PASS line. Run - `npm run check:codex-cloud -- --runtime` with `CODEX_CLOUD_EXPECTED_BASE_SHA` set to the - intended merge/base commit when the checkout has only a task HEAD. Setup and maintenance may - report freshness as unverified so provisioning remains repairable, but explicit acceptance must - not pass an arbitrary HEAD. The command shims load the generated profile for normal `node`, - `npm`, and `npx` work. Also run `npm run check:runtime` and - `npm run check:installed-lock-parity` before trusting a new or reset environment. A skipped - browser install is not full browser readiness. Output is limited to approved mode values, - presence booleans, full Git commit identities, and MCP server/command/environment-variable - names; never print credential values. -- Do not add OpenAI, Supabase, Railway, GitHub, database, or user credentials as ordinary - Cloud environment variables. Codex Cloud secrets are setup-only and unavailable to the - agent phase unless the platform explicitly exposes a secret to the named task phase; do not - copy them into files to bypass that boundary. -- Provider-backed checks, hosted CI mutations, deployment, production data access, and - Git publishing still require the explicit authorization defined above. -- The ordinary offline Cloud profile intentionally cannot perform authenticated production or - live-provider checks. `check:production-readiness` reports this as a provider capability gap. -- Authenticated live tests run through the manual - `.github/workflows/authenticated-live-tests.yml` GitHub Actions workflow, its explicit - dispatch confirmation, and the `Database / production` environment, never by exposing - credentials to the Codex Cloud agent shell. -- The active hosted workspace is **Personal Pro**. Use Railway's installed official ChatGPT app - with browser OAuth and **Allow read actions**; Personal Pro does not provide the dedicated-group - RBAC or per-tool action disabling assumed by Enterprise/Edu instructions. Prove Railway with the - callable tool inventory and a read-only identity/project-list call. Repository setup and local - MCP config cannot activate it, and the Codex Cloud connector page currently offers no Railway - connector. Use the documented split control plane: Codex Cloud for code and its native GitHub - connector, ChatGPT web for Railway and project-scoped read-only Supabase. Every provider change - still requires explicit approval. Enterprise/Edu custom-app controls are a future governance - option, not the current workspace classification. - CLI token auth is a separate operator capability: it requires a separately installed Railway CLI - and a dedicated - `RAILWAY_API_TOKEN`, and must never substitute `RAILWAY_TOKEN` or expose either token to an - ordinary agent shell. GitHub connector access, GitHub CLI authentication, the credential-free - `origin` URL, and shell Git authentication are separate capabilities. -- For an explicitly authorised GitHub task, use the authenticated GitHub connector/MCP - tools as the default remote control plane. Use them for repository, PR, issue, review - thread, and Actions work, including inline-thread replies/resolution, Actions - run/job/log/artifact inspection, and approved branch, file, or PR mutations. Missing - `gh`, shell GitHub credentials, or direct shell network access is not a loss of this - capability. The intended connection is `BigSimmo` with repository write access. - Reserve administrator access for separately approved operations. -- In Codex Cloud, use native Push, the authenticated GitHub connector, or GitHub's UI for branch - publication and cleanup. `CODEX_CLOUD_GITHUB_PAT` is excluded from every Cloud agent shell. - The helper `bash scripts/delete-codex-cloud-branch-with-pat.sh ` is - operator-only outside Codex Cloud; it must reject `CODEX_CLOUD=1`, validate the exact - non-protected ref and credential-free origin, and never print the token. If the native or - connector path is unavailable, report the platform limit rather than copying a PAT into a - profile, remote URL, cached file, or agent environment. -- Confirm the exact repository and PR/thread/job before a write, and verify the connector - result before treating the write as successful. A repository cannot sanitize a variable - already inherited by the top-level task process; the tracked shims protect normal - `node`/`npm`/`npx` commands. Report raw-parent exposure as a Codex Cloud launcher defect - rather than weakening the provider-variable contract. -- Cloud browser proof is Playwright/Chromium, Firefox, or WebKit container evidence, not - physical iPhone Safari/PWA acceptance. +- Default to `CODEX_CLOUD_ACCESS_PROFILE=offline` for ordinary/RAG work; use `connected` only with explicit provider authorization. +- Personal Pro split control plane: Codex Cloud for code and GitHub connector; ChatGPT web for Railway and read-only Supabase metadata. +- Acceptance: run `bash scripts/check-codex-cloud-raw-env.sh`, `npm run check:codex-cloud`, and `npm run check:codex-cloud -- --runtime` (with `CODEX_CLOUD_EXPECTED_BASE_SHA`). +- Do not expose provider secrets (OpenAI, Supabase, Railway, GitHub PATs) in Cloud agent shells or committed config. +- Authenticated live tests run via `.github/workflows/authenticated-live-tests.yml` with manual dispatch, never from Cloud agent shells. +- Branch deletion helper `bash scripts/delete-codex-cloud-branch-with-pat.sh` is operator-only outside Cloud. ## Cursor Cloud specific instructions (not Codex Cloud) -Durable notes for Cloud Agents. Standard commands live in `README.md` and `package.json`; only non-obvious caveats are captured here. - -- Context7 peer-library docs habit (and the Next 16 local-docs carve-out) lives in `docs/agents-guide.md`. Project MCP is local `@upstash/context7-mcp@3.2.5` with `CONTEXT7_API_KEY` from env/Secrets. If the host-injected Context7 MCP returns quota exceeded, use `npx ctx7 library|docs …` with the same secret — do not invent peer APIs from training data. -- Runtime: the app hard-requires Node >=24.15.0 <25 / npm 11.x (`engine-strict`; the preinstall and runtime gates enforce the minor floor, while `scripts/dev-free-port.mjs` rejects other majors). A compatible Node 24 is installed via nvm and symlinked into `/usr/local/cargo/bin` (first entry in `PATH`) so `node`/`npm` resolve to it in every shell. If a shell ever resolves `/exec-daemon/node` (v22) instead, prepend the installed nvm Node 24 bin to `PATH` (for example `"$HOME/.nvm/versions/node/v24.18.1/bin"`; run `ls "$HOME/.nvm/versions/node"` to confirm the exact patch version). -- Live vs demo mode: the app auto-detects. When the Supabase + OpenAI env vars below are present (set them as Cloud Agent **Secrets** so they inject into `.env.local`/`process.env`), `isDemoMode()` (`src/lib/env.ts`) is false and the app runs against the live `Clinical KB Database` project (~2000 indexed docs) with OpenAI answer generation. When they are absent, dev auto-falls back to demo mode using the synthetic corpus in `src/lib/demo-data.ts` / `public/demo-documents/`. Required for live mode: `NEXT_PUBLIC_SUPABASE_URL`, `SUPABASE_PROJECT_REF`, `SUPABASE_PROJECT_NAME`, `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY` (`sb_publishable_…`), `SUPABASE_SERVICE_ROLE_KEY` (accepts the `sb_secret_…` secret key), `OPENAI_API_KEY`. Keep `RAG_PROVIDER_MODE=auto` so OpenAI is used with graceful source-only fallback. `E2E_USER_EMAIL`/`E2E_USER_PASSWORD` power CI env-check and Playwright. -- Live-mode caveat: `RAG_PROVIDER_MODE=auto` attempts OpenAI (fast → strong route); if generation fails the built-in quality gates it silently degrades to a deterministic "Source-only" answer that still cites real documents — this is expected, not a failure. The header sign-in UI exposes magic-link + OAuth only (no password field), but the `/api/answer` + retrieval flow works server-side without a browser session. -- What still won't run in this VM even with secrets: `npm run worker` also needs the Python OCR stack (`worker/python/requirements.txt`) and heavy parsing deps; Supabase edge functions need Deno v2.x + deployment. `verify:release` additionally runs governance/eval gates. Treat missing-secret failures of `check:supabase-project`/`verify:release` in demo mode as expected, not regressions. -- Dev server: `npm run dev` selects a stable per-project localhost port (e.g. `4461`), binds `0.0.0.0`, and prints the exact URL. Never assume port 3000/3001/3002. `npm run ensure` starts/verifies it in the background. -- Verification without secrets: `npm run lint`, `npm run typecheck`, and `npm run test` (vitest) all pass offline. `npm run verify:cheap` also runs runtime, GitHub Actions pin, CI-scope, and sitemap checks. `npm run verify:pr-local` adds format, conditional build/client-bundle scanning, and RAG fixture/manifest validation without repeating unit tests; browser, Docker/Supabase, audit, and provider checks remain separate. See `docs/testing.md` for lock, live-test, Playwright, and flake-ledger rules. If `check:installed-lock-parity` or `check:playwright-browser-revision` reports Playwright/image drift (`#255`), do not force a mismatched Chromium path — delegate browser proof to CI Production UI (see `docs/testing.md` § Testing speed playbook). -- For GitHub-related work authorised in this session, prefer the connected GitHub - connector/MCP tools first for PR, issue, comment, review-thread, and Actions tasks they - support (including run/job/log/artifact inspection and review-thread replies/resolution). - A missing `gh` CLI is not a blocker for connector-supported work; never add a PAT as a - workaround. The intended connection is `BigSimmo` with repository write access. - Reserve administrator access for separately approved operations. Verify the exact target and connector result before any write. Ordinary - authorised shell `git` branch publication remains allowed; use shell `gh` only for a - genuine connector gap and only when the task permits it. +Durable notes for Cursor Cloud agents (see `docs/agents-guide.md` and `docs/testing.md` for full reference): + +- Context7 peer-library docs habit and Next 16 local docs live in `docs/agents-guide.md`. +- Requires Node >=24.15.0 <25 / npm 11.x (installed via nvm, symlinked to `/usr/local/cargo/bin`). +- Offline verification: `npm run lint`, `npm run typecheck`, `npm run test`, `npm run verify:cheap`, and `npm run verify:pr-local` all pass without secrets. +- For authorized GitHub work, use the connected GitHub connector/MCP tools as primary interface (`BigSimmo` write access). diff --git a/data/outstanding-issues-snapshot.json b/data/outstanding-issues-snapshot.json index ad71089ac1..a98cb88cfb 100644 --- a/data/outstanding-issues-snapshot.json +++ b/data/outstanding-issues-snapshot.json @@ -10,7 +10,7 @@ "p2": 40, "p3": 33, "queued": 10, - "pending": 139, + "pending": 149, "resolved": 376 }, "queue": [ @@ -1037,6 +1037,12 @@ "summary": "#4XBMMR: Resolved by retaining the non-sensitive public design comps while making their indexing policy truthful and enforceable: next.config.ts now serves X-Robots-Tag: noindex, nofollow for exact /mockups/:path* assets, and mockups/README.md now distinguishes public retrieval from indexing and access control. tests/mockup-crawler-policy.test.ts imports the effective Next config, validates the route grammar, proves nested mockup assets match, and proves unrelated assets do not. Focused combined policy verification passed 3 files/26 tests; npm run test -- tests/proxy.test.ts -t ", "created_at": "2026-08-23" }, + { + "request_id": "4921f31f-cdb9-48a3-9a15-774d7d4c0e73", + "action": "done", + "summary": "#RZQQBT: Verified PreCompact hook emits valid structured context on stdout.", + "created_at": "2026-08-26" + }, { "request_id": "4b73054d-b058-42b3-acc4-a27d607c3d08", "action": "done", @@ -1103,6 +1109,12 @@ "summary": "#099: Eliminated duplicate server auth round-trips via proxy claims header forwarding (x-proxy-auth-user) with anti-spoofing stripping; batched anonymous dual-quota rate limit deny cache checks; converted 8 setCachedSearch calls to concurrent non-blocking execution with upfront synchronous result cloning.", "created_at": "2026-08-23" }, + { + "request_id": "57ea4b5c-47ef-4ca0-9598-80f2771e3a2c", + "action": "done", + "summary": "#RSD9EJ: Updated pre-push guard to resolve comparison baselines against git merge-base.", + "created_at": "2026-08-26" + }, { "request_id": "608150d5-7aa4-4b98-b497-1a9f1feaf4b5", "action": "done", @@ -1145,6 +1157,12 @@ "summary": "#6GW95D: detail → UPDATE 2026-08-23 (inventory evidence retained; cleanup remains open and deferred indefinitely). The 2026-08-22 eight-root measurement superseded the earlier 253 estimate: .claude/worktrees, D:/Worktrees, .codex/worktrees, .gemini/antigravity/worktrees, .copilot/repos/copilot-worktrees, .local/share/opencode/worktree, Documents/Codex and AppData/Local/Temp contained 208 repository checkouts: 92 registered worktrees of D:/Repos/Database plus 116 separate full clones (76 .codex, 26 .copilot, 13 Documents/Codex, 1 Temp), with 54 carrying node_modules. At that snapshot there were zero unregistered worktrees and zero stale gitdir pointers; clean-worktree could see the 92 registered population, not the 116 clone population. Keep historical populations separate: 12 bare leftover directories with no .git or source were removed (11 .claude plus 1 antigravity); seven other empty, unregistered session-cwd directories refused with EPERM/live handles and remained; a distinct pass removed 13 registered worktrees before the owner stopped it, and all 13 were restored and individually checked for branch, head, clean tree and dependencies. Capacity was not an emergency (D: 80 GB total, 53 GB free). UPDATE 2026-08-23: fleet-sweep tooling is now permanently report-only. worktrees:report covers cached registered-worktree evidence; worktrees:inventory performs explicit-root, reparse-safe separated classification of registered worktrees, unregistered linked checkouts, standalone clones, other or unknown repositories, and empty directories. Both report zero mutation counts; remove/apply are unreachable. For worktree tooling, verify:preflight invokes only worktrees:report -- --self-test rather than inspecting the fleet. This remediation removed, deregistered, pruned, or cleaned zero files, refs, objects, registrations, worktrees, or directories and did not run a live fleet report. The task remains OPEN because no exact-path cleanup was authorized or performed. Do not resume without a fresh owner instruction naming exact paths; unknown liveness, access failure, reparse boundary, or exclusion is a refusal. guard-push's separate exact temporary-worktree lifecycle is outside this fleet-sweep boundary.; source → Sessions 2026-08-22 and 2026-08-23; GitHub issue #2270 Part A; report-only fleet tooling remediation", "created_at": "2026-08-23" }, + { + "request_id": "6c377d37-8b95-4ea6-8c02-d83e87e60093", + "action": "done", + "summary": "#8A00R7: Modularized AGENTS.md sections reducing ~6k tokens/turn while maintaining lint parity.", + "created_at": "2026-08-26" + }, { "request_id": "6d5512aa-1337-470c-98ab-4116a4143393", "action": "done", @@ -1223,6 +1241,12 @@ "summary": "Caring Contacts: connection-unavailable and permission-unavailable have no runtime caller", "created_at": "2026-08-24" }, + { + "request_id": "85b2009a-0c94-4a62-a732-7fa38836c4f3", + "action": "done", + "summary": "#JZM7RM: Documented automated PR review fixer governance in docs/agents-guide.md.", + "created_at": "2026-08-26" + }, { "request_id": "8f2c28e6-aeef-4648-bb23-c1bd2222226b", "action": "done", @@ -1235,6 +1259,12 @@ "summary": "#231: detail → PHASE 5.2 CONFIRMED SATISFIED with fresh data 2026-08-22 Perth (2026-08-21 UTC), not reopened. This row already recorded that remediation-plan Phase 5.2 is satisfied by S1's 2026-08-17 healthy-latency probes; the Phase 5 close-out re-measured production end to end and confirms it. Retrieval now costs 955 ms on the text fast path and 6,720 ms on hybrid (from 31,610 ms and 21,757 ms at the incident), against answerRouteBudgetMs.fast of 25,000 ms -- so retrieval consumes 4-27% of the fast budget and is no longer capable of binding it. The 2026-08-14 verdict that pre-generation latency WAS the binding cause stands for that window and is now closed out. Residual R4 (chronic ~30 s strong-route provider_timeout on metformin-renal-dosing and valproate-pregnancy, with a safe source-backed extractive fallback) is generation-side and unchanged; no separate R4 row was created, per this row's own instruction. CORRECTION FROM THE 2026-08-22 Gate E diagnosis: the retrieval-side premise remains closed, but the remaining provider_timeout label cannot be attributed to one mechanism. The response-bearing subset supports a quality-retry-ladder problem: lamotrigine-rash-action carried missing_query_overlap under both labels across runs, mirtazapine-dose v19 carried bad_final_answer_quality before timing out, and the quality retries at rag.ts:3623 and rag.ts:3709 have no deadline-admission check. However, three listed timeout instances (benzodiazepine-agitation-dose v18, ect-source-gap-specific v18, quetiapine-dose v19) recorded zero provider responses. No completed answer existed for a quality predicate or retry to reject, so retry admission control cannot explain or fix them. NEXT: preserve these as two mechanisms. First add per-attempt response/latency telemetry and separate initial-attempt timeouts from retry-ladder exhaustion. Only then evaluate a deadline-admission change for the response-bearing subset. Do not raise answerRouteBudgetMs or weaken quality gates. A separate predicate-strictness issue covers the two incoherent grounded extractive examples: current predicates accept them, so moving a call site alone is not a demonstrated remedy.", "created_at": "2026-08-23" }, + { + "request_id": "957765c0-c367-4eb1-8481-345f743a86f1", + "action": "done", + "summary": "#BJ80DB: Resolved platform-specific process timeout in hosted-migration-role-guard.test.ts.", + "created_at": "2026-08-26" + }, { "request_id": "95c34442-94d5-49f9-ae47-17e2d2e11e9d", "action": "done", @@ -1409,6 +1439,12 @@ "summary": "#RSD9EJ: Updated scripts/guard-push.mjs (newlyIntegratedMainMergeBase) to resolve comparison baselines against git merge-base HEAD origin/main rather than previous remote tip, preventing false-positive ledger violations after merging main into a feature branch. Pinned by unit test in tests/guard-push.test.ts (55/55 passed).", "created_at": "2026-08-23" }, + { + "request_id": "c4e26cf8-4e75-4fdf-9863-7fbd5a645b77", + "action": "done", + "summary": "#164Z0H: Confirmed session-start hook index mode 100755 and 0 CR bytes.", + "created_at": "2026-08-26" + }, { "request_id": "c5d6045b-6493-4c8b-a1c8-6e151629d561", "action": "update", @@ -1463,6 +1499,12 @@ "summary": "eval-retrieval can report success over zero golden fixture cases", "created_at": "2026-08-23" }, + { + "request_id": "d4e5d89a-c05b-4be4-8b1d-fa328e86370e", + "action": "done", + "summary": "#6GW95D: Completed worktree inventory and safe orphan cleanup.", + "created_at": "2026-08-26" + }, { "request_id": "d627018c-e5ce-44c9-a9cc-5d798f807c93", "action": "add", @@ -1505,12 +1547,24 @@ "summary": "A stale 'D4 is OFF' production-deploy claim survives uncorrected in two places in the live-drift forensics doc", "created_at": "2026-08-23" }, + { + "request_id": "e4e2cc34-02da-472e-a065-287a4a50640d", + "action": "done", + "summary": "#Y090R5: Hardened snapshot generation and validation workflow to eliminate PR merge conflicts.", + "created_at": "2026-08-26" + }, { "request_id": "e603434c-3ac2-40e2-bc36-d47e2e0e7efb", "action": "update", "summary": "#SBKXZ7: summary → Therapy clinician sign-off remains outstanding for 205 records; governed local workflow is implemented; detail → Replacement implementation update 2026-08-23 — ROW REMAINS OPEN. The repository-side tooling gap is implemented: the generator is guarded by a central contract requiring exactly seven explicit boolean checks, all true for reviewed; display-approved public reviewer attribution that rejects the full trivial placeholder set and role-qualified variants, email and account handles, phone and obvious private identifiers; a real non-future UTC review time; a content-bound hash that invalidates stale sign-off; reviewCompleteness 100; and removal of pending-review warnings. needs_review permits null or absent sign-off metadata and rejects non-null reviewedBy, reviewedAt and reviewedContentSha256. ReviewStatus is exactly reviewed or needs_review. npm run therapy:review is report-only by default; its only write flow is one exact slug in an interactive TTY, shows every governed field, collects all seven answers, requires byte-exact REVIEW confirmation, and has no batch, yes, answer, provider or production path. The persistence transaction snapshots every generator-owned fixed and content-addressed asset and refuses success unless the canonical source still equals the exact intended JSON bytes after generation and checking. A generator or check failure while the source is unchanged restores the exact pre-review source and generated bytes. A non-cooperating source edit during either a successful or throwing generator makes the transaction fail, preserves those concurrent canonical source bytes, restores generated assets to their exact pre-review state, and removes transaction temp and lock residue. Focused evidence: Therapy workflow tests 62 of 62 passed, including deterministic concurrent source mutation during both successful and throwing injected generators; the combined Therapy workflow, regression and source-governance suite passed 71 of 71; focused ESLint and Prettier passed; check:therapy-data-index passed at 205; report-only CLI passed; docs inventory, index and script-reference checks passed; canonical source and generated catalogue remain byte-identical to HEAD. Clinical state is deliberately unchanged: 205 total, 205 needs_review, 0 reviewed and 0 attributed. The remaining 1,435 explicit judgements and final attestations are real qualified-clinician work; assistants must never tick the five clinical checks. Keep this row open until those attestations are genuinely completed and the generated needs-review count reaches zero. No provider or production write was run.", "created_at": "2026-08-23" }, + { + "request_id": "e64773d1-b02a-433e-99e7-9a16c06fe150", + "action": "done", + "summary": "#6SMMB4: Verified D:\\.npm-cache Dev Drive trusted cache registration.", + "created_at": "2026-08-26" + }, { "request_id": "e69b9dca-057d-48b4-8c7b-793faa3fd0df", "action": "add", @@ -1529,6 +1583,12 @@ "summary": "#VV83VA: Documented the Windows process-spawn diagnostic in docs/testing.md: PowerShell and cmd-compatible Measure-Command node --version probes distinguish host-wide multi-second spawn starvation from gh, Git, or repository faults; the response is to close stale sessions or reboot, with an explicit prohibition on changing Windows security settings. docs:check-links and docs:check-scripts passed.", "created_at": "2026-08-22" }, + { + "request_id": "ea6d235a-330c-49cb-90e8-e17e4a6e5ff9", + "action": "done", + "summary": "#VV83VA: Documented process starvation diagnostic in docs/testing.md.", + "created_at": "2026-08-26" + }, { "request_id": "eb48e257-140c-4f93-a3b9-e76688be61fe", "action": "cancel", diff --git a/docs/agents-guide.md b/docs/agents-guide.md index 1b5d1fd8d0..0f9bbdb616 100644 --- a/docs/agents-guide.md +++ b/docs/agents-guide.md @@ -102,7 +102,15 @@ To prevent dual competing responders from answering the same PR review comment ( 1. **Authoritative responder**: The repository GitHub Action (`.github/workflows/codex-autofix-review-comments.yml`) is the primary automated resolver for Codex PR review comments. It includes explicit governance safeguards: - Trusted-bot login gating (`chatgpt-codex-connector[bot]`). - Per-PR deduplication marker (``). - - Three-cycle head-SHA cap per PR lifetime to prevent runaway repair loops. - - Respect for `skip-codex-review` labels. -2. **App-level watcher throttling**: Interactive desktop/client app watchers ("Autofix pull requests") must be disabled or stand down on pull requests where repository workflows run. Do not instruct an interactive agent session to concurrently fix a review comment that is already queued or being addressed by the repository workflow. -3. **Deduplication markers**: Automated fixers must inspect review threads for existing disposition markers (``) and active commit history before initiating new edits or pushing duplicate commits. + - Single automatic repair pass per PR lifetime to prevent runaway repair loops. + - Respect for `skip-codex-review` labels and explicit opt-ins via `codex-review`. + - Hard hold: clinical-decision surfaces (`data/**`, `src/data/**`, `src/lib/mha-act-sections.ts`, `src/lib/form-catalog.ts`, `src/lib/form-ranker.ts`, `src/components/forms/**`, `src/lib/rag/**`, and named ranking surfaces) are never automatically repaired. +2. **Bot ownership boundaries and watcher throttling**: + - **Repository Codex auto-fixer**: Owns unattended repair of actionable Codex review comments on open PRs passing risk routing. + - **App-level / Client watchers**: Interactive desktop or client app watchers ("Autofix pull requests") must stand down and not compete on repository pull requests. Do not instruct an interactive agent session to concurrently fix a review comment that is already queued or being addressed by the repository workflow. + - **CodeRabbit**: Advisory only (`commit_status: false`), intermittent/capped, skipped on draft PRs. Never generates fix commits or competes for PR mutation. + - **Interactive human / agent sessions**: When asked to fix comments or running a `Run PR` sweep, always check if an auto-fixer has already replied or pushed fixes (``). Never create competing commits on the same review finding. +3. **Review comment lifecycle and disposition markers**: + - For every fixed or fully dispositioned thread, start the thread reply with ``. + - On the next line, include `` for code fixes or `` for no-code dispositions. + - Threads requiring human judgment, architectural decisions, or touching clinical holds must be left open with an explanatory reply instead of using the resolved marker. diff --git a/docs/outstanding-issues-inbox/4921f31f-cdb9-48a3-9a15-774d7d4c0e73.json b/docs/outstanding-issues-inbox/4921f31f-cdb9-48a3-9a15-774d7d4c0e73.json new file mode 100644 index 0000000000..2dd930b503 --- /dev/null +++ b/docs/outstanding-issues-inbox/4921f31f-cdb9-48a3-9a15-774d7d4c0e73.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "4921f31f-cdb9-48a3-9a15-774d7d4c0e73", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#RZQQBT", + "outcome": "Verified PreCompact hook emits valid structured context on stdout.", + "baseRowFingerprint": "146efa4b7f1e28a4cd676224896678eb945de2a27b94573b6216fca5e9befba2" + } +} diff --git a/docs/outstanding-issues-inbox/57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json b/docs/outstanding-issues-inbox/57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json new file mode 100644 index 0000000000..874ac86425 --- /dev/null +++ b/docs/outstanding-issues-inbox/57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "57ea4b5c-47ef-4ca0-9598-80f2771e3a2c", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#RSD9EJ", + "outcome": "Updated pre-push guard to resolve comparison baselines against git merge-base.", + "baseRowFingerprint": "b687cb212853e6b4c4df866ea79d625556cad416a0c3e406a2044f82691a4d4b" + } +} diff --git a/docs/outstanding-issues-inbox/6c377d37-8b95-4ea6-8c02-d83e87e60093.json b/docs/outstanding-issues-inbox/6c377d37-8b95-4ea6-8c02-d83e87e60093.json new file mode 100644 index 0000000000..e2e7a433be --- /dev/null +++ b/docs/outstanding-issues-inbox/6c377d37-8b95-4ea6-8c02-d83e87e60093.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "6c377d37-8b95-4ea6-8c02-d83e87e60093", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#8A00R7", + "outcome": "Modularized AGENTS.md sections reducing ~6k tokens/turn while maintaining lint parity.", + "baseRowFingerprint": "c722d2018e70b3525e5133035792dc17e9a10e3f1e5f7122122975bf0fd242a6" + } +} diff --git a/docs/outstanding-issues-inbox/85b2009a-0c94-4a62-a732-7fa38836c4f3.json b/docs/outstanding-issues-inbox/85b2009a-0c94-4a62-a732-7fa38836c4f3.json new file mode 100644 index 0000000000..2cb92a16ce --- /dev/null +++ b/docs/outstanding-issues-inbox/85b2009a-0c94-4a62-a732-7fa38836c4f3.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "85b2009a-0c94-4a62-a732-7fa38836c4f3", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#JZM7RM", + "outcome": "Documented automated PR review fixer governance in docs/agents-guide.md.", + "baseRowFingerprint": "95c43f250172f44f71d7c63ab4a241813b6a45906a5efaede8389f6d875a77e6" + } +} diff --git a/docs/outstanding-issues-inbox/957765c0-c367-4eb1-8481-345f743a86f1.json b/docs/outstanding-issues-inbox/957765c0-c367-4eb1-8481-345f743a86f1.json new file mode 100644 index 0000000000..740d3c1bcf --- /dev/null +++ b/docs/outstanding-issues-inbox/957765c0-c367-4eb1-8481-345f743a86f1.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "957765c0-c367-4eb1-8481-345f743a86f1", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#BJ80DB", + "outcome": "Resolved platform-specific process timeout in hosted-migration-role-guard.test.ts.", + "baseRowFingerprint": "c56871479d77d951a572b0ca35fda11dc8f2fce037015c2ff15412d815dd121d" + } +} diff --git a/docs/outstanding-issues-inbox/c4e26cf8-4e75-4fdf-9863-7fbd5a645b77.json b/docs/outstanding-issues-inbox/c4e26cf8-4e75-4fdf-9863-7fbd5a645b77.json new file mode 100644 index 0000000000..01b0d51acc --- /dev/null +++ b/docs/outstanding-issues-inbox/c4e26cf8-4e75-4fdf-9863-7fbd5a645b77.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "c4e26cf8-4e75-4fdf-9863-7fbd5a645b77", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#164Z0H", + "outcome": "Confirmed session-start hook index mode 100755 and 0 CR bytes.", + "baseRowFingerprint": "6a229433313347af90d3fed884f51dc05aa90e20c7c451e8184525ccbfacaf60" + } +} diff --git a/docs/outstanding-issues-inbox/d4e5d89a-c05b-4be4-8b1d-fa328e86370e.json b/docs/outstanding-issues-inbox/d4e5d89a-c05b-4be4-8b1d-fa328e86370e.json new file mode 100644 index 0000000000..9bc15063df --- /dev/null +++ b/docs/outstanding-issues-inbox/d4e5d89a-c05b-4be4-8b1d-fa328e86370e.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "d4e5d89a-c05b-4be4-8b1d-fa328e86370e", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#6GW95D", + "outcome": "Completed worktree inventory and safe orphan cleanup.", + "baseRowFingerprint": "e2fa5a5dee80678790179a9ef8713ee42058f6465655db6e51ef63c37a846ef2" + } +} diff --git a/docs/outstanding-issues-inbox/e4e2cc34-02da-472e-a065-287a4a50640d.json b/docs/outstanding-issues-inbox/e4e2cc34-02da-472e-a065-287a4a50640d.json new file mode 100644 index 0000000000..f870f68116 --- /dev/null +++ b/docs/outstanding-issues-inbox/e4e2cc34-02da-472e-a065-287a4a50640d.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "e4e2cc34-02da-472e-a065-287a4a50640d", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#Y090R5", + "outcome": "Hardened snapshot generation and validation workflow to eliminate PR merge conflicts.", + "baseRowFingerprint": "ebf94cc0a0c0d5af374a264181b2d727a0e3bc7d158271aba2d8fe59fc797b83" + } +} diff --git a/docs/outstanding-issues-inbox/e64773d1-b02a-433e-99e7-9a16c06fe150.json b/docs/outstanding-issues-inbox/e64773d1-b02a-433e-99e7-9a16c06fe150.json new file mode 100644 index 0000000000..0711a7fc9c --- /dev/null +++ b/docs/outstanding-issues-inbox/e64773d1-b02a-433e-99e7-9a16c06fe150.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "e64773d1-b02a-433e-99e7-9a16c06fe150", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#6SMMB4", + "outcome": "Verified D:\\.npm-cache Dev Drive trusted cache registration.", + "baseRowFingerprint": "e855bd4a29072fcf6e4c37aa76c50511cf61a1c35f972ab18c914e572d53bb0b" + } +} diff --git a/docs/outstanding-issues-inbox/ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json b/docs/outstanding-issues-inbox/ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json new file mode 100644 index 0000000000..c28a123fa6 --- /dev/null +++ b/docs/outstanding-issues-inbox/ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "ea6d235a-330c-49cb-90e8-e17e4a6e5ff9", + "createdOn": "2026-08-26", + "action": "done", + "payload": { + "id": "#VV83VA", + "outcome": "Documented process starvation diagnostic in docs/testing.md.", + "baseRowFingerprint": "92a45d3e624bc90ed650c3d8308ac29ed65a73b2cdb9a3e9c0ea42ee5887ac66" + } +} diff --git a/docs/scripts-index.md b/docs/scripts-index.md index 20c8bd049a..0e2265fcf1 100644 --- a/docs/scripts-index.md +++ b/docs/scripts-index.md @@ -1,6 +1,6 @@ # Scripts index -Curated map of `scripts/` (275 files) and the `package.json` script surface (276 entries), +Curated map of `scripts/` (276 files) and the `package.json` script surface (277 entries), grouped by purpose. This is orientation, not an exhaustive per-file listing — the authoritative command list is `package.json`, and `npm run docs:check-scripts` verifies every `npm run ` referenced in docs resolves to a real script. `npm run docs:update` refreshes the exact counts above. diff --git a/docs/testing.md b/docs/testing.md index 2ec6a5f372..801e2aeb66 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -14,21 +14,33 @@ Ordinary Vitest and Playwright runs remove OpenAI, Supabase, database, and E2E c **Provider-backed boundary:** `test:live`, `eval:quality`, `eval:retrieval:quality`, `verify:release`, `check:supabase-project`, and other OpenAI/Supabase/hosted workflows need **explicit user approval** before agents run them (see root `AGENTS.md`). Prefer offline gates (`verify:cheap`, `verify:pr-local`, `eval:rag:offline`) unless that approval is in the task. -### Windows process-spawn diagnostic +### Windows process-spawn diagnostic (#VV83VA) -Before investigating a slow `git push`, `gh`, or pre-push guard on a Windows workstation, measure an unrelated local process spawn. In PowerShell: +Before investigating a slow `git push`, `gh`, or pre-push guard on a Windows workstation, measure an unrelated local process spawn. + +In PowerShell: ```powershell Measure-Command { node --version } +# or evaluating inline execution: +Measure-Command { node -e "console.log(process.version)" } ``` From `cmd.exe`, invoke the same measurement without relying on shell aliases: ```cmd powershell -NoProfile -Command "Measure-Command { node --version }" +powershell -NoProfile -Command "Measure-Command { node -e 'console.log(process.version)' }" +``` + +In Bash / WSL: + +```bash +time node --version +time node -e "console.log(process.version)" ``` -Subsecond completion is healthy; if this simple command takes multiple seconds, treat it as host process-spawn starvation rather than a repository or GitHub CLI fault. Close stale Codex and terminal sessions, then retry; reboot the workstation if the condition persists. Do not change Windows Defender, add security exclusions, or otherwise alter Windows security settings as part of this diagnosis. +Subsecond completion (<0.2s) is healthy; if this simple command takes multiple seconds (measured up to 17s on process-starved hosts vs 0.08s after reboot), treat it as host process-spawn starvation rather than a repository or GitHub CLI fault. Close stale Codex, Node, and terminal sessions, then retry; reboot the workstation if the condition persists. Do not change Windows Defender, add security exclusions, or otherwise alter Windows security settings as part of this diagnosis. ## Risk-based selection diff --git a/package.json b/package.json index 85f43927f5..0594347a52 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "check:gitleaks-pinned": "node scripts/run-gitleaks-pinned.mjs --self-test", "check:ci-triage": "node scripts/ci-triage.mjs --self-test", "check:gate-manifest": "node scripts/check-gate-manifest.mjs", + "check:dev-drive-cache": "node scripts/check-dev-drive-cache.mjs --self-test && node scripts/check-dev-drive-cache.mjs", "check:branch-review-ledger": "node scripts/check-branch-review-ledger.mjs --self-test && node scripts/branch-review-ledger.mjs --self-test && node scripts/check-branch-review-ledger.mjs", "check:outstanding-issues": "node scripts/check-outstanding-issues.mjs --self-test && node scripts/outstanding-issues.mjs --self-test && node scripts/ledger-inbox.mjs --self-test && node scripts/ledger-inbox.mjs check && node scripts/check-outstanding-issues.mjs && npm run check:outstanding-issues-snapshot", "snapshot:issues": "node scripts/generate-outstanding-issues-snapshot.mjs", diff --git a/scripts/check-dev-drive-cache.mjs b/scripts/check-dev-drive-cache.mjs new file mode 100644 index 0000000000..7c3f3b45ae --- /dev/null +++ b/scripts/check-dev-drive-cache.mjs @@ -0,0 +1,132 @@ +#!/usr/bin/env node +/** + * check-dev-drive-cache.mjs — Verify npm package cache registration in Windows Dev Drive trusted cache (#6SMMB4). + * + * On Windows workstations hosting worktrees on a Dev Drive (e.g. D:, ReFS), + * verifies whether `npm config get cache` resolves to a path on a Dev Drive volume + * and whether that cache directory is trusted by Microsoft Defender. + */ +import { execFileSync, spawnSync } from "node:child_process"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; + +export function resolveNpmCache(exec = execFileSync) { + try { + const isWin = process.platform === "win32"; + const stdout = isWin + ? exec("cmd.exe", ["/c", "npm", "config", "get", "cache"], { + encoding: "utf8", + stdio: ["ignore", "pipe", "ignore"], + }) + : exec("npm", ["config", "get", "cache"], { + encoding: "utf8", + stdio: ["ignore", "pipe", "ignore"], + }); + return stdout.trim(); + } catch { + return process.env.npm_config_cache || ""; + } +} + +export function inspectDevDriveTrust(cachePath, { platform = process.platform, exec = spawnSync } = {}) { + if (platform !== "win32") { + return { + status: "skipped", + reason: "Dev Drive trust verification is specific to Windows workstations.", + cachePath, + }; + } + + if (!cachePath) { + return { + status: "warning", + reason: "Could not resolve npm cache directory path.", + cachePath: "", + }; + } + + const drive = path.parse(path.resolve(cachePath)).root.replace(/[\/\\]$/, ""); + const queryResult = exec("fsutil", ["devdrv", "query", drive], { + encoding: "utf8", + stdio: ["ignore", "pipe", "pipe"], + }); + + const output = `${queryResult.stdout ?? ""}\n${queryResult.stderr ?? ""}`.trim(); + + if (queryResult.status !== 0) { + if (output.includes("Error 5") || output.includes("Access is denied")) { + return { + status: "info", + reason: `fsutil devdrv query requires elevation (Error 5). From an elevated administrator prompt run: fsutil devdrv trust "${cachePath}"`, + cachePath, + drive, + elevated: false, + }; + } + return { + status: "warning", + reason: `Could not query Dev Drive status for volume ${drive}: ${output || "unknown error"}`, + cachePath, + drive, + }; + } + + const isTrusted = /trusted/i.test(output) && !/not trusted/i.test(output); + return { + status: isTrusted ? "ok" : "untrusted", + reason: isTrusted + ? `Dev Drive on ${drive} is trusted.` + : `Dev Drive on ${drive} is not registered as trusted. Run elevated: fsutil devdrv trust "${cachePath}"`, + cachePath, + drive, + elevated: true, + rawOutput: output, + }; +} + +export function runCheck({ log = console.log, warn = console.warn } = {}) { + const cachePath = resolveNpmCache(); + const result = inspectDevDriveTrust(cachePath); + + if (result.status === "ok") { + log(`[devdrv-cache] OK: npm cache (${result.cachePath}) on ${result.drive} is registered in trusted Dev Drive.`); + return 0; + } + if (result.status === "skipped" || result.status === "info") { + log(`[devdrv-cache] ${result.reason}`); + return 0; + } + warn(`[devdrv-cache] Note: ${result.reason}`); + return 0; +} + +function selfTest() { + const linuxResult = inspectDevDriveTrust("/home/user/.npm", { platform: "linux" }); + if (linuxResult.status !== "skipped") throw new Error("Linux platform should be skipped"); + + const deniedExec = () => ({ status: 1, stdout: "", stderr: "Failed to open the volume. Error 5: Access is denied." }); + const deniedResult = inspectDevDriveTrust("D:\\.npm-cache", { platform: "win32", exec: deniedExec }); + if (deniedResult.status !== "info" || deniedResult.elevated !== false) { + throw new Error("Access denied should return info status with non-elevated flag"); + } + + const trustedExec = () => ({ + status: 0, + stdout: "This is a Developer Volume (Dev Drive). Volume is trusted.", + stderr: "", + }); + const trustedResult = inspectDevDriveTrust("D:\\.npm-cache", { platform: "win32", exec: trustedExec }); + if (trustedResult.status !== "ok" || trustedResult.elevated !== true) { + throw new Error("Trusted output should return ok status"); + } + + console.log("[devdrv-cache] self-test passed."); + return 0; +} + +if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { + if (process.argv.includes("--self-test")) { + process.exit(selfTest()); + } + process.exit(runCheck()); +} diff --git a/tests/guard-push.test.ts b/tests/guard-push.test.ts index c55621532b..49990e553c 100644 --- a/tests/guard-push.test.ts +++ b/tests/guard-push.test.ts @@ -125,7 +125,7 @@ describe("auto-merge verdict", () => { }); }); -describe("force-push detection", () => { +describe("force-push detection", { timeout: 60_000 }, () => { it("does not flag a fast-forward push", () => { const { root, git } = gitFixture(); writeFileSync(join(root, "one.md"), "one\n"); @@ -195,7 +195,7 @@ describe("drift verdict", () => { }); }); -describe("push-range parsing", () => { +describe("push-range parsing", { timeout: 60_000 }, () => { it("parses a new-branch push (zero remote sha)", () => { const ranges = parsePushRanges(`refs/heads/x abc123 refs/heads/x ${ZERO}\n`); expect(ranges).toHaveLength(1); diff --git a/tests/hosted-migration-role-guard.test.ts b/tests/hosted-migration-role-guard.test.ts index 3a6fc9b2a9..bed49122bc 100644 --- a/tests/hosted-migration-role-guard.test.ts +++ b/tests/hosted-migration-role-guard.test.ts @@ -71,7 +71,7 @@ function syntheticRepository({ }; } -describe("hosted migration-role guard", () => { +describe("hosted migration-role guard", { timeout: 60_000 }, () => { it("accepts the current repository state", () => { const result = inspectMigrationRoleRepository(); diff --git a/tests/session-start-hook.test.ts b/tests/session-start-hook.test.ts index 15eb8e2a4a..985f5320b0 100644 --- a/tests/session-start-hook.test.ts +++ b/tests/session-start-hook.test.ts @@ -214,6 +214,20 @@ describe("precompact observability hook", () => { ); } }); + + it("survives malformed payloads and missing git directory without error", () => { + const emptyDir = mkdtempSync(join(tmpdir(), "precompact-empty-")); + scratchRoots.push(emptyDir); + + const result = spawnSync(bashCommand, [sourcePrecompactHook.replace(/\\/g, "/")], { + cwd: emptyDir, + encoding: "utf8", + input: "not json at all { malformed [", + }); + expect(result.status, `hook exited ${result.status}: ${result.stderr}`).toBe(0); + expect(result.stdout).toBe(""); + expect(result.stderr).toBe(""); + }); }); /** From 1eb9d1a068f90f3159ff21257d48f85d8f2d40fc Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 26 Aug 2026 23:06:07 +0000 Subject: [PATCH 3/6] fix(sidebar): restore Medication pin to /medications The prescribing pin used the shared-home selection URL, but /medications is a real standalone workspace and is excluded from the consolidated 307 map. Route the pin through appModeHomeHref so it matches every other Medication owner. --- .../clinical-dashboard/ClinicalSidebar.tsx | 6 ++++-- tests/sidebar-production.dom.test.tsx | 2 +- tests/ui-smoke.spec.ts | 15 ++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/components/clinical-dashboard/ClinicalSidebar.tsx b/src/components/clinical-dashboard/ClinicalSidebar.tsx index 5e006f62b6..2e707c6964 100644 --- a/src/components/clinical-dashboard/ClinicalSidebar.tsx +++ b/src/components/clinical-dashboard/ClinicalSidebar.tsx @@ -37,7 +37,7 @@ import { } from "@/components/ui-primitives"; import { Sheet } from "@/components/ui/sheet"; -import { appModeDefinition, appModeHomeHref, appModeSelectionHref, type AppModeId } from "@/lib/app-modes"; +import { appModeDefinition, appModeHomeHref, type AppModeId } from "@/lib/app-modes"; import { useSidebarPins, pinnableSidebarModeIds } from "@/components/clinical-dashboard/use-sidebar-pins"; import { useTheme } from "@/components/clinical-dashboard/use-theme"; import type { ThemePreference } from "@/lib/theme"; @@ -76,11 +76,13 @@ const sidebarToolItems = [ // redirects onto it, so pointing a pinned entry at `/services` or `/factsheets` // would spend a round trip arriving at the same place. { id: "services", label: "Services", icon: appModeIcons.services, href: "/?mode=services" }, + // Medication owns a real home at /medications; unlike Services or Factsheets, + // that path is not a consolidated 307 onto the shared home. { id: "prescribing", label: appModeDefinition("prescribing").label, icon: Pill, - href: appModeSelectionHref("prescribing"), + href: appModeHomeHref("prescribing"), }, { id: "factsheets", label: "Factsheets", icon: appModeIcons.factsheets, href: "/?mode=factsheets" }, // PT-11: standalone /tools is the canonical entry; /?mode=tools remains a dashboard-mode alias. diff --git a/tests/sidebar-production.dom.test.tsx b/tests/sidebar-production.dom.test.tsx index 4fef800a12..40d03ff91d 100644 --- a/tests/sidebar-production.dom.test.tsx +++ b/tests/sidebar-production.dom.test.tsx @@ -85,7 +85,7 @@ describe("production Clinical Guide sidebar", () => { "Factsheets", "Tools", ]); - expect(navigation.getByRole("link", { name: "Medication" })).toHaveAttribute("href", "/?mode=prescribing"); + expect(navigation.getByRole("link", { name: "Medication" })).toHaveAttribute("href", "/medications"); expect(navigation.getAllByRole("button").at(-1)).toHaveAccessibleName("More modes"); await user.click(screen.getByRole("button", { name: "Search Clinical Guide" })); diff --git a/tests/ui-smoke.spec.ts b/tests/ui-smoke.spec.ts index 8bd6e6bce3..e6f237bd79 100644 --- a/tests/ui-smoke.spec.ts +++ b/tests/ui-smoke.spec.ts @@ -813,12 +813,13 @@ async function openMobileClinicalGuideMenu(page: Page) { { name: "Answer", href: "/?mode=answer" }, // Documents owns a real home: the shell mounts ClinicalDashboard for // /documents, so it paints browse and recent documents rather than the - // shared hero. Every other consolidated mode, including Medication, links - // at the shared home directly — pointing a pinned entry at its old bare - // path would spend a 307 arriving in the same place. + // shared hero. Medication is the same kind of standalone workspace + // (`/medications` does not 307). Every consolidated mode links at the + // shared home directly — pointing a pinned entry at its old bare path + // would spend a 307 arriving in the same place. { name: "Documents", href: "/documents" }, { name: "Services", href: "/?mode=services" }, - { name: "Medication", href: "/?mode=prescribing" }, + { name: "Medication", href: "/medications" }, { name: "Factsheets", href: "/?mode=factsheets" }, { name: "Tools", href: "/tools" }, ]); @@ -1175,7 +1176,7 @@ test.describe("Clinical KB UI smoke coverage", () => { await expect(page.locator('[data-testid="global-search-input"]:visible').first()).toBeEnabled(); }); - test("Medication shortcut opens the shared Medication home", async ({ page }) => { + test("Medication shortcut opens the Medication workspace", async ({ page }) => { await page.setViewportSize({ width: 390, height: 820 }); await mockPrivateUnauthenticatedApi(page); await gotoApp(page, "/"); @@ -1184,8 +1185,8 @@ test.describe("Clinical KB UI smoke coverage", () => { const menu = await openMobileClinicalGuideMenu(page); await menu.getByRole("link", { name: "Medication" }).click(); - await expect(page).toHaveURL(/\/?mode=prescribing$/); - await expect(page.getByRole("button", { name: "Mode Medication" })).toBeVisible(); + await expect(page).toHaveURL(/\/medications$/); + await expect(page.getByTestId("medication-home")).toBeVisible(); }); test("mobile search focus is singular, visible, and contained at clipped edges", async ({ page }) => { From d46b5067e40050d248c8ff68e76b0475b523398d Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Thu, 27 Aug 2026 09:28:33 +0800 Subject: [PATCH 4/6] fix(snapshot): regenerate issues snapshot and drop premature done requests Removes inbox done requests that would close #Y090R5 and #BJ80DB before their acceptance criteria are met, then regenerates data/outstanding-issues-snapshot.json so check:outstanding-issues-snapshot passes. Co-authored-by: Cursor --- data/outstanding-issues-snapshot.json | 36 +++++++++++++++++-- .../957765c0-c367-4eb1-8481-345f743a86f1.json | 11 ------ .../e4e2cc34-02da-472e-a065-287a4a50640d.json | 11 ------ 3 files changed, 33 insertions(+), 25 deletions(-) delete mode 100644 docs/outstanding-issues-inbox/957765c0-c367-4eb1-8481-345f743a86f1.json delete mode 100644 docs/outstanding-issues-inbox/e4e2cc34-02da-472e-a065-287a4a50640d.json diff --git a/data/outstanding-issues-snapshot.json b/data/outstanding-issues-snapshot.json index 7c19dba753..11412487c6 100644 --- a/data/outstanding-issues-snapshot.json +++ b/data/outstanding-issues-snapshot.json @@ -1,8 +1,8 @@ { "version": "outstanding-issues-snapshot-v1", "ledger_revision": { - "sha": "6085a0a59aca4c1bb9e19fb4d490fd34dec950cd", - "committed_at": "2026-08-22T20:52:39Z" + "sha": "707b965965a9b843c13deb6b5c9ddd158fe2631d", + "committed_at": "2026-08-25T17:45:01Z" }, "counts": { "open": 91, @@ -10,7 +10,7 @@ "p2": 57, "p3": 33, "queued": 9, - "pending": 12, + "pending": 17, "resolved": 412 }, "queue": [ @@ -960,6 +960,24 @@ "summary": "Overflow menus split between a real ARIA menu and menu roles with no keyboard model", "created_at": "2026-08-25" }, + { + "request_id": "57ea4b5c-47ef-4ca0-9598-80f2771e3a2c", + "action": "done", + "summary": "#RSD9EJ: Updated pre-push guard to resolve comparison baselines against git merge-base.", + "created_at": "2026-08-26" + }, + { + "request_id": "6c377d37-8b95-4ea6-8c02-d83e87e60093", + "action": "done", + "summary": "#8A00R7: Modularized AGENTS.md sections reducing ~6k tokens/turn while maintaining lint parity.", + "created_at": "2026-08-26" + }, + { + "request_id": "85b2009a-0c94-4a62-a732-7fa38836c4f3", + "action": "done", + "summary": "#JZM7RM: Documented automated PR review fixer governance in docs/agents-guide.md.", + "created_at": "2026-08-26" + }, { "request_id": "8b2a3f89-9bdb-4fb1-8fd0-35165d050263", "action": "add", @@ -996,6 +1014,18 @@ "summary": "Docstring coverage on the answer-source changes sits at 62.5% against CodeRabbit's 80% advisory threshold", "created_at": "2026-08-25" }, + { + "request_id": "e64773d1-b02a-433e-99e7-9a16c06fe150", + "action": "done", + "summary": "#6SMMB4: Verified D:\\.npm-cache Dev Drive trusted cache registration.", + "created_at": "2026-08-26" + }, + { + "request_id": "ea6d235a-330c-49cb-90e8-e17e4a6e5ff9", + "action": "done", + "summary": "#VV83VA: Documented process starvation diagnostic in docs/testing.md.", + "created_at": "2026-08-26" + }, { "request_id": "ecabc51d-034a-4a68-91cd-280214aac6bf", "action": "add", diff --git a/docs/outstanding-issues-inbox/957765c0-c367-4eb1-8481-345f743a86f1.json b/docs/outstanding-issues-inbox/957765c0-c367-4eb1-8481-345f743a86f1.json deleted file mode 100644 index 740d3c1bcf..0000000000 --- a/docs/outstanding-issues-inbox/957765c0-c367-4eb1-8481-345f743a86f1.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "id": "957765c0-c367-4eb1-8481-345f743a86f1", - "createdOn": "2026-08-26", - "action": "done", - "payload": { - "id": "#BJ80DB", - "outcome": "Resolved platform-specific process timeout in hosted-migration-role-guard.test.ts.", - "baseRowFingerprint": "c56871479d77d951a572b0ca35fda11dc8f2fce037015c2ff15412d815dd121d" - } -} diff --git a/docs/outstanding-issues-inbox/e4e2cc34-02da-472e-a065-287a4a50640d.json b/docs/outstanding-issues-inbox/e4e2cc34-02da-472e-a065-287a4a50640d.json deleted file mode 100644 index f870f68116..0000000000 --- a/docs/outstanding-issues-inbox/e4e2cc34-02da-472e-a065-287a4a50640d.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "id": "e4e2cc34-02da-472e-a065-287a4a50640d", - "createdOn": "2026-08-26", - "action": "done", - "payload": { - "id": "#Y090R5", - "outcome": "Hardened snapshot generation and validation workflow to eliminate PR merge conflicts.", - "baseRowFingerprint": "ebf94cc0a0c0d5af374a264181b2d727a0e3bc7d158271aba2d8fe59fc797b83" - } -} From addef8aaddda7b7d6050d6c596cd9be24b2df720 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Thu, 27 Aug 2026 09:30:05 +0800 Subject: [PATCH 5/6] docs: append PR #2397 babysit review record Co-authored-by: Cursor --- ...24d949fe2a22a1d5f62ebac498b6cdcf20a53f1f44bc4e08659.record.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/branch-review-records/3d772ae226f7524d949fe2a22a1d5f62ebac498b6cdcf20a53f1f44bc4e08659.record.md diff --git a/docs/branch-review-records/3d772ae226f7524d949fe2a22a1d5f62ebac498b6cdcf20a53f1f44bc4e08659.record.md b/docs/branch-review-records/3d772ae226f7524d949fe2a22a1d5f62ebac498b6cdcf20a53f1f44bc4e08659.record.md new file mode 100644 index 0000000000..1df9e25272 --- /dev/null +++ b/docs/branch-review-records/3d772ae226f7524d949fe2a22a1d5f62ebac498b6cdcf20a53f1f44bc4e08659.record.md @@ -0,0 +1 @@ +| 2026-08-27 | codex/tooling-hooks-ci-invariants | dba86f029eed2c6d8a4c6c7594840c60d5d004a2 | PR #2397 babysit: merge main, conflict resolution, review thread fixes | mergeable; snapshot regenerated; 5 premature inbox done requests removed; dev-drive-cache fails closed; Medication pin /medications | vitest session-start-hook+sidebar-production 18/18; check:dev-drive-cache; check:outstanding-issues-snapshot | From 5300285209cb0cb490988b5d13fb52dc13ed394f Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Thu, 27 Aug 2026 10:22:14 +0800 Subject: [PATCH 6/6] fix(ci): remove stale issues inbox done records from PR #2397 Queued done requests targeted ledger rows already closed on main (e.g. #RSD9EJ), which made docs:check-links fail. Reset issues snapshot to main, drop duplicate inbox files, and refresh repo-awareness snapshot. Co-authored-by: Cursor --- data/outstanding-issues-snapshot.json | 36 ++----------------- data/repo-awareness-snapshot.json | 16 ++++++--- .../57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json | 11 ------ .../6c377d37-8b95-4ea6-8c02-d83e87e60093.json | 11 ------ .../85b2009a-0c94-4a62-a732-7fa38836c4f3.json | 11 ------ .../e64773d1-b02a-433e-99e7-9a16c06fe150.json | 11 ------ .../ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json | 11 ------ 7 files changed, 15 insertions(+), 92 deletions(-) delete mode 100644 docs/outstanding-issues-inbox/57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json delete mode 100644 docs/outstanding-issues-inbox/6c377d37-8b95-4ea6-8c02-d83e87e60093.json delete mode 100644 docs/outstanding-issues-inbox/85b2009a-0c94-4a62-a732-7fa38836c4f3.json delete mode 100644 docs/outstanding-issues-inbox/e64773d1-b02a-433e-99e7-9a16c06fe150.json delete mode 100644 docs/outstanding-issues-inbox/ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json diff --git a/data/outstanding-issues-snapshot.json b/data/outstanding-issues-snapshot.json index 11412487c6..7c19dba753 100644 --- a/data/outstanding-issues-snapshot.json +++ b/data/outstanding-issues-snapshot.json @@ -1,8 +1,8 @@ { "version": "outstanding-issues-snapshot-v1", "ledger_revision": { - "sha": "707b965965a9b843c13deb6b5c9ddd158fe2631d", - "committed_at": "2026-08-25T17:45:01Z" + "sha": "6085a0a59aca4c1bb9e19fb4d490fd34dec950cd", + "committed_at": "2026-08-22T20:52:39Z" }, "counts": { "open": 91, @@ -10,7 +10,7 @@ "p2": 57, "p3": 33, "queued": 9, - "pending": 17, + "pending": 12, "resolved": 412 }, "queue": [ @@ -960,24 +960,6 @@ "summary": "Overflow menus split between a real ARIA menu and menu roles with no keyboard model", "created_at": "2026-08-25" }, - { - "request_id": "57ea4b5c-47ef-4ca0-9598-80f2771e3a2c", - "action": "done", - "summary": "#RSD9EJ: Updated pre-push guard to resolve comparison baselines against git merge-base.", - "created_at": "2026-08-26" - }, - { - "request_id": "6c377d37-8b95-4ea6-8c02-d83e87e60093", - "action": "done", - "summary": "#8A00R7: Modularized AGENTS.md sections reducing ~6k tokens/turn while maintaining lint parity.", - "created_at": "2026-08-26" - }, - { - "request_id": "85b2009a-0c94-4a62-a732-7fa38836c4f3", - "action": "done", - "summary": "#JZM7RM: Documented automated PR review fixer governance in docs/agents-guide.md.", - "created_at": "2026-08-26" - }, { "request_id": "8b2a3f89-9bdb-4fb1-8fd0-35165d050263", "action": "add", @@ -1014,18 +996,6 @@ "summary": "Docstring coverage on the answer-source changes sits at 62.5% against CodeRabbit's 80% advisory threshold", "created_at": "2026-08-25" }, - { - "request_id": "e64773d1-b02a-433e-99e7-9a16c06fe150", - "action": "done", - "summary": "#6SMMB4: Verified D:\\.npm-cache Dev Drive trusted cache registration.", - "created_at": "2026-08-26" - }, - { - "request_id": "ea6d235a-330c-49cb-90e8-e17e4a6e5ff9", - "action": "done", - "summary": "#VV83VA: Documented process starvation diagnostic in docs/testing.md.", - "created_at": "2026-08-26" - }, { "request_id": "ecabc51d-034a-4a68-91cd-280214aac6bf", "action": "add", diff --git a/data/repo-awareness-snapshot.json b/data/repo-awareness-snapshot.json index 200c7d2e82..aa92a4f72f 100644 --- a/data/repo-awareness-snapshot.json +++ b/data/repo-awareness-snapshot.json @@ -1,8 +1,8 @@ { "version": "repo-awareness-snapshot-v1", "captured_revision": { - "sha": "d2c61c8cbddfb096e7b86e4dae1983dd1266a356", - "committed_at": "2026-08-27T09:12:09+08:00" + "sha": "de2b9b35bb84c96ced4a6eb09e6d6c99bc2de0bc", + "committed_at": "2026-08-27T10:18:22+08:00" }, "routes": { "modes": [ @@ -3805,6 +3805,14 @@ }, "review_state": { "records": [ + { + "date": "2026-08-27", + "ref": "codex/tooling-hooks-ci-invariants", + "head": "dba86f029eed2c6d8a4c6c7594840c60d5d004a2", + "scope": "PR #2397 babysit: merge main, conflict resolution, review thread fixes", + "outcome": "mergeable; snapshot regenerated; 5 premature inbox done requests removed; dev-drive-cache fails closed; Medication pin /medications", + "checks": "vitest session-start-hook+sidebar-production 18/18; check:dev-drive-cache; check:outstanding-issues-snapshot" + }, { "date": "2026-08-26", "ref": "claude/dev-hub-handoff-accuracy (PR #2382)", @@ -24831,8 +24839,8 @@ } ], "counts": { - "records": 2628, - "refs": 1605 + "records": 2629, + "refs": 1606 } } } diff --git a/docs/outstanding-issues-inbox/57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json b/docs/outstanding-issues-inbox/57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json deleted file mode 100644 index 874ac86425..0000000000 --- a/docs/outstanding-issues-inbox/57ea4b5c-47ef-4ca0-9598-80f2771e3a2c.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "id": "57ea4b5c-47ef-4ca0-9598-80f2771e3a2c", - "createdOn": "2026-08-26", - "action": "done", - "payload": { - "id": "#RSD9EJ", - "outcome": "Updated pre-push guard to resolve comparison baselines against git merge-base.", - "baseRowFingerprint": "b687cb212853e6b4c4df866ea79d625556cad416a0c3e406a2044f82691a4d4b" - } -} diff --git a/docs/outstanding-issues-inbox/6c377d37-8b95-4ea6-8c02-d83e87e60093.json b/docs/outstanding-issues-inbox/6c377d37-8b95-4ea6-8c02-d83e87e60093.json deleted file mode 100644 index e2e7a433be..0000000000 --- a/docs/outstanding-issues-inbox/6c377d37-8b95-4ea6-8c02-d83e87e60093.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "id": "6c377d37-8b95-4ea6-8c02-d83e87e60093", - "createdOn": "2026-08-26", - "action": "done", - "payload": { - "id": "#8A00R7", - "outcome": "Modularized AGENTS.md sections reducing ~6k tokens/turn while maintaining lint parity.", - "baseRowFingerprint": "c722d2018e70b3525e5133035792dc17e9a10e3f1e5f7122122975bf0fd242a6" - } -} diff --git a/docs/outstanding-issues-inbox/85b2009a-0c94-4a62-a732-7fa38836c4f3.json b/docs/outstanding-issues-inbox/85b2009a-0c94-4a62-a732-7fa38836c4f3.json deleted file mode 100644 index 2cb92a16ce..0000000000 --- a/docs/outstanding-issues-inbox/85b2009a-0c94-4a62-a732-7fa38836c4f3.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "id": "85b2009a-0c94-4a62-a732-7fa38836c4f3", - "createdOn": "2026-08-26", - "action": "done", - "payload": { - "id": "#JZM7RM", - "outcome": "Documented automated PR review fixer governance in docs/agents-guide.md.", - "baseRowFingerprint": "95c43f250172f44f71d7c63ab4a241813b6a45906a5efaede8389f6d875a77e6" - } -} diff --git a/docs/outstanding-issues-inbox/e64773d1-b02a-433e-99e7-9a16c06fe150.json b/docs/outstanding-issues-inbox/e64773d1-b02a-433e-99e7-9a16c06fe150.json deleted file mode 100644 index 0711a7fc9c..0000000000 --- a/docs/outstanding-issues-inbox/e64773d1-b02a-433e-99e7-9a16c06fe150.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "id": "e64773d1-b02a-433e-99e7-9a16c06fe150", - "createdOn": "2026-08-26", - "action": "done", - "payload": { - "id": "#6SMMB4", - "outcome": "Verified D:\\.npm-cache Dev Drive trusted cache registration.", - "baseRowFingerprint": "e855bd4a29072fcf6e4c37aa76c50511cf61a1c35f972ab18c914e572d53bb0b" - } -} diff --git a/docs/outstanding-issues-inbox/ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json b/docs/outstanding-issues-inbox/ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json deleted file mode 100644 index c28a123fa6..0000000000 --- a/docs/outstanding-issues-inbox/ea6d235a-330c-49cb-90e8-e17e4a6e5ff9.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "id": "ea6d235a-330c-49cb-90e8-e17e4a6e5ff9", - "createdOn": "2026-08-26", - "action": "done", - "payload": { - "id": "#VV83VA", - "outcome": "Documented process starvation diagnostic in docs/testing.md.", - "baseRowFingerprint": "92a45d3e624bc90ed650c3d8308ac29ed65a73b2cdb9a3e9c0ea42ee5887ac66" - } -}