Skip to content

fix(filters): resolve PR #1998 merge conflicts and required CI failures - #2025

Merged
BigSimmo merged 23 commits into
mainfrom
claude/pr-1998-review-fix-u9u9ps
Aug 17, 2026
Merged

fix(filters): resolve PR #1998 merge conflicts and required CI failures#2025
BigSimmo merged 23 commits into
mainfrom
claude/pr-1998-review-fix-u9u9ps

Conversation

@BigSimmo

Copy link
Copy Markdown
Owner

Summary

  • Carries the complete clinical filter overhaul from feat(filters): implement clinical result filter overhaul #1998 (codex/filter-system-overhaul) forward, merged cleanly onto current main, with the specific fixes needed to satisfy the required pr-required CI aggregate:
    • Resolved the real merge conflict against main in docs/design-system/COMPONENTS.md, docs/design-system/adoption-manifest.json, and src/components/ui/sheet.tsx (kept the headerRef/headerHidden/data-sheet-header header-collapse attributes that landed on main via feat(guide): pin guide chrome controls to shared scroll-hide behavior #2007 after feat(filters): implement clinical result filter overhaul #1998 branched).
    • Regenerated the design-sync contract and design-system adoption manifest (npm run design-system:design-sync:update, generate-design-system-adoption.mjs --write) so check:design-sync-contract and the design-sync-contract/design-sync-visual-exports unit tests pass again — they were failing with dtsPropsFor must be generated from source public Props types because the merge left the generated artifacts stale relative to sheet.tsx.
    • Fixed a genuine test/implementation mismatch in tests/ui-tools.spec.ts: feat(filters): implement clinical result filter overhaul #1998's first commit rewrote several assertions to expect the /tools hero composer visible at every viewport width, but never changed the production composer-placement logic in ClinicalDashboard.tsx / global-search-shell.tsx, which deliberately keeps /tools on the phone footer dock per the documented contract in docs/search-chrome-behaviour.md ("Tools directory... Compact bottom dock on phones; in-flow hero composer from sm"). Restored the phone/desktop branching in the 4 affected tests to match the shipped, documented behaviour instead of changing production code on a protected search-chrome surface.
    • Extracted the new handleDocumentFiltersApply callback out of ClinicalDashboard.tsx into src/components/clinical-dashboard/use-apply-filters.ts (mirroring the existing useScopeFilterRelax pattern) because feat(filters): implement clinical result filter overhaul #1998's addition pushed the component to 4146 lines, past the 4140-line no-growth budget check:maintainability-budgets enforces. Pure extraction, no behaviour change.
    • Merged the one commit that landed on main after this branch started (Add outstanding-issues row-staleness fingerprint checks #2009, a URL-regex assertion robustness fix in the same test file).

Verification

  • npm run verify:pr-local — see below (ran the constituent gates directly: full unit suite, typecheck, lint, design-sync/adoption/maintainability-budget checks, targeted + full ui-tools.spec.ts Chromium Playwright run, and a clean rm -rf .next && npm run build)
  • npm run verify:ui — ran tests/ui-tools.spec.ts (95/95 passed) against a clean production build with --project=chromium, including the 4 tests that were failing in feat(filters): implement clinical result filter overhaul #1998's CI (Production UI (3))
  • Unit suite: npx vitest run — 635 files / 6771 tests passed, 4 skipped
  • Typecheck: npx tsc --noEmit -p tsconfig.json — clean
  • Lint: npx eslint on all changed files — clean
  • node scripts/check-design-sync-contract.mjs — passes (54 components, 7 guidelines)
  • node scripts/generate-design-system-adoption.mjs --check — passes (54 components, 59 roots)
  • node scripts/check-maintainability-budgets.mjs — passes (ClinicalDashboard.tsx: 4136/4140 lines)
  • npm run format — clean, nothing to reformat

Risk and rollout

  • Risk: the only production-code behaviour change versus feat(filters): implement clinical result filter overhaul #1998 is the ClinicalDashboard.tsx extraction, which is a pure refactor (same logic, moved to a hook module) — verified by the unchanged document-filter-panel.dom.test.tsx / medication-prescribing-workspace.dom.test.tsx suites and typecheck/lint. The sheet.tsx conflict resolution keeps both features (existing header-collapse from main + this PR's filter-sheet changes) with no logic removed on either side.
  • Rollback: revert this commit; feat(filters): implement clinical result filter overhaul #1998 remains open and untouched as a fallback source of the original diff.
  • Provider or production effects: None.

Clinical Governance Preflight

  • Source-backed claims still require linked source verification before clinical use
  • No patient-identifiable document workflow was introduced or expanded without explicit governance approval
  • Supabase target remains Clinical KB Database (sjrfecxgysukkwxsowpy)
  • Service-role keys and private document access remain server-only
  • Demo/synthetic content remains clearly separated from real clinical sources
  • Source metadata, review status, and outdated/unknown-source behavior remain conservative
  • Deployment classification/TGA SaMD impact was checked when clinical decision-support behavior changed — this is a filter/search UI change, no clinical decision-support logic changed

Notes


Generated by Claude Code

BigSimmo and others added 20 commits August 16, 2026 19:50
…ests

The filter overhaul rewrote these assertions to expect the tools hero
composer visible at every width, but never changed the production
composer-placement logic (ClinicalDashboard.tsx, global-search-shell.tsx)
that deliberately keeps /tools on the phone footer dock per the
documented contract in docs/search-chrome-behaviour.md. Restore the
phone/desktop branching so the tests match shipped behaviour.
…nder the ClinicalDashboard line budget

PR #1998 added a new inline callback (handleDocumentFiltersApply) that
pushed ClinicalDashboard.tsx to 4146 lines, past the 4140-line no-growth
budget check:maintainability-budgets enforces. Extract it into
use-apply-filters.ts following the same pattern already used for
useScopeFilterRelax — a hook module beside the component instead of
inline growth. Pure extraction, no behaviour change.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@supabase

supabase Bot commented Aug 17, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project sjrfecxgysukkwxsowpy because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 57 minutes

Limit details: You’ve used all 1 included review currently available under your plan. You completed 94 included PR reviews in the past 7 days; at that activity level, included reviews refill at 1 review per hour.

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 39b43fc1-43c8-4b49-b007-1b60c10ea1ed

📥 Commits

Reviewing files that changed from the base of the PR and between f2cdb69 and 7e8ac75.

📒 Files selected for processing (61)
  • .design-sync/config.json
  • docs/branch-review-records/3cb7ccda715349528ce874a104d8f7086772b310145b8ef3f028b82ae6b4f63c.record.md
  • docs/branch-review-records/7765db7390f88c4cb763e05a58bef1158fb0db2c3232072b73ddddd3d653876a.record.md
  • docs/branch-review-records/81782f186cfefcfe52006b705b15b5018bd6bc01d0998839c9544151db434263.record.md
  • docs/branch-review-records/c77521d7551a10d87a7824257e5ec615ced08a21d9254bc8612ea6318a73e9f4.record.md
  • docs/design-system/COMPONENTS.md
  • docs/design-system/adoption-manifest.json
  • docs/search-results-bar-decisions.md
  • src/app/(search-app)/dsm/search/page.tsx
  • src/components/ClinicalDashboard.tsx
  • src/components/applications-launcher-page.tsx
  • src/components/calculators/search-page.tsx
  • src/components/clinical-dashboard/differentials-home.tsx
  • src/components/clinical-dashboard/document-search-results.tsx
  • src/components/clinical-dashboard/favourites-command-library-page.tsx
  • src/components/clinical-dashboard/medication-prescribing-workspace.tsx
  • src/components/clinical-dashboard/result-filter-control.tsx
  • src/components/clinical-dashboard/search-results-header-band.tsx
  • src/components/clinical-dashboard/use-apply-filters.ts
  • src/components/differentials/differential-stream-workspace.tsx
  • src/components/dsm/dsm-search-page.tsx
  • src/components/factsheets/factsheets-search-page.tsx
  • src/components/forms/forms-search-results-page.tsx
  • src/components/formulation/formulation-home-page.tsx
  • src/components/services/service-group-nav.tsx
  • src/components/services/services-navigator-page.tsx
  • src/components/specifiers/specifiers-home-page.tsx
  • src/components/therapy-compass/screens/search-screen.tsx
  • src/components/tools/tools-search-results-page.tsx
  • src/components/ui/sheet.tsx
  • src/lib/document-filter-model.ts
  • src/lib/form-filters.ts
  • src/lib/medication-filters.ts
  • src/lib/result-filter-url.ts
  • src/lib/search-scope-filter-chips.ts
  • tests/differential-stream-page.dom.test.tsx
  • tests/differentials-compare-selection.dom.test.tsx
  • tests/document-filter-model.test.ts
  • tests/document-filter-panel.dom.test.tsx
  • tests/document-search-scope-zero-results.dom.test.tsx
  • tests/dsm-search-empty-state.dom.test.tsx
  • tests/factsheets-search-page.dom.test.tsx
  • tests/favourites-auth-gate.dom.test.tsx
  • tests/favourites-empty-state.dom.test.tsx
  • tests/filter-review-regressions.dom.test.tsx
  • tests/form-filters.test.ts
  • tests/forms-search-filters.dom.test.tsx
  • tests/formulation-search-filters.dom.test.tsx
  • tests/medication-filters.test.ts
  • tests/medication-prescribing-workspace.dom.test.tsx
  • tests/mobile-interaction-regressions.test.ts
  • tests/result-filter-url.test.ts
  • tests/search-results-header-band.dom.test.tsx
  • tests/services-navigator-scope-empty-state.dom.test.tsx
  • tests/sheet.dom.test.tsx
  • tests/specifiers-search-filters.dom.test.tsx
  • tests/ui-route-coverage.spec.ts
  • tests/ui-smoke.spec.ts
  • tests/ui-specifiers.spec.ts
  • tests/ui-stress.spec.ts
  • tests/ui-tools.spec.ts
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/pr-1998-review-fix-u9u9ps

Comment @coderabbitai help to get the list of available commands.

@BigSimmo
BigSimmo enabled auto-merge August 17, 2026 09:35
@github-actions

github-actions Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

CI triage

CI failed on this PR. Automated classification of the 4 failed job(s):

  • Lighthouse budgetneeds investigation: inspect the failing step and uploaded diagnostics; rerun only after classifying the cause.
  • Production UI (1)needs investigation: inspect the failing step and uploaded diagnostics; rerun only after classifying the cause.
  • Advisory UIneeds investigation: inspect the failing step and uploaded diagnostics; rerun only after classifying the cause.
  • PR requiredneeds investigation: inspect the failing step and uploaded diagnostics; rerun only after classifying the cause.

Compared with main CI run #11281 (cancelled).

Classification is evidence routing, not permission to ignore a failure. Exact quarantined Playwright identities remain governed by the flake ledger.

claude added 2 commits August 17, 2026 10:02
…arget and layout-transition ratchets

check:design-system-contract regressed on this PR's head:
- favourites-command-library-page.tsx's new 'Recently used' toggle used
  bare min-h-10 (40px) on every viewport instead of the file's own
  min-h-tap ... sm:min-h-10 pattern, dropping below the 48px phone tap
  floor.
- result-filter-control.tsx's new coverage progress bar animated width
  directly (transition-[width]), which is a real layout-thrash risk the
  ratchet exists to catch; switched to the scaleX(...) + origin-left
  pattern already used by ui/progress.tsx and DocumentManagerPanel.tsx.

Both are genuine fixes to new code from #1998, not baseline bumps.
@BigSimmo
BigSimmo disabled auto-merge August 17, 2026 10:16
@BigSimmo
BigSimmo enabled auto-merge August 17, 2026 10:16
@BigSimmo
BigSimmo merged commit ab7c513 into main Aug 17, 2026
40 of 45 checks passed
@BigSimmo
BigSimmo deleted the claude/pr-1998-review-fix-u9u9ps branch August 17, 2026 10:26
BigSimmo added a commit that referenced this pull request Sep 5, 2026
…cal gates match CI (#2621)

* verify:pr-local: mirror every static-heavy static-pr gate in the heavy plan (M24)

Defect: the heavy-scope plan of scripts/verify-pr-local.mjs selected only
lint, typecheck and test, while CI's static-pr job additionally runs the
migration-role, function-grant and owner-scope guards plus the design-system,
generated-artifact, docs and ledger gates for the same scope. A migration using
a non-postgres role, a SECURITY DEFINER function left open to PUBLIC, or an API
handler reading an owner-scoped table without an owner filter passed the
documented "PR mirror" green locally and reddened only after push.

Trigger: `npm run verify:pr-local` on any PR touching supabase/migrations/** or
src/app/api/** (both classify static_heavy).

Fix: a `staticHeavyGuards` list in CI step order, selected for static_heavy
scope ahead of lint/typecheck/test; the docs/ledger steps CI runs for heavy
scope now ride docsScripts for docs_changed || static_heavy_changed, and
check:mockups joins that list to match static-pr. The assertPlan self-test
(check:verification-plan) is updated in the same change and pins the three
tenancy/database guards by name.

Test: tests/ci-cache-safety.test.ts "mirrors every static-heavy static-pr step
in the verify:pr-local heavy plan (M24)" parses the static-pr job and fails on
any static_heavy-gated `npm run` step missing from the local heavy plan (red on
the previous script with 25 missing gates), and checks the guards stay out of
the docs-only plan.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FSPY4VSqg7WVukCvmHQP9t

* ci: run the medication interaction index drift gate in static-pr (M30)

Defect: `npm run check:medication-interactions` rebuilt the index from the
snapshot and diffed it, but ran only inside verify:pr-local — no CI job
invoked it — and the only unit test compared data/medication-interaction-
index.json against its own sourceRowCount, never against
data/medications-snapshot.json. A snapshot or lexicon edit merged without
re-running `npm run medications:interactions` (the bare-PR route permits
exactly that) shipped a stale index: a renamed drug missing from names/bySlug,
an added row that never alerts, or a severity token rendered with the old
tone on the reverse path, with every required check green.

Trigger: any PR editing data/medications-snapshot.json or the interaction
lexicon without regenerating the index, pushed from an environment that
skipped verify:pr-local.

Fix: a "Medication interaction index drift" step in the static-pr job, under
the same static_heavy_changed condition as its lexicon-report sibling.

Tests: tests/check-medication-interactions-index.test.ts compares the
committed index to the committed snapshot drug for drug and row for row
(names, row counts, row keys, verbatim note text, sourceRowCount) and proves
the failure shape against a mutated record (renamed drug, edited row, added
row). tests/ci-cache-safety.test.ts pins the new static-pr step (red before
the workflow change).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FSPY4VSqg7WVukCvmHQP9t

* hazard-controls: require proofs to name their control, run the register gate on PRs (M33)

Defect: scripts/check-clinical-hazard-controls.mjs proved only that each
listed control symbol appeared somewhere in the control paths and that each
listed test file existed with a tests/*.test.ts name. It never checked that
any cited test references the control, so a proof test emptied of its case,
or a symbol renamed and re-added as a comment, kept
CLINICAL_HAZARD_CONTROLS_PASS printing. The gate also ran only inside the
provider-backed governance:release chain, so a control rename or the
register's reviewExpiresAt lapsing produced no pull-request signal.

Trigger: any PR renaming one of the 13 control symbols or deleting the
relevant it(...) case; or the calendar reaching the manifest's
reviewExpiresAt.

Fix: for every controlled/partial hazard, at least one listed test must name
a control symbol or import a control path module, reported as
"<id>: no listed test references a control symbol or imports a control path".
The gate joins the static-pr job (docs or static-heavy scope, which already
checks out with fetch-depth 0) and verify:pr-local's docs/heavy plan. On a
shallow clone the script prints CLINICAL_HAZARD_CONTROLS_SHALLOW_CLONE and
skips only the reviewedCommit ancestry checks instead of reporting every
reviewed commit as missing; every file, symbol, test-reference and date check
still runs (verified against a depth-one clone of this branch). The existing
date, commit and role checks are unchanged.

Tests: tests/clinical-hazard-controls.test.ts "requires at least one listed
test to reference a control symbol or control path" (red before the change)
and tests/ci-cache-safety.test.ts pins the static-pr step and its
full-history checkout.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FSPY4VSqg7WVukCvmHQP9t

* hazard-controls: escape regex metacharacters in control symbols (L22)

Defect: the symbol-presence check in scripts/check-clinical-hazard-controls.mjs
escaped symbols with /[.*+?^${}()|[\\]\\]/g, which JavaScript parses as the
class [.*+?^${}()|[\\] followed by a literal "\]", so no metacharacter was ever
escaped. A dotted symbol matched as a wildcard (fail-open: reported present
when absent) and a symbol carrying "(" or "[" threw or never matched.

Trigger: any control symbol that is not a plain identifier. Today's 13 are
plain identifiers, so the defect was latent.

Fix: the repository's standard escape class /[.*+?^${}()|[\]\\]/g, in the one
symbolPattern helper both the control-path and test-reference checks use.

Test: tests/clinical-hazard-controls.test.ts "escapes regex metacharacters in
control symbols instead of treating them as wildcards" — a runtime-assembled
"foo.bar" must not match the file's "fooxbar" sentinel (red before the fix),
and a "sentinel(" symbol must neither throw nor be reported missing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FSPY4VSqg7WVukCvmHQP9t

* owner-scope guard: recognise owner filters, not the owner_id substring (L47)

Defect: scripts/check-owner-scope-api.mjs treated a handler as owner-scoped
if the literal substring "owner_id" appeared anywhere in its body. A
projection such as .select("id,owner_id,title"), a comment, or an unrelated
object key satisfied it, so the two most likely tenancy regressions — a
handler that returns owner_id without filtering on it, and one that only
mentions it in prose — merged green while the gate reported "60 files clean".

Trigger: a future src/app/api handler that reads an owner-scoped table and
names owner_id without filtering on it.

Fix: SCOPE_TOKENS are now filter shapes — .eq/.neq/.is/.in/.not/.match/
.filter("owner_id" or "documents.owner_id"), PostgREST owner_id.eq./.is./.in.
strings, an owner_id: write payload key, the documents!inner(owner_id) join
projection — plus the existing word-bounded helper names. The guard stays
green on the current tree (60 files, 26 tables; the setup-status and
clinical-quality reads remain covered by the documented allowlist). Child
tables without an owner_id column and src/lib callers of createAdminClient
are unchanged and reported for an owner decision.

Test: the script's --self-test now fails a select-list-only handler with an
owner_id comment (red before the change) and passes every filter shape the
codebase uses (.is, .in, .or("owner_id.eq."), documents.owner_id, the inner
join, an insert payload, single-quoted .eq). tests/owner-scope-guard.test.ts
still passes unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FSPY4VSqg7WVukCvmHQP9t

* tests: restore the 320px low-confidence AccessibleTable mockup journey (M31)

Defect: PR #2006 (54585e9, 2026-08-16) added the /mockups/accessible-
table-browser-fixture route and a Playwright journey proving that a
low-confidence clinical table keeps "Not recorded" and its verify-against-
source warning fully legible at 320px; it closed /issues #237. Merge commit
ab7c513 (PR #2025, one day later) dropped the journey from
tests/ui-tools.spec.ts while no non-merge commit ever removed it, so no PR
diff showed the loss and nothing has run it since.

Trigger: any change to AccessibleTable's low-confidence / missing-value
rendering at 320px.

Fix: the journey is restored verbatim from 54585e9 into its own file,
tests/ui-accessible-table-mockup.spec.ts (tagged @mockup, so it runs in the
advisory chromium-mockups project against the surviving fixture route), and
`accessible-table-mockup` joins mockupSpecPattern and the top-level testMatch
in playwright.config.ts. check:ci-scope's mockup-spec parity, the shard
parity gate and the browser-test-plan self-test all pass with the new arm.
docs/agents/test-deletion-guard.md records the merge-commit blind spot of
check:diff-integrity. mockups/README.md is outside this change's scope; its
2026-09-02 row still says no committed test navigates to the fixture. The
pre-commit hook regenerated docs/design-system/adoption-manifest.json (the
new pin test now references AccessibleTable); that output is included.

Test: tests/playwright-pr-shards.test.ts "collects the 320px AccessibleTable
mockup journey in the advisory mockup project (M31)" pins the spec file, its
@mockup tag, the fixture route it navigates to, and its collection by
testMatch and mockupSpecPattern but not the production matcher (red before
this change: the spec was missing).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FSPY4VSqg7WVukCvmHQP9t

* playwright: collect the orphaned ui-tools-show-all spec and guard both directions (M32)

Defect: tests/ui-tools-show-all.spec.ts landed with PR #2008 (0b95d06,
2026-08-16) but its basename was in neither the top-level testMatch nor
productionSpecPattern, mockupSpecPattern or seededSpecPattern in
playwright.config.ts, so no project ever collected it — not test:e2e, not
verify:ui, not the PR shards, not the release matrix. Both existing parity
guards checked one direction only (what the matcher selects is sharded; named
specs are collected), so a never-selected file was invisible to them.

Trigger: any Playwright run; the phone launcher journey (/?mode=tools "Show
all" link, 48px tap target, keyboard navigation to /tools) had zero browser
evidence for 17 days while appearing to be tested.

Fix: `tools-show-all` joins testMatch and productionSpecPattern in
playwright.config.ts and the mirrored productionSpecFilePattern in
scripts/playwright-pr-shards.mjs, and the spec is assigned to PR shard 2
(3.0s estimate on the shard with the smallest full total; the balance guards
still hold at 1.5s/3.0s spread). No spec was deleted, moved or skipped.

Tests: tests/playwright-pr-shards.test.ts "collects every on-disk spec in
the top-level testMatch and at least one project (M32)" asserts the missing
direction against the files on disk (red before the change, naming exactly
tests/ui-tools-show-all.spec.ts), and "collects the phone launcher Show-all
journey as a sharded production spec (M32)" pins the file by name.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FSPY4VSqg7WVukCvmHQP9t

* gates: repair two couplings the main merge broke (M24, M32)

The merge itself was clean on these two files, which is exactly why they broke:
each side added something the other side's guard counts.

- scripts/playwright-pr-shards.mjs: main and this branch both added a shard row
  for tests/ui-tools-show-all.spec.ts, so the file listed it twice and
  `check:playwright-pr-shards` reported "duplicated". Kept main's shard-1 row
  (zero timing, the lightest measured shard) and folded this branch's M32
  rationale into its comment. The spec is still sharded exactly once; the
  by-name pin in tests/playwright-pr-shards.test.ts asserts membership, not
  which shard.
- scripts/verify-pr-local.mjs: main added a `Design drift ratchet` step to
  static-pr under static_heavy_changed, which the M24 mirror test in
  tests/ci-cache-safety.test.ts requires the local heavy plan to carry. Added
  check:design-drift-ratchet to staticHeavyGuards in CI step order (after
  check:icon-scale). The assertPlan expectations spread that list, so they move
  with it.

check:playwright-pr-shards: "PR UI shard parity OK: 36 production specs across 3
groups." check:verification-plan: "PR-local verification plan self-test passed."

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DHSyfuC6mS98ystWFiitAR

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants