Skip to content

refactor: type clean up - #822

Open
harlan-zw wants to merge 7 commits into
mainfrom
refactor/type-clean-up
Open

refactor: type clean up#822
harlan-zw wants to merge 7 commits into
mainfrom
refactor/type-clean-up

Conversation

@harlan-zw

@harlan-zw harlan-zw commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator

🔗 Linked issue

N/A

❓ Type of change

  • 📖 Documentation
  • 🐞 Bug fix
  • 👌 Enhancement
  • ✨ New feature
  • 🧹 Chore
  • ⚠️ Breaking change

📚 Description

Threads Input/RenderResult generics through Unhead, HeadPlugin and the head hooks so head.render() is typed per environment (SSRHeadPayload for server heads) instead of any, with each framework package (vue, react, solid, svelte, angular) preserving the generics through its own createHead/context layer.

Loose surfaces tighten alongside: PropResolver takes unknown instead of any, HeadEntry.options derives from HeadEntryOptions instead of a hand-rolled copy, and the legacy createServerHead gains overloads that keep disableDefaults inference. Type erasure now happens at single documented boundaries (for example toUnheadContextValue in the React context) rather than scattered casts. New public-type specs in the angular and eslint-plugin packages lock the exported type surface.

@coderabbitai

coderabbitai Bot commented Jul 12, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@harlan-zw, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 20 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5bade867-9923-4b90-b0e4-f81f16d9f227

📥 Commits

Reviewing files that changed from the base of the PR and between d9b3d2a and a62787f.

📒 Files selected for processing (124)
  • packages/angular/client/src/client.spec.ts
  • packages/angular/client/src/client.ts
  • packages/angular/server/src/server.ts
  • packages/angular/src/composables.ts
  • packages/angular/src/context.ts
  • packages/angular/src/head.component.spec.ts
  • packages/angular/src/head.component.ts
  • packages/angular/src/public-api.ts
  • packages/angular/src/public-types.spec.ts
  • packages/bundler/src/devtools/lazy.ts
  • packages/bundler/src/devtools/plugin.ts
  • packages/bundler/src/devtools/vite.ts
  • packages/bundler/src/unplugin/framework.ts
  • packages/bundler/src/unplugin/types.ts
  • packages/bundler/src/unplugin/vite.ts
  • packages/bundler/test/framework.test.ts
  • packages/eslint-plugin/src/index.ts
  • packages/react/src/client.ts
  • packages/react/src/components.ts
  • packages/react/src/composables.ts
  • packages/react/src/context.ts
  • packages/react/src/helmet.ts
  • packages/react/src/server.ts
  • packages/react/src/stream/client.ts
  • packages/react/src/stream/server.ts
  • packages/react/test/public-types.test.ts
  • packages/react/test/types.test.ts
  • packages/react/test/unified-plugin.test.ts
  • packages/react/test/unmount-cleanup.test.tsx
  • packages/schema-org/src/nodes/Video/index.test.ts
  • packages/schema-org/src/nodes/WebPage/index.test.ts
  • packages/schema-org/src/plugin.ts
  • packages/schema-org/src/react.ts
  • packages/schema-org/src/runtime.ts
  • packages/schema-org/src/solid-js.ts
  • packages/schema-org/src/svelte.ts
  • packages/schema-org/src/vue/runtime/composables.ts
  • packages/schema-org/test/types.test.ts
  • packages/solid-js/src/autoImports.ts
  • packages/solid-js/src/client.ts
  • packages/solid-js/src/composables.ts
  • packages/solid-js/src/context.ts
  • packages/solid-js/src/stream/client.ts
  • packages/solid-js/src/stream/server.ts
  • packages/solid-js/test/types.test.ts
  • packages/solid-js/test/unified-plugin.test.ts
  • packages/svelte/src/client.ts
  • packages/svelte/src/composables.ts
  • packages/svelte/src/stream/client.ts
  • packages/svelte/src/stream/server.ts
  • packages/svelte/test/types.test.ts
  • packages/svelte/test/unified-plugin.test.ts
  • packages/unhead/src/client/adapter.ts
  • packages/unhead/src/client/createHead.ts
  • packages/unhead/src/client/renderDOMHead.ts
  • packages/unhead/src/composables.ts
  • packages/unhead/src/define.ts
  • packages/unhead/src/legacy/index.ts
  • packages/unhead/src/plugins/canonical.ts
  • packages/unhead/src/plugins/defineHeadPlugin.ts
  • packages/unhead/src/plugins/deprecations.ts
  • packages/unhead/src/plugins/flatMeta.ts
  • packages/unhead/src/plugins/inferSeoMetaPlugin.ts
  • packages/unhead/src/plugins/minify.ts
  • packages/unhead/src/plugins/promises.ts
  • packages/unhead/src/plugins/safe.ts
  • packages/unhead/src/plugins/templateParams.ts
  • packages/unhead/src/plugins/validate.ts
  • packages/unhead/src/scripts/proxy.ts
  • packages/unhead/src/scripts/scope.ts
  • packages/unhead/src/scripts/types.ts
  • packages/unhead/src/scripts/useScript.ts
  • packages/unhead/src/scripts/utils.ts
  • packages/unhead/src/server/createHead.ts
  • packages/unhead/src/server/renderSSRHead.ts
  • packages/unhead/src/server/sort.ts
  • packages/unhead/src/server/transformHtmlTemplate.ts
  • packages/unhead/src/server/util/propsToString.ts
  • packages/unhead/src/stream/client.ts
  • packages/unhead/src/stream/iife.ts
  • packages/unhead/src/stream/server.ts
  • packages/unhead/src/stream/types.ts
  • packages/unhead/src/stream/unplugin.ts
  • packages/unhead/src/types/head.ts
  • packages/unhead/src/types/hooks.ts
  • packages/unhead/src/types/schema/head.ts
  • packages/unhead/src/types/schema/link.ts
  • packages/unhead/src/types/schema/script.ts
  • packages/unhead/src/types/tags.ts
  • packages/unhead/src/unhead.ts
  • packages/unhead/src/utils/dedupe.ts
  • packages/unhead/src/utils/hooks.ts
  • packages/unhead/src/utils/meta.ts
  • packages/unhead/src/utils/normalize.ts
  • packages/unhead/src/utils/resolve.ts
  • packages/unhead/src/utils/walkResolver.ts
  • packages/unhead/src/validate/predicates/runtime.ts
  • packages/unhead/test/schema-org-utils.ts
  • packages/unhead/test/streaming/unplugin.test.ts
  • packages/unhead/test/unit/hooks/mutating-hooks.test.ts
  • packages/unhead/test/unit/scripts/events.test.ts
  • packages/unhead/test/unit/scripts/proxy.test.ts
  • packages/unhead/test/unit/scripts/scope.test.ts
  • packages/unhead/test/unit/scripts/use.test.ts
  • packages/unhead/test/unit/server/normalise.test.ts
  • packages/unhead/test/unit/server/prepared-template.test.ts
  • packages/unhead/test/unit/types.test.ts
  • packages/vue/src/client.ts
  • packages/vue/src/composables.ts
  • packages/vue/src/install.ts
  • packages/vue/src/legacy.ts
  • packages/vue/src/resolver.ts
  • packages/vue/src/scripts/useScript.ts
  • packages/vue/src/server.ts
  • packages/vue/src/stream/client.ts
  • packages/vue/src/stream/server.ts
  • packages/vue/src/types/schema.ts
  • packages/vue/src/utils.ts
  • packages/vue/test/unified-plugin.test.ts
  • packages/vue/test/unit/types.test.ts
  • packages/vue/test/unit/useScript.test.ts
  • packages/vue/test/util.ts
  • test/exports/vue.yaml
  • tsconfig.json
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/type-clean-up

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

github-actions Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

📦 Bundle Size

⚠️ 12 bundles grew · net +1.8 kB gz

Bundle Gzipped Δ
Client (Minimal) 5.4 kB → 5.5 kB 🔴 +0.1 kB (+2.5%)
Client (Full) 9.5 kB → 9.7 kB 🔴 +0.2 kB (+1.6%)
Client (Self-Contained) 5.7 kB → 5.8 kB 🔴 +0.1 kB (+2.4%)
Server (Minimal) 4.9 kB → 5 kB 🔴 +0.1 kB (+2.2%)
Server (Self-Contained) 5.2 kB → 5.4 kB 🔴 +0.1 kB (+2.1%)
Vue Client (Minimal) 5.9 kB → 6.1 kB 🔴 +0.2 kB (+3.3%)
Vue Client (Full) 10.5 kB → 10.8 kB 🔴 +0.2 kB (+2.2%)
Vue Server (Minimal) 5.4 kB → 5.5 kB 🔴 +0.1 kB (+2.7%)
React Client (Minimal) 5.8 kB → 6 kB 🔴 +0.1 kB (+2.5%)
React Client (Full) 10.6 kB → 10.8 kB 🔴 +0.2 kB (+1.6%)
React Server (Minimal) 5.2 kB → 5.3 kB 🔴 +0.1 kB (+2.2%)
Schema.org (Minimal) 10.1 kB → 10.2 kB 🔴 +0.1 kB (+1.1%)
All bundles (14)
Bundle Gzipped Brotli Raw
Core
Client (Minimal) 5.5 kB 5 kB 14 kB 🔴
Client (Full) 9.7 kB 8.8 kB 25.4 kB 🔴
Client (Self-Contained) 5.8 kB 5.3 kB 14.8 kB 🔴
Server (Minimal) 5 kB 4.5 kB 12.7 kB 🔴
Server (Self-Contained) 5.4 kB 4.8 kB 13.4 kB 🔴
Vue
Vue Client (Minimal) 6.1 kB 5.5 kB 15.2 kB 🔴
Vue Client (Full) 10.8 kB 9.8 kB 28.4 kB 🔴
Vue Server (Minimal) 5.5 kB 5 kB 13.9 kB 🔴
React
React Client (Minimal) 6 kB 5.4 kB 15.2 kB 🔴
React Client (Full) 10.8 kB 9.8 kB 28.5 kB 🔴
React Server (Minimal) 5.3 kB 4.8 kB 13.4 kB 🔴
Schema.org
Schema.org (Minimal) 10.2 kB 9.3 kB 28.4 kB 🔴
Schema.org Imports 0.1 kB 0.1 kB 0.1 kB
Schema.org Vue Meta 0.4 kB 0.3 kB 0.8 kB

📦 Runtime Dependencies

No runtime dependency changes

All packages (10)
Package External deps Install size Largest dependency Skipped optional
@unhead/angular 10 773.6 kB @jridgewell/trace-mapping 146.7 kB 0
@unhead/bundler 18 5.6 MB @oxc-parser/binding-linux-arm64-gnu 2.2 MB 19
@unhead/cli 22 5.7 MB @oxc-parser/binding-linux-arm64-gnu 2.2 MB 19
@unhead/eslint-plugin 9 683.2 kB @jridgewell/trace-mapping 146.7 kB 0
@unhead/react 19 5.6 MB @oxc-parser/binding-linux-arm64-gnu 2.2 MB 19
@unhead/schema-org 9 683.2 kB @jridgewell/trace-mapping 146.7 kB 0
@unhead/solid-js 19 5.6 MB @oxc-parser/binding-linux-arm64-gnu 2.2 MB 19
@unhead/svelte 19 5.6 MB @oxc-parser/binding-linux-arm64-gnu 2.2 MB 19
@unhead/vue 19 5.6 MB @oxc-parser/binding-linux-arm64-gnu 2.2 MB 19
unhead 9 683.2 kB @jridgewell/trace-mapping 146.7 kB 0
Skipped optional dependencies (114)
  • @unhead/bundler: oxc-parser -> @oxc-parser/binding-android-arm-eabi, oxc-parser -> @oxc-parser/binding-android-arm64, oxc-parser -> @oxc-parser/binding-darwin-arm64, oxc-parser -> @oxc-parser/binding-darwin-x64, oxc-parser -> @oxc-parser/binding-freebsd-x64, oxc-parser -> @oxc-parser/binding-linux-arm-gnueabihf, oxc-parser -> @oxc-parser/binding-linux-arm-musleabihf, oxc-parser -> @oxc-parser/binding-linux-arm64-musl, oxc-parser -> @oxc-parser/binding-linux-ppc64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-musl, oxc-parser -> @oxc-parser/binding-linux-s390x-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-musl, oxc-parser -> @oxc-parser/binding-openharmony-arm64, oxc-parser -> @oxc-parser/binding-wasm32-wasi, oxc-parser -> @oxc-parser/binding-win32-arm64-msvc, oxc-parser -> @oxc-parser/binding-win32-ia32-msvc, oxc-parser -> @oxc-parser/binding-win32-x64-msvc
  • @unhead/cli: oxc-parser -> @oxc-parser/binding-android-arm-eabi, oxc-parser -> @oxc-parser/binding-android-arm64, oxc-parser -> @oxc-parser/binding-darwin-arm64, oxc-parser -> @oxc-parser/binding-darwin-x64, oxc-parser -> @oxc-parser/binding-freebsd-x64, oxc-parser -> @oxc-parser/binding-linux-arm-gnueabihf, oxc-parser -> @oxc-parser/binding-linux-arm-musleabihf, oxc-parser -> @oxc-parser/binding-linux-arm64-musl, oxc-parser -> @oxc-parser/binding-linux-ppc64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-musl, oxc-parser -> @oxc-parser/binding-linux-s390x-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-musl, oxc-parser -> @oxc-parser/binding-openharmony-arm64, oxc-parser -> @oxc-parser/binding-wasm32-wasi, oxc-parser -> @oxc-parser/binding-win32-arm64-msvc, oxc-parser -> @oxc-parser/binding-win32-ia32-msvc, oxc-parser -> @oxc-parser/binding-win32-x64-msvc
  • @unhead/react: oxc-parser -> @oxc-parser/binding-android-arm-eabi, oxc-parser -> @oxc-parser/binding-android-arm64, oxc-parser -> @oxc-parser/binding-darwin-arm64, oxc-parser -> @oxc-parser/binding-darwin-x64, oxc-parser -> @oxc-parser/binding-freebsd-x64, oxc-parser -> @oxc-parser/binding-linux-arm-gnueabihf, oxc-parser -> @oxc-parser/binding-linux-arm-musleabihf, oxc-parser -> @oxc-parser/binding-linux-arm64-musl, oxc-parser -> @oxc-parser/binding-linux-ppc64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-musl, oxc-parser -> @oxc-parser/binding-linux-s390x-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-musl, oxc-parser -> @oxc-parser/binding-openharmony-arm64, oxc-parser -> @oxc-parser/binding-wasm32-wasi, oxc-parser -> @oxc-parser/binding-win32-arm64-msvc, oxc-parser -> @oxc-parser/binding-win32-ia32-msvc, oxc-parser -> @oxc-parser/binding-win32-x64-msvc
  • @unhead/solid-js: oxc-parser -> @oxc-parser/binding-android-arm-eabi, oxc-parser -> @oxc-parser/binding-android-arm64, oxc-parser -> @oxc-parser/binding-darwin-arm64, oxc-parser -> @oxc-parser/binding-darwin-x64, oxc-parser -> @oxc-parser/binding-freebsd-x64, oxc-parser -> @oxc-parser/binding-linux-arm-gnueabihf, oxc-parser -> @oxc-parser/binding-linux-arm-musleabihf, oxc-parser -> @oxc-parser/binding-linux-arm64-musl, oxc-parser -> @oxc-parser/binding-linux-ppc64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-musl, oxc-parser -> @oxc-parser/binding-linux-s390x-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-musl, oxc-parser -> @oxc-parser/binding-openharmony-arm64, oxc-parser -> @oxc-parser/binding-wasm32-wasi, oxc-parser -> @oxc-parser/binding-win32-arm64-msvc, oxc-parser -> @oxc-parser/binding-win32-ia32-msvc, oxc-parser -> @oxc-parser/binding-win32-x64-msvc
  • @unhead/svelte: oxc-parser -> @oxc-parser/binding-android-arm-eabi, oxc-parser -> @oxc-parser/binding-android-arm64, oxc-parser -> @oxc-parser/binding-darwin-arm64, oxc-parser -> @oxc-parser/binding-darwin-x64, oxc-parser -> @oxc-parser/binding-freebsd-x64, oxc-parser -> @oxc-parser/binding-linux-arm-gnueabihf, oxc-parser -> @oxc-parser/binding-linux-arm-musleabihf, oxc-parser -> @oxc-parser/binding-linux-arm64-musl, oxc-parser -> @oxc-parser/binding-linux-ppc64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-musl, oxc-parser -> @oxc-parser/binding-linux-s390x-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-musl, oxc-parser -> @oxc-parser/binding-openharmony-arm64, oxc-parser -> @oxc-parser/binding-wasm32-wasi, oxc-parser -> @oxc-parser/binding-win32-arm64-msvc, oxc-parser -> @oxc-parser/binding-win32-ia32-msvc, oxc-parser -> @oxc-parser/binding-win32-x64-msvc
  • @unhead/vue: oxc-parser -> @oxc-parser/binding-android-arm-eabi, oxc-parser -> @oxc-parser/binding-android-arm64, oxc-parser -> @oxc-parser/binding-darwin-arm64, oxc-parser -> @oxc-parser/binding-darwin-x64, oxc-parser -> @oxc-parser/binding-freebsd-x64, oxc-parser -> @oxc-parser/binding-linux-arm-gnueabihf, oxc-parser -> @oxc-parser/binding-linux-arm-musleabihf, oxc-parser -> @oxc-parser/binding-linux-arm64-musl, oxc-parser -> @oxc-parser/binding-linux-ppc64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-gnu, oxc-parser -> @oxc-parser/binding-linux-riscv64-musl, oxc-parser -> @oxc-parser/binding-linux-s390x-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-gnu, oxc-parser -> @oxc-parser/binding-linux-x64-musl, oxc-parser -> @oxc-parser/binding-openharmony-arm64, oxc-parser -> @oxc-parser/binding-wasm32-wasi, oxc-parser -> @oxc-parser/binding-win32-arm64-msvc, oxc-parser -> @oxc-parser/binding-win32-ia32-msvc, oxc-parser -> @oxc-parser/binding-win32-x64-msvc

Production dependencies only. Peer dependencies and Unhead workspace packages are excluded. Skipped optional dependencies are unavailable on the CI platform.


⚡ Performance (directional)

No significant change (within CI noise)

All benchmarks (14)
Benchmark PR Δ RME
SSR render (CPU) 0.366 ms ~ noise ±9.3%
SSR render (wall) 0.268 ms ~ noise ±4.7%
SSR allocated / render 243.7 KiB ~ noise ±4.9%
Schema.org cached render (CPU) 0.334 ms ~ noise ±7.1%
Schema.org cached render (wall) 0.238 ms ~ noise ±3.1%
Schema.org cached allocated / render 134 KiB ~ noise ±0.3%
Streaming wrapStream drain (CPU) 0.234 ms ~ noise ±5.1%
Streaming wrapStream drain (wall) 0.147 ms ~ noise ±4.7%
Streaming allocated / drain 149.7 KiB ~ noise ±0.3%
Streaming suspense chunk (CPU) 0.013 ms ~ noise ±6.6%
Streaming allocated / suspense chunk 5.1 KiB ~ noise ±0.4%
CSR DOM mutations / nav 38 ~ noise
CSR re-render (CPU) 0.842 ms ~ noise ±5.1%
CSR re-render (wall) 0.474 ms ~ noise ±2.0%

Baseline: main @ d9b3d2a · 2026-07-26 · gzipped is the headline size metric · perf is directional (shared-runner, gated)

# Conflicts:
#	packages/react/src/context.ts
#	packages/schema-org/src/core/define.ts
#	packages/unhead/src/legacy/index.ts
# Conflicts:
#	bench/perf-ci.mjs
#	packages/angular/src/composables.ts
#	packages/react/src/composables.ts
#	packages/solid-js/src/composables.ts
#	packages/svelte/src/composables.ts
#	packages/unhead/src/legacy/index.ts
#	packages/unhead/src/scripts/types.ts
#	packages/unhead/src/scripts/useScript.ts
#	packages/unhead/test/unit/scripts/use.test.ts
#	packages/vue/src/scripts/useScript.ts
# Conflicts:
#	packages/react/src/client.ts
#	packages/react/src/helmet.ts
#	packages/react/src/server.ts
#	packages/react/src/stream/client.ts
#	packages/react/src/stream/server.ts
#	packages/react/test/public-types.test.ts
#	packages/schema-org/src/core/graph.ts
#	packages/schema-org/src/core/resolve.ts
#	packages/schema-org/src/nodes/Event/index.ts
#	packages/schema-org/src/nodes/Offer/index.ts
#	packages/schema-org/src/nodes/Organization/index.ts
#	packages/schema-org/src/nodes/Video/index.test.ts
#	packages/schema-org/src/nodes/Video/index.ts
#	packages/schema-org/src/nodes/WebPage/index.test.ts
#	packages/schema-org/src/nodes/WebPage/index.ts
#	packages/schema-org/src/plugin.ts
#	packages/schema-org/src/react.ts
#	packages/schema-org/src/runtime.ts
#	packages/schema-org/src/solid-js.ts
#	packages/schema-org/src/svelte.ts
#	packages/schema-org/src/vue/runtime/composables.ts
#	packages/schema-org/test/types.test.ts
#	packages/schema-org/test/vue/vue.test.ts
#	packages/unhead/src/plugins/flatMeta.ts
#	packages/unhead/src/plugins/inferSeoMetaPlugin.ts
#	packages/unhead/src/plugins/minify.ts
#	packages/unhead/src/plugins/safe.ts
#	packages/unhead/src/plugins/validate.ts
#	packages/unhead/test/unit/types.test.ts
@harlan-zw

Copy link
Copy Markdown
Collaborator Author

🤖 Harlan Agent Kit automated review

This was generated and posted by a robot, not Harlan's personal review.

PASS · 90/100 confidence

  • Reviewed a62787f1 against main@d9b3d2a6
  • Base current; GitHub reports no conflicts
  • PR title and body match the project template; review threads are resolved
  • Adversarial review found no remaining material code issue
  • Broad diff reviewed; required CI passed 9/9; confidence includes limited local execution

Human merge decision still required.

@harlan-zw harlan-zw added v3 Targets Unhead v3 or the main branch types Public TypeScript contracts and inference needs-rebase Conflicts with the target branch and needs a rebase labels Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-rebase Conflicts with the target branch and needs a rebase types Public TypeScript contracts and inference v3 Targets Unhead v3 or the main branch

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant