Skip to content

Aged PRs

Cindy Zhang edited this page Aug 24, 2026 · 13 revisions

Aged PRs — the cleanup decision table

The queue is 146 non-draft open PRs; 68 were opened two or more weeks ago and 44 more than a month ago. Many are no longer relevant, and of the ones that are, some no longer work. This page is the decision table for clearing that backlog once, and then holding the line nightly.

Cindy, 2026-08-23: "I think many of them aren't relevant anymore and even if they were they might not work."

The governing rule is unchanged: we are goaled on good reviews, not on throughput. Closing a PR is a real cost to a real person. Every close is warm, names the reason, and leaves the door open.

The counts this table was built against

bucket n
team (eng/design), no changes-requested, idle ≥7d 1
changes-requested, idle ≥7d, any author 12
external, no changes-requested, opened ≥14d ago 56

Five of the twelve have the AUTHOR as the last speaker, and none of the twelve has ever been nudged. Both facts change what is owed — see below.

Step 1 — close the one abandoned team PR

Authors in .github/ENGOWNERS or .github/DESIGNOWNERS can merge themselves, so an open PR of theirs sitting idle a week is abandoned rather than blocked. There is exactly one: #4812 (josephfarina, 15d old, 11d idle).

Close it warmly: reopen any time, merge main first. If they wanted to keep working, draft is what draft is for.

Not a batch, not a policy sweep — one PR. The team keeps its own queue clean.

Step 2 — the relevance sweep, over EVERY aged PR

Relevance is the first question for all of them, whatever their review state. It does not matter whether a PR is sitting on changes-requested, was never reviewed, or has an author waiting on us — if the change no longer applies, none of that is worth spending a minute on.

Scope: every non-draft PR opened ≥14 days ago. 68 PRs.

Be liberal. Cindy: "If not relevant or superseded then close. We can be liberal about this." The bar is does this still apply, not can I prove it is worthless. A PR whose bug no longer reproduces, whose file moved, or whose idea shipped another way closes on that fact alone — no review, no ruling, no waiting for a reply.

The one thing that stops a close: if you cannot name why it is irrelevant, it is relevant.

Tests, cheapest first — stop at the first that matches:

# test action
1 Already fixed on main — someone else landed it, or the code it patches is gone close, and link the PR that fixed it
2 Superseded by another PR close, linking it. If the superseder is open and unreviewed, R6d applies — review the winner first
3 The file it touches no longer exists, or the API it extends was removed close, linking the PR that moved the ground
4 Still applies → Step 3

Always link the PR that made it irrelevant — never "this has since been fixed" on its own. The author gets to see the change that overtook theirs, check it actually covers their case, and say so if it does not. A close without that link is unfalsifiable and reads as a brush-off.

Find it, do not guess it: git log --oneline -S'<a distinctive token from their diff>' origin/main, git log --follow on the file, or the issue's own timeline. If you cannot find the PR, you have not established row 1 — fall through to Step 3 rather than closing on a hunch.

Cheapest test of all, and worth doing before any archaeology: apply their diff to main and see whether it is a no-op, or check whether the symptom still reproduces.

The NEED test sorts; it does not kill

Running R28 — is the need demonstrated, is it ours to serve, does an existing seam reach it — across 23 aged PRs as a kill mechanism produced 1 death in 22. It fails at that job by construction: an aged PR's need is almost always "the library can't express X", which is asserted rather than demonstrated, and asserting it is free.

It earns its four minutes as a sorter. 13 of the 23 were waiting on a decision, not on a review — no amount of reviewing moves them, and each one is a ruling or nothing. Run it to find out which pile a PR is in, then stop; do not run it hoping for a close.

Step 3 — what survives the sweep

Whatever is left still applies. From here every surviving PR is treated the same, whatever its review state — the state changes what the review has to account for, not what the process is.

We refresh it, we do not ask them to. Merge main into the branch in a worktree ourselves — a stale branch is our latency, not their debt. A mechanical conflict (lockfile, both sides appended) we fix; a conflict needing the author's judgement is the one case that goes back to them.

Then run the review loop at the new head, and post the outcome. That is the whole of it. Two things the pass has to carry:

  • If there is an earlier review, this one sees it (R1e). Findings the author fixed, or that main fixed under them, are deleted, not restated — half of the changes-requested set is probably resolved and nobody looked.
  • If the author spoke last, answer them. Their question is part of the review, not a separate errand. 5 of the 12 on changes-requested are here, and until we reply the silence is ours — that PR cannot be nudged or closed on any timer.

Never reviewed, or reviewed three weeks ago — same pass, same standard. Age is not a verdict.

The one branch: still applies and we do not want it is a taste call → Rulings, not a unilateral close. If the only argument for closing is age, it is not an argument.

Nothing aged merges unattended

An approve on a two-week-old PR does not arm auto-merge. R21 says arm it when only CI is left; this cleanup suspends that. Cindy: "Merging really old PRs is risky so please track the decisions in a table for review."

Why aged is different from the daily flow:

  • The diff was written against a main that has moved, sometimes by hundreds of commits. Green CI proves it builds against today's main, not that its assumptions still hold.
  • The merge we would land is not the diff anyone reviewed — we merged main into it ourselves in Step 3, so the resolved tree is new code that has never been read by its author.
  • Volume. One bad merge in a normal night is visible; one inside a batch of fifteen is not.

So: review it, post the verdict, record the row, and stop. Cindy merges from the table. An approve here means "I would merge this", not "merge it".

Two exceptions, both narrow: a docs-only diff with no code, and a PR whose merged tree is byte-identical to a rebase (nothing to resolve). Say which applies in the row, or it waits.

The decision table

Every aged PR gets a row, including the ones closed in Step 2 — a close is a decision too, and the closes are the ones with no author left to catch a mistake.

PR author age decision why, in one line evidence landed?
  • decisionclose: fixed · close: superseded · close: gone · approve — awaiting merge · changes requested · ruling · answered author
  • why — one line, the same sentence posted on the PR. If the row and the comment disagree, one of them is wrong.
  • evidence — the link that makes it checkable: the fixing PR, the superseding PR, the commit that removed the file, or the review.
  • landed? — merge SHA once Cindy merges, so the table closes out.

Sort the table by decision, not by number: all the closes together, all the awaiting-merge together. She is scanning for the ones to act on, not reading it end to end.

Then ledger it. Every surviving PR also goes in the Ledger below: PR, date re-reviewed, head SHA, what is outstanding, who owes the next move. The nightly reads the ledger and these rejoin the standard loop — with the nudge ladder running from that review's date, not the old one. The decision table is for this cleanup and closes out; the Ledger is ongoing.

Nothing closes for silence on this pass. None of the twelve on changes-requested has ever been nudged, and the ladder needs a current review to count from. Nudging someone about a three-week-old review of a branch that has since diverged is asking them to answer something that no longer describes their PR.

The standing ladder, once a current review exists: under 2 days nothing · 2+ days one nudge, ever · 7+ days after that nudge with no author activity, close. Author activity means a commit, a comment or a review reply — CI runs, bot comments and base-branch churn are not responses.

What every close says

Four things, short, in this order:

  1. Thanks, by name, for the specific thing they found or built.
  2. Why it is closing — the concrete reason, not "stale". A commit, a superseding PR, a week of silence after a nudge.
  3. Reopening is welcome any time — and merge main first, since the branch has aged.
  4. Discord, for anything they would rather ask a person (R12e).

If the change is one we still want, say so, and say we may carry it ourselves with credit — then file it so the intent is not lost (R2g: file it in the same turn, or do not promise it).

Rate limit

No more than 10 closes in a day, and never a batch with one boilerplate body. A contributor watching several of their PRs close at once inside a minute learns the project is automated and hostile, whatever the words say. AKnassa alone has five in the changes-requested bucket.

Spread them, and write each one to its own PR.

After the cleanup — the nightly's standing quota

The backlog is not the real problem. Inflow is ~30 PRs/day and outflow ~22, so the queue grows +8/day on its own. Clear 64 aged PRs and change nothing else and there are 64 new aged PRs in eight days.

So the aged work does not get its own project — it becomes part of the main nightly, with a quota that covers both jobs. Cindy: "The hard ones should become part of the main nightly and we should find a good number of reviews it should do between handling incoming ones and cleaning the backlog."

The number

18 reviews a night: 12 incoming, 6 backlog.

per night why
incoming — opened in the last 72h 12 30/day arrive and most need nothing from us; 12 is the share that reaches a real review
backlog — opened ≥14 days ago 6 clears the 37 hard ones in ~6 nights, and holds the line after
of the 18, features max 2 features are where rulings come from — ~62% of them produce one, against 0% for fixes. More than 2 floods the ruling queue past its cap of 3
of the 18, closes max 10 a contributor watching several of theirs close at once learns the project is automated and hostile

Backlog before incoming when the night is short. An incoming PR that waits a day is fine; the backlog is what nobody ever gets to, which is how it became a backlog.

Why 18 and not more

A measured full loop run is 13–21 minutes, and the Mac caps at two measuring agents (Storybook builds compete). 18 × ~17 min ÷ 2 ≈ 2.5 hours of wall clock. That fits a night. 30 would not, and a rushed review is worse than no review — we are goaled on good reviews, not throughput.

Most incoming PRs are not 17 minutes. Triage is ~4 minutes with no browser and every incoming PR gets one; the full ~17-minute loop is for new surface, a changed default, or an a11y/interaction claim. The tier table is on Running It. Scale the evidence to the claim, and the 12 incoming cost far less than the 6 backlog ones.

The quota is a target, not a contract

  • A PR that needs real work gets it, and the count drops that night. Say so in the report.
  • Never pad to reach 18. A night that reviewed 9 carefully beats one that reviewed 18 badly. Report what you protected, not how many you touched.
  • If the queue is clean, do fewer and spend the time on the family fixes and system findings the reviews turned up.

Report the two numbers

Every run reports incoming reviewed / backlog reviewed, and the aged count remaining. That is how we find out whether 12/6 is the right split — if the aged number is not falling, the split is wrong, not the people.

Decisions

One row per aged PR, closes included. Sorted by decision. Cindy merges the approve — awaiting merge rows; nothing aged merges unattended.

Step 1 and Step 2 ran 2026-08-23. Step 3 is running: of the 68 aged PRs, 31 are actioned (8 closes, 13 approve — awaiting merge, 10 changes requested, 1 of which also goes to a ruling) and 37 still applies rows are untouched and unreviewed.

Step 3 is running. The table now carries 8 close rows (7 posted, #4839 still pending and fine to go as-is) and 23 posted reviews. The reconciliation pass of 2026-08-23 found 16 still applies rows had in fact been reviewed — 10 approved, 6 changes-requested — and #4688 closed; those rows now carry their posted verdicts and are ledgered below.

Note on #4685: it was carried into batch 3 as a second ready-to-post close. It is a close, but the earlier evidence was wrong about why — the row below has the verified reason.

PR author age decision why evidence landed?
#4812 josephfarina 15d close: abandoned (Step 1) Team PR (ENGOWNERS) idle since the 12 Aug rebase with no unanswered question, and drifted back into conflict — parked, not blocked. #4812
#4408 AKnassa 28d close: fixed InfoTip opens on tap on main — Tooltip gained a touchTrigger channel and InfoTip's trigger sets touchTrigger="tap", carrying the same reasoning as this PR. #5248
#4832 yomybaby 15d close: superseded The same isImeKeyEvent early return landed in the same two places (BaseTypeahead.handleKeyDown, PowerSearchEditPopover), and the broader all-IME-keys contract was lifted into utils/ime.ts. #4860, #4907
#4403 AKnassa 28d close: gone The CLI reorg deleted every file this builds on — cli/commands/swizzle.mjs, lib/package-scanner.mjs, utils/paths.mjs, types/swizzle.d.ts — so it needs a rewrite, not a rebase; the feature is still wanted and #2090 holds it. #4623
#4553 AKnassa 24d close: fixed The Unknown prop "selected" warning is gone on main — loadKnownComponents() folds each target's declared states into the known keys, and butter and stone now build with no override warnings (ran it). The cross-directory theming-guard hole the author also raised closed separately. #4778, #5016 · Review-4553
#4688 zeroryu 19d close: fixed #4880 landed the same correction in the meantime, on SideNav's own styles rather than the shared mirror, and the mirrored chevrons measure centred across all five call sites on main today. Closed by us, not the author. #4880 · close
#4839 AKnassa 14d close: pending — over rate limit Superseded: the same issue was closed in the same function — video sources strip to an empty src rather than the image data URI — and the embedded-clip approach here was explicitly declined. Held back only to pace closes for one author; two survivors to hand over: .m4v is missing from main's set, and DEMO_ASSET_PATTERN reads the extension off the first dot so clip.min.mp4 is judged on min. #4863, #4780
#3933 jiunshinn 40d approve — awaiting merge Exactly what #2572 asked for, and omitting the spacer rather than zeroing it is the right cut — would merge as is. review
#3934 jiunshinn 40d still applies → Step 3 No text-to-speech anywhere in the repo — no useChatSpeech, no ChatSpeechButton, no speechSynthesis call.
#3935 jiunshinn 40d still applies → Step 3 Stack has no isSticky/stickyOffset, and Layout/sticky.stylex.ts does not exist.
#3937 jiunshinn 40d still applies → Step 3 Lightbox's media is still `LightboxMedia LightboxMedia[]` — no custom-item discriminant.
#3938 jiunshinn 40d still applies → Step 3 TabList has no isFullBleed; the prop exists only on Divider.
#4022 gonzoblasco 38d still applies → Step 3 The shipped default --color-border-emphasized is still the failing value; #4354 fixed only generated themes, not the hand-written default.
#4026 Kevinjohn 38d approve — awaiting merge Dropped the two PNGs and merged main in for them, so this is ready — the one helper across all three compact paths matches what the colon path already did. review
#4032 Kevinjohn 37d approve — awaiting merge Merged main in and re-ran CI — the shape matches the arbitration on #3348, and the test covers it. review
#4050 AKnassa 36d still applies → Step 3 No reserved minWidth and no tabular-nums on the value label, so the track still resizes mid-drag; only the rounding half landed, via #3897.
#4053 jiunshinn 36d still applies → Step 3 Layout has no shellWidth; contentWidth caps slot content while headers/footers stay full-bleed.
#4072 AKnassa 35d changes requested Refreshed the branch myself (merged main, resolved three mechanical conflicts, dropped the duplicate Slider.width the merge created) and pushed c5a16509. At that head the new scanner fails on DropdownMenu and the hit is a false positive — #4954 made children mutually exclusive with items, so a playground can seed only one. Not the author's debt: at their own head children was a render function. review · Review-4072
#4074 AKnassa 35d still applies → Step 3 ChatComposerInputHandle still exposes no setValue and there is no pending-emissions ledger.
#4083 Unmesh100 35d merged CLA Signed landed 23 Aug after our nudge, clearing the last blocker. The branch had aged 35 days on us, so we merged main in ourselves and pushed 7a090f1 — no conflicts. Re-verified at that head: the crash still reproduces on current main (BlogFeatureCard line 85, parseReleaseVersion(post.title) on an undefined post), the guard fixes it, and the 2-/3-post layouts are unchanged. Required checks green; the two Vercel statuses fail on every branch we refreshed today and are not required. review · Review-4083 94c2d8b
#4103 Han5991 34d approve — awaiting merge The measurements make the case and the join gate matches build's — would merge as is; nit only, vitest.config.ts's SYNC line should list ci.yml now. review
#4121 AKnassa 33d still applies → Step 3 The sentinel observer just awaits scrollToTopAction() — no scroll-height capture, so the reader is still teleported on prepend.
#4158 AKnassa 32d still applies → Step 3 packages/lab/src/Image/ does not exist; no Image component landed in core or lab.
#4228 AKnassa 31d still applies → Step 3 TreeList has no renderExpandIcon; the indicator is still the hardcoded rotating chevron.
#4229 AKnassa 31d still applies → Step 3 The a11y dimension is still the static regex scan — no axe-previews.ts, no runtime axe signal.
#4244 Geervan 31d still applies → Step 3 Unsure — see the report. Main's spinner does now sit in an absolutely-positioned endSlot at the field's top-right via #4533, which reads as satisfying #4232, but the issue is still open, the claim is about pixels nobody has looked at, and this PR proposes the opposite placement.
#4259 HelloOjasMutreja 31d still applies → Step 3 No LineClamp component anywhere; Text's maxLines clamps a single text node only.
#4277 AKnassa 30d still applies → Step 3 Item has no variant prop — no default/outline/muted surface exists.
#4284 Lee-Dongwook 30d still applies → Step 3 History recall still fires on any ArrowUp/ArrowDown with no caret-boundary check.
#4310 jibin7jose 29d still applies → Step 3 SideNavHeading still imports usePopover at module top level, with a live TODO(#264) saying so.
#4311 HelloOjasMutreja 29d changes requested #4E606F is the light half of --color-text-secondary, so hardcoding it fixes light and takes dark down with it — 2.33:1 measured in Chromium, against 6.00:1 for the token. review
#4314 zeroryu 29d still applies → Step 3 CodeBlock has no hasStickyLineNumbers; gutter numbers are ::before pseudo-elements inside the scrolling <code>.
#4315 HelloOjasMutreja 29d approve — awaiting merge Every prop here is real; merged main and dropped the width/onEnter entries #4313 landed first, plus marked Toast's onDismiss required. Would merge as is. review
#4316 HelloOjasMutreja 29d approve — awaiting merge All 20 props checked against source — types, unions and defaults correct. Pushed one commit to their branch restoring the pixels/strings note the SizeValue swap deleted from contentWidth; approved at f9fe0724. Docs-only, no code. review · Review-4316
#4317 HelloOjasMutreja 29d approve — awaiting merge CodeBlock and Toolbar were both genuinely missing; merged main and dropped the Stack block, which #4754 landed meanwhile. Would merge as is. review
#4319 HelloOjasMutreja 29d changes requested title/url/icon are fields of CitationSource, not Citation props, and the new test pins them — the Markdown half is right. Also answered the author's 22-day-old a11y question: pr-a11y is green on their head, nothing to baseline. review · Review-4319
#4320 HelloOjasMutreja 29d approve — awaiting merge Both props and their descriptions verified against Field.tsx; docs-only, no code. review · Review-4320
#4327 HelloOjasMutreja 29d changes requested --_avatar-radius is the right name, but the registration the convention needs is missing — a theme writing avatar: {base: {borderRadius}} gets the wrapper only and the photo still clips to a circle. review · Review-4327
#4328 ejc3 29d still applies → Step 3 highlightLines is still number[] — no {line, type} entries, no gutter markers, no language="diff".
#4329 AKnassa 29d still applies → Step 3 Tokenizer has no delimiter handling at all — no delimiters.ts, no paste or comma/newline splitting.
#4332 app/dependabot 28d changes requested v6.0.0 dropped the Babel integration and vitest.config.ts:31 still passes a babel option, so every StyleX call reaches the runtime uncompiled and 215 suites fail — the bump needs a companion change onto @rolldown/plugin-babel first. review
#4372 AKnassa 28d changes requested component(name, {blocks: true}) already returns exactly these records with the hero flagged, so the raw export needs the page that motivates it — once the CLI ships the symbol, taking it back is a breaking release. review
#4377 AKnassa 28d still applies → Step 3 60 of its 67 new test files are still absent and packages/vega is still outside the ui vitest project; only the charts half landed, via #4382.
#4390 AKnassa 28d still applies → Step 3 NumberInput still has no changeAction — the one input in the family without the async-action convention.
#4404 AKnassa 28d still applies → Step 3 InternationalizationProvider accepts no translator; the exported Translator interface has nothing behind it.
#4405 AKnassa 28d still applies → Step 3 Tokenizer.tsx contains zero InputGroup references, so it still renders duplicate Field chrome inside a group.
#4410 AKnassa 28d still applies → Step 3 MobileNav has no focus restoration at all — not one .focus() call in the component.
#4411 AKnassa 28d still applies → Step 3 packages/vega declares no @astryxdesign/* dependency and VegaChart never applies buildVegaLiteConfig.
#4412 AKnassa 28d still applies → Step 3 The gigantic preset is still spacing: 8, radius: 12 — non-concentric — and no warning banner exists.
#4415 AKnassa 27d still applies → Step 3 The Theme Editor's spacing rows still show no component-usage context; neither generator nor derived map exists.
#4446 AKnassa 26d still applies → Step 3 The neutral theme still paints the error Badge #ffffff on #e33f4a — the 4.14:1 pair this fixes.
#4545 octo-patch 24d still applies → Step 3 design-judge.ts is still single-provider Anthropic; minimax appears nowhere in the repo.
#4583 Le-Ngoc-Tu 23d approve — awaiting merge --color-background-secondary isn't in colorDefaults, so that block renders with no background at all today — would merge as is; the CLA signature is the only thing left. review
#4590 jiunshinn 23d changes requested + ruling The cancel margin mirrors Item's inset, so a theme that changes item padding leaves the rows out by the difference — measured in Chromium: row text x=16 by default, x=20 with item on --spacing-3, heading at 16 either way. Naming and mechanism go to Rulings: Cindy's own #2626 comment says isFullBleed is not accurate and this needs container awareness, and the PR argues against that mechanism. review · Review-4590
#4593 jiunshinn 23d still applies → Step 3 hideBelow exists nowhere in packages/; LayoutPanel has no breakpoint prop.
#4605 gonzoblasco 23d approve — awaiting merge This is the fix the Breadcrumbs audit pointed at — the supporting variant now reads as current without colour. Nit: semibold runs ~4px wider, so long labels wrap sooner. review
#4685 AKnassa 20d close: superseded The editor half landed in #4818 and the author's own open #5204 carries the rest — RichTextView.label, the story labels and the identical 13 baseline deletions — against the richtext package these files moved into. #5204, #4818 · Review-4685
#4689 AKnassa 19d changes requested The role change is right, but the trigger has no onKeyDown: it now announces as a combobox and Down Arrow does nothing, where the sibling DateInput opens the picker (DateInput.tsx:663). Enter and Space still work. review · Review-4689
#4690 AKnassa 19d still applies → Step 3 useTableTreeData still sets aria-level/aria-expanded on <tr>; all 10 aria-conditional-attr entries remain.
#4691 AKnassa 19d approve — awaiting merge Making read-only editors focusable is the right call, and keeping the fix at story level for Stack is the right restraint — would merge as is. review
#4692 AKnassa 19d still applies → Step 3 All 8 landmark-unique entries remain, and useTablePagination still names both navs with one shared label.
#4693 AKnassa 19d approve — awaiting merge This is the same shape useTableRowExpansion uses, and the clipped span keeps the gutter visually blank — would merge as is. review
#4696 ngolin 19d changes requested The new map fills per tag, overrides then messages, so a shipped pt-BR string now wins over a pt override — two passes over the chain, every override first, restores the documented order. review
#4707 MeGaurav4 19d still applies → Step 3 extractComponents still scrapes JSX tags with a regex and a hardcoded denylist — no registry check.
#4743 athz 17d changes requested Putting the indicator target on the Icon is the part I wanted, but the spinner branch loses dropdown-menu-indicator-icon altogether, so a theme styling the submenu indicator watches it disappear the moment that submenu starts loading. review
#4768 AKnassa 16d still applies → Step 3 The popover layer is still minWidth: 400 with no fallback and the editor has no wrapping chip row.
#4824 AKnassa 15d still applies → Step 3 useResizable still persists a bare isCollapsed ? 0 : size, so a collapsed SideNav reloads invisible.
#4837 AKnassa 14d still applies → Step 3 DateTimeInput has no timeOptionInterval and no preset-time listbox.

Ledger

Aged PRs brought back onto the standard loop. The nightly reads this before picking work: an entry whose author has responded is a re-review; an entry past the ladder's window is a nudge or a close.

PR re-reviewed head outstanding who moves next
#4319 2026-08-23 4fba5d4 Drop the three Citation prop entries; Markdown half is fine. Their a11y question is answered. author
#4320 2026-08-23 28319c4 Nothing — approved, waiting on Cindy to merge. Cindy
#4316 2026-08-23 f9fe072 Nothing — approved at the head we pushed, waiting on Cindy to merge. Cindy
#4590 2026-08-23 14f9bd7 Derive the cancel from Item instead of mirroring it; naming/mechanism ruling. Cindy (ruling), then author
#4689 2026-08-23 76d5aba ArrowDown handler on the trigger; one open question about focus placement. author
#4072 2026-08-23 c5a1650 Exempt a mutually-exclusive children from the new ReactNode rule. Branch already refreshed by us. author
#3933 2026-08-23 da411de Nothing — approved, waiting on Cindy to merge. Cindy
#4026 2026-08-23 95bb346 Nothing — approved at the head we pushed (PNGs dropped, main merged). Cindy
#4032 2026-08-23 a777c27 Nothing — approved at the head we pushed (main merged, CI re-run). Cindy
#4103 2026-08-23 a3bb9e9 Nothing blocking — approved; the SYNC-line nit is optional. Cindy
#4311 2026-08-23 499e849 Swap the hardcoded #4E606F for var(--color-text-secondary) so dark mode does not regress. author
#4315 2026-08-23 4cadf7b Nothing — approved at the head we pushed. Cindy
#4317 2026-08-23 28ff6d0 Nothing — approved at the head we pushed (Stack block dropped). Cindy
#4327 2026-08-22 41cd6d5 Register --_avatar-radius (vars/derived/derivedVarRegistry); keep shapeStyles internal. author
#4332 2026-08-23 e123131 Companion change moving the StyleX transform onto @rolldown/plugin-babel; dependabot cannot do it. us, then the bump relands
#4372 2026-08-23 4567245 Name what the docsite page needs that component(name, {blocks: true}) does not already give it. author
#4583 2026-08-23 c0b2247 CLA signature. Approved but unmergeable until then. author
#4605 2026-08-23 55541c6 Nothing blocking — approved; the wrap-width nit is optional. Cindy
#4691 2026-08-23 a4e0706 Nothing — approved, waiting on Cindy to merge. Cindy
#4693 2026-08-23 966ce79 Nothing — approved, waiting on Cindy to merge. Cindy
#4696 2026-08-23 e2d6082 Two passes over the chain so overrides beat shipped catalogs; import-time en build is a separate note. author
#4743 2026-08-23 68bc504 Keep dropdown-menu-indicator-icon on the spinner branch as main has it. author

Clone this wiki locally