chore(sync): resolve forward-merge conflict (main into next) - #2981
Conversation
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Three conflicts, plus two cross-side interactions the merge creates. `loadProperties.ts` — `next` moved the properties table onto the generated component index (#2897); `main` taught it to hide `@deprecatedValues` and to tell that tag apart from a prop-level `@deprecated` (#2960, #2961). Kept `next`'s data source and ported `main`'s value hiding onto the new prop shape (key-based name, `type` as a string, optional `description`). Top-level `undefined`/`null` are not filtered here any more — the index generator already strips them, so the docs side only removes deprecated values. `buildComponentIndex.ts` — `main`'s new `@deprecatedValues` tag contains the substring `next`'s generator matched to set `deprecated: true`, so `Button`'s `color` came out of the merge flagged deprecated as a whole. Uses `main`'s `/@deprecated(?!\w)/` now; regression test added. `RemoteRatingSegmentElement.ts` — `main` put react-aria's `render` on the generator's global ignore list (#2966) after `next` had generated `RatingSegment` (#2863). Regenerated, which drops the `render` property that would have broken the whole mutation batch in remote. ADR 0004 §3 — took `main`'s passage: it already carries both the `publish-next.yml` → `publish.yml` rename (#2968) and the version-consistency guard paragraph (#2958). `pnpm-lock.yaml` — kept `next`'s. It is a strict superset of `main`'s (zero entries only on `main`; `next` already had the Dependabot bumps), and `pnpm install` reports it up to date against every merged manifest. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
🚀 Preview DeploymentPreview environments are ready:
Images:
|
❌ Visual Regression Tests FailedThe visual test step did not pass. If snapshots differ from the committed baselines, download the visual-diffs artifact from this run to inspect the actual/diff images (the artifact is absent if the run failed before comparison, e.g. during install or browser setup). If the differences are intentional, update the baselines by adding the |
|
The
Neither branch touched anything that could affect it — The 1% diff is not noise: the checked filter item in the open dropdown loses its focus ring, and those 782 px are the ring. It comes with an unhandled error that reproduces on both parents: Line 34 is It went unnoticed because 🤖 Addressed by Claude Code |
…ivers it
Takes .github/scripts/version-contract-lib{,.test}.mjs verbatim from `main`,
where #2983 fixed the guard reading a package's first publish as a tightening.
This PR's version-contract check runs the script from its own tree, so it
cannot pass until that fix is present here. The cascade would normally supply
it, but the forward-merge is stuck on a pnpm-lock.yaml conflict and the sync PR
resolving it (#2981) predates the fix and has a red visual suite of its own.
Byte-identical to `main` on purpose: when the cascade does reach `next`, git
sees no difference and there is nothing to reconcile. Nothing is authored here
— the fix itself was reviewed and merged in #2983.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Resolves the forward-merge conflict between
mainandnext(ADR 0004 §4), resolved locally with the merge drivers active viapnpm sync:resolve.Merge this as a true merge commit — a squash or rebase merge would break the superset invariant (ADR 0004 §1) and is blocked by branch protection on
next.This PR is not only conflict resolution. Beyond the three conflicts it carries a generator fix, a new test, and one regenerated file — two cross-side interactions that only break once both branches are combined. Those are the parts worth reviewing.
The three conflicts
apps/docs/src/lib/PropertiesTables/lib/loadProperties.ts— a real semantic conflict.nextmoved the properties table onto the generated component index (#2897);maintaught it to hide@deprecatedValues(#2960, on top of #2961). Keptnext's data source and portedmain's value hiding onto the new prop shape: name comes from the map key,typeis a plain string,descriptionis optional.Dropped the top-level
undefined/nullfilter from the docs side — the index generator already strips them indev/component-index/filterProps.ts, so keeping it here would duplicate the rule. The docs side now only removes deprecated values.docs/adr/0004-forward-merge-main-into-next.md(§3) — tookmain's passage verbatim. It already contains both changes: thepublish-next.yml→publish.ymlrename (#2968) and the version-consistency-guard paragraph (#2958).pnpm-lock.yaml— keptnext's, verified rather than assumed. Zero entries exist only onmain(nextalready carried the same Dependabot bumps), andpnpm installreports it up to date against every merged manifest.Two cross-side interactions
Neither is in a conflicted file. Both are silent — nothing in either branch's own CI run would have caught them.
1.
Button'scolorcame out of the merge flagged deprecated as a whole.main's new@deprecatedValuestag contains the substringnext's index generator matched to setdeprecated: true:dev/component-index/buildComponentIndex.tsnow usesmain's/@deprecated(?!\w)/, which was introduced in #2960 for exactly this distinction. Without it, #2960's "nothing about the prop itself changes" stops holding —colorkeeps working and still warns viauseWarnDeprecation, but the docs would have advertised the whole prop as deprecated. A regression test covers it (verified to fail on the old code).2.
RemoteRatingSegmentElementcarried arenderremote property.mainput react-aria'srenderon the generator's global ignore list (#2966) afternexthad generatedRatingSegment(#2863), so the merged generator output differs from what is committed. Regenerated.This is not cosmetic:
renderreturns rendered output the host would have to call, and one such property drops the entire mutation batch overpostMessage— the bug #2966 fixed forTable. It would also have failed CI's "Check all generated code is committed" gate.Verification
pnpm lint(eslint + stylelint +format:check)node .github/scripts/version-consistency-guard.mjs1.1.0-next.0node --test .github/scripts/*.test.mjstest:compilecomponents,tsc --noEmitapps/docspnpm build+git diffEnd-to-end against the real generated index,
Button'scolorreads… | "secondary"withaccentgone,deprecated: false, and the tag stripped from the description.ColumnLayout'ssstill reads(number | null)[], so #2961's nested-null fix survives.Carries the verify-only
run-visual-testslabel: this is the first timemain'sTableandFileFieldfixes render alongsidenext's newRatingSegment, and no prior PR's visual run covered that combination.Escalation: #2963 — closed automatically once
nextcontainsmainagain.The red
run-visual-testscheck is inherited frommainDo not add
update-screenshotsto this PR. All four required checks (main, Conventional PR title, Routing, Version contract) pass;run-visual-testsis not required.Two Remote/firefox cases in
List.browser.test.tsxfail. Both already fail onmain's tip — verified by running the same test on each parent commit in a clean worktree:main@ 83d6086next@ b171f12List itemsList date range filterList tableThe merge does not cause either failure, and it repairs
List table (Remote), whichmain's #2966 fixes andnextwas still failing.The
List itemsdiff is the focus ring missing on the checked filter item in the dropdown — 782 px is the ring, not noise. It comes with an unhandled error that reproduces on both parents:The host hands down an
onChangethat is truthy but not a function, so theonChangeFromProps?.(v)guard does not catch it. That is a real bug on both release lines and wants its own fix — baking the current rendering into the baselines would entrench it.Nothing here blocks this PR; the visual suite only ran because the label was applied deliberately, and the workflow removed it again after the run.