Skip to content

fix(mcp): refuse unknown fields in the email template tools - #127183

Merged
trunk-io[bot] merged 49 commits into
email-v2/08-admission-checks-djangofrom
email-v2/10-mcp-strict-email-bodies
Nov 4, 2026
Merged

trunk-io[bot] merged 49 commits into
email-v2/08-admission-checks-djangofrom
email-v2/10-mcp-strict-email-bodies

Conversation

@Silthus

@Silthus Silthus commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Moved from Silthus#582.

Re-cut on 2026-11-02 onto #127167, after the scope cut parked local templates and sends by key. This layer keeps only what still applies to a code send. Since 2026-11-03 it sits on #127181: #127182 closed. Its diff stays MCP-only apart from two OpenAPI annotations.

Part of the code-first rebuild of the email send stack; replaces parts of #118924 (part 2, the MCP send tool's body check).

Problem

  • An agent that misspells a field in an email template MCP tool gets no error. The tool drops the key before the request, and the call goes through without it.
  • On the send tool, capture_engagment instead of capture_engagement sends the email with engagement capture still on.

Impact

Pays into Grow Workflows: an agent that sends email from code learns about a wrong field at once, instead of sending the wrong content. In scope: the email template MCP tools.

Merge Danger

Warning

🟡 Merge risk: medium · two-way door: a revert lets the tools drop unknown keys again

  • Partly not behind a flag. The create, update and design tools refuse unknown keys for every MCP user once the MCP server deploys. Before, the tools dropped those keys and Django never saw them. The send tool sits behind workflows-email-from-code, and make-transactional behind workflows-transactional-email-api.
  • The design patch tools (workflows-patch-email-template and workflows-patch-action-email) share the operation union, so both refuse an unknown operation field.
  • The update tool now refuses a fetched template's read-only fields: created_at, updated_at, transactional_hog_flow_id and _posthogUrl. The get and update tool descriptions tell the agent to build the content from the fetched template and send only the other writable fields it changes. The error names the key.
  • The design document stays open: Unlayer's own keys pass at its top level, in body and below.

Changes

Kind Files Lines
Production 6 +268 −64
Tests 2 +179 −0
Generated types and snapshots 14 +113 −57
  • The email template MCP tools refuse a key they don't know, nested ones included, with an error that names it. This covers the create, update, design, patch, send and make-transactional tools, and workflows-patch-action-email, which edits a workflow's email action and shares the patch schema.
  • The MCP codegen makes request bodies strict for the email_templates module only. Tools that join path parameters and a body are strict at the top level too. Every other module's generated code is unchanged.
  • The design document stays open. Its OpenAPI shape marks the design root and body as open. A small step after Orval keeps those objects loose, because Orval's strict mode ignores additionalProperties: true. The step runs only for strict-body modules.
  • The hand-written patch schema is strict too. Its nine operations and its root refuse unknown keys, so indx instead of index no longer appends the block at the end. The freeform patch, content and row payloads stay open.
  • The send tool keeps the code form only, as in feat(workflows): send an email with inline html from an MCP tool #127167: template_key, subject, the content and the options. A template object is an unknown key there. feat(workflows): send an email with inline html from an MCP tool #127167 splits the send into workflows-send-email-prepare and -execute; the prepare tool carries the strict body.
  • Codegen fails loudly when that step cannot place an open object. A renamed export, a changed generated shape, an open object under items, a real oneOf/anyOf, or a body property name with a dot, in a body that has an open object, stops the generator with the module, operation and path. A nullable wrapper (one object plus null) counts as the object itself, since that is how drf-spectacular writes a nullable field.
  • Mechanical: the regenerated email_templates client and tool schemas, the tool-schema snapshots, and an index signature on the EmailTemplateDesign types.

How did you test this code?

Test seams: the schemas the generated tools use (GENERATED_TOOL_MAP[tool]().schema), in services/mcp/tests/unit/email-templates-generated.test.ts.

Test rationale, each run red against the previous generator:

  • A send with a misspelled capture_engagment, or a template object on the code-only send tool, that passes.
  • A design patch with a misspelled operation field (indx) or an unknown top-level field that passes.
  • A make-transactional call with an unknown key, or an update with created_at that passes.
  • A create with an unknown key in content.email that passes. This row was checked red against the generated code from before this PR.
  • A design with extra keys at its top level and in body that the tool refuses.
  • An open object the post-step can't place that generates without an error: a missing export, a hoisted const, items, a two-branch oneOf, a path opened twice, a dotted key, open or closed (loosen-open-objects.test.ts). One more row pins the nullable wrapper as loose, with its closed sibling still strict.

Proofs at b9cb59d (saved with fleet proof), after the merge of #127181 at 0b3662a, which carries #127167's fcf42b0, #127123's c81b9e0 and master:

  • Live run through the MCP server and Django at this head, cdp-api at feat(cdp): key a code send on the sender the caller chose #127129's head e88ee89, mail caught locally. Every answer matches the run at the previous head 77ecc1c.
    • workflows-send-email-prepare refuses capture_engagment and a template_id, each with an error that names the key.
    • A valid prepare, then execute with confirmation: "confirm", returns a message_id, calls cdp-api once and delivers the mail. A second execute with the same hash is refused.
    • The template tools (create, update, patch, the step email patch, make-transactional prepare) each accept a valid call and refuse an unknown or misspelled key with an error that names it. A refused call sends no request to Django.
    • Read-only fields sent back on update are refused by name. The stored design keeps the editor's extra keys after an MCP update and patch.
    • The step email tool's top level stays non-strict: an unknown top-level key is dropped and the patch still applies.
  • Cross-version, 77 request fixtures through the base (0b3662a) and HEAD tool schemas: 0 regressions, the same classification as at 77ecc1c. 22 are refused on purpose (unknown or read-only keys that base dropped silently), and 6 keep design keys that base dropped.
  • Prod-shape, reused from 77ecc1c: no template tool schema changes since, and every stored template shape gives the same result.
  • Lane gate: the migration check and the messaging tests pass on the same Python at f7bad79. The MCP unit tests pass at the stack top 00f9015, paths-view.test.ts included. hogli build:openapi gives no diff after the hand-resolved conflict in the generated send schema. A fresh review of the changes since 77ecc1c found nothing in this PR's diff. Its one finding was in master code that the base merge brought in.
  • CI report: at 13bbcfb only the bundle warning (+1.2 KiB) stays open, and it does not come from this layer: it measures the whole stack against master, and this layer's generated types add no bundle code. The two flaky Playwright tests passed on retry and touch nothing in this stack.
Earlier live run at the pre-cut stack, 2026-10-31
  • Live run, 2026-10-31, the MCP send tool against django at the top of the stack (3a30f51c529), cdp-api and both CDP workers at feat(cdp): send a template from the workflow version Django graded #127130 (f9abed0841c), mail caught in maildev.

    Tool call Result
    Code send from a verified sender message_id, email delivered with the caller's content
    Code send from an unverified domain Tool error that names the from field
    capture_engagment (misspelled) Refused by the schema before any request

Release status

  • Part of this change is not behind a feature flag: the create, update and design tools, workflows-patch-action-email included, refuse unknown keys for everyone

Docs update

None.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Agent: Claude Code, Claude Opus 5.5 (claude-opus-5-5)

Question Answer Who Where
How do the MCP email bodies become strict? Through the codegen config, in this stack 👤 Human map Silthus#461, 2026-10-25 (D2)
May the code carry comments? No; names carry the reasons 👤 Human map Silthus#461, 2026-10-25
Does the update tool refuse a fetched template's read-only fields? Yes, with an error that names the key, and a description that says to send only changed fields 🤖 Agent pending approval
Which form does the MCP send tool take? The code form only; a template send goes through the SDKs 🤖 Agent pending approval
How does the design document stay open under strict bodies? An open OpenAPI shape plus a post-Orval step that loosens those objects, rather than a patch to Orval 🤖 Agent pending approval

Involvement: one decision from Michael (D2); review rounds: srv2 round 1 (GPT-6.1 Sol, Opus fresh eyes) fixed; dj3 round 1 (GPT-6.1 Sol) fixed, final read clean; QA swarm on 2026-11-01 with one panel round (GPT-6.1 Sol review, Opus 5.5 fresh eyes): 2 findings fixed in this description; later changes are merges from below; live run captured. After the re-cut, one panel round (GPT-6.1 Sol lenses, Opus 5.5 fresh eyes): 2 findings fixed in 9e6fadb.

