Skip to content

fix(react-native-plugin): fix "module map file not found" on React Native 0.87 and 0.88 iOS - #5606

Open
turnipdabeets wants to merge 1 commit into
chore/rn-plugin-v3from
fix/rn-plugin-ios-modulemap-spm
Open

turnipdabeets wants to merge 1 commit into
chore/rn-plugin-v3from
fix/rn-plugin-ios-modulemap-spm

Conversation

@turnipdabeets

Copy link
Copy Markdown
Contributor

Problem

With plugin 3.0, iOS builds on Expo 58 (React Native 0.88.1) fail without any Podfile changes:

error: module map file '…/Release-iphonesimulator/posthog-react-native-plugin/posthog_react_native_plugin.modulemap' not found (in target 'Pods-EXPO58')

React Native 0.87 and 0.88 changed scripts/cocoapods/spm.rb (react/react-native#57602). When a pod that uses spm_dependency is a static library, RN builds it straight into the shared products dir. Then rewrite_aggregate_modulemap_references rewrites the app's -fmodule-map-file flags from ${PODS_CONFIGURATION_BUILD_DIR}/<pod>/<pod>.modulemap to ${PODS_CONFIGURATION_BUILD_DIR}/<pod>.modulemap. But CocoaPods names the module map after the module. Our pod is posthog-react-native-plugin and its module is posthog_react_native_plugin, so the rewrite never matches. The flags keep pointing at a file that is never created.

React Native fixed this upstream in react/react-native#59182, which uses the module name. The fix ships in 0.89.0-rc.0 but hasn't been backported to 0.87 or 0.88. @rnmapbox/maps hit the same bug and works around it the same way (ios/rnmapbox_spm.rb).

Plugin 2.x on main isn't affected. By default it installs posthog-ios from CocoaPods. Its posthog.useSpm path requires dynamic frameworks, and React Native only flattens static-library pods. I checked this with pod install on Expo 58, useSpm=true and dynamic frameworks: the pod is a framework and gets no plugin -fmodule-map-file flag.

Changes

  • posthog-react-native-plugin.podspec: when SPMManager#rewrite_aggregate_modulemap_references exists (RN 0.87+), prepend a module that calls super and then rewrites this pod's path using product_module_name. It only touches our pod. On RN 0.89+, upstream has already rewritten the path, so the patch finds nothing to change. On RN 0.75–0.86 the method doesn't exist and nothing is patched.
  • I considered renaming the pod so its name matches the module name. That would change the podspec file name, the Swift module and header names, and Podfile.lock entries, and would break any Podfile that references the pod by name. The prepend is smaller and goes away by itself once 0.89 is the floor.
  • No changeset: 3.0 hasn't been released yet, so released users never hit this bug. No migration note either, because users don't need to do anything.

Testing

All builds are iOS Release on the simulator (Xcode 26.4.1, CocoaPods 1.17 on Ruby 3.3), with posthog-ios 4.0.0 from a local tag through a local URL override that isn't committed. Each app called captureFatalException through the plugin, and the resulting native $exception reached a local catcher at /i/v1/analytics/events.

App Linkage -fmodule-map-file Result
Expo 58 (RN 0.88.1), without fix static libs posthog-react-native-plugin/posthog_react_native_plugin.modulemap (missing) fails (reproduced from pod install output, matches the original report)
Expo 58 (RN 0.88.1), with fix static libs posthog_react_native_plugin.modulemap builds, launches, event received
Expo 57 (RN 0.86.3) static libs unchanged (no flattening) builds, launches, event received
Bare RN 0.78.3 use_frameworks! :linkage => :static none builds, launches, event received
Bare RN 0.78.3 default unchanged builds, launches, event received

Release info Sub-libraries affected

Libraries affected

  • All of them
  • posthog-js (web)
  • posthog-js-lite (web lite)
  • posthog-node
  • posthog-react-native
  • @posthog/react-native-plugin
  • @posthog/react
  • @posthog/ai
  • @posthog/convex
  • @posthog/next
  • @posthog/nextjs-config
  • @posthog/nuxt
  • @posthog/openfeature-node-provider
  • @posthog/openfeature-web-provider
  • @posthog/rollup-plugin
  • @posthog/webpack-plugin
  • @posthog/types
  • @posthog/browser-common

Checklist

  • All commits are signed (see Commit signing)
  • Tests for new code (no Ruby test harness for the podspec; covered by the build matrix above)
  • Accounted for the impact of any changes across different platforms
  • Accounted for backwards compatibility of any changes (no breaking changes!)
  • Took care not to unnecessarily increase the bundle size

If releasing new changes

  • Ran pnpm changeset to generate a changeset file (not needed: fixes an unreleased 3.0 regression)

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

  • Claude Code read RN 0.86.3, 0.87.0/0.87.1, 0.88.1 and 0.89.0-rc.0 spm.rb to find out which versions are affected, found the upstream fix and the rnmapbox workaround, and ran the build matrix above.
  • Rejected: renaming the pod (too much breakage) and copying the module map with a script phase (risks duplicate module definitions, which the flattening exists to avoid).

🤖 Generated with Claude Code

…tive 0.87 and 0.88 iOS

React Native 0.87 and 0.88 build a static spm_dependency pod into the shared
products dir and rewrite the app's -fmodule-map-file flags from
<pod>/<pod>.modulemap to <pod>.modulemap. The plugin's module map is named
after its module (posthog_react_native_plugin), not the pod, so the rewrite
misses it and Expo 58 iOS builds fail. Redo the rewrite with the module name,
as React Native 0.89 does (react/react-native#59182).
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

📝 No Changeset Found

This PR doesn't include a changeset. A changeset is required to release a new version.

How to add a changeset

Run this command and follow the prompts:

pnpm changeset

Remember: Never use major version bumps for posthog-js as it's autoloaded by clients.

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor
⚠️ `@posthog/react-native-plugin` is modified but this PR has no changeset

This is informational — the PR is not blocked. Click the triangle above to collapse, or push a fix and this comment will auto-delete.

Modified in this PR but no changeset added:

  • @posthog/react-native-plugin

If this change should ship, run pnpm changeset and select a bump level.
If it isn't user-facing (refactor with no behavior change, internal tooling, generated files), no action needed.

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Coherence

📄 0 spec file errors · ⛔ 0 broken rules · 🚪 2 unchecked inputs · 🐛 0 bugs that came back

What is Coherence?

Coherence compares the code with its spec files (*.spec.md). A spec file lists the rules for one part of the code.

This check read 44 parts of the code and 7 rules.

Note

These findings do not make this check fail.

None of these findings are in files that this pull request changes. You do not need to fix them in this pull request.

🚪 Unchecked inputs (2)

  • public api in packages/web/Web.spec.md. The input comes from: host-app.
  • webpack plugin in packages/webpack-plugin/Webpack-plugin.spec.md. The input comes from: build.
What this means and how to fix it

Input from outside this code comes in at these places. The spec does not say what checks that input. 10 more places were already like this when Coherence was added. This list does not show them.

To close one of these, find the place by its name in the ## entrances section of its spec file. Add one line under it:

  • If all of the input goes through one function that a rule in the spec protects, add guard: <function>.
  • If a rule in the spec already checks input from the same source, add the place's name to the entrances: line of that rule.
  • If the input needs no check, add control: none - <reason>.

To get the line to add, run npx --no -- coherence scaffold control "<name>".

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

SDK performance: posthog-node

Benchmarks completed. No changes flagged for review.

Flags require at least a 5% change in the median and all six pairs agreeing on direction. This is a noise filter, not proof of a performance change or a CI gate.

View all results
Test Measurement Before PR With PR Change Assessment
Capture and deliver events (32-byte payload, burst)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Capture and deliver events (32-byte payload, steady)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Queue an event (32-byte payload)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Queue an event (4,096-byte payload)
Shard: capture
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate all 10 flags
Shard: flags-scaling
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate all 100 flags
Shard: flags-scaling
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate all 1,000 flags
Shard: flags-scaling
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate one boolean flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a cohort-filtered flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a flag (early match)
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a flag (late match)
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a flag (no match)
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a property-filtered flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a regex-filtered flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a rollout flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Evaluate a multivariate flag
Shard: flags-single
Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ V8 samples do not expose total allocation count; sample count is not object count.​; head:​ V8 samples do not expose total allocation count; sample count is not object count.​
Capture and deliver events (32-byte payload, burst)
Shard: capture
Allocated memory per operation (estimated) 10.05 KiB/op 10.58 KiB/op 5.3% more memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Time per operation 17.19 µs/op 17.34 µs/op 0.8% more time Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Idle process memory (RSS) 102.76 MiB 102.71 MiB <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Observed peak process memory (RSS) 106.19 MiB 106.33 MiB 0.1% more memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Managed heap after settling 9.96 MiB 9.95 MiB <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Process memory after settling (RSS) 105.88 MiB 106.03 MiB 0.1% more memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Process CPU time per operation 29.98 µs/op 30.25 µs/op 0.9% more time Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Lifetime peak process memory (RSS) 106.4 MiB 106.6 MiB 0.2% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Allocated memory per operation (estimated) 18.01 KiB/op 18.15 KiB/op 0.8% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Time per operation 29.77 µs/op 29.15 µs/op 2.1% less time Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Idle process memory (RSS) 103.12 MiB 103.18 MiB <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Observed peak process memory (RSS) 113.73 MiB 113.76 MiB <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Managed heap after settling 9.96 MiB 9.96 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Process memory after settling (RSS) 109.67 MiB 109.62 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Process CPU time per operation 42.47 µs/op 42.2 µs/op 0.6% less time Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Lifetime peak process memory (RSS) 116.52 MiB 116.36 MiB 0.1% less memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Allocated memory per operation (estimated) 9.94 KiB/op 10.45 KiB/op 5.1% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Time per operation 18.11 µs/op 17.58 µs/op 3% less time Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Idle process memory (RSS) 102.4 MiB 102.34 MiB <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Observed peak process memory (RSS) 106.52 MiB 106.27 MiB 0.2% less memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Managed heap after settling 10.03 MiB 10.03 MiB <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Process memory after settling (RSS) 106.52 MiB 106.3 MiB 0.2% less memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Process CPU time per operation 31.01 µs/op 30.29 µs/op 2.3% less time Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Lifetime peak process memory (RSS) 106.86 MiB 106.73 MiB 0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Allocated memory per operation (estimated) 17.92 KiB/op 17.59 KiB/op 1.8% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Time per operation 25.59 µs/op 25.32 µs/op 1.1% less time Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Idle process memory (RSS) 102.8 MiB 102.81 MiB <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Observed peak process memory (RSS) 109.03 MiB 109.22 MiB 0.2% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Managed heap after settling 10.04 MiB 10.04 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Process memory after settling (RSS) 107.83 MiB 108.03 MiB 0.2% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Process CPU time per operation 38.9 µs/op 38.26 µs/op 1.7% less time Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Lifetime peak process memory (RSS) 109.03 MiB 109.22 MiB 0.2% more memory Not flagged
Queue an event (32-byte payload)
Shard: capture
Allocated memory per operation (estimated) 9.1 KiB/op 8.69 KiB/op 4.4% less memory Not flagged
Queue an event (32-byte payload)
Shard: capture
Time per operation 12.84 µs/op 13.17 µs/op 2.6% more time Not flagged
Queue an event (32-byte payload)
Shard: capture
Process CPU time per operation 25.07 µs/op 25.75 µs/op 2.7% more time Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Allocated memory per operation (estimated) 8.54 KiB/op 8.92 KiB/op 4.5% more memory Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Time per operation 12.72 µs/op 12.69 µs/op 0.3% less time Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Process CPU time per operation 24.79 µs/op 24.54 µs/op 1% less time Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 132.31 KiB/op 132.16 KiB/op 0.1% less memory Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Time per operation 140.52 µs/op 141.1 µs/op 0.4% more time Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Process CPU time per operation 249.52 µs/op 250.42 µs/op 0.4% more time Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 1.23 MiB/op 1.24 MiB/op 0.2% more memory Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Time per operation 1.28 ms/op 1.27 ms/op 0.5% less time Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Process CPU time per operation 2.21 ms/op 2.19 ms/op 0.6% less time Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 12.1 MiB/op 12.08 MiB/op 0.2% less memory Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Time per operation 13.17 ms/op 13.12 ms/op 0.4% less time Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Process CPU time per operation 21.88 ms/op 21.83 ms/op 0.2% less time Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Idle process memory (RSS) 286.02 MiB 285.84 MiB <0.1% less memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Observed peak process memory (RSS) 286.02 MiB 285.84 MiB <0.1% less memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Managed heap after settling 9.61 MiB 9.6 MiB <0.1% less memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Process memory after settling (RSS) 285.05 MiB 284.89 MiB <0.1% less memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Lifetime peak process memory (RSS) 286.71 MiB 286.67 MiB <0.1% less memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Idle process memory (RSS) 222.77 MiB 221.75 MiB 0.5% less memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Observed peak process memory (RSS) 238.56 MiB 238.58 MiB <0.1% more memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Managed heap after settling 11.61 MiB 11.61 MiB <0.1% less memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Process memory after settling (RSS) 233.82 MiB 233.84 MiB <0.1% more memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Lifetime peak process memory (RSS) 240.35 MiB 239.87 MiB 0.2% less memory Not flagged
Evaluate one boolean flag
Shard: flags-single
Allocated memory per operation (estimated) 17.1 KiB/op 17.11 KiB/op <0.1% more memory Not flagged
Evaluate one boolean flag
Shard: flags-single
Time per operation 41.09 µs/op 40.9 µs/op 0.5% less time Not flagged
Evaluate one boolean flag
Shard: flags-single
Process CPU time per operation 45.46 µs/op 45.25 µs/op 0.5% less time Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 14.06 KiB/op 14.02 KiB/op 0.3% less memory Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Time per operation 22.95 µs/op 22.84 µs/op 0.5% less time Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Process CPU time per operation 28.5 µs/op 27.84 µs/op 2.3% less time Not flagged
Evaluate a flag (early match)
Shard: flags-single
Allocated memory per operation (estimated) 17.48 KiB/op 17.66 KiB/op 1% more memory Not flagged
Evaluate a flag (early match)
Shard: flags-single
Time per operation 23.05 µs/op 22.78 µs/op 1.2% less time Not flagged
Evaluate a flag (early match)
Shard: flags-single
Process CPU time per operation 28 µs/op 27.65 µs/op 1.3% less time Not flagged
Evaluate a flag (late match)
Shard: flags-single
Allocated memory per operation (estimated) 22.42 KiB/op 22.4 KiB/op 0.1% less memory Not flagged
Evaluate a flag (late match)
Shard: flags-single
Time per operation 23.51 µs/op 23.23 µs/op 1.2% less time Not flagged
Evaluate a flag (late match)
Shard: flags-single
Process CPU time per operation 28.33 µs/op 27.81 µs/op 1.8% less time Not flagged
Evaluate a flag (no match)
Shard: flags-single
Allocated memory per operation (estimated) 17 KiB/op 17.02 KiB/op 0.1% more memory Not flagged
Evaluate a flag (no match)
Shard: flags-single
Time per operation 3.3 µs/op 3.17 µs/op 3.9% less time Not flagged
Evaluate a flag (no match)
Shard: flags-single
Process CPU time per operation 6.58 µs/op 6.53 µs/op 0.9% less time Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 12.71 KiB/op 12.69 KiB/op 0.2% less memory Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Time per operation 22.5 µs/op 22.27 µs/op 1% less time Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Process CPU time per operation 26.75 µs/op 26.29 µs/op 1.7% less time Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 18.31 KiB/op 18.24 KiB/op 0.4% less memory Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Time per operation 42.88 µs/op 43.34 µs/op 1.1% more time Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Process CPU time per operation 47.89 µs/op 48.55 µs/op 1.4% more time Not flagged
Evaluate a rollout flag
Shard: flags-single
Allocated memory per operation (estimated) 14.28 KiB/op 14.51 KiB/op 1.6% more memory Not flagged
Evaluate a rollout flag
Shard: flags-single
Time per operation 31.74 µs/op 31.25 µs/op 1.6% less time Not flagged
Evaluate a rollout flag
Shard: flags-single
Process CPU time per operation 36.01 µs/op 35.75 µs/op 0.7% less time Not flagged
Evaluate a multivariate flag
Shard: flags-single
Allocated memory per operation (estimated) 17.47 KiB/op 17.4 KiB/op 0.4% less memory Not flagged
Evaluate a multivariate flag
Shard: flags-single
Time per operation 40.89 µs/op 40.22 µs/op 1.6% less time Not flagged
Evaluate a multivariate flag
Shard: flags-single
Process CPU time per operation 45.06 µs/op 44.59 µs/op 1% less time Not flagged

Values are medians of paired measurements. Not flagged does not mean unchanged. Unavailable means a measurement could not be provided, not zero. Estimated allocation measurements retain their instrumentation uncertainty. RSS measures the whole process, not just SDK allocations; observed peaks are sampled checkpoints. Paired ranges in the diagnostics describe variability, not confidence intervals.

Each shard uses its own runner; compare Before PR against With PR within a row, not across shards.

Compared e27ced1a008da10acce4664fcaa91ab4bf25b605 → 15b98095ffbae4c808dd81f4904d5cab41277e25.

Full report and diagnostics

102 metric rows; 102 rows shown in all results. Omitted or shortened data remain in comparison.json, including per-runner environments, resource limits, measurement methods, samples and checkpoints.

@turnipdabeets
turnipdabeets marked this pull request as ready for review November 6, 2026 23:06
@turnipdabeets
turnipdabeets requested a review from a team as a code owner November 6, 2026 23:06

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant