build(deps): bump preact from 10.29.2 to 10.29.4 - #2854
Conversation
Build Branch
Static preview entry points
QR codes (mobile preview)
Integration commandsnpm (Android / Extension): Swift Package Manager (Apple): .package(url: "https://github.com/duckduckgo/content-scope-scripts.git", branch: "pr-releases/dependabot/npm_and_yarn/main/preact-10.29.3")git submodule (Windows): git -C submodules/content-scope-scripts fetch origin pr-releases/dependabot/npm_and_yarn/main/preact-10.29.3
git -C submodules/content-scope-scripts checkout origin/pr-releases/dependabot/npm_and_yarn/main/preact-10.29.3Pin to exact commitnpm (Android / Extension): Swift Package Manager (Apple): .package(url: "https://github.com/duckduckgo/content-scope-scripts.git", revision: "f1ba7283efd1c23b1848895c56598b98964ae5d1")git submodule (Windows): git -C submodules/content-scope-scripts fetch origin pr-releases/dependabot/npm_and_yarn/main/preact-10.29.3
git -C submodules/content-scope-scripts checkout f1ba7283efd1c23b1848895c56598b98964ae5d1 |
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
PR:
build(deps): bump preact from 10.29.2 to 10.29.3(4a7ec40f→a517058a)Web Compatibility Assessment
File Lines Severity Finding special-pages/package.json46 info Dependency-only patch bump ( ^10.29.2→^10.29.3). No application source changes.package-lock.json8448–8451 info Lockfile resolves preact@10.29.3. No runtime contract changes in this repo.— — info Zero changes to injected/src/,messaging/,wrapper-utils.js,captured-globals.js, or message-bridge code. Preact is not bundled into page-injected scripts.— — info Preact is used only in special-pages (embedded DDG browser UI: NTP, history, onboarding, duckplayer, etc.). Upstream 10.29.3 fixes are net-positive for this codebase: useIdstability (used in NTP, duckplayer, onboarding),Suspensesubtree effect flushing (ActivityItemAnimationWrapper.js), error recovery, and memory-leak guards. Special-pages userender()(nothydrate()), so hydrate-recovery fixes are low-impact but harmless.No API surface fidelity, prototype-chain, DOM-timing, platform-specific injected, or third-party script compatibility concerns apply — this dependency does not run in the hostile third-party page context.
Security Assessment
File Lines Severity Finding — — info No changes to captured globals, messaging transports, message-bridge trust boundaries, origin validation, postMessage, config gating, or iframe access patterns.— — info Preact runs in isolated embedded special-pages served by the native browser, not in arbitrary third-party page injection. No new data-exfiltration or dynamic-code-execution vectors introduced. — — info Upstream 10.29.3 is a patch release (bug fixes + perf); no published security advisories for this delta. Risk Level
Low Risk — special-pages-only dependency patch with no injected runtime, messaging, or security-sensitive code changes.
Recommendations
- Merge when CI is green — no blocking concerns for injected web compat or security.
- Optional smoke test — NTP activity lazy-load (
Suspense) and anyuseId-linked a11y attributes (tooltips, drawers, omnibar) if manual QA is desired; upstream fixes target exactly these patterns.- Note: newer Preact patch releases (10.29.4/10.29.5) exist upstream; this Dependabot PR is still safe to merge as-is.
Verified locally:
npm run build --workspace=special-pagessucceeds.Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency update review: preact 10.29.2 → 10.29.3
Verdict: Approve with recommendation to target 10.29.7 instead of 10.29.3.
This is a patch-level bump confined to
special-pages/(the only workspace that depends on Preact). No application source changes are required.
Scope & necessity
- Confirmed: Preact is only consumed by
special-pages/(~200+ component files).injected/,messaging/, andtypes-generator/do not use it.- Still needed: Preact is the core UI framework for embedded browser pages (new-tab, history, onboarding, duckplayer, etc.). There is no in-repo alternative; this dependency remains appropriate.
Changelog impact vs. this codebase
10.29.3 change Relevance here Error recovery for partially rendered subtrees Medium — ErrorBoundary/InlineErrorBoundaryused across new-tab, duckplayer, onboarding, release-notes, special-erroruseIdstability across async SuspenseLow — useIdused in ~15 files, but only oneSuspenseusage (ActivityItemAnimationWrapperlazy-loads burn animation; no async Suspense). Fix was reverted in 10.29.4 anywayFlush subtree effects (#5055) High risk — reverted in 10.29.6 due to useSignalEffectincompatibility. Repo usesuseSignalEffectin customizer, burning, protections, history providersHydrate recovery fixes Low — pages use render(), nothydrate()Memory leak / perf guards Positive — low risk Signalishinput typeLow — type-only; signals already used via @preact/signalsKey concern (confirmed): 10.29.6 release notes explicitly revert #5055 because of
useSignalEffectbreakage. This repo depends heavily on@preact/signals(CustomizerProvider,BurnProvider,BackgroundProvider,ProtectionsProvider, history hooks, etc.). While integration tests pass on 10.29.3 in CI-like runs, landing 10.29.3 means accepting a change the Preact team already rolled back.Recommendation: Close or supersede this PR in favor of 10.29.7 (latest patch), which includes retained fixes without the reverted changes. Alternative PR opened: #2855.
Test coverage
Adequate for affected surfaces:
- Customizer (
customizer.spec.js, 40+ tests) — exercises@preact/signals,useSignalEffect, theme/background flows- Activity (
activity.spec.js) — coversSuspense+ lazy burn animation path- History (
history.spec.js) — coversuseSignalEffectin search/selection providers- Onboarding v4 (
onboarding.v4.spec.js) — coversuseIdin Bubble component- New-tab integration suite covers widget
ErrorBoundarypathsGap (uncertain): No dedicated unit/integration test asserts
useSignalEffectordering edge cases that motivated the 10.29.6 revert. Reliance is on Preact's own regression tests + broad integration coverage.Validation run on 10.29.3:
npm ci,npm run build, unit tests (116 pass), customizer + activity + history + new-tab + onboarding v4 integration tests pass.
Supply chain
Check Status Publisher preactjs/preacton GitHub, npm maintainers include core teamLicense MIT Integrity Lockfile hash sha512-D9NL1GAnJZhc3RndVs4gDdxEeU9TcHgywMrhhOsnpdlvFjdbx0gAsLUnH6JEhlJH5giL7Tx5biWPUSEXE/HPzw==matches npm registryProvenance npm attestations / SLSA provenance present for 10.29.3 Publishing 10.29.3 switched to npm staged publishing (maintenance, not runtime risk) No indicators of compromise. Standard Dependabot patch bump from a well-known OSS project.
Summary
Category Assessment Breaking changes None expected (semver patch) Regression risk Moderate for 10.29.3 specifically due to reverted useSignalEffectinteractionSupply chain Low risk Code changes needed None — version selection is the fix Suggested action Prefer 10.29.7 via #2855 over merging this PR as-is Sent by Cursor Automation: Review dependabot
| "classnames": "^2.5.1", | ||
| "lottie-web": "^5.13.0", | ||
| "preact": "^10.29.2" | ||
| "preact": "^10.29.3" |
There was a problem hiding this comment.
Version target concern: 10.29.3 includes subtree-effect flushing (#5055) that Preact reverted in 10.29.6 because it broke useSignalEffect. This repo uses @preact/signals / useSignalEffect in customizer, burning, protections, and history providers. Recommend bumping to ^10.29.7 instead — see alternative PR #2855.
a517058 to
8b4b0d3
Compare
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
Re-assessed on synchronize (
71b45d08→8b4b0d39); diff unchanged — dependency patch only (2 files:special-pages/package.json+ lockfile).Web Compatibility Assessment
No findings.
- Scope: Preact is a
special-pagesruntime dependency only. Zero changes toinjected/,messaging/, or page-injected scripts. Preact is not bundled into content-scope scripts that run on arbitrary third-party pages.- Upstream 10.29.3 fixes (
useIdstability across asyncSuspense, error recovery, effect flushing) align with existing NTP usage (useIdin omnibar/favorites/customizer;Suspense+lazyin activity animations). Special-pages userender()exclusively — nohydrate()call sites, so hydrate-recovery fixes are low-impact.- API surface fidelity / prototype chain / DOM / timing: Not applicable — no browser API overrides, wrapper utilities, or injected lifecycle code in this diff.
Security Assessment
No findings.
- No changes to
captured-globals.js, message bridge, messaging transports, origin validation, orpostMessageusage.- No new network requests, dynamic code execution, or config-trust surface.
- Preact runs inside DDG-controlled special pages (NTP, onboarding, error pages), not in hostile third-party page context.
Risk Level
Low Risk — patch-level dependency bump confined to
special-pages; no injected script, messaging, or security-sensitive code changes.Recommendations
- Info: Merge after CI passes. No additional compat/security gates required for this diff.
- Info: Optional smoke-test NTP activity lazy-load section and any
useId-dependent a11y wiring (omnibar, favorites, drawer) in a native preview — upstream fixes are targeted at these patterns.- Info: Verified locally:
npm run build --workspace=special-pagespasses on synchronize head.Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency update review: preact 10.29.2 → 10.29.3
Verdict: Request changes — do not merge this version.
This is a patch bump in
special-pagesonly (package.json+ lockfile). Preact remains the correct UI framework here (~200 imports across special-pages, paired with@preact/signals). Supply-chain risk is low (officialpreactjsmaintainers, MIT, npm provenance/attestations, lockfile integrity updated).
Confirmed issue:
useSignalEffectincompatibility in 10.29.3Preact 10.29.3 includes Flush subtree effects (#5055), which changes effect scheduling during render. Preact maintainers reverted this in 10.29.6 with an explicit note:
"We had to revert #5055 due to an incompatibility with
useSignalEffect" — 10.29.6 releaseThis repo uses
useSignalEffectin 10 files across signal-heavy surfaces:
- new-tab:
CustomizerProvider.js,themes.js,BackgroundProvider.js,BurnProvider.js,ProtectionsProvider.js- history:
HistoryServiceProvider.js,SearchForm.js,useURLReflection.js,useSearchCommit.js,useResetSelectionsOnQueryChange.jsThese are core to theme/background updates, protections stats, burn flow, and history search/selection — not edge cases.
Recommendation: Close or supersede this PR. Prefer draft PR #2855, which bumps to 10.29.7 (post-revert) instead of stopping at 10.29.3.
Changelog impact vs. this codebase
10.29.3 change Relevance here Flush subtree effects (#5055) High risk — conflicts with @preact/signalsusage aboveuseIdstability across async Suspense (#5108)Medium — useIdused in NTP drawers/tooltips/favorites;SuspenseinActivityItemAnimationWrapper.js. Note: this fix was later reverted in 10.29.4Error recovery for partially rendered subtrees (#5120) Low–medium — ErrorBoundaryused across pagesHydrate recovery with null excess DOM children (#5112) Low — pages use render(), nothydrate()Memory-leak guards / perf (#5115, #5116) Positive, retained in later versions SignalishforinputDOM types (#5096)Low — type-only improvement
Test coverage
- 38 unit/integration test files under
special-pages/cover NTP customizer, history, protections, favorites, omnibar, etc.useSignalEffectpaths are exercised indirectly via integration tests, but there is no targeted test for the effect-flush + signal-effect interaction that caused the upstream revert.- Local validation on this branch:
npm run buildpasses;--project=integrationsuite for customizer/history/new-tab/protections passes (78/78 on re-run). During an earlier parallel run,customizer.spec.jsdark-mode theme-variant test failed once (background colorrgb(28,28,28)vs expectedrgb(30,48,66)); it passed on re-run and on 10.29.2 — treat as potentially flaky, not confirmed regression, but consistent with timing-sensitive signal/effect behavior.Suggested validation before any preact bump:
npm ci && npm run build npx playwright test --project=integration \ pages/new-tab/app/customizer/integration-tests/customizer.spec.js \ pages/history/integration-tests/history.spec.js \ pages/new-tab/integration-tests/new-tab.spec.js \ pages/new-tab/app/protections/integrations-tests/protections.spec.js \ --reporter list
Supply chain
- Package:
preact@10.29.3fromregistry.npmjs.org- License: MIT; maintainers:
preactjsorg- npm provenance/attestations present
- Diff is limited to version + integrity hash — no unexpected transitive changes
Follow-up PR
An alternative fix already exists: draft PR #2855 (
preact→^10.29.7). No additional fix PR opened from this review to avoid duplication.Sent by Cursor Automation: Review dependabot
| "classnames": "^2.5.1", | ||
| "lottie-web": "^5.13.0", | ||
| "preact": "^10.29.2" | ||
| "preact": "^10.29.3" |
There was a problem hiding this comment.
Stop at 10.29.3 is risky for this repo. This version ships the subtree-effect flush (#5055) that Preact reverted in 10.29.6 due to useSignalEffect incompatibility. special-pages uses useSignalEffect in customizer, protections, burning, and history providers. Recommend closing this bump and merging #2855 (10.29.7) instead.
8b4b0d3 to
d60567b
Compare
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
PR: build(deps): bump preact from 10.29.2 to 10.29.3 (
d60567b)
Web Compatibility Assessment
No findings.
This PR changes only
special-pages/package.jsonandpackage-lock.json(version10.29.2→10.29.3). There are no changes toinjected/,wrapper-utils.js,captured-globals.js, or any browser API override code.Preact is used exclusively in the
special-pages/workspace (new-tab, errorpage, duckplayer, etc.) and is bundled at build time into static HTML/CSS/JS served as embedded browser pages. It does not ship as injected content on arbitrary third-party web pages, so the injected-script compatibility criteria (API surface fidelity, prototype chain integrity, third-party script detection, stack-trace exemptions) do not apply to this diff.Preact 10.29.3 is a patch release with stability and performance fixes (error recovery for partially rendered subtrees,
useIdstability across async Suspense, hydrate recovery, memory-leak guards). These are net-positive for special-page UI reliability.
Security Assessment
No findings.
- No changes to
captured-globals.js, messaging transports, message bridge, or origin validation.- No new
postMessage,eval(), or dynamic code execution.- No
nativeDataforwarding risk — no messaging code touched.- Preact runs in a controlled, first-party embedded context with privileged native API access, not in the hostile page-injection environment.
Risk Level
Low Risk — dependency-only patch bump in
special-pages/; no injected runtime code, API overrides, or security-sensitive subsystems are modified.
Recommendations
- CI validation (info): Ensure standard
npm run buildandspecial-pagesintegration tests pass on this branch. No additional injected-specific testing is required.- Version note (info): Preact 10.29.4 and 10.29.5 are available upstream; this patch bump is still appropriate and low-risk. A follow-up dependabot PR may cover newer versions separately.
Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency update review: preact 10.29.2 → 10.29.3
Verdict: Request changes — do not merge this version.
This is a patch bump confined to
special-pages/(package.json+ lockfile). No application source changes. Preact remains the correct and necessary UI framework here (~200 imports across special-pages, paired with@preact/signals^2.9.2). Supply-chain risk is low: officialpreactjsmaintainers, MIT license, lockfile integrity matches npm registry (sha512-D9NL1GAnJZhc3RndVs4gDdxEeU9TcHgywMrhhOsnpdlvFjdbx0gAsLUnH6JEhlJH5giL7Tx5biWPUSEXE/HPzw==).
Confirmed issue:
useSignalEffectincompatibility in 10.29.3Preact 10.29.3 ships subtree-effect flushing (#5055), which changes when
useEffect/useLayoutEffectcallbacks run across the component tree. The Preact team reverted this in 10.29.6 with an explicit note: "We had to revert #5055 due to an incompatibility withuseSignalEffect" (10.29.6 release).This repo relies heavily on
@preact/signals/useSignalEffectin production paths:
Area Files New Tab customizer CustomizerProvider.js,themes.jsNew Tab burning/activity BurnProvider.js,BackgroundProvider.jsNew Tab protections ProtectionsProvider.jsHistory page HistoryServiceProvider.js,SearchForm.js,useURLReflection.js,useSearchCommit.js,useResetSelectionsOnQueryChange.jsMerging 10.29.3 risks subtle timing bugs (stale UI, missed subscriptions, incorrect theme/background sync) that existing tests may not catch.
Changelog impact vs. this codebase
10.29.3 change Relevance here Subtree effect flushing (#5055) High risk — conflicts with useSignalEffect(reverted in 10.29.6)useIdstability across async Suspense (#5108)Low — useIdis used (~15 files) but async Suspense is only inActivityItemAnimationWrapper.jsHydrate recovery fixes (#5112) Not applicable — no hydrate()calls; client-siderender()onlyError recovery for partially rendered subtrees (#5120) Low — ErrorBoundaryusescomponentDidCatch; no SSRMemory-leak guards / perf (#5115, #5116) Beneficial — retained in 10.29.7 Signalishfor inputtype(#5096)Type-only; no runtime impact
Test coverage
Validated on this branch (
d60567b):
npm run build— passnpm run test-unit— 116/116 passnpm run test-int(history, customizer, new-tab, activity) — 112/112 passCoverage is good for affected pages but does not exercise the
useSignalEffect+ subtree-flush interaction that upstream flagged. Passing CI does not negate the documented regression risk.
Recommendation
Close this PR and merge #2855 instead, which targets
preact@^10.29.7— the first 10.29.x release after the #5055 revert, retaining the applicable bugfixes without theuseSignalEffectbreakage.No additional fix PR is needed; #2855 already exists as a draft from a prior review run.
Sent by Cursor Automation: Review dependabot
| "classnames": "^2.5.1", | ||
| "lottie-web": "^5.13.0", | ||
| "preact": "^10.29.2" | ||
| "preact": "^10.29.3" |
There was a problem hiding this comment.
d60567b to
358c7a0
Compare
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
PR:
build(deps): bump preact from 10.29.2 to 10.29.3(#2854)
Trigger: synchronize — re-assessed at358c7a09
Web Compatibility Assessment
File Lines Severity Finding special-pages/package.json46 info Dependency version bump only ( ^10.29.2→^10.29.3). No application source changes.package-lock.json8447–8450, 11330 info Lockfile resolution update for preact@10.29.3. No runtime code changes.— — info Preact is confined to special-pages/(embedded first-party UI: NTP, onboarding, duckplayer, etc.). No usage ininjected/— this dependency does not run in third-party page contexts and is outside the injected API-override / prototype-patching threat surface.— — info Preact 10.29.3 is a patch release (error recovery, useId/Suspensestability, memory-leak fixes, hydrate recovery). Special-pages usesuseId(tooltips, drawers, omnibar) andSuspense(NTP activity animations); these fixes are stability improvements, not contract changes.— — info Special-pages entry points use render()(client-only), nothydrate(). Hydrate-recovery fixes in 10.29.3 are low direct impact but harmless.— — info No changes to browser API overrides, wrapper-utils.js,DDGProxy, DOM manipulation in injected features, platform entry points, or remote config.No web compatibility warnings or errors identified.
Security Assessment
File Lines Severity Finding — — info No changes to captured-globals.js, messaging transports, message-bridge trust boundaries,nativeDatahandling, or origin validation.— — info No new postMessage,eval/Function, dynamic code execution, or network request patterns introduced.— — info Preact renders trusted, bundled first-party UI inside browser-controlled special-page origins — not hostile third-party page content. Dependency bump does not expand the attack surface. No security warnings, errors, or critical findings identified.
Risk Level
Low Risk — Dependency-only patch bump in
special-pages/with noinjected/, messaging, or security-sensitive code changes; Preact does not ship into third-party page injection contexts.
Recommendations
- Merge when CI passes — No injected-scope concerns; standard dependabot hygiene.
- Optional: Run
special-pagesintegration tests (npm run test-intinspecial-pages/) as a sanity check for NTPuseId/Suspensepaths, though no behavioral regressions are expected from this patch.- Future note (info): Preact 10.29.4 reverted the
useIdasync-Suspense fix from 10.29.3. If a future dependabot PR targets 10.29.4+, re-evaluate NTP Suspense/useIdusage; not applicable to this bump.Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency update review: preact 10.29.2 → 10.29.3
Verdict: Request changes — do not merge this version.
This is a patch bump in
special-pagesonly (special-pages/package.json+ rootpackage-lock.json). Preact is the UI runtime for all embedded special pages (new-tab, history, duckplayer, onboarding, etc.); it is still required and there is no in-repo alternative.
Changelog impact (10.29.2 → 10.29.3)
Per preact 10.29.3 release notes and compare diff:
Change Relevance to this repo Flush subtree effects (#5055) High risk — see confirmed issue below Fix error recovery for partially rendered subtrees (#5120) Medium — ErrorBoundaryused across duckplayer, new-tab, release-notes, special-errorFix useIdstability across async Suspense (#5108)Low–medium — useIdin 14+ files (Drawer, Popover, omnibar, favorites, etc.); only one asyncSuspensesite (activity burn animation)Fix hydrate recovery with null excess DOM children (#5112) Not applicable — all pages use render(), nothydrate()Memory-leak guards + perf (#5115, #5116) Positive — heavy hook/signal usage in new-tab Signalishinput types (#5096)Types-only; repo already uses @preact/signals
Confirmed issue:
useSignalEffectincompatibilityEvidence: Preact 10.29.6 release notes state they reverted #5055 (shipped in 10.29.3) "due to an incompatibility with
useSignalEffect".This repo uses
useSignalEffectfrom@preact/signalsin 10 files across new-tab and history:
CustomizerProvider.js,BurnProvider.js,BackgroundProvider.js,ProtectionsProvider.js,themes.jsHistoryServiceProvider.js,SearchForm.js,useURLReflection.js,useSearchCommit.js,useResetSelectionsOnQueryChange.jsLanding 10.29.3 would change passive-effect flush ordering globally. That is exactly the behavior Preact maintainers rolled back one patch later. Merge risk is real and upstream-validated.
Test coverage assessment
Existing coverage (adequate for a safe bump, not for catching this regression):
- 116 special-pages unit tests pass locally (
npm run test-unit)- 36 Playwright integration spec files cover new-tab, history, duckplayer, onboarding, customizer, activity, etc.
- Key Preact features in use are partially exercised:
ErrorBoundary(duckplayer exception test),Suspense/lazy(activity burn path),useId(drawer/customizer/omnibar a11y IDs)Gap (uncertain — would need targeted repro):
- No integration test asserts
useSignalEffecttiming or ordering under concurrent re-renders. A regression from #5055 could manifest as stale UI, missed side-effects, or animation glitches in customizer/history/burn flows without failing CI.
Supply chain
Check Result Package source Official preactjs/preacton npmLicense MIT Lockfile integrity Updated SRI hash for preact-10.29.3.tgz(expected for Dependabot)Known CVEs None reported for preact in npm auditPublishing 10.29.3 adds npm staged publishing (supply-chain hardening) @preact/signalspeer dep>= 10.25.0— 10.29.3 satisfies thisNo supply-chain red flags; the blocker is runtime compatibility, not provenance.
Recommendation
- Close or skip this PR — do not merge 10.29.3.
- Use the existing follow-up PR instead: #2855 — bump preact to 10.29.7 (skip 10.29.3) is already open and targets a version that includes applicable fixes without the reverted #5055 change.
- No additional fix PR needed from this review — #2855 covers the remediation.
Local validation (this run)
npm ci✓npm run test-unit(special-pages): 116/116 pass ✓- Targeted integration tests (new-tab, activity, duckplayer): 144 passed ✓
Tests passing on 10.29.3 does not disprove the upstream
useSignalEffectrevert rationale; effect-order regressions are often subtle and path-dependent.Sent by Cursor Automation: Review dependabot
358c7a0 to
47c7e67
Compare
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
PR: build(deps): bump preact from 10.29.2 to 10.29.3 (
47c7e67)
Scope:special-pages/package.json,package-lock.jsononly (5 lines)
Web Compatibility Assessment
File Lines Severity Finding special-pages/package.json46 info Preact is a special-pagesruntime dependency only. It is not used ininjected/and does not participate in third-party page API shimming,toString()masking, or prototype overrides. Web-compat evaluation categories for injected API fidelity do not apply.package-lock.json8408–8410 info Patch release 10.29.3 includes fixes for error recovery, useIdstability across asyncSuspense, subtree effect flushing, and memory-leak hotspots. Special-pages uses bothuseId(NTP omnibar, tooltips, drawers, etc.) andSuspense(ActivityItemAnimationWrapper); these fixes are stability improvements, not regressions.— — info Special-pages entry points use render()(nothydrate()), so the hydrate-recovery fix is low-impact here but harmless.No warnings or errors identified.
Security Assessment
File Lines Severity Finding — — info No changes to injected/,messaging/,captured-globals.js, message bridge, or native messaging transports. No newpostMessage,eval, or uncaptured-global usage.— — info Preact renders first-party embedded browser pages (NTP, onboarding, error pages, etc.) inside the native WebView sandbox — not arbitrary hostile page content. Dependency supply-chain risk is unchanged from the prior 10.29.2 pin (same registry, patch-level bump). No warnings, errors, or critical findings identified.
Risk Level
Low Risk — Dependency-only patch bump confined to
special-pages; no injected runtime, API override, or security-boundary changes.
Recommendations
- Merge after CI green — No additional web-compat or security gates required for this diff.
- Optional smoke test — NTP pages exercising
useId+Suspense(omnibar, activity animations) are the highest-signal manual check if integration coverage is thin.- Future dependabot note — Preact 10.29.4 reverted the
useId/async-Suspensefix; flag for extra scrutiny if a subsequent bump targets 10.29.4+.Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency update review: preact 10.29.2 → 10.29.3
Verdict: Request changes — do not merge this version.
This is a patch bump confined to
special-pages/(package.json+package-lock.json). Preact is the core UI runtime for all embedded special pages (new-tab, history, onboarding, duckplayer, etc.). The update is low supply-chain risk, but 10.29.3 ships a runtime change that upstream explicitly reverted due to incompatibility with@preact/signals.
Confirmed issue:
useSignalEffectincompatibility (10.29.3)Preact 10.29.3 includes "Flush subtree effects when rendering a pending node" (#5055). This changes effect-flush timing from per-component to flushing the entire pending-effects queue before re-render.
Upstream reverted this in 10.29.6 with the explicit note: "We had to revert #5055 due to an incompatibility with
useSignalEffect" (#5147).This repo is directly affected.
useSignalEffectfrom@preact/signalsis used in 10 files across high-traffic surfaces:
- new-tab:
CustomizerProvider,BackgroundProvider,BurnProvider,ProtectionsProvider,themes.js- history:
HistoryServiceProvider,SearchForm,useURLReflection,useSearchCommit,useResetSelectionsOnQueryChangeThese drive theme/background sync, protections counters, burn animations, history search debouncing, and URL reflection — all user-visible flows.
Changelog impact vs. this codebase
10.29.3 change Relevance here Flush subtree effects (#5055) High risk — conflicts with useSignalEffect; reverted in 10.29.6Error recovery for partially rendered subtrees (#5120) Moderate — custom ErrorBoundarycomponents on most pagesuseIdstability across async Suspense (#5108)Low — reverted in 10.29.4 anyway; useIdis used for a11y IDs but pages use client-siderender(), not SSR hydrationHydrate recovery with null excess DOM children (#5112) Low — no hydrate()calls; all pages userender()into#appMemory-leak guards + perf (#5115, #5116) Positive — retained in later 10.29.x Signalishinput DOM type (#5096)Neutral — type-only npm staged publishing (#5101) Positive for supply chain
Test coverage assessment
Validated locally on this branch (10.29.3):
npm run build— passnpm run test-unit(special-pages) — 116/116 pass- Targeted integration tests (history, new-tab, customizer, onboarding v4) — 192 passed, 2 skipped
Gap: No test exercises the
useSignalEffect+ subtree-effect-flush interaction. Passing CI does not disprove subtle timing bugs (stale theme state, missed protections counter updates, burn-animation race conditions). Upstream caught this via their own regression tests, not ours.
Supply chain risk
- Low. Official
preactpackage from npm registry; lockfile integrity hash updated correctly.- Maintainer: established Preact team; release published via GitHub Actions with trusted publishing and staged publishing (reduces takeover blast radius).
- No new transitive dependencies introduced.
Is Preact still needed?
Yes. It is the sole UI framework for
special-pages/(~150+ component files). No viable in-repo alternative;@preact/signalsis tightly coupled. Staying on 10.29.x is appropriate.
Recommended action
Close this PR and merge #2855 instead, which bumps directly to
^10.29.7— skipping the 10.29.3–10.29.5 window that contains the reverted subtree-effect flush, while retaining the applicable bugfixes from the 10.29.x line.No additional fix PR is needed; #2855 already exists as a draft with the correct target version.
Sent by Cursor Automation: Review dependabot
| "classnames": "^2.5.1", | ||
| "lottie-web": "^5.13.0", | ||
| "preact": "^10.29.2" | ||
| "preact": "^10.29.3" |
There was a problem hiding this comment.
47c7e67 to
493d865
Compare
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
Re-assessed on synchronize (
493d865) — assessment unchanged from prior run.Web Compatibility Assessment
File Lines Severity Finding special-pages/package.json46 info Dependency version bump only ( preact^10.29.2→^10.29.3). No changes toinjected/runtime code, API overrides, or browser shims.package-lock.json8408–8410, 11263 info Lockfile resolution update for preact@10.29.3. No behavioral code changes in this repo.(runtime context) — info Preact is used exclusively in special-pages/(first-party embedded UI: NTP, Duck Player, onboarding, etc.). It does not ship in theinjected/bundle that runs on arbitrary third-party pages, so none of the API-surface-fidelity, prototype-chain, or third-party-script-detection concerns apply.(preact 10.29.3 changelog) — info Patch release fixes: error recovery for partially rendered subtrees, useIdstability across asyncSuspense, subtree effect flushing, hydrate recovery with null excess DOM children, memory-leak hotspots. Special-pages usesuseId(NTP omnibar, favorites, drawer, etc.) andSuspense(ActivityItemAnimationWrapper); all entry points userender()nothydrate(). These fixes are net-positive for special-pages stability.No web compatibility regressions identified.
Security Assessment
File Lines Severity Finding special-pages/package.json46 info Dev/runtime dependency bump in isolated special-pages workspace. No impact on captured-globals.js, message bridge, messaging transports, orinjected/trust boundaries.package-lock.json8408–8410 info Integrity hash updated for preact-10.29.3.tgz. Standard lockfile maintenance.(scope boundary) — info Special-pages run as first-party duck:///chrome-extension://embedded pages inside WebViews — not in the hostile third-party page context. Messaging,nativeDataleakage, and prototype-attack vectors evaluated in the injected trust model do not apply.No security vulnerabilities identified.
Risk Level
Low Risk — Dependency-only patch bump confined to
special-pages/; no changes to injected privacy features, API overrides, messaging, or security-critical paths.Recommendations
- Merge when CI green — no blockers from a web-compat or security perspective.
- (info) Standard Dependabot hygiene: confirm
npm run buildand special-pages integration tests pass in CI.- (info) Future watch: Preact
10.29.4reportedly reverted theuseId/async-Suspensefix — if Dependabot proposes10.29.4+, re-evaluate NTPuseId+Suspenseusage before merging.Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Dependency update review:
preact10.29.2 → 10.29.3Verdict: Do not merge — close in favor of #2855 (
preact@^10.29.7).This is a patch bump confined to
special-pages/package.jsonandpackage-lock.json. Preact is the correct and necessary UI runtime for all special pages; there is no viable in-repo replacement without a full rewrite.
Confirmed risk: subtree effect flushing shipped in 10.29.3, later reverted
Preact 10.29.3 includes preactjs/preact#5055 (“Flush subtree effects”), which changes
options._renderto callflushAfterPaintEffects()and flush all pendinguseEffectcallbacks before a re-render proceeds, instead of only the re-rendering component’s effects.That change was reverted in 10.29.6 via preactjs/preact#5148 after downstream breakage. The 10.29.3 line is therefore a known-bad intermediate release.
Why this repo is exposed:
special-pagesrelies heavily on@preact/signalsanduseSignalEffect(10 files across new-tab and history), including:
CustomizerProvider.js,BackgroundProvider.js,BurnProvider.js,ProtectionsProvider.jsHistoryServiceProvider.js,useURLReflection.js,useSearchCommit.jsThese code paths combine signal-driven synchronous updates with
useEffect/useSignalEffectside effects. The 10.29.3 effect-flush timing change can alter when sibling effects run (tree order vs per-component), which is exactly the class of regression #5055 targeted and why maintainers reverted it.A follow-up fix PR already exists: #2855 bumps to
^10.29.7, which retains applicable fixes while skipping the reverted subtree-flush behavior.
Changelog impact vs current code
10.29.3 change Repo exposure Assessment Flush subtree effects (#5055) High — useSignalEffectacross NTP/historyAvoid (reverted in 10.29.6) useIdstability across async Suspense (#5108)Medium — useIdin Tooltip, Popover, Drawer, omnibar, favorites, etc.;Suspense+lazyinActivityItemAnimationWrapperFix also reverted in 10.29.4; low practical risk here (client render(), not SSR/hydrate)Error recovery for partially rendered subtrees (#5120) Low — ErrorBoundaryused on several pagesLikely beneficial; available in 10.29.7 Hydrate recovery with null excess DOM children (#5112) None — pages use render(), nothydrate()No impact Memory-leak guards / SCU perf (#5115, #5116) General runtime Likely beneficial; available in 10.29.7 Signalishinput types (#5096)Type-only No runtime impact
Test coverage
- Unit tests:
npm run test-unitinspecial-pagespasses (116/116) on this branch.- Integration tests: Good Playwright coverage exists for affected surfaces (
customizer.spec.js,activity.spec.jsincluding burn/Suspense path,history.spec.js,new-tab.spec.js). These exercise signal-driven UI but do not assertuseSignalEffectflush ordering — a regression from #5055 could slip through green CI.- Gap: No targeted test for signal-effect timing interactions. Recommend running the NTP customizer + history + activity burn suites when landing #2855.
Supply chain
- Package: official
preacton npm, MIT, maintained bypreactjsorg.- Lockfile integrity
sha512-D9NL1GAnJZhc3RndVs4gDdxEeU9TcHgywMrhhOsnpdlvFjdbx0gAsLUnH6JEhlJH5giL7Tx5biWPUSEXE/HPzw==matches registry metadata for 10.29.3.- npm publish attestations / provenance present for this version.
- No supply-chain red flags for this bump; the concern is behavioral regression, not provenance.
Recommendation
- Close #2854 without merging.
- Merge #2855 (
preact@^10.29.7) instead — it is already drafted for this exact finding.- No additional fix PR needed from this review; #2855 covers the remediation.
Automated dependency update review.
Sent by Cursor Automation: Review dependabot
| "classnames": "^2.5.1", | ||
| "lottie-web": "^5.13.0", | ||
| "preact": "^10.29.2" | ||
| "preact": "^10.29.3" |
There was a problem hiding this comment.
Blocker: 10.29.3 ships subtree effect flushing (#5055), reverted in 10.29.6 (#5148).
This repo uses useSignalEffect in 10+ files (CustomizerProvider, BurnProvider, HistoryServiceProvider, etc.). That effect-scheduling change is a confirmed regression vector for signal-driven UI here.
Please close this Dependabot PR and land #2855 (^10.29.7) instead.
493d865 to
06d8dbe
Compare
There was a problem hiding this comment.
Stale comment
Dependency update review:
preact10.29.2 → 10.29.3Verdict: Do not merge as-is — skip to ≥10.29.7
Summary
This is a patch bump confined to
special-pages(package.json+ lockfile). Preact is the sole UI runtime for all special pages and is still the right choice here — there is no in-repo alternative.However, 10.29.3 ships a confirmed regression for this codebase: subtree-effect flushing (#5055), which Preact reverted in 10.29.6 citing incompatibility with
useSignalEffect(release notes).Confirmed risk:
useSignalEffectincompatibility
special-pagesrelies heavily on@preact/signals/useSignalEffectacross core UI:
- new-tab:
CustomizerProvider.js,themes.js,BackgroundProvider.js,BurnProvider.js,ProtectionsProvider.js- history:
HistoryServiceProvider.js,useURLReflection.js,useSearchCommit.js,useResetSelectionsOnQueryChange.js,SearchForm.js10.29.3's effect-flushing change can cause signals to trigger synchronous renders that corrupt component execution context — exactly the failure mode Preact documented when reverting #5055.
Changelog impacts (lower concern on their own)
Other 10.29.3 changes are generally beneficial but overlap areas this repo uses:
Change Repo usage Risk useIdstability across async SuspenseuseIdin ~15 components (NTP, duckplayer, onboarding)Low — fix is desirable Error recovery for partially rendered subtrees ErrorBoundary/componentDidCatchon every pageLow — fix is desirable Hydrate recovery with null DOM children No hydrate()calls; pages userender()onlyNegligible SuspensefixesSingle usage in ActivityItemAnimationWrapper.jsLow Memory-leak / perf hooks changes Widespread hooks usage Low Signalishinput typesType-only; no runtime impact None These fixes are retained in 10.29.7 without the reverted #5055 change.
Test coverage
- Unit tests (
npm run test-unit): 116/116 pass, but they do not exercise Preact runtime +useSignalEffectinteraction.- Integration tests: Good coverage exists for signal-heavy flows (
customizer.spec.js,history.spec.js,new-tab.spec.js,protections.spec.js), but there are no tests specifically targeting the #5055 regression.- Gap: No automated guard against landing a
useSignalEffect-incompatible Preact minor. Recommend closing this PR and merging the skip-ahead instead.Supply chain
Low risk. Package is the official
preactjs/preactnpm artifact (MIT), published by known maintainers. Lockfile integrity hash matches registry (sha512-D9NL1GAnJZhc3RndVs4gDdxEeU9TcHgywMrhhOsnpdlvFjdbx0gAsLUnH6JEhlJH5giL7Tx5biWPUSEXE/HPzw==). No suspicious install scripts. Scoped tospecial-pagesonly —injected/is unaffected.Recommended action
Close this Dependabot PR and merge #2855 (
preact→^10.29.7, skipping 10.29.3–10.29.5) instead. That draft PR already exists and targets the same dependency with the regression avoided.No additional fix PR is needed from this review.
Sent by Cursor Automation: Review dependabot
| "classnames": "^2.5.1", | ||
| "lottie-web": "^5.13.0", | ||
| "preact": "^10.29.2" | ||
| "preact": "^10.29.3" |
There was a problem hiding this comment.
Bumps [preact](https://github.com/preactjs/preact) from 10.29.2 to 10.29.4. - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](preactjs/preact@10.29.2...10.29.4) --- updated-dependencies: - dependency-name: preact dependency-version: 10.29.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
06d8dbe to
2e4bdef
Compare
There was a problem hiding this comment.
Injected PR Evaluation: Web Compatibility & Security
PR: build(deps): bump preact from 10.29.2 to 10.29.4
Scope: special-pages/package.json + package-lock.json only (dependency bump)
Web Compatibility Assessment
| File | Lines | Severity | Finding |
|---|---|---|---|
special-pages/package.json |
46 | info | Preact is consumed only by special-pages (embedded first-party UI: NTP, onboarding, duckplayer, etc.). It is not bundled into injected/ and does not run on arbitrary third-party web pages, so typical API-fidelity / prototype-patching concerns for injected code do not apply. |
special-pages/package.json |
46 | warning | 10.29.4 reverts the 10.29.3 fix for useId stability across async Suspense (#5135). NTP uses useId extensively (omnibar, favorites, protections, drawers, tooltips) and has one Suspense boundary for lazy-loaded burn animation (ActivityItemAnimationWrapper.js). Mitigating factors: all entry points use render() (no hydrate()), and the Suspense boundary is scoped to the burn-animation lazy import — useId consumers are largely outside that async path. Residual risk is low but non-zero (e.g., unstable aria-* ID refs if a future component combines useId inside an async Suspense subtree). |
package-lock.json |
— | info | 10.29.4 also includes a hydration+Suspense crash fix (#5134). Not directly relevant today because special-pages do not call hydrate(). |
No changes to browser API overrides, DOM manipulation in injected features, platform entry points, or third-party script interaction surfaces.
Security Assessment
No findings.
- No changes to
injected/,messaging/,captured-globals.js, message bridge, or native transport code. - No new network requests,
postMessage, dynamic code execution, or config-trust surface. - Preact runs in first-party embedded pages with native messaging — outside the hostile third-party page trust model this review targets for injected code.
Risk Level
Low Risk — dependency-only patch bump confined to special-pages; no injected runtime, API shims, or security-boundary changes.
Recommendations
- (info) Merge is reasonable from a web-compat/security standpoint for injected code (no injected impact).
- (warning) After merge, smoke-test NTP activity burn animation (triggers the lone
Suspense+lazy()path) and spot-check omnibar/favorites accessibility (aria-labelledby/aria-describedbytied touseId) on at least one platform. - (info) If a future bump re-introduces the
useId/async-Suspense fix, re-validate any component that placesuseIdinside or above async Suspense boundaries. - No additional security hardening required for this diff.
Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Dependency update review: preact 10.29.2 → 10.29.4
Verdict: Do not merge — close in favor of #2855
Summary
This PR bumps preact in special-pages from ^10.29.2 to ^10.29.4. While the diff is minimal and CI passes, 10.29.4 still includes the subtree-effect flushing change from 10.29.3 (preactjs/preact#5055) that Preact reverted in 10.29.6 due to incompatibility with useSignalEffect. This repo relies heavily on @preact/signals / useSignalEffect across new-tab and history.
An alternative PR (#2855) already exists to bump to ^10.29.7, skipping the affected range.
Changelog impact (10.29.2 → 10.29.4)
| Version | Change | Relevance to this repo |
|---|---|---|
| 10.29.3 | Flush subtree effects when rendering pending node (#5055) | High risk — reverted in 10.29.6 for useSignalEffect incompatibility |
| 10.29.3 | Fix error recovery for partially rendered subtrees (#5120) | Medium — ErrorBoundary used across all major pages |
| 10.29.3 | Fix useId stability across async Suspense (#5108) |
Low — useId not used inside Suspense |
| 10.29.3 | Memory leak guards, hydrate recovery fixes | Low — no hydration in this repo |
| 10.29.4 | Fix hydration-suspense shouldComponentUpdate bailout (#5134) |
None — no hydration |
| 10.29.4 | Revert useId async Suspense fix (#5135) |
Low |
| 10.29.6 | Revert subtree-effect flushing (#5147) | Not included in 10.29.4 |
Confirmed concern: useSignalEffect incompatibility
Evidence:
- Preact 10.29.6 release: "We had to revert #5055 due to an incompatibility with
useSignalEffect" - This repo uses
useSignalEffectin 11 files across new-tab (customizer, burning, protections, background) and history (search, URL reflection, service provider) @preact/signals@^2.9.2is a direct dependency alongsidepreact
Why CI still passes: The subtree-effect flushing change alters effect timing in ways that may not surface in existing Playwright integration tests. This is a runtime correctness risk, not a build/test failure.
Recommended action: Close this PR and merge #2855 (^10.29.7) instead, which retains applicable bugfixes without the reverted change.
Test coverage assessment
| Layer | Coverage | Gap |
|---|---|---|
| Unit tests | 116 tests — mostly pure logic, minimal component rendering | Does not exercise useSignalEffect timing |
| Integration tests | 36 Playwright specs across 7 pages | No dedicated useSignalEffect regression test |
| Affected areas | customizer.spec.js, activity.spec.js, history.spec.js, new-tab.spec.js |
Pass on 10.29.4 locally but won't catch subtle effect-order bugs |
Uncertain concern: Error-boundary recovery improvements in 10.29.3 could change behavior in edge cases. Low priority given the useSignalEffect blocker.
Dependency necessity
preact remains required — it is the sole UI framework for all 8 Preact-based special pages (~313 source files). No alternative framework is used elsewhere in this workspace. @preact/signals is deeply integrated and is the reason the 10.29.3–10.29.5 range is problematic.
Supply chain risk
| Check | Status |
|---|---|
| Publisher | preactjs org on npm — established maintainers (developit, marvinhagemeister, jdecroock) |
| License | MIT |
| Provenance | npm SLSA attestations present for 10.29.4 |
| Integrity hash | Lockfile updated: sha512-GMpwh9+NJ8tSmqwIaVyFRQkiKfBEzQ+k7r7tle4W+kaJ+7wJiB9hFz9BixAomMtenPPSBfM4bZhXozGxhf0uFQ== |
| Typosquatting / unexpected publisher | None detected |
Supply chain risk: Low.
Fix PR status
No new fix PR needed — #2855 (build(deps): bump preact to 10.29.7 (skip 10.29.3)) is already open, CI-green, and addresses this concern.
Sent by Cursor Automation: Review dependabot
| "classnames": "^2.5.1", | ||
| "lottie-web": "^5.13.0", | ||
| "preact": "^10.29.2" | ||
| "preact": "^10.29.4" |
There was a problem hiding this comment.
Blocker: ^10.29.4 includes the subtree-effect flushing change from 10.29.3 (preactjs/preact#5055), which Preact reverted in 10.29.6 because it breaks useSignalEffect.
This repo uses useSignalEffect in 11 files (customizer, burning, protections, history search/URL reflection). Please close this PR in favor of #2855, which bumps to ^10.29.7 and skips the affected range.
|
Superseded by #2881. |


Bumps preact from 10.29.2 to 10.29.4.
Release notes
Sourced from preact's releases.
Commits
707884cMerge pull request #5136 from preactjs/10.29.40e6a25310.29.4174d345Merge pull request #5135 from preactjs/fix-preact-suspense8d20635Revert "Fix useId stability across async Suspense (#5108)"893845aMerge pull request #5134 from preactjs/patch-crashing-at-suspense-bailc3b4f0fFix hydration-suspense crash due to sCU bailout65b32cb10.29.3 (#5121)1a3b8b5Fix error recovery for partially rendered subtrees (#5120)67f0290Fix useId stability across async Suspense (#5108)d9e8984Flush subtree effects (#5055)Note
Low Risk
Routine patch dependency bump in special-pages UI code with no app logic or security surface changes in this diff.
Overview
Bumps the preact dependency in
special-pagesfrom 10.29.2 to 10.29.4, with matching updates in the root package-lock.json.This patch release mainly brings renderer fixes (hydration/Suspense crashes, partial subtree error recovery, hydrate recovery with excess DOM children) and performance/memory improvements from 10.29.3, plus 10.29.4 fixes a hydration-Suspense crash and reverts an earlier
useId+ async Suspense change.Reviewed by Cursor Bugbot for commit 2e4bdef. Bugbot is set up for automated code reviews on this repo. Configure here.