Follow-up: the loose root of workflows-patch-action-email, which drops a misspelled base_updated_at, is master behavior.

🤖 Generated with Claude Code

Silthus and others added 24 commits October 31, 2026 15:54
The send tool's Zod stripped unknown keys, so template.content_hash
instead of template.hash sent the email without the hash check. Orval
now generates strict bodies for the email_templates module only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upload, update and make-transactional join path params and a body, so
they took the params' loose top level and stripped a misspelled key such
as if_not_superseded. The joined input is now strict when its module has
strict bodies. The design document stays open: its skeleton sets
additionalProperties, and the Orval post-step turns those objects into
looseObject, because Orval's strict mode ignores the flag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every open object the OpenAPI marks must now match a generated object, or
the generator fails and names the module, the operation and the path.
Unions with more than one non-null branch, colliding paths and dotted
property names fail the same way instead of loosening a closed sibling.
The update tool now tells the agent to keep the template id.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A closed property whose literal name contains a dot could alias a nested
open path and be loosened with it. A body with open targets now refuses
any dotted property name. The generator removes its temp directory when
preparation or the collector throws, not only after post-processing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A code send without `from` now tells cdp-api its sender is the project's
default (`from.isDefault`). cdp-api keys an Idempotency-Key retry on the
sender the caller chose, so a retry after the default sender changed
replays the first send instead of answering that the key was reused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s code form

The rebase kept the base side of the generated MCP email clients, so the
send and template tools still took unknown keys. Regenerating makes them
strict, and the open design objects loose. The send tool takes only the
email your code rendered, so its tests now send that form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The patch tools took their operations from a hand-written schema that
dropped unknown keys, so a misspelled `index` moved a block to the end
instead of the position the agent asked for. The operations and the patch
root now refuse unknown keys. The freeform payloads stay open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rations

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oute-idempotency

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ict-email-bodies

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oute-idempotency

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ict-email-bodies

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oute-idempotency

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ict-email-bodies

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oute-idempotency

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ict-email-bodies

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Trunk lane — backend Python lane

This PR is assigned to the backend Python lane. It runs backend Python tests and may merge in parallel with PRs in other lanes.

✅ Complexity (TypeScript) — clean

Cyclomatic complexity above the limit in changed typescript files (10 for production files, 15 for test files). Warn only: worth simplifying when you next touch these functions.

✅ Duplication (Python) — clean

New Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

✅ Duplication (TypeScript) — clean

New TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

⚠️ Bundle size — 🔺 +1.2 KiB (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 77.27 MiB · 🔺 +1.2 KiB (+0.0%)

File Size Δ vs base
toolbar/src/toolbar/floating/components/experiments/chunk-ExperimentsToolbarMenu.js 13.1 KiB 🔺 +1.2 KiB (+10.0%)

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

✅ Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.03 MiB · 25 files no change █████████░ 89.7% of 1.14 MiB
logged-out boot: index + App + bootApp (preloaded by every page, including /login)
src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
3.00 MiB · 623 files no change ██████████ 99.0% of 3.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
3.87 MiB · 1,233 files no change ██████████ 96.5% of 4.01 MiB
dashboard scene
src/scenes/dashboard/Dashboard.tsx
7.55 MiB · 2,914 files no change ████████░░ 76.8% of 9.84 MiB
today home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
4.72 MiB · 1,757 files no change ██████████ 95.7% of 4.93 MiB
AI-first home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
5.97 MiB · 2,255 files no change ██████████ 95.2% of 6.27 MiB
events scene
src/scenes/activity/explore/EventsScene.tsx
6.59 MiB · 2,485 files no change ███████░░░ 70.0% of 9.41 MiB
web analytics scene
src/scenes/web-analytics/WebAnalyticsScene.tsx
7.57 MiB · 2,831 files no change ███████░░░ 72.1% of 10.49 MiB
replay detail scene
src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
6.87 MiB · 2,582 files no change ████████░░ 84.6% of 8.13 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 products/product_analytics/frontend/insights/activityDescriptions stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/zod/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/logic/billing/billingLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/ProductEmptyState/productSetupPreloadLogic.ts stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/kea-test-utils/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/product_analytics/frontend/insights/activityDescriptions stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/kea-test-utils/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/dashboards/frontend/widgets/previews/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/panel-layout/ProjectTree/menus/SessionReplayMenuItems.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/navigation/projectNoticeLogic.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/navigation/ImpersonationNotice/ImpersonationNotice.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/cohorts/cohortSavedToast.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/wizard/frontend/runs/WizardRunDetailsDrawer.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/TodayShell.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/TodayContextPanelFloating.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/TodaySidePanel.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/TodayTopBar.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/todayRailItems.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/subscriptions/frontend/components/Subscriptions/exportNudge/exportNudgeLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/billing/paymentEntryLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/conversations/frontend/components/SidePanel/sidepanelTicketsLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/zod/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/authentication/auth/loginLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/authentication/shared/passkeyLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/surveys/constants.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@tiptap/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/prosemirror- stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/re2js/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/react-markdown/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/Command/Command.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 packages/quill/packages/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 zod/v4/locales/de.js stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 packages/quill/packages/quill/dist/ stays out of src/scenes/dashboard/Dashboard.tsx
🟢 node_modules/@tiptap/ stays out of src/scenes/dashboard/Dashboard.tsx
🟢 node_modules/prosemirror- stays out of src/scenes/dashboard/Dashboard.tsx
🟢 node_modules/marked/ stays out of src/scenes/dashboard/Dashboard.tsx
🟢 node_modules/frimousse/ stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/queries/validators.js stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/queries/web-analytics-validators.js stays out of src/scenes/dashboard/Dashboard.tsx
🟢 node_modules/re2js/ stays out of src/scenes/dashboard/Dashboard.tsx
🟢 node_modules/kea-test-utils/ stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/debug/HogDebug.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/queries/QueryEditor/QueryEditor.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 packages/quill/packages/quill/dist/ stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/project-homepage/today/TodayReportPage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/queries/Query/Query.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 packages/quill/packages/charts/ stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 packages/quill/packages/quill/dist/ stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 products/posthog_ai/frontend/components/tool/widgets/VisualizationWidget.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 products/posthog_ai/frontend/components/tool/widgets/RecordingsWidget.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 src/queries/Query/Query.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 products/posthog_ai/frontend/api/primitives.ts stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 src/scenes/notebooks/Notebook/notebookLogic.ts stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 packages/quill/packages/quill/dist/ stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 node_modules/@tiptap/ stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 node_modules/prosemirror- stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 node_modules/marked/ stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 node_modules/frimousse/ stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/queries/validators.js stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/queries/web-analytics-validators.js stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 node_modules/re2js/ stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 node_modules/kea-test-utils/ stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/queries/nodes/InsightViz/InsightViz.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/queries/nodes/DataVisualization/DataVisualization.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/queries/nodes/WebOverview/WebOverview.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/scenes/debug/HogDebug.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/queries/QueryEditor/QueryEditor.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 packages/quill/packages/quill/dist/ stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 node_modules/@tiptap/ stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 node_modules/prosemirror- stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 node_modules/marked/ stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 node_modules/frimousse/ stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 src/scenes/web-analytics/LiveMetricsDashboard/LiveWebAnalyticsMetrics.tsx stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 products/product_analytics/frontend/insights/trends/WorldMap/countryVectors.tsx stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 src/queries/validators.js stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 node_modules/re2js/ stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 node_modules/kea-test-utils/ stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 src/scenes/debug/HogDebug.tsx stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 src/queries/QueryEditor/QueryEditor.tsx stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 packages/quill/packages/quill/dist/ stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 node_modules/@tiptap/ stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 node_modules/prosemirror- stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 node_modules/marked/ stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 src/scenes/settings/SettingsMap.tsx stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 @jspm/core/nodelibs/browser/fs stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 node_modules/re2js/ stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 node_modules/kea-test-utils/ stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 node_modules/d3/src/ stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.7 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
4.0 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.9 KiB src/lib/utils/bootTiming.ts
1.7 KiB src/index.tsx
1.7 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.2 KiB src/RootErrorBoundary.tsx
1.1 KiB src/lib/utils/deferredAppContext.ts
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
356.2 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
224.1 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
104.8 KiB src/products.tsx
89.6 KiB src/lib/api.ts
68.7 KiB src/lib/lemon-ui/icons/icons.tsx
41.9 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
36.4 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
28.5 KiB src/lib/constants.tsx
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
356.2 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
224.1 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
104.8 KiB src/products.tsx
89.6 KiB src/lib/api.ts
68.7 KiB src/lib/lemon-ui/icons/icons.tsx
41.9 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
36.4 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
32.3 KiB src/lib/utils/eventUsageLogic.ts
28.5 KiB src/lib/constants.tsx
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
Size File
356.2 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
224.1 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
114.5 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/surveys-preview.js
110.8 KiB ../packages/quill/packages/primitives/dist/index.js
104.8 KiB src/products.tsx
96.1 KiB ../packages/quill/packages/components/dist/index.js
89.6 KiB src/lib/api.ts
75.6 KiB src/scenes/dashboard/dashboardLogic.tsx
68.7 KiB src/lib/lemon-ui/icons/icons.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
Size File
356.2 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
224.1 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.8 KiB ../packages/quill/packages/primitives/dist/index.js
104.8 KiB src/products.tsx
89.6 KiB src/lib/api.ts
68.7 KiB src/lib/lemon-ui/icons/icons.tsx
68.0 KiB ../products/posthog_ai/frontend/logics/runStreamLogic.ts
41.9 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
36.4 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
Size File
356.2 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
224.1 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.8 KiB ../packages/quill/packages/primitives/dist/index.js
104.8 KiB src/products.tsx
89.6 KiB src/lib/api.ts
68.7 KiB src/lib/lemon-ui/icons/icons.tsx
68.0 KiB ../products/posthog_ai/frontend/logics/runStreamLogic.ts
41.9 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
41.7 KiB src/scenes/hog-functions/sub-templates/sub-templates.ts
Largest files eagerly shipped from src/scenes/activity/explore/EventsScene.tsx
Size File
356.2 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
224.1 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.8 KiB ../packages/quill/packages/primitives/dist/index.js
104.8 KiB src/products.tsx
96.1 KiB ../packages/quill/packages/components/dist/index.js
89.6 KiB src/lib/api.ts
75.6 KiB src/scenes/dashboard/dashboardLogic.tsx
68.7 KiB src/lib/lemon-ui/icons/icons.tsx
68.0 KiB ../products/posthog_ai/frontend/logics/runStreamLogic.ts
Largest files eagerly shipped from src/scenes/web-analytics/WebAnalyticsScene.tsx
Size File
356.2 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
224.1 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
114.5 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/surveys-preview.js
110.8 KiB ../packages/quill/packages/primitives/dist/index.js
104.8 KiB src/products.tsx
96.1 KiB ../packages/quill/packages/components/dist/index.js
89.6 KiB src/lib/api.ts
75.6 KiB src/scenes/dashboard/dashboardLogic.tsx
68.7 KiB src/lib/lemon-ui/icons/icons.tsx
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
Size File
356.2 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
321.5 KiB ../node_modules/.pnpm/posthog-js@1.445.2_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js
224.1 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.8 KiB ../packages/quill/packages/primitives/dist/index.js
104.8 KiB src/products.tsx
96.1 KiB ../packages/quill/packages/components/dist/index.js
89.6 KiB src/lib/api.ts
68.7 KiB src/lib/lemon-ui/icons/icons.tsx
68.0 KiB ../products/posthog_ai/frontend/logics/runStreamLogic.ts

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

✅ Frontend layers — no new upward imports, 0 removed

Static imports from a lower frontend layer into a higher one (layers, lowest first: kernel, shell, query, features). Compared with the base branch, so an import that a PR also adds to layer-baseline.txt still shows here. Sizes are the source bytes on the eager path of every logged-in page.

Layer Eager source bytes Δ vs base
kernel 2.99 MiB no change
shell 2.38 MiB no change
query 56.4 KiB no change
features 356.2 KiB no change

Download the interactive layer graph for this PR.

Posted automatically by check-layers

✅ Toolbar bundle — eager 2.39 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.39 MiB · 19 files 🔺 +115 B (+0.0%) ████░░░░░░ 41.7% of 5.72 MiB
Deferred (lazy) 2.12 MiB · 42 files 🔺 +1.2 KiB (+0.1%) n/a — loads on demand
Loader dist/toolbar.js 1.2 KiB no change █░░░░░░░░░ 6.0% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
962.0 KiB dist/toolbar/toolbar-app-2YDO7Z76.css
727.9 KiB dist/toolbar/chunk-chunk-C3YI6GSO.js
261.3 KiB dist/toolbar/chunk-chunk-LPZVU6KG.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
130.4 KiB dist/toolbar/chunk-chunk-T5YBIAR2.js
75.7 KiB dist/toolbar/toolbar-app-KQBCSO2E.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
33.8 KiB dist/toolbar/chunk-chunk-RNAY4ENA.js
21.7 KiB dist/toolbar/chunk-chunk-DOK7DOTD.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

✅ Dist folder size — 🔺 +7.1 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 973.14 MiB · 🔺 +7.1 KiB (+0.0%)

ℹ️ MCP UI apps size — 35 app(s), 29271.9 KB JS

Built size of each MCP UI app (main.js + styles.css).

App JS CSS
debug 848.8 KB 220.9 KB
explain-chart 1123.7 KB 220.9 KB
action 771.5 KB 220.9 KB
action-list 839.8 KB 220.9 KB
cohort 770.5 KB 220.9 KB
cohort-list 838.8 KB 220.9 KB
email-template 770.4 KB 220.9 KB
error-details 775.4 KB 220.9 KB
error-issue 772.7 KB 220.9 KB
error-issue-list 841.2 KB 220.9 KB
experiment 836.9 KB 220.9 KB
experiment-list 840.5 KB 220.9 KB
experiment-results 838.7 KB 220.9 KB
feature-flag 839.2 KB 220.9 KB
feature-flag-list 842.9 KB 220.9 KB
feature-flag-testing 773.8 KB 220.9 KB
inline-scan 771.0 KB 220.9 KB
insight-actors 838.3 KB 220.9 KB
llm-costs 835.6 KB 220.9 KB
session-recording 772.8 KB 220.9 KB
survey 772.1 KB 220.9 KB
survey-global-stats 835.6 KB 220.9 KB
survey-list 840.5 KB 220.9 KB
survey-stats 835.6 KB 220.9 KB
trace-span 770.9 KB 220.9 KB
trace-span-list 839.7 KB 220.9 KB
vision-observation-list 838.9 KB 220.9 KB
workflow 770.9 KB 220.9 KB
workflow-list 839.1 KB 220.9 KB
workflow-setup-status 770.6 KB 220.9 KB
query-results 1095.2 KB 220.9 KB
render-ui 1199.7 KB 220.9 KB
visual-review-snapshots 775.4 KB 220.9 KB
workflow-data-suggestions 773.2 KB 220.9 KB
workflow-sending-rules 771.9 KB 220.9 KB
ℹ️ MCP agent API — agent-facing tool changes

What this PR changes for agents, from the tool schema snapshots and tool definitions.

Tools changed (5):

Tool Params Scopes Annotations Schema chars
workflows-create-email-template 4,347 -> 4,486
workflows-get-email-template description changed
workflows-patch-action-email 4,441 -> 4,702
workflows-patch-email-template 3,824 -> 4,085
workflows-update-email-template description changed 4,433 -> 4,572
⚠️ Playwright — 2 flaky

🎭 Playwright report · View test results →

⚠️ 2 flaky tests:

  • Early access feature new and list (chromium)
  • view results, pause, resume, and ship (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this section? Help fix flakies and failures and it will go green!

✅ Backend coverage — all changed backend lines covered

🧪 Backend test coverage

Patch coverage — changed backend lines (products + core): ████████████████████ 100.0% (8 / 8)

All changed backend lines are covered ✅

Per-product line coverage (touched products)
Product Coverage Lines
demo ██████████████░░░░░░ 71.2% 1,979 / 2,778
batch_exports ████████████████░░░░ 82.2% 23,521 / 28,601
engineering_analytics █████████████████░░░ 84.9% 11,753 / 13,841
commands █████████████████░░░ 85.4% 1,621 / 1,898
mcp_analytics █████████████████░░░ 86.3% 5,812 / 6,733
posthog_ai ██████████████████░░ 87.9% 4,304 / 4,896
notebooks ██████████████████░░ 88.8% 15,454 / 17,407
mcp_registry ██████████████████░░ 89.0% 1,596 / 1,794
dashboards ██████████████████░░ 89.4% 8,048 / 9,003
product_tours ██████████████████░░ 89.7% 1,355 / 1,510
warehouse_suggestions ██████████████████░░ 90.1% 3,836 / 4,257
cohorts ██████████████████░░ 90.3% 9,203 / 10,195
signals ██████████████████░░ 90.7% 102,118 / 112,573
today ██████████████████░░ 91.2% 3,949 / 4,330
canvas ██████████████████░░ 91.2% 8,199 / 8,988
tasks ██████████████████░░ 91.3% 83,321 / 91,241
managed_warehouse ██████████████████░░ 91.4% 12,928 / 14,151
data_warehouse ██████████████████░░ 91.4% 15,913 / 17,416
data_modeling ██████████████████░░ 91.5% 11,714 / 12,806
autoresearch ██████████████████░░ 91.5% 11,717 / 12,805
cdp ██████████████████░░ 91.5% 10,433 / 11,399
metrics ██████████████████░░ 91.8% 11,380 / 12,399
streamlit_apps ██████████████████░░ 91.9% 3,139 / 3,415
business_knowledge ██████████████████░░ 92.0% 10,556 / 11,476
wizard ██████████████████░░ 92.2% 7,002 / 7,594
review_hog ██████████████████░░ 92.3% 17,768 / 19,256
conversations ██████████████████░░ 92.3% 31,368 / 33,969
error_tracking ███████████████████░ 92.5% 20,375 / 22,018
early_access_features ███████████████████░ 92.6% 1,339 / 1,446
alerts_platform ███████████████████░ 92.6% 8,643 / 9,329
slack_app ███████████████████░ 92.7% 22,443 / 24,215
notifications ███████████████████░ 92.8% 1,218 / 1,312
stamphog ███████████████████░ 93.0% 10,413 / 11,193
alerts ███████████████████░ 93.0% 11,701 / 12,575
surveys ███████████████████░ 93.3% 7,256 / 7,780
web_analytics ███████████████████░ 93.4% 26,472 / 28,347
approvals ███████████████████░ 93.7% 5,004 / 5,341
marketing_analytics ███████████████████░ 93.8% 22,066 / 23,535
workflows ███████████████████░ 93.8% 27,870 / 29,712
context_layer ███████████████████░ 93.8% 3,984 / 4,247
exports ███████████████████░ 93.9% 4,324 / 4,607
cross_project_dashboards ███████████████████░ 93.9% 858 / 914
mcp_store ███████████████████░ 93.9% 9,193 / 9,789
ai_observability ███████████████████░ 94.0% 33,124 / 35,252
authorization ███████████████████░ 94.0% 671 / 714
billing_alerts ███████████████████░ 94.0% 2,322 / 2,470
messaging ███████████████████░ 94.1% 7,669 / 8,150
customer_analytics ███████████████████░ 94.1% 30,760 / 32,679
replay_vision ███████████████████░ 94.4% 33,353 / 35,345
logs ███████████████████░ 94.5% 19,437 / 20,572
reminders ███████████████████░ 94.8% 782 / 825
experiments ███████████████████░ 94.8% 45,081 / 47,546
warehouse_sources ███████████████████░ 94.8% 135,153 / 142,521
actions ███████████████████░ 94.9% 997 / 1,051
growth ███████████████████░ 95.0% 11,563 / 12,176
endpoints ███████████████████░ 95.0% 9,665 / 10,177
annotations ███████████████████░ 95.1% 1,097 / 1,153
skills ███████████████████░ 95.2% 7,633 / 8,018
access_control ███████████████████░ 95.4% 8,461 / 8,871
subscriptions ███████████████████░ 95.7% 14,017 / 14,651
data_catalog ███████████████████░ 95.7% 4,715 / 4,928
product_analytics ███████████████████░ 95.8% 30,525 / 31,863
feature_flags ███████████████████░ 95.8% 29,678 / 30,973
revenue_analytics ███████████████████░ 95.9% 1,877 / 1,958
data_quality ███████████████████░ 96.0% 8,561 / 8,915
tracing ███████████████████░ 96.5% 4,572 / 4,737
account_audits ███████████████████░ 96.7% 770 / 796
pulse ███████████████████░ 97.3% 2,036 / 2,093
analytics_platform ████████████████████ 98.0% 2,883 / 2,943
groups ████████████████████ 98.2% 1,604 / 1,634

Report-only. Patch coverage = changed backend lines covered vs origin/master. Sorted lowest first.
Known gaps: lines covered only by Temporal tests show as uncovered; core line numbers may drift if master changed the same file.

✅ Django migration risk — no migrations to analyze

No Django migrations need risk analysis.

@Silthus

Silthus commented Nov 4, 2026

Copy link
Copy Markdown
Contributor Author

@PostHog review

@posthog

posthog Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

@Silthus PostHog Review is reviewing this pull request.

@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 77ecc1c: no findings.

@Silthus Silthus added the stamphog Request AI approval (no full review) label Nov 4, 2026
stamphog[bot]

This comment was marked as outdated.

Silthus and others added 4 commits November 4, 2026 13:07
…cp-strict-email-bodies

Brings 03's fcf42b0, which carries 02's c81b9e0. The send email schema keeps
this layer's strict object and gains 03's `from` max of 1024 characters.
hogli build:openapi regenerates nothing on top of the merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@stamphog
stamphog Bot dismissed their stale review November 4, 2026 14:44

A new stamphog review started for this PR — the fresh verdict replaces this approval.

stamphog[bot]

This comment was marked as outdated.

@Silthus

Silthus commented Nov 4, 2026

Copy link
Copy Markdown
Contributor Author

@PostHog review

@posthog

posthog Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

@Silthus PostHog Review is reviewing this pull request.

@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 b9cb59d: no findings.

@trunk-io

trunk-io Bot commented Nov 4, 2026

Copy link
Copy Markdown

This pull request is queued for merge as part of 127187, which will merge 127167, 127181, 127183, 127187.

@trunk-io

trunk-io Bot commented Nov 4, 2026

Copy link
Copy Markdown

Stacked PR 127187 was cancelled: @Silthus cancelled it.

@trunk-io

trunk-io Bot commented Nov 4, 2026

Copy link
Copy Markdown

This pull request is queued for merge as part of 127187, which will merge 127167, 127181, 127183, 127187.

@trunk-io

trunk-io Bot commented Nov 4, 2026

Copy link
Copy Markdown

Stacked PR 127187 failed testing in the merge queue. Please investigate the failure and re-submit the stack.

@trunk-io

trunk-io Bot commented Nov 4, 2026

Copy link
Copy Markdown

This pull request is queued for merge as part of 127187, which will merge 127167, 127181, 127183, 127187.

@trunk-io

trunk-io Bot commented Nov 4, 2026

Copy link
Copy Markdown

Stacked PR 127187 failed testing in the merge queue. Please investigate the failure and re-submit the stack.

…ies layer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@stamphog
stamphog Bot dismissed their stale review November 4, 2026 18:59

A new stamphog review started for this PR — the fresh verdict replaces this approval.

@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.

Approved.

The author belongs to @PostHog/team-workflows, but the risky MCP and generator changes owned by @PostHog/team-context-and-mcp lack current-head review coverage; both supplied reviews concern older commits. Request review from @PostHog/team-context-and-mcp before re-requesting, with Julian Bez or Harley Alexander as suggested reviewers.

Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✓ no deny categories matched
size ✓ 417L, 10F substantive, 681L/22F incl. docs/generated/snapshots — within ceiling
tier ✓ T1-agent / T1d-complex (681L, 22F, two-areas, fix)
stamphog 2.7.0 .stamphog/policy.yml @ 13bbcfb · reviewed head 13bbcfb

@trunk-io

trunk-io Bot commented Nov 4, 2026

Copy link
Copy Markdown

This pull request is queued for merge as part of 127187, which will merge 127167, 127181, 127183, 127187.

@trunk-io
trunk-io Bot merged commit d7f54b2 into master Nov 4, 2026
304 checks passed
@trunk-io

trunk-io Bot commented Nov 4, 2026

Copy link
Copy Markdown

This pull request was merged into master as part of stacked PR 127187.

@trunk-io
trunk-io Bot deleted the email-v2/10-mcp-strict-email-bodies branch November 4, 2026 20:20
@deployment-status-posthog

deployment-status-posthog Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-11-04 21:00 UTC Run
prod-us ✅ Deployed 2026-11-04 21:42 UTC Run
prod-eu ✅ Deployed 2026-11-04 21:35 UTC Run

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

Labels

stamphog Request AI approval (no full review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant