Skip to content

feat(mcp): redact personal data in tool arguments, results and errors by default - #5603

Closed
lucasheriques wants to merge 8 commits into
mainfrom
lucas/mcp-payload-pii
Closed

lucasheriques wants to merge 8 commits into
mainfrom
lucas/mcp-payload-pii

Conversation

@lucasheriques

@lucasheriques lucasheriques commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Problem

@posthog/mcp should not capture personal data in tool arguments, results and errors by default. It redacted it only in intent and feedback text, so a customer-lookup tool sent the customer's email in $mcp_parameters and $mcp_response. sdk-specs#190 (merged) specifies the behavior. This is the reference port, and Python, Go, Ruby and Rust follow it.

Changes

  • Payload pass. redactPayloadPii in @posthog/core privacy.ts is narrower than the intent pass:
    • email, Luhn-valid card, US SSN, IPv6
    • IPv4 only when public and not part of a version string
    • phone numbers only with +, 00, 011 or a parenthesized area code
    • cards only as one 13–19 digit run or grouped as cards are printed (4-4-4-4, 4-4-4-4-3, 4-6-4, 4-6-5)
  • Where it applies, unless redactPayloadPersonalData: false:
    • every string and key in $mcp_parameters and $mcp_response
    • card-number JSON numbers
    • $mcp_error_message
    • resource-read URIs
    • $exception values
  • Escape masking, not JSON parsing. Patterns run on a same-length shadow of the text. In it, JSON escapes are masked or read as the characters they encode, and redactions are spliced into the original at the same offsets. So an identifier after \n or   can't hide, valid JSON stays valid, and clean text comes back byte for byte. Duplicate keys, integers above 2^53 and __proto__ need no special cases.
  • JSON number tokens. These are replaced whole, as "[redacted]", only in text that parses as JSON. In other text a card is redacted unquoted, so a URL around it stays one URL for the credential pass.
  • Bounded cost. Breadth and depth limits apply before sanitizing, and arguments are sanitized once. Scanning stops at a window. The window grows in bounded steps when redaction shrinks the head, and at the cap the last 32,768 characters are dropped so a half-cut identifier can't ship. A URL crossing the window is replaced whole. Keys are cut to 256 characters after redaction. 1 MB to 20 MB inputs cost the same.
  • Card finder. A loop replaces the card regex, so 12 MB of digits no longer overflows the stack (main does). The intent pass keeps main's card coverage, and a card followed by an SSN no longer swallows part of the SSN.
  • Smaller fixes. $mcp_input_keys drops a name the pass would change, and feedback JSON extras are sanitized as free text.
  • Changeset. @posthog/mcp and @posthog/core minor. It lists what is redacted, the opt-out, and the known false positives:
    • ddd-dd-dddd references
    • four-part versions after a space, : or @
    • about 1 in 10 ids of 13–19 digits
    • 00-prefixed ids
    • +-signed numbers and coordinates
    • long URLs crossing the scan window

For reviewers:

  • Known gaps that are already on main (follow-ups, not caused by this PR):
    • Keys get no credential, URL or binary pass, which the spec requires.
    • A few synthetic strings that main redacted only because it misread xxx: as a URL scheme.
    • The first group of an IPv6 address cut at the window edge.
  • Trade-off at the window cap. A head that redaction shrinks over 16x keeps less text, in exchange for never shipping a partial identifier.

How I tested

  • Six adversarial gate rounds (Opus), each answered with failing-first tests. The final round's clean runs:
    • intent parity with main over 900k inputs from a full-period PRNG
    • 36,360 window-edge runs with no leaks
    • 78,005 random JSON documents, all valid, with clean ones unchanged
    • flat cost from 1 MB to 20 MB
  • Suites:
    • pnpm --filter @posthog/mcp test:unit: 1837 passed.
    • @posthog/core: 2355 passed.
    • browser webmcp.test.ts: 46 passed.
    • lint, check-types and format are clean.
    • test:integration passes, apart from the 2 expected failures.

… by default

We told OpenAI's plugin directory review that the MCP SDKs redact personal
data in tool payloads by default. sdk-specs#190 specifies it; this is the JS
reference port.

What:
- @posthog/core: redactPayloadPii, the intent pass narrowed for payloads
  (public, unglued IPv4 only; phones only with +/00/011 or a parenthesized
  area code; a bare JSON-number card is written "[redacted]" quoted).
  sanitizeCapturedValue runs it, when redactPayloadPersonalData is set,
  inside the existing redactCapturedHead cut between the credential and URL
  passes, on object keys (collisions keep the key that sorts first by code
  point), and on Luhn-valid card numbers.
- @posthog/mcp: new redactPayloadPersonalData option (default true) on
  instrument() and PostHogMCP, applied to $mcp_parameters, $mcp_response,
  exception values (cut at the 2,048 error limit) and resource read URIs.
  $mcp_input_keys drops names the token, URL or payload pass would change.
  $mcp_feedback_<name> JSON text is sanitized as free text, keys included.

Tested:
- pnpm --filter @posthog/mcp test:unit: 1049 passed (the new tests failed first)
- pnpm --filter @posthog/mcp lint, check-types: clean
- pnpm --filter @posthog/mcp build && test:integration: green (2 expected failures)
- packages/core test:unit: 2356 passed; browser webmcp.test.ts: 46 passed

Reviewer notes:
- Per the spec's order (personal data before URLs), a URL with user:pass@host
  reads as an email and is redacted whole, read URIs included. Two existing
  expectations changed accordingly.
- @posthog/core is listed in the changeset: mcp depends on it unbundled.
@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Coherence

📄 0 spec file errors · ⛔ 0 broken rules · 🚪 1 unchecked input · 🐛 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 (1)

  • public api in packages/web/Web.spec.md. The input comes from: host-app.
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

@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Size Change: +66.1 kB (+0.25%)

Total Size: 26.5 MB

📦 View Changed
Filename Size Change
packages/browser/dist/array.full.es5.js 588 kB +2.66 kB (+0.46%)
packages/browser/dist/array.full.js 726 kB +2.45 kB (+0.34%)
packages/browser/dist/array.full.no-external.js 793 kB +2.45 kB (+0.31%)
packages/browser/dist/array.js 377 kB +2.45 kB (+0.65%)
packages/browser/dist/array.no-external.js 423 kB +2.45 kB (+0.58%)
packages/browser/dist/default-extensions.js 374 kB +2.45 kB (+0.66%)
packages/browser/dist/extension-bundles.js 225 kB +2.43 kB (+1.09%)
packages/browser/dist/main.js 381 kB +2.45 kB (+0.65%)
packages/browser/dist/module.full.cjs 730 kB +2.45 kB (+0.34%)
packages/browser/dist/module.full.js 730 kB +2.45 kB (+0.34%)
packages/browser/dist/module.full.no-external.cjs 797 kB +2.45 kB (+0.31%)
packages/browser/dist/module.full.no-external.js 797 kB +2.45 kB (+0.31%)
packages/browser/dist/module.js 380 kB +2.45 kB (+0.65%)
packages/browser/dist/module.mjs 380 kB +2.45 kB (+0.65%)
packages/browser/dist/module.no-external.cjs 427 kB +2.45 kB (+0.58%)
packages/browser/dist/module.no-external.js 427 kB +2.45 kB (+0.58%)
packages/core/dist/privacy.js 27.1 kB +11.5 kB (+73.5%) 🆘
packages/core/dist/privacy.mjs 25.3 kB +11.4 kB (+81.4%) 🆘
packages/mcp/dist/extensions/capture.js 4.19 kB +83 B (+2.02%)
packages/mcp/dist/extensions/capture.mjs 2.73 kB +83 B (+3.13%)
packages/mcp/dist/extensions/feedback.js 12.2 kB +64 B (+0.53%)
packages/mcp/dist/extensions/feedback.mjs 9.2 kB +18 B (+0.2%)
packages/mcp/dist/extensions/mcp-payloads.js 4.19 kB +228 B (+5.76%) 🔍
packages/mcp/dist/extensions/mcp-payloads.mjs 2.2 kB -47 B (-2.09%)
packages/mcp/dist/extensions/posthog-mcp.js 17.4 kB +189 B (+1.1%)
packages/mcp/dist/extensions/posthog-mcp.mjs 14 kB +189 B (+1.37%)
packages/mcp/dist/extensions/sanitization.js 5.28 kB +451 B (+9.35%) 🔍
packages/mcp/dist/extensions/sanitization.mjs 3.54 kB +611 B (+20.9%) 🚨
packages/mcp/dist/extensions/sink.js 4.48 kB +9 B (+0.2%)
packages/mcp/dist/extensions/sink.mjs 2.68 kB +9 B (+0.34%)
packages/mcp/dist/extensions/tool-input.js 5.04 kB +228 B (+4.73%) 🔍
packages/mcp/dist/extensions/tool-input.mjs 3.44 kB +163 B (+4.98%) 🔍
packages/mcp/dist/extensions/truncation.js 13 kB +1.05 kB (+8.83%) 🔍
packages/mcp/dist/extensions/truncation.mjs 10.6 kB +579 B (+5.78%) 🔍
ℹ️ View Unchanged
Filename Size
packages/ai/dist/adk/index.cjs 41.9 kB
packages/ai/dist/adk/index.mjs 41.6 kB
packages/ai/dist/anthropic/index.cjs 47.5 kB
packages/ai/dist/anthropic/index.mjs 46.1 kB
packages/ai/dist/claude-agent-sdk/index.cjs 50.1 kB
packages/ai/dist/claude-agent-sdk/index.mjs 49.8 kB
packages/ai/dist/evaluations/index.cjs 59.1 kB
packages/ai/dist/evaluations/index.mjs 58.7 kB
packages/ai/dist/gemini/index.cjs 60.8 kB
packages/ai/dist/gemini/index.mjs 60.5 kB
packages/ai/dist/genkit/index.cjs 36.3 kB
packages/ai/dist/genkit/index.mjs 36.1 kB
packages/ai/dist/index.cjs 66.5 kB
packages/ai/dist/index.mjs 66.2 kB
packages/ai/dist/langchain/index.cjs 43.1 kB
packages/ai/dist/langchain/index.mjs 42.9 kB
packages/ai/dist/langchain/middleware/index.cjs 49.6 kB
packages/ai/dist/langchain/middleware/index.mjs 49.2 kB
packages/ai/dist/openai-agents/index.cjs 34.9 kB
packages/ai/dist/openai-agents/index.mjs 34.7 kB
packages/ai/dist/openai/index.cjs 92.3 kB
packages/ai/dist/openai/index.mjs 91.7 kB
packages/ai/dist/otel/index.browser.cjs 38.1 kB
packages/ai/dist/otel/index.browser.mjs 37.7 kB
packages/ai/dist/otel/index.cjs 38.2 kB
packages/ai/dist/otel/index.mjs 37.8 kB
packages/ai/dist/vercel/index.cjs 48.4 kB
packages/ai/dist/vercel/index.mjs 48.2 kB
packages/browser-common/dist/autocapture-config.js 585 B
packages/browser-common/dist/autocapture-config.mjs 12 B
packages/browser-common/dist/autocapture.js 29.9 kB
packages/browser-common/dist/autocapture.mjs 23.9 kB
packages/browser-common/dist/client.js 585 B
packages/browser-common/dist/client.mjs 12 B
packages/browser-common/dist/config.js 1.52 kB
packages/browser-common/dist/config.mjs 217 B
packages/browser-common/dist/console-logs.js 13 kB
packages/browser-common/dist/console-logs.mjs 11.3 kB
packages/browser-common/dist/constants.js 6.37 kB
packages/browser-common/dist/constants.mjs 1.94 kB
packages/browser-common/dist/disposable.js 1.72 kB
packages/browser-common/dist/disposable.mjs 386 B
packages/browser-common/dist/extension-runtime.js 3.17 kB
packages/browser-common/dist/extension-runtime.mjs 1.83 kB
packages/browser-common/dist/extension-tokens.js 1.44 kB
packages/browser-common/dist/extension-tokens.mjs 98 B
packages/browser-common/dist/extension.js 585 B
packages/browser-common/dist/extension.mjs 12 B
packages/browser-common/dist/feature-flags-config.js 585 B
packages/browser-common/dist/feature-flags-config.mjs 12 B
packages/browser-common/dist/feature-flags.js 64.7 kB
packages/browser-common/dist/feature-flags.mjs 58.4 kB
packages/browser-common/dist/index.js 5.87 kB
packages/browser-common/dist/index.mjs 447 B
packages/browser-common/dist/logs-config.js 3.35 kB
packages/browser-common/dist/logs-config.mjs 1.99 kB
packages/browser-common/dist/logs-types.js 1.46 kB
packages/browser-common/dist/logs-types.mjs 133 B
packages/browser-common/dist/logs.js 20 kB
packages/browser-common/dist/logs.mjs 18.1 kB
packages/browser-common/dist/persistence.js 585 B
packages/browser-common/dist/persistence.mjs 12 B
packages/browser-common/dist/pubsub.js 2.63 kB
packages/browser-common/dist/pubsub.mjs 1.35 kB
packages/browser-common/dist/rageclick.js 2.51 kB
packages/browser-common/dist/rageclick.mjs 1.21 kB
packages/browser-common/dist/survey-action-matcher.js 7.81 kB
packages/browser-common/dist/survey-action-matcher.mjs 5.96 kB
packages/browser-common/dist/survey-constants.js 4.61 kB
packages/browser-common/dist/survey-constants.mjs 2.17 kB
packages/browser-common/dist/survey-event-host.js 585 B
packages/browser-common/dist/survey-event-host.mjs 12 B
packages/browser-common/dist/survey-event-receiver-base.js 15.2 kB
packages/browser-common/dist/survey-event-receiver-base.mjs 13.5 kB
packages/browser-common/dist/survey-event-receiver.js 5.84 kB
packages/browser-common/dist/survey-event-receiver.mjs 3.7 kB
packages/browser-common/dist/survey-render-context.js 1.59 kB
packages/browser-common/dist/survey-render-context.mjs 285 B
packages/browser-common/dist/surveys-config.js 2.82 kB
packages/browser-common/dist/surveys-config.mjs 619 B
packages/browser-common/dist/surveys-renderer.js 71.1 kB
packages/browser-common/dist/surveys-renderer.mjs 60.7 kB
packages/browser-common/dist/surveys.js 28 kB
packages/browser-common/dist/surveys.mjs 23 kB
packages/browser-common/dist/surveys/components/BottomSection.js 3.4 kB
packages/browser-common/dist/surveys/components/BottomSection.mjs 1.74 kB
packages/browser-common/dist/surveys/components/ConfirmationMessage.js 4 kB
packages/browser-common/dist/surveys/components/ConfirmationMessage.mjs 2.09 kB
packages/browser-common/dist/surveys/components/IntroScreen.js 3.48 kB
packages/browser-common/dist/surveys/components/IntroScreen.mjs 1.68 kB
packages/browser-common/dist/surveys/components/PostHogLogo.js 2 kB
packages/browser-common/dist/surveys/components/PostHogLogo.mjs 614 B
packages/browser-common/dist/surveys/components/QuestionHeader.js 3.48 kB
packages/browser-common/dist/surveys/components/QuestionHeader.mjs 1.64 kB
packages/browser-common/dist/surveys/components/QuestionTypes.js 25.9 kB
packages/browser-common/dist/surveys/components/QuestionTypes.mjs 21 kB
packages/browser-common/dist/surveys/icons.js 15.5 kB
packages/browser-common/dist/surveys/icons.mjs 12.3 kB
packages/browser-common/dist/surveys/survey-branching.js 5.99 kB
packages/browser-common/dist/surveys/survey-branching.mjs 3.9 kB
packages/browser-common/dist/surveys/survey-html-sanitizer.js 5.18 kB
packages/browser-common/dist/surveys/survey-html-sanitizer.mjs 3.47 kB
packages/browser-common/dist/surveys/survey-styles.js 14.7 kB
packages/browser-common/dist/surveys/survey-styles.mjs 13.4 kB
packages/browser-common/dist/surveys/survey-translations.js 2.69 kB
packages/browser-common/dist/surveys/survey-translations.mjs 1.08 kB
packages/browser-common/dist/surveys/survey-url-prefill.js 7.99 kB
packages/browser-common/dist/surveys/survey-url-prefill.mjs 5.62 kB
packages/browser-common/dist/surveys/surveys-extension-utils.js 34.6 kB
packages/browser-common/dist/surveys/surveys-extension-utils.mjs 26.1 kB
packages/browser-common/dist/token.js 585 B
packages/browser-common/dist/token.mjs 12 B
packages/browser-common/dist/types/compression.js 1.37 kB
packages/browser-common/dist/types/compression.mjs 93 B
packages/browser-common/dist/types/feature-flags.js 585 B
packages/browser-common/dist/types/feature-flags.mjs 12 B
packages/browser-common/dist/types/index.js 4.16 kB
packages/browser-common/dist/types/index.mjs 181 B
packages/browser-common/dist/types/network-recording.js 585 B
packages/browser-common/dist/types/network-recording.mjs 12 B
packages/browser-common/dist/types/remote-config.js 585 B
packages/browser-common/dist/types/remote-config.mjs 12 B
packages/browser-common/dist/types/surveys.js 585 B
packages/browser-common/dist/types/surveys.mjs 12 B
packages/browser-common/dist/utils/array-at-polyfill.js 619 B
packages/browser-common/dist/utils/array-at-polyfill.mjs 437 B
packages/browser-common/dist/utils/array-find-last-polyfill.js 604 B
packages/browser-common/dist/utils/array-find-last-polyfill.mjs 422 B
packages/browser-common/dist/utils/autocapture-utils.js 26.5 kB
packages/browser-common/dist/utils/autocapture-utils.mjs 20.4 kB
packages/browser-common/dist/utils/blocked-uas.js 2.2 kB
packages/browser-common/dist/utils/blocked-uas.mjs 598 B
packages/browser-common/dist/utils/console-original.js 1.49 kB
packages/browser-common/dist/utils/console-original.mjs 171 B
packages/browser-common/dist/utils/convert-to-url.js 1.62 kB
packages/browser-common/dist/utils/convert-to-url.mjs 298 B
packages/browser-common/dist/utils/cookie-utils.js 1.99 kB
packages/browser-common/dist/utils/cookie-utils.mjs 673 B
packages/browser-common/dist/utils/device-model-utils.js 2.08 kB
packages/browser-common/dist/utils/device-model-utils.mjs 678 B
packages/browser-common/dist/utils/element-utils.js 2.56 kB
packages/browser-common/dist/utils/element-utils.mjs 804 B
packages/browser-common/dist/utils/elements-chain-utils.js 2.86 kB
packages/browser-common/dist/utils/elements-chain-utils.mjs 1.23 kB
packages/browser-common/dist/utils/encode-utils.js 1.49 kB
packages/browser-common/dist/utils/encode-utils.mjs 205 B
packages/browser-common/dist/utils/event-utils.js 16.1 kB
packages/browser-common/dist/utils/event-utils.mjs 10.2 kB
packages/browser-common/dist/utils/general-utils.js 7.83 kB
packages/browser-common/dist/utils/general-utils.mjs 4.77 kB
packages/browser-common/dist/utils/globals.js 2.83 kB
packages/browser-common/dist/utils/globals.mjs 842 B
packages/browser-common/dist/utils/logger.js 3.46 kB
packages/browser-common/dist/utils/logger.mjs 1.67 kB
packages/browser-common/dist/utils/matcher-utils.js 2.78 kB
packages/browser-common/dist/utils/matcher-utils.mjs 1.3 kB
packages/browser-common/dist/utils/patch.js 2.94 kB
packages/browser-common/dist/utils/patch.mjs 1.62 kB
packages/browser-common/dist/utils/promise-utils.js 1.45 kB
packages/browser-common/dist/utils/promise-utils.mjs 169 B
packages/browser-common/dist/utils/property-utils.js 3.63 kB
packages/browser-common/dist/utils/property-utils.mjs 1.6 kB
packages/browser-common/dist/utils/prototype-utils.js 3.61 kB
packages/browser-common/dist/utils/prototype-utils.mjs 1.86 kB
packages/browser-common/dist/utils/regex-utils.js 1.55 kB
packages/browser-common/dist/utils/regex-utils.mjs 71 B
packages/browser-common/dist/utils/request-reachability.js 2.55 kB
packages/browser-common/dist/utils/request-reachability.mjs 996 B
packages/browser-common/dist/utils/request-utils.js 6.5 kB
packages/browser-common/dist/utils/request-utils.mjs 3.68 kB
packages/browser-common/dist/utils/sanitize-url.js 1.76 kB
packages/browser-common/dist/utils/sanitize-url.mjs 475 B
packages/browser-common/dist/utils/simple-event-emitter.js 1.86 kB
packages/browser-common/dist/utils/simple-event-emitter.mjs 553 B
packages/browser-common/dist/utils/stylesheet-loader.js 2.23 kB
packages/browser-common/dist/utils/stylesheet-loader.mjs 823 B
packages/browser-common/dist/utils/survey-utils.js 5.74 kB
packages/browser-common/dist/utils/survey-utils.mjs 2.05 kB
packages/browser-common/dist/utils/timezone.js 1.44 kB
packages/browser-common/dist/utils/timezone.mjs 163 B
packages/browser-common/dist/utils/type-utils.js 1.68 kB
packages/browser-common/dist/utils/type-utils.mjs 258 B
packages/browser-common/dist/utils/url-targeting-utils.js 2.4 kB
packages/browser-common/dist/utils/url-targeting-utils.mjs 823 B
packages/browser-common/dist/utils/uuidv7.js 6.81 kB
packages/browser-common/dist/utils/uuidv7.mjs 5.26 kB
packages/browser-next/dist/analytics-buffer.js 7.69 kB
packages/browser-next/dist/analytics-buffer.mjs 6.03 kB
packages/browser-next/dist/analytics-delivery.js 8.79 kB
packages/browser-next/dist/analytics-delivery.mjs 7.11 kB
packages/browser-next/dist/analytics-internal.js 1.95 kB
packages/browser-next/dist/analytics-internal.mjs 273 B
packages/browser-next/dist/analytics-options.js 585 B
packages/browser-next/dist/analytics-options.mjs 12 B
packages/browser-next/dist/analytics.js 1.67 kB
packages/browser-next/dist/analytics.mjs 259 B
packages/browser-next/dist/autocapture-options.js 1.85 kB
packages/browser-next/dist/autocapture-options.mjs 513 B
packages/browser-next/dist/autocapture.js 4.44 kB
packages/browser-next/dist/autocapture.mjs 3.01 kB
packages/browser-next/dist/automatic-analytics.js 1.64 kB
packages/browser-next/dist/automatic-analytics.mjs 298 B
packages/browser-next/dist/automatic-surveys.js 1.54 kB
packages/browser-next/dist/automatic-surveys.mjs 189 B
packages/browser-next/dist/bot-filter.js 2.38 kB
packages/browser-next/dist/bot-filter.mjs 1.09 kB
packages/browser-next/dist/browser-client.js 585 B
packages/browser-next/dist/browser-client.mjs 12 B
packages/browser-next/dist/capture-summary.js 2.14 kB
packages/browser-next/dist/capture-summary.mjs 647 B
packages/browser-next/dist/capture-v1.js 29.9 kB
packages/browser-next/dist/capture-v1.mjs 27.2 kB
packages/browser-next/dist/core.js 1.96 kB
packages/browser-next/dist/core.mjs 244 B
packages/browser-next/dist/event-buffer.js 5.32 kB
packages/browser-next/dist/event-buffer.mjs 4.04 kB
packages/browser-next/dist/extensions/registry.js 4.42 kB
packages/browser-next/dist/extensions/registry.mjs 3.12 kB
packages/browser-next/dist/flags-internal.js 585 B
packages/browser-next/dist/flags-internal.mjs 12 B
packages/browser-next/dist/flags-options.js 585 B
packages/browser-next/dist/flags-options.mjs 12 B
packages/browser-next/dist/flags-token.js 1.4 kB
packages/browser-next/dist/flags-token.mjs 80 B
packages/browser-next/dist/flags.js 6.61 kB
packages/browser-next/dist/flags.mjs 5.02 kB
packages/browser-next/dist/id.js 2.25 kB
packages/browser-next/dist/id.mjs 983 B
packages/browser-next/dist/index.js 5.46 kB
packages/browser-next/dist/index.mjs 3.38 kB
packages/browser-next/dist/lane.js 15.1 kB
packages/browser-next/dist/lane.mjs 13.8 kB
packages/browser-next/dist/logger.js 2.08 kB
packages/browser-next/dist/logger.mjs 742 B
packages/browser-next/dist/logs-internal.js 585 B
packages/browser-next/dist/logs-internal.mjs 12 B
packages/browser-next/dist/logs-options.js 1.84 kB
packages/browser-next/dist/logs-options.mjs 529 B
packages/browser-next/dist/logs.js 5.33 kB
packages/browser-next/dist/logs.mjs 3.83 kB
packages/browser-next/dist/named-error.js 1.57 kB
packages/browser-next/dist/named-error.mjs 271 B
packages/browser-next/dist/posthog.js 34.7 kB
packages/browser-next/dist/posthog.mjs 32.3 kB
packages/browser-next/dist/rate-limiter.js 3.06 kB
packages/browser-next/dist/rate-limiter.mjs 1.75 kB
packages/browser-next/dist/remote-config.js 1.85 kB
packages/browser-next/dist/remote-config.mjs 483 B
packages/browser-next/dist/request.js 4.99 kB
packages/browser-next/dist/request.mjs 3.58 kB
packages/browser-next/dist/state.js 24.9 kB
packages/browser-next/dist/state.mjs 23.1 kB
packages/browser-next/dist/surveys-extension.js 11.3 kB
packages/browser-next/dist/surveys-extension.mjs 9.73 kB
packages/browser-next/dist/surveys-internal.js 585 B
packages/browser-next/dist/surveys-internal.mjs 12 B
packages/browser-next/dist/surveys-options.js 1.44 kB
packages/browser-next/dist/surveys-options.mjs 112 B
packages/browser-next/dist/surveys.js 1.77 kB
packages/browser-next/dist/surveys.mjs 258 B
packages/browser-next/dist/types.js 585 B
packages/browser-next/dist/types.mjs 12 B
packages/browser-next/dist/version.js 1.31 kB
packages/browser-next/dist/version.mjs 45 B
packages/browser/dist/all-external-dependencies.js 428 kB
packages/browser/dist/conversations.js 75.1 kB
packages/browser/dist/crisp-chat-integration.js 1.67 kB
packages/browser/dist/customizations.full.js 19.5 kB
packages/browser/dist/customizations.js 19.1 kB
packages/browser/dist/dead-clicks-autocapture.js 24 kB
packages/browser/dist/element-inference.js 5.28 kB
packages/browser/dist/exception-autocapture.js 17.8 kB
packages/browser/dist/external-scripts-loader.js 3.7 kB
packages/browser/dist/intercom-integration.js 1.72 kB
packages/browser/dist/lazy-recorder.js 221 kB
packages/browser/dist/loader-bootstrap.js 4.93 kB
packages/browser/dist/loader.js 6.67 kB
packages/browser/dist/logs.js 7.21 kB
packages/browser/dist/module.slim.js 158 kB
packages/browser/dist/module.slim.no-external.js 172 kB
packages/browser/dist/posthog-recorder.js 220 kB
packages/browser/dist/product-tours-preview.js 78.1 kB
packages/browser/dist/product-tours.js 122 kB
packages/browser/dist/recorder-v2.js 140 kB
packages/browser/dist/recorder.js 140 kB
packages/browser/dist/rrweb-plugin-console-record.js 7.63 kB
packages/browser/dist/rrweb-types.js 2.41 kB
packages/browser/dist/rrweb.js 333 kB
packages/browser/dist/surveys-preview.js 120 kB
packages/browser/dist/surveys.js 144 kB
packages/browser/dist/tracing-headers.js 4.71 kB
packages/browser/dist/web-vitals-soft-navs.js 11.1 kB
packages/browser/dist/web-vitals-with-attribution-soft-navs.js 27 kB
packages/browser/dist/web-vitals-with-attribution.js 27 kB
packages/browser/dist/web-vitals.js 11 kB
packages/browser/react/dist/esm/index.js 23.3 kB
packages/browser/react/dist/esm/slim/index.js 19.5 kB
packages/browser/react/dist/esm/surveys/index.js 4.22 kB
packages/browser/react/dist/umd/index.js 27.8 kB
packages/browser/react/dist/umd/slim/index.js 23.5 kB
packages/browser/react/dist/umd/surveys/index.js 6.33 kB
packages/convex/dist/client/feature-flags/crypto.js 76 B
packages/convex/dist/client/feature-flags/evaluator.js 16.2 kB
packages/convex/dist/client/feature-flags/index.js 196 B
packages/convex/dist/client/feature-flags/match-property.js 5.7 kB
packages/convex/dist/client/feature-flags/types.js 44 B
packages/convex/dist/client/index.js 14.8 kB
packages/convex/dist/component/_generated/api.js 712 B
packages/convex/dist/component/_generated/component.js 212 B
packages/convex/dist/component/_generated/dataModel.js 230 B
packages/convex/dist/component/_generated/server.js 3.74 kB
packages/convex/dist/component/convex.config.js 1.66 kB
packages/convex/dist/component/crons.js 969 B
packages/convex/dist/component/lib.js 24.9 kB
packages/convex/dist/component/schema.js 1.17 kB
packages/convex/dist/component/version.js 67 B
packages/core/dist/cookie.js 5.71 kB
packages/core/dist/cookie.mjs 3.4 kB
packages/core/dist/error-tracking/chunk-ids.js 3.44 kB
packages/core/dist/error-tracking/chunk-ids.mjs 2.11 kB
packages/core/dist/error-tracking/coercers/dom-exception-coercer.js 2.4 kB
packages/core/dist/error-tracking/coercers/dom-exception-coercer.mjs 993 B
packages/core/dist/error-tracking/coercers/error-coercer.js 2.58 kB
packages/core/dist/error-tracking/coercers/error-coercer.mjs 1.24 kB
packages/core/dist/error-tracking/coercers/error-event-coercer.js 2.45 kB
packages/core/dist/error-tracking/coercers/error-event-coercer.mjs 1.05 kB
packages/core/dist/error-tracking/coercers/event-coercer.js 1.92 kB
packages/core/dist/error-tracking/coercers/event-coercer.mjs 548 B
packages/core/dist/error-tracking/coercers/index.js 5.82 kB
packages/core/dist/error-tracking/coercers/index.mjs 326 B
packages/core/dist/error-tracking/coercers/object-coercer.js 4.13 kB
packages/core/dist/error-tracking/coercers/object-coercer.mjs 2.53 kB
packages/core/dist/error-tracking/coercers/primitive-coercer.js 1.76 kB
packages/core/dist/error-tracking/coercers/primitive-coercer.mjs 419 B
packages/core/dist/error-tracking/coercers/promise-rejection-event.js 2.69 kB
packages/core/dist/error-tracking/coercers/promise-rejection-event.mjs 1.25 kB
packages/core/dist/error-tracking/coercers/string-coercer.js 2.11 kB
packages/core/dist/error-tracking/coercers/string-coercer.mjs 820 B
packages/core/dist/error-tracking/coercers/utils.js 2.16 kB
packages/core/dist/error-tracking/coercers/utils.mjs 716 B
packages/core/dist/error-tracking/error-properties-builder.js 10.1 kB
packages/core/dist/error-tracking/error-properties-builder.mjs 8.58 kB
packages/core/dist/error-tracking/exception-steps.js 6.1 kB
packages/core/dist/error-tracking/exception-steps.mjs 3.83 kB
packages/core/dist/error-tracking/index.js 4.62 kB
packages/core/dist/error-tracking/index.mjs 222 B
packages/core/dist/error-tracking/parsers/base.js 2.43 kB
packages/core/dist/error-tracking/parsers/base.mjs 961 B
packages/core/dist/error-tracking/parsers/chrome.js 2.83 kB
packages/core/dist/error-tracking/parsers/chrome.mjs 1.32 kB
packages/core/dist/error-tracking/parsers/gecko.js 2.57 kB
packages/core/dist/error-tracking/parsers/gecko.mjs 1.13 kB
packages/core/dist/error-tracking/parsers/index.js 8.87 kB
packages/core/dist/error-tracking/parsers/index.mjs 6.03 kB
packages/core/dist/error-tracking/parsers/node.js 4.33 kB
packages/core/dist/error-tracking/parsers/node.mjs 2.96 kB
packages/core/dist/error-tracking/parsers/opera.js 2.35 kB
packages/core/dist/error-tracking/parsers/opera.mjs 746 B
packages/core/dist/error-tracking/parsers/safari.js 1.98 kB
packages/core/dist/error-tracking/parsers/safari.mjs 574 B
packages/core/dist/error-tracking/parsers/winjs.js 1.82 kB
packages/core/dist/error-tracking/parsers/winjs.mjs 426 B
packages/core/dist/error-tracking/release.js 1.68 kB
packages/core/dist/error-tracking/release.mjs 366 B
packages/core/dist/error-tracking/types.js 1.42 kB
packages/core/dist/error-tracking/types.mjs 131 B
packages/core/dist/error-tracking/utils.js 1.9 kB
packages/core/dist/error-tracking/utils.mjs 604 B
packages/core/dist/eventemitter.js 1.88 kB
packages/core/dist/eventemitter.mjs 571 B
packages/core/dist/featureFlagLocalEvaluation.js 28.9 kB
packages/core/dist/featureFlagLocalEvaluation.mjs 26.1 kB
packages/core/dist/featureFlagUtils.js 8.61 kB
packages/core/dist/featureFlagUtils.mjs 5.52 kB
packages/core/dist/gzip.js 5.88 kB
packages/core/dist/gzip.mjs 3.87 kB
packages/core/dist/index.js 27.9 kB
packages/core/dist/index.mjs 2.02 kB
packages/core/dist/logs/index.js 11.8 kB
packages/core/dist/logs/index.mjs 9.83 kB
packages/core/dist/logs/logs-utils.js 6.68 kB
packages/core/dist/logs/logs-utils.mjs 4.53 kB
packages/core/dist/logs/types.js 585 B
packages/core/dist/logs/types.mjs 12 B
packages/core/dist/metrics/config.js 2.05 kB
packages/core/dist/metrics/config.mjs 735 B
packages/core/dist/metrics/index.js 19.7 kB
packages/core/dist/metrics/index.mjs 16.6 kB
packages/core/dist/metrics/metrics-utils.js 3.67 kB
packages/core/dist/metrics/metrics-utils.mjs 1.68 kB
packages/core/dist/metrics/types.js 585 B
packages/core/dist/metrics/types.mjs 12 B
packages/core/dist/posthog-core-stateless.js 49.3 kB
packages/core/dist/posthog-core-stateless.mjs 45.9 kB
packages/core/dist/posthog-core.js 50.4 kB
packages/core/dist/posthog-core.mjs 44.7 kB
packages/core/dist/surveys/activation.js 2.29 kB
packages/core/dist/surveys/activation.mjs 572 B
packages/core/dist/surveys/events.js 5.82 kB
packages/core/dist/surveys/events.mjs 3.14 kB
packages/core/dist/surveys/index.js 7.48 kB
packages/core/dist/surveys/index.mjs 921 B
packages/core/dist/surveys/keys.js 1.8 kB
packages/core/dist/surveys/keys.mjs 350 B
packages/core/dist/surveys/property-matching.js 3.8 kB
packages/core/dist/surveys/property-matching.mjs 2.15 kB
packages/core/dist/surveys/shuffling.js 2.53 kB
packages/core/dist/surveys/shuffling.mjs 1.07 kB
packages/core/dist/surveys/translations.js 9.18 kB
packages/core/dist/surveys/translations.mjs 6.83 kB
packages/core/dist/surveys/validation.js 3.15 kB
packages/core/dist/surveys/validation.mjs 1.51 kB
packages/core/dist/testing/index.js 2.76 kB
packages/core/dist/testing/index.mjs 79 B
packages/core/dist/testing/PostHogCoreTestClient.js 3.35 kB
packages/core/dist/testing/PostHogCoreTestClient.mjs 1.85 kB
packages/core/dist/testing/test-utils.js 2.9 kB
packages/core/dist/testing/test-utils.mjs 1.11 kB
packages/core/dist/traces/config.js 4.62 kB
packages/core/dist/traces/config.mjs 3.27 kB
packages/core/dist/traces/context.js 1.64 kB
packages/core/dist/traces/context.mjs 318 B
packages/core/dist/traces/ids.js 3.2 kB
packages/core/dist/traces/ids.mjs 1.52 kB
packages/core/dist/traces/index.js 26.7 kB
packages/core/dist/traces/index.mjs 24 kB
packages/core/dist/traces/otlp.js 6.33 kB
packages/core/dist/traces/otlp.mjs 4.14 kB
packages/core/dist/traces/sanitize.js 3.59 kB
packages/core/dist/traces/sanitize.mjs 1.88 kB
packages/core/dist/traces/span.js 20 kB
packages/core/dist/traces/span.mjs 16.7 kB
packages/core/dist/traces/traceparent.js 4.54 kB
packages/core/dist/traces/traceparent.mjs 2.54 kB
packages/core/dist/traces/types.js 585 B
packages/core/dist/traces/types.mjs 12 B
packages/core/dist/tracing-headers.js 3.48 kB
packages/core/dist/tracing-headers.mjs 2.08 kB
packages/core/dist/types.js 8.53 kB
packages/core/dist/types.mjs 5.37 kB
packages/core/dist/utils/backoff.js 2.36 kB
packages/core/dist/utils/backoff.mjs 611 B
packages/core/dist/utils/bot-detection.js 4.19 kB
packages/core/dist/utils/bot-detection.mjs 2.59 kB
packages/core/dist/utils/browser-utils.js 1.57 kB
packages/core/dist/utils/browser-utils.mjs 182 B
packages/core/dist/utils/bucketed-rate-limiter.js 4.32 kB
packages/core/dist/utils/bucketed-rate-limiter.mjs 2.22 kB
packages/core/dist/utils/flush-timer.js 2.06 kB
packages/core/dist/utils/flush-timer.mjs 725 B
packages/core/dist/utils/index.js 17.8 kB
packages/core/dist/utils/index.mjs 3.69 kB
packages/core/dist/utils/json-utils.js 7.44 kB
packages/core/dist/utils/json-utils.mjs 5.02 kB
packages/core/dist/utils/logger.js 2.68 kB
packages/core/dist/utils/logger.mjs 1.29 kB
packages/core/dist/utils/number-utils.js 3.42 kB
packages/core/dist/utils/number-utils.mjs 1.68 kB
packages/core/dist/utils/otlp-any-value.js 7.96 kB
packages/core/dist/utils/otlp-any-value.mjs 5.77 kB
packages/core/dist/utils/otlp-resource.js 3.94 kB
packages/core/dist/utils/otlp-resource.mjs 1.97 kB
packages/core/dist/utils/promise-queue.js 2.58 kB
packages/core/dist/utils/promise-queue.mjs 1.25 kB
packages/core/dist/utils/retry-after.js 3.5 kB
packages/core/dist/utils/retry-after.mjs 1.96 kB
packages/core/dist/utils/string-utils.js 3.83 kB
packages/core/dist/utils/string-utils.mjs 1.97 kB
packages/core/dist/utils/type-utils.js 7.52 kB
packages/core/dist/utils/type-utils.mjs 3.27 kB
packages/core/dist/utils/user-agent-utils.js 19 kB
packages/core/dist/utils/user-agent-utils.mjs 15.2 kB
packages/core/dist/utils/webview-app-utils.js 3.54 kB
packages/core/dist/utils/webview-app-utils.mjs 2.23 kB
packages/core/dist/vendor/uuidv7.js 8.36 kB
packages/core/dist/vendor/uuidv7.mjs 6.7 kB
packages/mcp/dist/extensions/analytics-parameters.js 6.65 kB
packages/mcp/dist/extensions/analytics-parameters.mjs 4.3 kB
packages/mcp/dist/extensions/client-identity.js 6.33 kB
packages/mcp/dist/extensions/client-identity.mjs 3.71 kB
packages/mcp/dist/extensions/compatibility.js 5.45 kB
packages/mcp/dist/extensions/compatibility.mjs 3.4 kB
packages/mcp/dist/extensions/constants.js 5.69 kB
packages/mcp/dist/extensions/constants.mjs 3.19 kB
packages/mcp/dist/extensions/context-parameters.js 2.85 kB
packages/mcp/dist/extensions/context-parameters.mjs 899 B
packages/mcp/dist/extensions/conversation-id.js 6.41 kB
packages/mcp/dist/extensions/conversation-id.mjs 3.58 kB
packages/mcp/dist/extensions/detect.js 3.87 kB
packages/mcp/dist/extensions/detect.mjs 1.49 kB
packages/mcp/dist/extensions/event-types.js 1.82 kB
packages/mcp/dist/extensions/event-types.mjs 498 B
packages/mcp/dist/extensions/exceptions.js 2.67 kB
packages/mcp/dist/extensions/exceptions.mjs 1.19 kB
packages/mcp/dist/extensions/headers.js 2.08 kB
packages/mcp/dist/extensions/headers.mjs 643 B
packages/mcp/dist/extensions/ids.js 2.11 kB
packages/mcp/dist/extensions/ids.mjs 637 B
packages/mcp/dist/extensions/instrument-highlevel.js 15.8 kB
packages/mcp/dist/extensions/instrument-highlevel.mjs 12.5 kB
packages/mcp/dist/extensions/instrument-lowlevel.js 8.44 kB
packages/mcp/dist/extensions/instrument-lowlevel.mjs 5.88 kB
packages/mcp/dist/extensions/instrumentation.js 37.9 kB
packages/mcp/dist/extensions/instrumentation.mjs 30.8 kB
packages/mcp/dist/extensions/intent.js 3.3 kB
packages/mcp/dist/extensions/intent.mjs 1.64 kB
packages/mcp/dist/extensions/internal.js 4.99 kB
packages/mcp/dist/extensions/internal.mjs 2.88 kB
packages/mcp/dist/extensions/lib-identity.js 1.7 kB
packages/mcp/dist/extensions/lib-identity.mjs 267 B
packages/mcp/dist/extensions/logger.js 1.81 kB
packages/mcp/dist/extensions/logger.mjs 380 B
packages/mcp/dist/extensions/mcp-sdk-compat.js 5.86 kB
packages/mcp/dist/extensions/mcp-sdk-compat.mjs 3.5 kB
packages/mcp/dist/extensions/model-parameters.js 4.6 kB
packages/mcp/dist/extensions/model-parameters.mjs 2.33 kB
packages/mcp/dist/extensions/output-instructions.js 6.21 kB
packages/mcp/dist/extensions/output-instructions.mjs 3.91 kB
packages/mcp/dist/extensions/posthog-events.js 12.5 kB
packages/mcp/dist/extensions/posthog-events.mjs 8.49 kB
packages/mcp/dist/extensions/request-headers.js 2.27 kB
packages/mcp/dist/extensions/request-headers.mjs 963 B
packages/mcp/dist/extensions/server-build.js 1.94 kB
packages/mcp/dist/extensions/server-build.mjs 482 B
packages/mcp/dist/extensions/session-token.js 5.47 kB
packages/mcp/dist/extensions/session-token.mjs 3.6 kB
packages/mcp/dist/extensions/session.js 6.79 kB
packages/mcp/dist/extensions/session.mjs 4.16 kB
packages/mcp/dist/extensions/tools.js 3.81 kB
packages/mcp/dist/extensions/tools.mjs 1.68 kB
packages/mcp/dist/extensions/tracing-helpers.js 2.51 kB
packages/mcp/dist/extensions/tracing-helpers.mjs 772 B
packages/mcp/dist/extensions/transport-identity.js 3 kB
packages/mcp/dist/extensions/transport-identity.mjs 1.09 kB
packages/mcp/dist/index.js 10.2 kB
packages/mcp/dist/index.mjs 5.54 kB
packages/mcp/dist/types.js 585 B
packages/mcp/dist/types.mjs 12 B
packages/mcp/dist/version.js 1.31 kB
packages/mcp/dist/version.mjs 45 B
packages/next/dist/app/PostHogProvider.js 5.37 kB
packages/next/dist/client/ClientPostHogProvider.js 2.28 kB
packages/next/dist/client/hooks.js 172 B
packages/next/dist/client/PostHogPageView.js 4.23 kB
packages/next/dist/index.client.js 401 B
packages/next/dist/index.edge.js 588 B
packages/next/dist/index.js 572 B
packages/next/dist/index.react-server.js 420 B
packages/next/dist/middleware/postHogMiddleware.js 4.08 kB
packages/next/dist/otel.js 1.12 kB
packages/next/dist/otel.unsupported.js 181 B
packages/next/dist/pages.client.js 225 B
packages/next/dist/pages.edge.js 294 B
packages/next/dist/pages.js 347 B
packages/next/dist/pages/createPostHog.js 1.48 kB
packages/next/dist/pages/getServerSidePostHog.js 1.48 kB
packages/next/dist/pages/PostHogPageView.js 1.77 kB
packages/next/dist/pages/PostHogProvider.js 1.58 kB
packages/next/dist/server.edge.js 1.65 kB
packages/next/dist/server/captureRequestError.js 16.4 kB
packages/next/dist/server/clientCache.edge.js 305 B
packages/next/dist/server/clientCache.js 1.53 kB
packages/next/dist/server/clientCache.node.js 828 B
packages/next/dist/server/createPostHog.js 1.44 kB
packages/next/dist/server/getPostHog.js 3.89 kB
packages/next/dist/server/onRequestError.js 2.55 kB
packages/next/dist/server/onRequestError.types.js 59 B
packages/next/dist/server/withPostHogProxy.js 4.03 kB
packages/next/dist/shared/browser.js 195 B
packages/next/dist/shared/config.js 2.23 kB
packages/next/dist/shared/constants.js 201 B
packages/next/dist/shared/cookie.js 540 B
packages/next/dist/shared/identity.js 2.56 kB
packages/next/dist/shared/tracing-headers.js 2.18 kB
packages/nextjs-config/dist/config.js 13.6 kB
packages/nextjs-config/dist/config.mjs 11.9 kB
packages/nextjs-config/dist/index.js 2.21 kB
packages/nextjs-config/dist/index.mjs 30 B
packages/nextjs-config/dist/inject-server-release.js 4.51 kB
packages/nextjs-config/dist/inject-server-release.mjs 2.68 kB
packages/nextjs-config/dist/strip-sourcemap-comments.js 5.46 kB
packages/nextjs-config/dist/strip-sourcemap-comments.mjs 3.37 kB
packages/nextjs-config/dist/utils.js 4.81 kB
packages/nextjs-config/dist/utils.mjs 2.33 kB
packages/node/dist/ai-capture/batching.js 2.71 kB
packages/node/dist/ai-capture/batching.mjs 1.21 kB
packages/node/dist/ai-capture/routing.js 1.96 kB
packages/node/dist/ai-capture/routing.mjs 264 B
packages/node/dist/capture-v1/config.js 1.59 kB
packages/node/dist/capture-v1/config.mjs 283 B
packages/node/dist/capture-v1/errors.js 1.99 kB
packages/node/dist/capture-v1/errors.mjs 694 B
packages/node/dist/capture-v1/routing.js 1.77 kB
packages/node/dist/capture-v1/routing.mjs 279 B
packages/node/dist/capture-v1/sender.js 11.5 kB
packages/node/dist/capture-v1/sender.mjs 9.94 kB
packages/node/dist/capture-v1/transform.js 5.22 kB
packages/node/dist/capture-v1/transform.mjs 3.65 kB
packages/node/dist/capture-v1/types.js 585 B
packages/node/dist/capture-v1/types.mjs 12 B
packages/node/dist/client.js 66.5 kB
packages/node/dist/client.mjs 62.7 kB
packages/node/dist/emails/emails.js 19.9 kB
packages/node/dist/emails/emails.mjs 17.6 kB
packages/node/dist/emails/errors.js 2.79 kB
packages/node/dist/emails/errors.mjs 1.52 kB
packages/node/dist/emails/types.js 585 B
packages/node/dist/emails/types.mjs 12 B
packages/node/dist/entrypoints/index.edge.js 3.66 kB
packages/node/dist/entrypoints/index.edge.mjs 720 B
packages/node/dist/entrypoints/index.node.js 6.45 kB
packages/node/dist/entrypoints/index.node.mjs 1.77 kB
packages/node/dist/entrypoints/nestjs.js 2.27 kB
packages/node/dist/entrypoints/nestjs.mjs 42 B
packages/node/dist/entrypoints/otel.js 3.93 kB
packages/node/dist/entrypoints/otel.mjs 2.35 kB
packages/node/dist/experimental.js 852 B
packages/node/dist/experimental.mjs 279 B
packages/node/dist/exports.js 7.2 kB
packages/node/dist/exports.mjs 510 B
packages/node/dist/extensions/context/context.js 2.62 kB
packages/node/dist/extensions/context/context.mjs 1.14 kB
packages/node/dist/extensions/context/event-context.js 1.93 kB
packages/node/dist/extensions/context/event-context.mjs 501 B
packages/node/dist/extensions/context/lifetime.js 2.01 kB
packages/node/dist/extensions/context/lifetime.mjs 571 B
packages/node/dist/extensions/context/listeners.js 2.35 kB
packages/node/dist/extensions/context/listeners.mjs 788 B
packages/node/dist/extensions/context/span-context.node.js 1.8 kB
packages/node/dist/extensions/context/span-context.node.mjs 355 B
packages/node/dist/extensions/context/types.js 585 B
packages/node/dist/extensions/context/types.mjs 12 B
packages/node/dist/extensions/error-tracking/autocapture.js 17.6 kB
packages/node/dist/extensions/error-tracking/autocapture.mjs 15.7 kB
packages/node/dist/extensions/error-tracking/index.js 5.5 kB
packages/node/dist/extensions/error-tracking/index.mjs 4.1 kB
packages/node/dist/extensions/error-tracking/modifiers/context-lines.node.js 11.7 kB
packages/node/dist/extensions/error-tracking/modifiers/context-lines.node.mjs 9.64 kB
packages/node/dist/extensions/error-tracking/modifiers/module.node.js 2.87 kB
packages/node/dist/extensions/error-tracking/modifiers/module.node.mjs 1.45 kB
packages/node/dist/extensions/error-tracking/modifiers/relative-path.node.js 2.07 kB
packages/node/dist/extensions/error-tracking/modifiers/relative-path.node.mjs 624 B
packages/node/dist/extensions/error-tracking/trace-context.js 2.25 kB
packages/node/dist/extensions/error-tracking/trace-context.mjs 913 B
packages/node/dist/extensions/express.js 6.42 kB
packages/node/dist/extensions/express.mjs 4.07 kB
packages/node/dist/extensions/feature-flags/cache.js 585 B
packages/node/dist/extensions/feature-flags/cache.mjs 12 B
packages/node/dist/extensions/feature-flags/crypto.js 1.37 kB
packages/node/dist/extensions/feature-flags/crypto.mjs 42 B
packages/node/dist/extensions/feature-flags/feature-flags.js 44.7 kB
packages/node/dist/extensions/feature-flags/feature-flags.mjs 42 kB
packages/node/dist/extensions/nestjs.js 5.97 kB
packages/node/dist/extensions/nestjs.mjs 3.62 kB
packages/node/dist/extensions/sentry-integration.js 4.99 kB
packages/node/dist/extensions/sentry-integration.mjs 3.37 kB
packages/node/dist/extensions/tracing-headers.js 6.85 kB
packages/node/dist/extensions/tracing-headers.mjs 4.61 kB
packages/node/dist/extensions/url-utils.js 2.32 kB
packages/node/dist/extensions/url-utils.mjs 785 B
packages/node/dist/feature-flag-evaluations.js 6.72 kB
packages/node/dist/feature-flag-evaluations.mjs 5.24 kB
packages/node/dist/gzip.node.js 1.83 kB
packages/node/dist/gzip.node.mjs 416 B
packages/node/dist/host-os.node.js 1.8 kB
packages/node/dist/host-os.node.mjs 349 B
packages/node/dist/storage-memory.js 1.61 kB
packages/node/dist/storage-memory.mjs 297 B
packages/node/dist/types.js 1.59 kB
packages/node/dist/types.mjs 292 B
packages/node/dist/version.js 1.31 kB
packages/node/dist/version.mjs 46 B
packages/nuxt/dist/module.mjs 8.05 kB
packages/nuxt/dist/runtime/composables/useFeatureFlagEnabled.js 566 B
packages/nuxt/dist/runtime/composables/useFeatureFlagPayload.js 690 B
packages/nuxt/dist/runtime/composables/useFeatureFlagVariantKey.js 591 B
packages/nuxt/dist/runtime/composables/usePostHog.js 128 B
packages/nuxt/dist/runtime/nitro-plugin-v2.js 817 B
packages/nuxt/dist/runtime/nitro-plugin-v3.js 893 B
packages/nuxt/dist/runtime/nitro-plugin.js 3.14 kB
packages/nuxt/dist/runtime/server-client.js 32 B
packages/nuxt/dist/runtime/server.js 127 B
packages/nuxt/dist/runtime/vue-plugin.js 1.13 kB
packages/openfeature-node-provider/dist/index.js 1.86 kB
packages/openfeature-node-provider/dist/index.mjs 122 B
packages/openfeature-node-provider/dist/mapping.js 5.66 kB
packages/openfeature-node-provider/dist/mapping.mjs 3.5 kB
packages/openfeature-node-provider/dist/provider.js 4.08 kB
packages/openfeature-node-provider/dist/provider.mjs 2.59 kB
packages/openfeature-web-provider/dist/index.js 1.84 kB
packages/openfeature-web-provider/dist/index.mjs 119 B
packages/openfeature-web-provider/dist/mapping.js 5.38 kB
packages/openfeature-web-provider/dist/mapping.mjs 3.18 kB
packages/openfeature-web-provider/dist/provider.js 4.51 kB
packages/openfeature-web-provider/dist/provider.mjs 3.06 kB
packages/plugin-utils/dist/chunk-ids.js 3.96 kB
packages/plugin-utils/dist/chunk-ids.mjs 2.11 kB
packages/plugin-utils/dist/cli.js 4.47 kB
packages/plugin-utils/dist/cli.mjs 2.72 kB
packages/plugin-utils/dist/config.js 3.6 kB
packages/plugin-utils/dist/config.mjs 2.25 kB
packages/plugin-utils/dist/index.js 4.5 kB
packages/plugin-utils/dist/index.mjs 197 B
packages/plugin-utils/dist/spawn-local.js 3.17 kB
packages/plugin-utils/dist/spawn-local.mjs 1.66 kB
packages/plugin-utils/dist/utils.js 3.36 kB
packages/plugin-utils/dist/utils.mjs 1.3 kB
packages/react-native/dist/autocapture.js 8.42 kB
packages/react-native/dist/error-tracking/exception-context.js 2.25 kB
packages/react-native/dist/error-tracking/fatal-payload.js 6.61 kB
packages/react-native/dist/error-tracking/index.js 17.2 kB
packages/react-native/dist/error-tracking/utils.js 6.03 kB
packages/react-native/dist/frameworks/wix-navigation.js 1.35 kB
packages/react-native/dist/hooks/useFeatureFlag.js 1.9 kB
packages/react-native/dist/hooks/useFeatureFlagResult.js 1.03 kB
packages/react-native/dist/hooks/useFeatureFlags.js 985 B
packages/react-native/dist/hooks/useNavigationTracker.js 2.31 kB
packages/react-native/dist/hooks/usePostHog.js 583 B
packages/react-native/dist/hooks/utils.js 1.02 kB
packages/react-native/dist/index.js 4.36 kB
packages/react-native/dist/logs-defaults.js 3.71 kB
packages/react-native/dist/native-deps.js 9.57 kB
packages/react-native/dist/optional/OptionalAsyncStorage.js 348 B
packages/react-native/dist/optional/OptionalExpoApplication.js 429 B
packages/react-native/dist/optional/OptionalExpoDevice.js 394 B
packages/react-native/dist/optional/OptionalExpoFileSystem.js 437 B
packages/react-native/dist/optional/OptionalExpoFileSystemLegacy.js 480 B
packages/react-native/dist/optional/OptionalExpoLocalization.js 436 B
packages/react-native/dist/optional/OptionalExpoUpdates.js 382 B
packages/react-native/dist/optional/OptionalPlugin.js 1.36 kB
packages/react-native/dist/optional/OptionalReactNativeDeviceInfo.js 473 B
packages/react-native/dist/optional/OptionalReactNativeExceptionsManager.js 626 B
packages/react-native/dist/optional/OptionalReactNativeExceptionsManager.web.js 287 B
packages/react-native/dist/optional/OptionalReactNativeLocalize.js 359 B
packages/react-native/dist/optional/OptionalReactNativeNavigation.js 473 B
packages/react-native/dist/optional/OptionalReactNativeNavigationWix.js 504 B
packages/react-native/dist/optional/OptionalReactNativeSafeArea.js 700 B
packages/react-native/dist/optional/OptionalReactNativeSvg.js 923 B
packages/react-native/dist/posthog-rn.js 97.6 kB
packages/react-native/dist/PostHogContext.js 372 B
packages/react-native/dist/PostHogErrorBoundary.js 3.98 kB
packages/react-native/dist/PostHogMaskView.js 1.72 kB
packages/react-native/dist/PostHogProvider.js 6.15 kB
packages/react-native/dist/storage.js 6.85 kB
packages/react-native/dist/surveys/components/BottomSection.js 1.69 kB
packages/react-native/dist/surveys/components/Cancel.js 1.19 kB
packages/react-native/dist/surveys/components/ConfirmationMessage.js 1.99 kB
packages/react-native/dist/surveys/components/IntroMessage.js 1.87 kB
packages/react-native/dist/surveys/components/QuestionHeader.js 1.69 kB
packages/react-native/dist/surveys/components/QuestionTypes.js 16.1 kB
packages/react-native/dist/surveys/components/SurveyModal.js 7.95 kB
packages/react-native/dist/surveys/components/Surveys.js 8.7 kB
packages/react-native/dist/surveys/getActiveMatchingSurveys.js 3.42 kB
packages/react-native/dist/surveys/icons.js 10.1 kB
packages/react-native/dist/surveys/index.js 634 B
packages/react-native/dist/surveys/PostHogSurveyProvider.js 12.7 kB
packages/react-native/dist/surveys/safeStyleSheet.js 491 B
packages/react-native/dist/surveys/survey-progress.js 7.8 kB
packages/react-native/dist/surveys/survey-shuffling.js 2.38 kB
packages/react-native/dist/surveys/survey-translations.js 1.22 kB
packages/react-native/dist/surveys/surveys-utils.js 12 kB
packages/react-native/dist/surveys/useActivatedSurveys.js 3.89 kB
packages/react-native/dist/surveys/useSurveyStorage.js 3.07 kB
packages/react-native/dist/tooling/expoconfig.js 42.3 kB
packages/react-native/dist/tooling/metroconfig.js 2.36 kB
packages/react-native/dist/tooling/posthogMetroSerializer.js 7.5 kB
packages/react-native/dist/tooling/utils.js 4.49 kB
packages/react-native/dist/tooling/vendor/expo/expoconfig.js 109 B
packages/react-native/dist/tooling/vendor/metro/countLines.js 276 B
packages/react-native/dist/tooling/vendor/metro/utils.js 3.61 kB
packages/react-native/dist/types.js 104 B
packages/react-native/dist/utils.js 1.83 kB
packages/react-native/dist/version.js 166 B
packages/react/dist/esm/index.js 23.3 kB
packages/react/dist/esm/slim/index.js 19.5 kB
packages/react/dist/esm/surveys/index.js 4.22 kB
packages/react/dist/umd/index.js 27.8 kB
packages/react/dist/umd/slim/index.js 23.5 kB
packages/react/dist/umd/surveys/index.js 6.33 kB
packages/rollup-plugin/dist/chunk-fingerprint.js 2.77 kB
packages/rollup-plugin/dist/index.js 14.9 kB
packages/rrweb/all/dist/rrweb-all.cjs 670 kB
packages/rrweb/all/dist/rrweb-all.js 669 kB
packages/rrweb/all/dist/rrweb-all.umd.cjs 699 kB
packages/rrweb/all/dist/rrweb-all.umd.min.cjs 345 kB
packages/rrweb/packer/dist/browser-********.cjs 17.9 kB
packages/rrweb/packer/dist/browser-********.js 17.5 kB
packages/rrweb/packer/dist/pack.cjs 401 B
packages/rrweb/packer/dist/pack.js 301 B
packages/rrweb/packer/dist/pack.umd.cjs 1.67 kB
packages/rrweb/packer/dist/pack.umd.min.cjs 1.11 kB
packages/rrweb/packer/dist/packer.cjs 276 B
packages/rrweb/packer/dist/packer.js 133 B
packages/rrweb/packer/dist/packer.umd.cjs 694 B
packages/rrweb/packer/dist/packer.umd.min.cjs 626 B
packages/rrweb/packer/dist/unpack.cjs 737 B
packages/rrweb/packer/dist/unpack.js 637 B
packages/rrweb/packer/dist/unpack.umd.cjs 1.14 kB
packages/rrweb/packer/dist/unpack.umd.min.cjs 953 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.cjs 34.9 kB
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.js 34.8 kB
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.umd.cjs 37 kB
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.umd.min.cjs 22.9 kB
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.cjs 31.8 kB
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.js 31.7 kB
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.umd.cjs 33.7 kB
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.umd.min.cjs 21.1 kB
packages/rrweb/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.cjs 16.7 kB
packages/rrweb/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.js 16.6 kB
packages/rrweb/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.umd.cjs 15.9 kB
packages/rrweb/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.umd.min.cjs 8.57 kB
packages/rrweb/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.cjs 6.25 kB
packages/rrweb/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.js 6.15 kB
packages/rrweb/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.umd.cjs 6.5 kB
packages/rrweb/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.umd.min.cjs 3.57 kB
packages/rrweb/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.cjs 663 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.js 540 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.umd.cjs 1.1 kB
packages/rrweb/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.umd.min.cjs 827 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.cjs 816 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.js 715 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.umd.cjs 1.25 kB
packages/rrweb/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.umd.min.cjs 966 B
packages/rrweb/record/dist/rrweb-record.cjs 238 kB
packages/rrweb/record/dist/rrweb-record.js 237 kB
packages/rrweb/record/dist/rrweb-record.umd.cjs 242 kB
packages/rrweb/record/dist/rrweb-record.umd.min.cjs 118 kB
packages/rrweb/replay/dist/rrweb-replay.cjs 437 kB
packages/rrweb/replay/dist/rrweb-replay.js 437 kB
packages/rrweb/replay/dist/rrweb-replay.umd.cjs 458 kB
packages/rrweb/replay/dist/rrweb-replay.umd.min.cjs 228 kB
packages/rrweb/rrdom-nodejs/dist/rrdom-nodejs.cjs 142 kB
packages/rrweb/rrdom-nodejs/dist/rrdom-nodejs.js 141 kB
packages/rrweb/rrdom-nodejs/dist/rrdom-nodejs.umd.cjs 155 kB
packages/rrweb/rrdom-nodejs/dist/rrdom-nodejs.umd.min.cjs 76.4 kB
packages/rrweb/rrdom/dist/rrdom.cjs 168 kB
packages/rrweb/rrdom/dist/rrdom.js 167 kB
packages/rrweb/rrdom/dist/rrdom.umd.cjs 179 kB
packages/rrweb/rrdom/dist/rrdom.umd.min.cjs 86.9 kB
packages/rrweb/rrweb-snapshot/dist/rebuild-********.cjs 133 kB
packages/rrweb/rrweb-snapshot/dist/rebuild-********.js 132 kB
packages/rrweb/rrweb-snapshot/dist/record.cjs 4.48 kB
packages/rrweb/rrweb-snapshot/dist/record.js 3.14 kB
packages/rrweb/rrweb-snapshot/dist/record.umd.cjs 97.3 kB
packages/rrweb/rrweb-snapshot/dist/record.umd.min.cjs 45.6 kB
packages/rrweb/rrweb-snapshot/dist/replay.cjs 1.96 kB
packages/rrweb/rrweb-snapshot/dist/replay.js 1.31 kB
packages/rrweb/rrweb-snapshot/dist/replay.umd.cjs 206 kB
packages/rrweb/rrweb-snapshot/dist/replay.umd.min.cjs 90.9 kB
packages/rrweb/rrweb-snapshot/dist/rrweb-snapshot.cjs 4.76 kB
packages/rrweb/rrweb-snapshot/dist/rrweb-snapshot.js 3.32 kB
packages/rrweb/rrweb-snapshot/dist/rrweb-snapshot.umd.cjs 252 kB
packages/rrweb/rrweb-snapshot/dist/rrweb-snapshot.umd.min.cjs 113 kB
packages/rrweb/rrweb-snapshot/dist/snapshot-********.cjs 37.7 kB
packages/rrweb/rrweb-snapshot/dist/snapshot-CtRtJ-aJ.js 35.6 kB
packages/rrweb/rrweb-snapshot/dist/types-********.cjs 49.9 kB
packages/rrweb/rrweb-snapshot/dist/types-********.js 44.6 kB
packages/rrweb/rrweb/dist/rrweb.cjs 655 kB
packages/rrweb/rrweb/dist/rrweb.js 654 kB
packages/rrweb/rrweb/dist/rrweb.umd.cjs 681 kB
packages/rrweb/rrweb/dist/rrweb.umd.min.cjs 335 kB
packages/rrweb/types/dist/rrweb-types.cjs 5.8 kB
packages/rrweb/types/dist/rrweb-types.js 5.5 kB
packages/rrweb/types/dist/rrweb-types.umd.cjs 6.06 kB
packages/rrweb/types/dist/rrweb-types.umd.min.cjs 2.95 kB
packages/rrweb/utils/dist/rrweb-utils.cjs 10.1 kB
packages/rrweb/utils/dist/rrweb-utils.js 9.5 kB
packages/rrweb/utils/dist/rrweb-utils.umd.cjs 10.2 kB
packages/rrweb/utils/dist/rrweb-utils.umd.min.cjs 5.07 kB
packages/types/dist/capture-log.js 585 B
packages/types/dist/capture-log.mjs 12 B
packages/types/dist/capture-metric.js 1.47 kB
packages/types/dist/capture-metric.mjs 93 B
packages/types/dist/capture.js 585 B
packages/types/dist/capture.mjs 12 B
packages/types/dist/common.js 585 B
packages/types/dist/common.mjs 12 B
packages/types/dist/feature-flags.js 585 B
packages/types/dist/feature-flags.mjs 12 B
packages/types/dist/index.js 1.83 kB
packages/types/dist/index.mjs 137 B
packages/types/dist/posthog-config.js 1.53 kB
packages/types/dist/posthog-config.mjs 209 B
packages/types/dist/posthog.js 585 B
packages/types/dist/posthog.mjs 12 B
packages/types/dist/request.js 585 B
packages/types/dist/request.mjs 12 B
packages/types/dist/segment.js 585 B
packages/types/dist/segment.mjs 12 B
packages/types/dist/session-recording.js 585 B
packages/types/dist/session-recording.mjs 12 B
packages/types/dist/survey.js 585 B
packages/types/dist/survey.mjs 12 B
packages/types/dist/toolbar.js 585 B
packages/types/dist/toolbar.mjs 12 B
packages/types/dist/traces.js 585 B
packages/types/dist/traces.mjs 12 B
packages/types/dist/tree-shakeable.js 585 B
packages/types/dist/tree-shakeable.mjs 12 B
packages/web/dist/index.cjs 9.09 kB
packages/web/dist/index.mjs 8.93 kB
packages/webpack-plugin/dist/config.js 3.55 kB
packages/webpack-plugin/dist/config.mjs 2.48 kB
packages/webpack-plugin/dist/index.js 20.2 kB
packages/webpack-plugin/dist/index.mjs 15.6 kB
tooling/changelog/dist/index.js 399 B
tooling/rollup-utils/dist/index.js 1.17 kB
tooling/sdk-mock-server/dist/decode.js 2.03 kB
tooling/sdk-mock-server/dist/index.js 16 kB
tooling/sdk-mock-server/dist/state.js 3.79 kB

compressed-size-action

@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Node SDK acceptance v2

Commit: 2b5415c
Workflow run and artifacts

Capture v0

✅ 83 passed / ❌ 4 non-passing / ⚠️ 954 not selected

Drill-down: run artifacts → node-v2-v0 → acceptance/report.json.diagnostics.json (match case_id below).

❌ server_snapshot_payload_false — failed_assertion

Expected native data result

Code: snapshot_result

Failed step: acceptance/public/evaluate-flags.feature:868

the public snapshot outcomes should have these semantics:
❌ server_snapshot_payload_zero — failed_assertion

Expected native data result

Code: snapshot_result

Failed step: acceptance/public/evaluate-flags.feature:868

the public snapshot outcomes should have these semantics:
❌ server_snapshot_payload_null — failed_assertion

Expected native data result

Code: snapshot_result

Failed step: acceptance/public/evaluate-flags.feature:868

the public snapshot outcomes should have these semantics:
❌ migration/yaml-parity-v1/remote-flags-v1.feature::Omitted GeoIP settings default to enabled in flag requests — failed_assertion

Flags field differs

Code: flag_request_field

Failed step: migration/yaml-parity-v1/remote-flags-v1.feature:134

the first flags request field "geoip_disable" should equal JSON false

Operation: /flags/

Field: geoip_disable

Expected:

false

Actual value:

true

Harness exit: 1; report validation exit: 1.

Capture v1

✅ 148 passed / ❌ 4 non-passing / ⚠️ 889 not selected

Drill-down: run artifacts → node-v2-v1 → acceptance/report.json.diagnostics.json (match case_id below).

❌ server_snapshot_payload_false — failed_assertion

Expected native data result

Code: snapshot_result

Failed step: acceptance/public/evaluate-flags.feature:868

the public snapshot outcomes should have these semantics:
❌ server_snapshot_payload_zero — failed_assertion

Expected native data result

Code: snapshot_result

Failed step: acceptance/public/evaluate-flags.feature:868

the public snapshot outcomes should have these semantics:
❌ server_snapshot_payload_null — failed_assertion

Expected native data result

Code: snapshot_result

Failed step: acceptance/public/evaluate-flags.feature:868

the public snapshot outcomes should have these semantics:
❌ migration/yaml-parity-v1/remote-flags-v1.feature::Omitted GeoIP settings default to enabled in flag requests — failed_assertion

Flags field differs

Code: flag_request_field

Failed step: migration/yaml-parity-v1/remote-flags-v1.feature:134

the first flags request field "geoip_disable" should equal JSON false

Operation: /flags/

Field: geoip_disable

Expected:

false

Actual value:

true

Harness exit: 1; report validation exit: 1.

@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

posthog-js Compliance Report

Date: 2026-11-06 22:29:47 UTC
Duration: 88914ms

✅ All Tests Passed!

26/26 tests passed


Capture Tests

✅ 26/26 tests passed

View Details
Test Status Duration
Format Validation.Event Has Required Fields Client ✅ 152ms
Format Validation.Event Has Uuid ✅ 20ms
Format Validation.Event Has Lib Properties ✅ 16ms
Format Validation.Distinct Id Is String Client ✅ 17ms
Format Validation.Token Is Present Client ✅ 17ms
Format Validation.Custom Properties Preserved ✅ 18ms
Format Validation.Event Has Timestamp ✅ 15ms
Retry Behavior.Retries On 503 ✅ 5021ms
Retry Behavior.Does Not Retry On 400 ✅ 2018ms
Retry Behavior.Does Not Retry On 401 ✅ 2031ms
Retry Behavior.Respects Retry After Header ✅ 5021ms
Retry Behavior.Implements Backoff ✅ 15027ms
Retry Behavior.Retries On 500 ✅ 5014ms
Retry Behavior.Retries On 502 ✅ 5017ms
Retry Behavior.Retries On 504 ✅ 5019ms
Retry Behavior.Max Retries Respected ✅ 15027ms
Deduplication.Generates Unique Uuids ✅ 24ms
Deduplication.Preserves Uuid On Retry ✅ 5017ms
Deduplication.Preserves Uuid And Timestamp On Retry ✅ 10015ms
Deduplication.Preserves Uuid And Timestamp On Batch Retry ✅ 5019ms
Deduplication.No Duplicate Events In Batch ✅ 24ms
Deduplication.Different Events Have Different Uuids ✅ 14ms
Batch Format.Flush With No Events Sends Nothing ✅ 7ms
Error Handling.Does Not Retry On 403 ✅ 2014ms
Error Handling.Does Not Retry On 413 ✅ 2015ms
Error Handling.Retries On 408 ✅ 5018ms

@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) 9.67 KiB/op 10.18 KiB/op 5.3% more memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Time per operation 12.62 µs/op 12.67 µs/op 0.3% more time Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Idle process memory (RSS) 102.73 MiB 102.79 MiB <0.1% more memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Observed peak process memory (RSS) 106.27 MiB 106.15 MiB 0.1% less memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Managed heap after settling 9.97 MiB 10 MiB 0.3% more memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Process memory after settling (RSS) 105.94 MiB 105.89 MiB <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Process CPU time per operation 23.42 µs/op 23.62 µs/op 0.8% more time Not flagged
Capture and deliver events (32-byte payload, burst)
Shard: capture
Lifetime peak process memory (RSS) 106.45 MiB 106.35 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Allocated memory per operation (estimated) 17.78 KiB/op 17.79 KiB/op <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Time per operation 23.24 µs/op 23.91 µs/op 2.9% more time Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Idle process memory (RSS) 103.16 MiB 103.28 MiB 0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Observed peak process memory (RSS) 113.7 MiB 113.83 MiB 0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Managed heap after settling 9.98 MiB 10.01 MiB 0.3% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Process memory after settling (RSS) 109.58 MiB 109.7 MiB 0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Process CPU time per operation 34.85 µs/op 35.9 µs/op 3% more time Not flagged
Capture and deliver events (4,096-byte payload, burst)
Shard: capture
Lifetime peak process memory (RSS) 116.51 MiB 116.59 MiB <0.1% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Allocated memory per operation (estimated) 9.87 KiB/op 10.08 KiB/op 2.1% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Time per operation 13.52 µs/op 13.76 µs/op 1.8% more time Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Idle process memory (RSS) 102.38 MiB 102.58 MiB 0.2% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Observed peak process memory (RSS) 106.6 MiB 106.71 MiB 0.1% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Managed heap after settling 10.05 MiB 10.08 MiB 0.3% more memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Process memory after settling (RSS) 106.56 MiB 106.54 MiB <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Process CPU time per operation 24.89 µs/op 25.34 µs/op 1.8% more time Not flagged
Capture and deliver events (32-byte payload, steady)
Shard: capture
Lifetime peak process memory (RSS) 106.65 MiB 106.71 MiB <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Allocated memory per operation (estimated) 18.42 KiB/op 17.91 KiB/op 2.8% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Time per operation 20.56 µs/op 19.94 µs/op 3% less time Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Idle process memory (RSS) 102.82 MiB 102.93 MiB 0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Observed peak process memory (RSS) 109.11 MiB 109.31 MiB 0.2% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Managed heap after settling 10.06 MiB 10.08 MiB 0.3% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Process memory after settling (RSS) 107.91 MiB 108.14 MiB 0.2% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Process CPU time per operation 32.64 µs/op 31.89 µs/op 2.3% less time Not flagged
Capture and deliver events (4,096-byte payload, steady)
Shard: capture
Lifetime peak process memory (RSS) 109.13 MiB 109.31 MiB 0.2% more memory Not flagged
Queue an event (32-byte payload)
Shard: capture
Allocated memory per operation (estimated) 8.49 KiB/op 8.48 KiB/op <0.1% less memory Not flagged
Queue an event (32-byte payload)
Shard: capture
Time per operation 9.8 µs/op 9 µs/op 8.2% less time Not flagged
Queue an event (32-byte payload)
Shard: capture
Process CPU time per operation 19.64 µs/op 18.08 µs/op 7.9% less time Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Allocated memory per operation (estimated) 8.75 KiB/op 8.75 KiB/op <0.1% more memory Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Time per operation 9.86 µs/op 9.14 µs/op 7.3% less time Not flagged
Queue an event (4,096-byte payload)
Shard: capture
Process CPU time per operation 19.24 µs/op 18.51 µs/op 3.8% less time Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 132.94 KiB/op 133.41 KiB/op 0.4% more memory Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Time per operation 285.23 µs/op 286.41 µs/op 0.4% more time Not flagged
Evaluate all 10 flags
Shard: flags-scaling
Process CPU time per operation 443.52 µs/op 446.1 µs/op 0.6% more time Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 1.22 MiB/op 1.23 MiB/op 0.7% more memory Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Time per operation 2.39 ms/op 2.38 ms/op 0.5% less time Not flagged
Evaluate all 100 flags
Shard: flags-scaling
Process CPU time per operation 3.69 ms/op 3.7 ms/op 0.2% more time Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Allocated memory per operation (estimated) 12.11 MiB/op 12.13 MiB/op 0.2% more memory Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Time per operation 24.46 ms/op 24.28 ms/op 0.7% less time Not flagged
Evaluate all 1,000 flags
Shard: flags-scaling
Process CPU time per operation 36.52 ms/op 36.2 ms/op 0.9% less time Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Idle process memory (RSS) 285.81 MiB 286.11 MiB 0.1% more memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Observed peak process memory (RSS) 285.92 MiB 286.11 MiB <0.1% more memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Managed heap after settling 9.62 MiB 9.65 MiB 0.3% more memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Process memory after settling (RSS) 284.83 MiB 285.11 MiB <0.1% more memory Not flagged
Evaluate 1,000 flags under concurrent load
Shard: flags-memory
Lifetime peak process memory (RSS) 286.5 MiB 287.04 MiB 0.2% more memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Idle process memory (RSS) 223.26 MiB 228.18 MiB 2.2% more memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Observed peak process memory (RSS) 240.15 MiB 240.49 MiB 0.1% more memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Managed heap after settling 11.63 MiB 11.66 MiB 0.2% more memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Process memory after settling (RSS) 235.31 MiB 234.5 MiB 0.3% less memory Not flagged
Refresh 1,000 flag definitions
Shard: flags-memory
Lifetime peak process memory (RSS) 241.7 MiB 240.99 MiB 0.3% less memory Not flagged
Evaluate one boolean flag
Shard: flags-single
Allocated memory per operation (estimated) 17.11 KiB/op 17.03 KiB/op 0.4% less memory Not flagged
Evaluate one boolean flag
Shard: flags-single
Time per operation 92.76 µs/op 92.12 µs/op 0.7% less time Not flagged
Evaluate one boolean flag
Shard: flags-single
Process CPU time per operation 99.56 µs/op 99.55 µs/op <0.1% less time Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 14.11 KiB/op 14.01 KiB/op 0.7% less memory Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Time per operation 51.43 µs/op 50.32 µs/op 2.2% less time Not flagged
Evaluate a cohort-filtered flag
Shard: flags-single
Process CPU time per operation 59.62 µs/op 58.34 µs/op 2.1% less time Not flagged
Evaluate a flag (early match)
Shard: flags-single
Allocated memory per operation (estimated) 17.49 KiB/op 17.66 KiB/op 0.9% more memory Not flagged
Evaluate a flag (early match)
Shard: flags-single
Time per operation 50.57 µs/op 49.95 µs/op 1.2% less time Not flagged
Evaluate a flag (early match)
Shard: flags-single
Process CPU time per operation 57.77 µs/op 57.22 µs/op 0.9% less time Not flagged
Evaluate a flag (late match)
Shard: flags-single
Allocated memory per operation (estimated) 22.38 KiB/op 22.24 KiB/op 0.6% less memory Not flagged
Evaluate a flag (late match)
Shard: flags-single
Time per operation 51.05 µs/op 50.88 µs/op 0.3% less time Not flagged
Evaluate a flag (late match)
Shard: flags-single
Process CPU time per operation 58.41 µs/op 58.06 µs/op 0.6% less time Not flagged
Evaluate a flag (no match)
Shard: flags-single
Allocated memory per operation (estimated) 17.11 KiB/op 17 KiB/op 0.7% less memory Not flagged
Evaluate a flag (no match)
Shard: flags-single
Time per operation 5.59 µs/op 5.79 µs/op 3.7% more time Not flagged
Evaluate a flag (no match)
Shard: flags-single
Process CPU time per operation 10.27 µs/op 10.36 µs/op 0.8% more time Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 12.76 KiB/op 12.7 KiB/op 0.5% less memory Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Time per operation 49.25 µs/op 49.83 µs/op 1.2% more time Not flagged
Evaluate a property-filtered flag
Shard: flags-single
Process CPU time per operation 56.15 µs/op 56.96 µs/op 1.4% more time Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Allocated memory per operation (estimated) 18.28 KiB/op 18.21 KiB/op 0.4% less memory Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Time per operation 99.05 µs/op 96.53 µs/op 2.5% less time Not flagged
Evaluate a regex-filtered flag
Shard: flags-single
Process CPU time per operation 108.25 µs/op 105.13 µs/op 2.9% less time Not flagged
Evaluate a rollout flag
Shard: flags-single
Allocated memory per operation (estimated) 14.22 KiB/op 14.15 KiB/op 0.5% less memory Not flagged
Evaluate a rollout flag
Shard: flags-single
Time per operation 70.98 µs/op 70.99 µs/op <0.1% more time Not flagged
Evaluate a rollout flag
Shard: flags-single
Process CPU time per operation 77.37 µs/op 77.49 µs/op 0.2% more time Not flagged
Evaluate a multivariate flag
Shard: flags-single
Allocated memory per operation (estimated) 17.39 KiB/op 17.5 KiB/op 0.6% more memory Not flagged
Evaluate a multivariate flag
Shard: flags-single
Time per operation 90.96 µs/op 88.91 µs/op 2.3% less time Not flagged
Evaluate a multivariate flag
Shard: flags-single
Process CPU time per operation 98.84 µs/op 96.2 µs/op 2.7% 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 90e846aa04281713fb2d60e0afb88d6a1280c0ac → 2b5415c8dad79b9db670184186ded8f8bc8cc2f0.

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.

…yload cost

The adversarial gate on the payload personal data pass found data it leaked
or corrupted. This fixes them.

What and why:
- JSON escapes: read as text, the letter of `\n`, `\t`, `\uXXXX` is a word
  character, so cards, SSNs, IPs and phones after it leaked and an email
  swallowed the `n` (invalid `\[` escape). A string that parses as a JSON
  object or array, within the length the passes already read (4x the string
  limit), is now sanitized as the structure it encodes (the same passes as
  structuredContent: leaves, keys, card-number integers) and written back
  with JSON.stringify; unchanged text comes back byte for byte. Free text
  (intent, feedback) gets the same path with its own passes, which covers
  feedback extras' keys. JSON nested too deep to walk falls back to the text
  pass instead of dropping the event.
- Floats: the payload card candidate no longer takes `.` as a separator or
  starts after `-`/`.` or ends before `.digit`/an exponent; 95 in 1,000
  random floats produced invalid JSON. The `00`/`011` phone prefix no longer
  matches after `.` (it ate `620.0119256973267`), found while verifying.
- Card then SSN: a card is one run of 13-19 digits or a run grouped
  4-4-4-4, 4-4-4-4-3, 4-6-5 or 4-6-4, so `4111111111111111 078-05-1120`
  no longer swallows `078`. Shared with the intent pass.
- Cost: sanitizeEvent applies the entry and nesting limits first, as the
  spec orders; strings are still cut by truncateEvent after the passes.
  Gate probe, processMcpEvent with 100k string leaves: on 249-262 ms -> 0.4-0.5 ms,
  off 89-96 ms -> 0.2 ms (3 runs each, median of 5).
- Changeset names the remaining default false positives.

Tested:
- pnpm --filter @posthog/mcp test:unit: 1131 passed; the 61 new cases
  failed first (the escapes x patterns grid, floats, card+SSN, feedback
  keys, deep nesting, the 100k-leaf cost bound)
- pnpm --filter @posthog/core test:unit: 2356 passed; browser
  webmcp.test.ts: 46 passed
- lint and check-types clean for mcp and core
- pnpm --filter @posthog/mcp build && test:integration: green (same 2
  expected failures per suite as before)

Reviewer notes:
- Redacted JSON text is re-serialized compactly; integers past 2^53 in it
  round as they do in structuredContent. A card written `4111111111111111e0`
  is redacted by value in parsed JSON.
- JSON text longer than the parse cut keeps the text pass, so an escape
  there can still hide an identifier.
…ializing JSON

What: the text pass (intent, payload, and the PostHog token pass) now
matches every pattern on a same-length copy of the string in which each
JSON/JS escape (\n \t \r \b \f \/ \\ \" \uXXXX) reads as NUL and Unicode
spaces read as ASCII spaces, and splices each redaction into the original
at the same offsets. sanitizeJsonText and the parse/re-serialize path are
gone. Cards: the CARD_GROUPINGS requirement is gone; each start takes the
shortest Luhn-valid 13-19 digit run of whole groups, so a trailing SSN is
left for its own pattern. The payload card candidate accepts a card glued
to a letter by - or . and still rejects negatives and fractions. A card
that is a bare JSON number outside any string (quote parity on the masked
text) is written "[redacted]" in both passes. Object walks (core
sanitizeValueWith, mcp normalize) build results with Object.fromEntries,
so a parsed __proto__ member survives. buildCapturedMcpParameters applies
the entry and nesting limits (limitEntries) before sanitizing.

Why: two rounds of parse-and-reserialize kept failing the re-gate
(duplicate keys, integers past 2^53, __proto__, NDJSON, embedded JSON,
BOM, lost formatting). Masking needs none of those special cases: no match
contains an escape, so JSON stays valid and clean text stays byte for
byte. The mask char is not a separator, so 4111\n1111\n... is not joined
into a spaced card. The PostHog token pass reads the masked text too,
because "x\nphc_..." leaked a token after the parse path was removed (and
leaks on main).

Tested:
- pnpm --filter @posthog/core test:unit: 2356 passed, 1 skipped
- pnpm --filter @posthog/mcp test:unit: 1702 passed (325 of them
  fail on 7c0527a)
- browser vitest src/__tests__/webmcp.test.ts: 46 passed
- lint and check-types for core and mcp, pnpm format: clean
- pnpm --filter @posthog/mcp build && test:integration: 37/39, the 2
  declared expected failures
- re-gate probes probe1-3 and perf, plus zz-regate-* tests: no leaks,
  intent card table matches main row for row; 100k-leaf arguments build in
  8.9 ms vs 0.1 ms for 100, the rest being V8 key enumeration (Object.keys
  on 100k keys alone is 8.2 ms)

Reviewer notes: the context argument is now dropped after the entry
limit, so it counts toward the 100 kept arguments. A payload card after a
non-letter - or . (": -4111...") is read as a negative number and kept.
… numbers

What:
- Payload cards: an unseparated 13-19 digit run, or groups printed as
  cards are (4-4-4-4, 4-4-4-4-3, 4-6-4, 4-6-5), Luhn-valid. The intent
  keeps the shortest Luhn run of any whole groups. Both are found by a loop
  instead of a backtracking pattern. The payload 00/011 phone prefix no
  longer counts after a dash (874-426-0063).
- Escapes: \uXXXX reads as the character it encodes (a Unicode space as a
  space, a non-ASCII character as %, a control, quote or backslash as NUL).
  The same applies to literal non-ASCII text. A match maps back over whole
  escapes, so the output stays valid JSON.
- JSON numbers in value position are kept or replaced whole by
  "[redacted]", whatever the indent. Payload: a non-negative token whose
  value is an integer card (4111...0, 4111...e0). Intent: that, or any token
  the card pass would touch. A text that is only a card becomes [redacted].
- The head scanned for a long string is cut at the window edge unless a URL
  crosses it; then it is cut where the URL starts.
- buildCapturedMcpParameters drops `context` before the argument limit,
  copying at most 101 arguments.

Why: the gate found payload false positives (date pairs 20%, phone pairs
42%, ZIP+4 26%, id lists 10%), escape-hidden emails and spaced cards, a
fixed 64-char lookback that broke indented JSON, partial number tokens
(-[redacted], [redacted].0), whole-value scans of whitespace-free input
(745ms at 8MB), a stack overflow at 12MB, and a lost 100th argument.

Tested:
- pnpm --filter @posthog/mcp test:unit: 1775 passed (64 new cases fail
  on 7c039ad)
- pnpm --filter @posthog/core test:unit: 2356 passed, 1 skipped
- browser vitest src/__tests__/webmcp.test.ts: 46 passed
- lint, check-types (core, mcp), pnpm format: clean
- pnpm --filter @posthog/mcp build && test:integration: exit 0, nest
  37/39 with the 2 declared expected failures
- gate3 probes: p4_fuzz 0 regressions in 200k; intent output identical to
  7c039ad on 300k escape-free strings; p11_fp payload 0.0% on all six
  generators; p12_indent valid at 2/4/10; payload `1-1.` 25-42ms from 1MB
  to 20MB

Reviewer notes: a URL that starts the window and runs past it is still
judged on the whole value, as on main, so `a:` plus 12MB costs seconds.
Direct redactPii/redactPayloadPii calls on 12MB no longer throw but take
seconds. Negative payload cards stay kept.
…ding it whole

What: when a URL crosses the 131072-character scan window, sanitizeString and
sanitizeFreeText now replace it whole with `[redacted]` and stop at the window
edge. Before, the cut moved back to where that URL started, and a value opening
with one fell back to processing the whole string. Object keys keep the plain
window (they get no URL pass).

Why: cost must follow the property limits, not the payload. `a:` + 12MB took
9.8-16s through the intent pass and 3-3.6s through the payload pass. Cutting the
URL at the edge instead would leak, since `https:secretuser...` without its `@`
reads as having no userinfo. The trailing URL is found after the personal-data
pass, so an email written into a URL's host (`john@ex.com:...`) is still redacted.

Behavior change from main (#5186), noted in the changeset: a URL longer than the
rest of the window is now `[redacted]` and nothing after it is captured. A
`data:` image inlined in a long HTML page is the visible case.

Tested:
- New tests failed on 707642d: 8MB/1MB cost ratio 5.3-9.4 (limit 3) for a value
  opening with a URL whose userinfo and token sit past the window, on the intent,
  payload-on and payload-off passes; window outputs for that value and for the
  four pinned URL cases (credential URL at the edge, credentials past the window,
  field count past the window, pre-signed URLs) plus the inlined-image test.
- pnpm --filter @posthog/core test:unit: 2356 passed, 1 skipped
- pnpm --filter @posthog/mcp test:unit: 1779 passed
- browser webmcp.test.ts: 46 passed
- pnpm format, lint (core, mcp, oxlint), check-types (core, mcp): clean
- pnpm --filter @posthog/mcp build && test:integration: exit 0 (2 declared
  expected failures)
- a: + 12MB now 26ms intent, 23ms payload on, 2ms payload off; p6/p8/p9 probes
  flat across 1-20MB.

Reviewer note: the shrink fallback (head under 2x the limit after redaction, cut
on whitespace) still reads the whole string. 8MB of 1024-char pre-signed URL
lines costs 2.2s vs 0.3s for 1MB. Not addressed here.
…s the head

What: when redacting the 131072-character window leaves a head under twice the
string limit, sanitizeString, sanitizeFreeText and object keys now redact a
window twice as long, up to four times the first (524288 characters), instead
of the whole string. At that cap a head still under twice the limit keeps all
but its last maxStringLength characters, so a match cut at the window edge is
never captured.

Why: cost must follow the property limits, not the payload. 1024-character
pre-signed URL lines shrink about tenfold, so 8MB fell back to whole-string
redaction: 2.2s vs 0.3s for 1MB on the intent pass. Keeping the cap head whole
would leak: tokens that shrink 27x leave a cut `john.doe@exa` inside the kept part.

Tested:
- New tests failed on ed74ee2: 8MB/1MB cost ratio 7.0-7.3 (limit 3) for
  pre-signed URL lines on the payload, payload-off and intent passes; the window
  output for pre-signed URL lines past the widest window; and the split email at
  the widest window edge on the payload and intent passes.
- pnpm --filter @posthog/core test:unit: 2356 passed, 1 skipped
- pnpm --filter @posthog/mcp test:unit: 1785 passed
- browser webmcp.test.ts: 46 passed
- pnpm format, lint (core, mcp, oxlint), check-types (core, mcp): clean
- pnpm --filter @posthog/mcp build && test:integration: exit 0 (2 declared
  expected failures)
- p14 aligned: 1MB intent 250ms, 8MB 251ms (was 0.3s vs 2.2s); p6/p8/p9/p13 flat.

Reviewer note: at the cap, a head that redaction shrank more than 16x keeps
nothing ('...'). Before, it read the whole string and kept up to the limit.
…ce, cut keys to 256

What:
- The JSON-number card rule writes "[redacted]" with quotes only when the
  scanned text parses as JSON (leading BOM allowed), checked lazily on the
  first card-like number. Elsewhere the card pass redacts it unquoted, as
  main does.
- buildCapturedMcpParameters applies only the entry and nesting limits;
  sanitizeEvent sanitizes arguments once, with the payload option.
- Object keys are cut to the 256-character key limit after redaction
  (CapturedValueOptions.maxKeyLength), with the option on or off.

Why: the final gate found three leaks. The inserted quote ended the URL
match, so `?ids=[4111...]&access_token=x` and userinfo after a card shipped
(intent regression vs main, and payload with the option on). Arguments were
cut at the scan window by a first pass with personal data off, so the second
pass saw a split identifier's prefix. Keys were redacted on a window head
but never truncated, so a split identifier in a key shipped.

Tested:
- 21 new cases fail on e7cb535: URL credentials after a card in brackets,
  commas, colon, a `[INFO]` log line, and userinfo, intent and payload; the
  unquoted card in prose; five identifiers split at the window in arguments
  through processMcpEvent; keys crossing the window in response and
  parameters, option on and off. The gate's zz-final-gate.test.ts: 8/8 pass.
- pnpm --filter @posthog/mcp test:unit: 1813 passed
- pnpm --filter @posthog/core test:unit: 2356 passed, 1 skipped
- browser vitest src/__tests__/webmcp.test.ts: 46 passed
- lint (core, mcp, oxlint), check-types (core, mcp), pnpm format: clean
- pnpm --filter @posthog/mcp build && test:integration: exit 0, 37/39 with
  the 2 declared expected failures
- gfinal probes on this build: f1/f2 clean and match main; f8_window 0
  leaks in 36360; f4c_json invalid 0, cleanChanged 0; f5_parity, f4c leaks
  and f6_fp identical to e7cb535; f3_cost flat from 1MB to 20MB.

Reviewer notes: NDJSON is not JSON text, so a bare card number in it is now
unquoted. A URL-shaped text with cards now reaches the URL parser whole
(url-ish probe 9ms to 25ms at the window, flat across sizes).
# Conflicts:
#	packages/mcp/src/extensions/sanitization.ts
@lucasheriques
lucasheriques marked this pull request as ready for review November 6, 2026 22:20
@lucasheriques
lucasheriques requested review from a team as code owners November 6, 2026 22:20

@posthog posthog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostHog Review · Standard · reviewed 2b5415c: 1 Must fix, 5 Should fix. This pull request is large, so the review ran in 4 parts with less depth than usual.

See this review and its findings in PostHog Review. Comment @posthog review --deep for a Deep review. A Deep review takes longer and looks deeper than a Standard review.

if (value.length <= windowLength) {
return redactUrls(redact(value))
}
const head = redact(value.slice(0, windowLength))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 · Preserve card-number redaction when windowing JSON text

A valid JSON result exceeding 131,072 characters with an early "card":4111111111111111.0 leaks the complete card number. redactCapturedText cuts the document before jsonNumberRule validates it, so JSON detection fails and the fallback card pass ignores the decimal form. Keep numeric-card recognition effective on incomplete scan windows.

Comment on lines +772 to +778
for (const grouping of CARD_GROUPINGS) {
const end = first + grouping.reduce((sum, length) => sum + length + 1, -1)
if (
grouping.every((length, index) => lengths[index] === length) &&
passesLuhn(run.slice(first, end).replace(/\D/g, ''))
) {
return end

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 · Redact the complete card when its prefix also passes Luhn

For 4111 1111 1111 1111 003, both the full 19-digit card and its 16-digit prefix pass Luhn. PAYLOAD_CARDS accepts the shorter grouping first and returns [redacted] 003, exposing part of the card; the revised intent matcher does the same, regressing its previous coverage. Resolve overlapping valid groupings before returning so the complete card is redacted.

function payloadPasses(options: CapturedValueOptions): ValuePasses {
return {
string: (value) => sanitizeString(value, options),
key: (key) => cutKey(redactCapturedHead(key, redactPayloadPii, options), options),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 · Size object-key scan windows from the key limit

With 100 long object keys, redactCapturedHead uses maxStringLength (32,768) to scan 131,072 characters per key, although cutKey retains only 256. A read-only reproduction with nonmatching email-shaped keys blocks synchronously for 6.2 seconds, delaying other requests. Bound the key scan window using maxKeyLength instead.

event: T,
{ redactPayloadPersonalData }: PayloadSanitizationOptions = { redactPayloadPersonalData: true }
): T {
const result = limitPayloadEntries(event)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 · Discard redacted subtrees before normalizing payloads

When a result contains nested objects under secret or image metadata, limitPayloadEntries clones subtrees that sanitization previously discarded immediately. A four-level, 50-way shared array under structuredContent.secret allocates roughly 98 MB and blocks the event loop for 92 ms. Apply sensitive-key and non-text block redaction before the limiting walk.

// `-`, where it is the last group of a dashed number (`874-426-0063`).
const PAYLOAD_PHONE_INTL_PATTERN = /(^|[^\w.-])((?:\+|00|011)[ .-]?[1-9]\d{0,2}(?:[ ./()-]{0,2}\d){7,13})(?![\w])/g
// A number in JSON value position: after `:`, `,` or `[`, and before `,`, `}` or `]`.
const JSON_NUMBER_PATTERN = /([:,[]\s*)(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)(?=\s*[,}\]])/g

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 · Recognize card numbers at the JSON document root

A tool text block containing only 4111111111111111.0 or 4111111111111111e0 passes through payload sanitization unchanged. Both are valid JSON numbers equal to a Luhn-valid card, but JSON_NUMBER_PATTERN requires surrounding container delimiters and the fallback rejects decimals and exponents. Include document boundaries in numeric-token matching.

])
}

export function sanitizeCapturedValue(value: unknown, options: CapturedValueOptions): unknown {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 · Keep existing sanitization options source-compatible

Existing TypeScript calls to sanitizeCapturedValue(value, { maxStringLength, truncationSuffix }) stop compiling because CapturedValueOptions requires maxKeyLength. The function is publicly re-exported from @posthog/core, so the planned minor release breaks its existing options contract. Make the new field optional and supply a default.

@stamphog stamphog Bot removed the stamphog label Nov 6, 2026

@stamphog stamphog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not approved — this change needs a human reviewer.

Re-add the stamphog label to request another review once you have addressed this.

All six @PostHog concerns remain supported by the current code, and its current-head review therefore does not supply concern-free assurance for these sensitive changes. Address those inline findings and request a fresh review from Georgis Andonis, Paul D'Ambra, or another teammate before re-requesting.

  • Author wrote 41% of the modified lines and has 22 merged PRs in these paths (familiarity MODERATE).
  • PostHog Review (Standard) reviewed the current head: 6 findings, posted on the PR.
  • posthog[bot] reviewed the current head.
  • @PostHog, packages/core/src/privacy.ts: redactCapturedText slices long documents before jsonNumberRule calls JSON.parse. An incomplete JSON window fails validation, while PAYLOAD_CARDS excludes decimal suffixes, leaving an early decimal-form card number exposed.
  • @PostHog, packages/core/src/privacy.ts: PAYLOAD_CARDS tries the 16-digit grouping before the overlapping 19-digit grouping and returns immediately on a valid checksum; INTENT_CARDS likewise returns the first valid prefix. A valid longer card can retain its final group.
  • @PostHog, packages/core/src/privacy.ts: payloadPasses scans keys through redactCapturedHead using maxStringLength, not maxKeyLength. With MCP defaults this scans 131,072 characters per initial key window before retaining only 256, so the reported excessive synchronous work remains possible.
Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✓ no deny categories matched
size ✓ 853L, 10F substantive, 1791L/19F incl. docs/generated/snapshots — within ceiling
tier ✓ T1-agent / T1d-complex (1791L, 19F, two-areas, feat)
stamphog 2.7.0 .stamphog/policy.yml @ 2b5415c · reviewed head 2b5415c

return BINARY_REDACTED_VALUE
}
const redactPersonalData = options.redactPayloadPersonalData ? redactPayloadPii : (head: string) => head
return redactCapturedText(value, (head) => redactPersonalData(redactCredentials(head)), options)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium: PII replacement can bypass URL credential scrubbing

With the default option, the valid custom URI dead::beef?access_token=secret becomes [redacted]?access_token=secret: the IPv6 pass removes its scheme before the URL pass can recognize it, leaving a credential that the previous payload sanitizer scrubbed in outgoing parameters, responses, resource names, and exception messages. Preserve the original URL spans for credential sanitization before identifier replacements can destroy their boundaries; simply swapping passes also needs care to avoid hiding PII through URL encoding.

function payloadPasses(options: CapturedValueOptions): ValuePasses {
return {
string: (value) => sanitizeString(value, options),
key: (key) => cutKey(redactCapturedHead(key, redactPayloadPii, options), options),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium: Object keys skip credential sanitization

The new key pass runs only redactPayloadPii, so a URL-keyed result such as { "https://service.test/file?access_token=secret": "ok" } retains the credential in $mcp_response or $mcp_parameters, although the same URL as a string value is scrubbed. Apply credential and URL sanitization to keys before truncation, including in the option-off branch at line 1090, so disabling personal-data redaction does not bypass credential protection.

@veria-ai

veria-ai Bot commented Nov 6, 2026

Copy link
Copy Markdown

PR overview

The PR adds default personal-data redaction to MCP tool arguments, results, and errors, including processing of object keys.

Two open issues leave credentials exposed in some sanitized payloads: personal-data replacement can disrupt URL recognition, and object keys do not receive credential sanitization. These gaps can allow access tokens to remain in outgoing parameters, responses, resource names, or exception messages when the affected URL forms are present. No issues have been addressed yet.

Open issues (2)

Fixed/addressed: 0 · PR risk: 5/10

@lucasheriques
lucasheriques marked this pull request as draft November 6, 2026 22:33
@lucasheriques

Copy link
Copy Markdown
Contributor Author

Closing. We're not adding a pattern-based personal data pass to tool payloads in the SDKs. sdk-specs#194 reverts the spec requirement. Tool arguments and results are what the server's own tools already hold, so the SDK relays them as captured, after the credential passes. Hosts that must not send them use parameter or response capture, or beforeSend. If there's demand, scrubbing will go in the backend, in one place.

Some fixes here apply to main independently of the payload pass, and may come back in a small PR:

  • redactPii / sanitizeFreeText overflow the stack on about 12 MB of digit-and-separator text, which drops the event.
  • A card followed by an SSN swallows part of the SSN in the intent pass.
  • normalize drops __proto__ keys.
  • Tool arguments are walked in full before the breadth and depth limits apply.
  • Feedback JSON extras with escaped keys leak.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant