Skip to content

feat(messaging): add an API for emails sent from code - #131583

Merged
trunk-io[bot] merged 11 commits into
masterfrom
feat/transactional-code-emails-api
Nov 12, 2026
Merged

trunk-io[bot] merged 11 commits into
masterfrom
feat/transactional-code-emails-api

Conversation

@Silthus

@Silthus Silthus commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Problem

  • Teams that send email from code under a template_key cannot find or label those emails in PostHog. The approved code-sent emails prototype asks for this and gives no further reason.

Caution

🔴 Merge risk: high · one-way door: a nullable source_url column and a new project API

  • The code-send path reads the key table, so a region without the column fails those sends. Few teams send from code.
  • Switch-off: the API 404s without the transactional email flags. The column ships on deploy.

Rollout

  • Stages: frontend layers merge only after this migration is live in prod-us and prod-eu.
  • Watch: no alert. Watch 5xx on transactional_code_emails.

Changes

  • A new transactional_code_emails API lists, gets and updates a project's emails sent from code.
  • An update changes the description, tags, or linked source file. The content always comes from code.
  • Access follows each email's hidden workflow.
  • Each email carries the reader's access level to that workflow, so the UI decides editability per email.
  • Get and update check access for the one email's workflow, not every viewable workflow.
  • A label edit moves the workflow's updated_at but writes no version. The workflow editor then rejects a save based on older labels with a 409.
  • Mechanical: the migration and regenerated types.

How did you test this code?

Test rationale: the new API tests cover team scoping, per-email workflow access, hidden keys, link validation and the flag gate. The update test also checks that a label edit leaves the workflow's version and steps untouched. A new test fails if a stale workflow save after a description or tags edit returns 200 and drops the labels.

  • CI report: the migration adds one nullable source_url column, with no default, backfill or index.

Release status

  • This change is behind a feature flag and is not available to users

Docs update

  • None.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

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

Skills: /improving-drf-endpoints, /django-migrations, /writing-tests, /writing-pr-descriptions, /merge-risk

More context for AI agents
  • Session: Claude Code worker building the code-sent emails prototype as a four-PR stack.
  • Decisions: 🤖 source_url lives on the key row; description and tags live on the hidden workflow.
  • Decisions: 🤖 A label edit writes no workflow version, but moves updated_at so stale editor saves get a 409. Keys a template took over, or whose workflow was deleted, are hidden.
  • Decisions: 🤖 No pagination, no "last sent", no MCP tool yet.
  • Read closely: services/code_emails.py and update_code_email_labels.

🤖 Generated with Claude Code

@Silthus Silthus added run-ci-backend Force ci-backend's full test matrices to run even on a draft PR run-ci-frontend Force ci-storybook's full visual-regression matrix to run even on a draft PR labels Nov 9, 2026
@Silthus Silthus self-assigned this Nov 9, 2026
@trunk-io

trunk-io Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

😎 This pull request was merged.

@github-actions

github-actions Bot commented Nov 9, 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 — no change

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

Total: 78.54 MiB · no change

No file changed by more than 1000 B.

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

⚠️ Eager graph — 1 over 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.05 MiB · 25 files no change █████████░ 91.5% 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.04 MiB · 628 files no change ██████████ 100.2% of 3.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
3.87 MiB · 1,237 files no change ██████████ 99.1% of 3.91 MiB
dashboard scene
src/scenes/dashboard/Dashboard.tsx
7.81 MiB · 3,018 files no change ██████████ 98.7% of 7.92 MiB
today home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
4.86 MiB · 1,872 files no change ██████████ 99.5% of 4.88 MiB
AI-first home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
6.08 MiB · 2,296 files no change ██████████ 99.2% of 6.13 MiB
events scene
src/scenes/activity/explore/EventsScene.tsx
6.80 MiB · 2,563 files no change ██████████ 98.5% of 6.91 MiB
web analytics scene
src/scenes/web-analytics/WebAnalyticsScene.tsx
7.89 MiB · 2,968 files no change ██████████ 99.2% of 7.96 MiB
replay detail scene
src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
6.99 MiB · 2,620 files no change ██████████ 98.6% of 7.09 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/cohorts/CohortFilters/constants.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/persons/frontend/logics/personsLogic.tsx 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
362.7 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_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
106.4 KiB src/products.tsx
87.8 KiB src/lib/api.ts
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
42.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.3.0_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
29.2 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
362.7 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_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
106.4 KiB src/products.tsx
87.8 KiB src/lib/api.ts
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
42.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.3.0_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.6 KiB src/lib/utils/eventUsageLogic.ts
29.2 KiB src/lib/constants.tsx
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
Size File
362.7 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_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
116.4 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_react@18.3.1/node_modules/posthog-js/dist/surveys-preview.js
112.7 KiB ../packages/quill/packages/primitives/dist/index.js
106.4 KiB src/products.tsx
98.2 KiB ../packages/quill/packages/components/dist/index.js
87.8 KiB src/lib/api.ts
78.8 KiB src/scenes/dashboard/dashboardLogic.tsx
69.0 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
362.7 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_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
112.7 KiB ../packages/quill/packages/primitives/dist/index.js
106.4 KiB src/products.tsx
87.8 KiB src/lib/api.ts
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
68.5 KiB ../products/posthog_ai/frontend/logics/runStreamLogic.ts
42.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.3.0_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
362.7 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_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
112.7 KiB ../packages/quill/packages/primitives/dist/index.js
106.4 KiB src/products.tsx
87.8 KiB src/lib/api.ts
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
68.5 KiB ../products/posthog_ai/frontend/logics/runStreamLogic.ts
42.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.3.0_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
362.7 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_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
112.7 KiB ../packages/quill/packages/primitives/dist/index.js
106.4 KiB src/products.tsx
98.2 KiB ../packages/quill/packages/components/dist/index.js
87.8 KiB src/lib/api.ts
78.8 KiB src/scenes/dashboard/dashboardLogic.tsx
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
68.5 KiB ../products/posthog_ai/frontend/logics/runStreamLogic.ts
Largest files eagerly shipped from src/scenes/web-analytics/WebAnalyticsScene.tsx
Size File
362.7 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_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
116.4 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_react@18.3.1/node_modules/posthog-js/dist/surveys-preview.js
112.7 KiB ../packages/quill/packages/primitives/dist/index.js
106.4 KiB src/products.tsx
98.2 KiB ../packages/quill/packages/components/dist/index.js
87.8 KiB src/lib/api.ts
78.8 KiB src/scenes/dashboard/dashboardLogic.tsx
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
Size File
362.7 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_react@18.3.1/node_modules/posthog-js/dist/module.mjs
329.1 KiB ../node_modules/.pnpm/posthog-js@1.447.12_@types+react@18.3.31_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
112.7 KiB ../packages/quill/packages/primitives/dist/index.js
106.4 KiB src/products.tsx
98.2 KiB ../packages/quill/packages/components/dist/index.js
87.8 KiB src/lib/api.ts
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
68.5 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 3.00 MiB no change
shell 2.41 MiB no change
query 56.9 KiB no change
features 274.1 KiB no change

Download the interactive layer graph for this PR.

Posted automatically by check-layers

✅ Toolbar bundle — eager 2.45 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.45 MiB · 19 files no change ████░░░░░░ 42.8% of 5.72 MiB
Deferred (lazy) 2.64 MiB · 43 files no change 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
984.4 KiB dist/toolbar/toolbar-app-I2TVWWC7.css
738.4 KiB dist/toolbar/chunk-chunk-ZCDDJ7QI.js
290.5 KiB dist/toolbar/chunk-chunk-T6UVYVTK.js
137.6 KiB dist/toolbar/chunk-chunk-U5SFCDOX.js
131.8 KiB dist/toolbar/chunk-chunk-FQJO25M6.js
75.7 KiB dist/toolbar/toolbar-app-IU6DQZCH.js
69.0 KiB dist/toolbar/chunk-chunk-BFAXZMC5.js
33.8 KiB dist/toolbar/chunk-chunk-2J4VD6DQ.js
21.9 KiB dist/toolbar/chunk-chunk-BAY6XTHE.js
6.8 KiB dist/toolbar/chunk-chunk-RVLGRPCH.js

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

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

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

Total: 1009.03 MiB · 🔺 +5.9 KiB (+0.0%)

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

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

App JS CSS
debug 1067.3 KB 225.1 KB
explain-chart 1349.7 KB 225.1 KB
action 994.5 KB 225.1 KB
action-list 1058.3 KB 225.1 KB
cohort 993.5 KB 225.1 KB
cohort-list 1057.3 KB 225.1 KB
email-template 993.4 KB 225.1 KB
error-details 998.4 KB 225.1 KB
error-issue 995.5 KB 225.1 KB
error-issue-list 1059.5 KB 225.1 KB
experiment 1055.4 KB 225.1 KB
experiment-list 1059.1 KB 225.1 KB
experiment-results 1057.4 KB 225.1 KB
feature-flag 1057.7 KB 225.1 KB
feature-flag-list 1061.4 KB 225.1 KB
feature-flag-testing 996.8 KB 225.1 KB
inline-scan 994.0 KB 225.1 KB
insight-actors 1056.8 KB 225.1 KB
llm-costs 1054.0 KB 225.1 KB
session-recording 995.8 KB 225.1 KB
survey 995.1 KB 225.1 KB
survey-global-stats 1054.1 KB 225.1 KB
survey-list 1059.0 KB 225.1 KB
survey-stats 1054.1 KB 225.1 KB
trace-span 993.9 KB 225.1 KB
trace-span-list 1058.2 KB 225.1 KB
vision-observation-list 1057.4 KB 225.1 KB
workflow 993.9 KB 225.1 KB
workflow-list 1057.6 KB 225.1 KB
workflow-setup-status 993.6 KB 225.1 KB
query-results 1319.0 KB 225.1 KB
render-ui 1425.6 KB 225.1 KB
visual-review-snapshots 998.4 KB 225.1 KB
workflow-data-suggestions 996.2 KB 225.1 KB
workflow-sending-rules 994.9 KB 225.1 KB
⚠️ Playwright — 1 flaky

🎭 Playwright report · View test results →

⚠️ 1 flaky test:

  • Delete a person property (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 — 88.0% of changed backend lines covered — 34 uncovered

🧪 Backend test coverage

Patch coverage — changed backend lines (products + core): ██████████████████░░ 88.0% (252 / 286)

File Patch Uncovered changed lines
products/workflows/backend/facade/contracts.py 33.3% 732–735
products/messaging/backend/facade/contracts.py 33.3% 413–420
products/workflows/backend/services/transactional_email_workflows.py 37.0% 275, 279–280, 285, 295, 310–320, 323
products/workflows/backend/facade/api.py 50.0% 257–258
products/messaging/backend/presentation/views/transactional_code_emails.py 96.4% 90, 120–121

🤖 Agents: add a test only if an uncovered line exposes a realistic regression that existing tests miss. Otherwise explain why no new test is needed under "How did you test this code?". Gap list: the patch-coverage artifact on this run (gh run download 79772608335144 -n patch-coverage), or the coverage-data block at the end of this comment.

Per-product line coverage (touched products)
Product Coverage Lines
demo ██████████████░░░░░░ 71.5% 1,996 / 2,793
knowledge_writer ████████████████░░░░ 77.8% 1,474 / 1,895
batch_exports █████████████████░░░ 82.9% 24,780 / 29,889
engineering_analytics █████████████████░░░ 85.6% 12,515 / 14,615
commands █████████████████░░░ 86.7% 1,674 / 1,930
mcp_analytics ██████████████████░░ 87.8% 6,827 / 7,777
posthog_ai ██████████████████░░ 88.2% 4,514 / 5,116
notebooks ██████████████████░░ 88.6% 15,594 / 17,599
apm ██████████████████░░ 89.2% 2,250 / 2,523
dashboards ██████████████████░░ 89.6% 9,053 / 10,101
cohorts ██████████████████░░ 90.7% 9,868 / 10,885
warehouse_suggestions ██████████████████░░ 90.7% 4,264 / 4,700
actions ██████████████████░░ 90.9% 1,524 / 1,677
data_warehouse ██████████████████░░ 91.1% 15,984 / 17,546
cdp ██████████████████░░ 91.1% 11,738 / 12,880
signals ██████████████████░░ 91.2% 113,337 / 124,320
today ██████████████████░░ 91.5% 4,136 / 4,521
canvas ██████████████████░░ 91.5% 8,559 / 9,351
tasks ██████████████████░░ 91.6% 86,725 / 94,665
autoresearch ██████████████████░░ 91.6% 12,203 / 13,318
data_modeling ██████████████████░░ 91.7% 12,686 / 13,835
streamlit_apps ██████████████████░░ 92.0% 3,200 / 3,478
release ██████████████████░░ 92.1% 453 / 492
alerts_platform ██████████████████░░ 92.1% 11,060 / 12,012
business_knowledge ██████████████████░░ 92.2% 10,900 / 11,824
review_hog ██████████████████░░ 92.4% 18,498 / 20,025
metrics ██████████████████░░ 92.4% 13,005 / 14,074
conversations ██████████████████░░ 92.4% 31,728 / 34,335
wizard ██████████████████░░ 92.4% 7,323 / 7,922
error_tracking ██████████████████░░ 92.5% 20,979 / 22,680
slack_app ███████████████████░ 92.5% 25,572 / 27,631
notifications ███████████████████░ 92.8% 1,230 / 1,326
early_access_features ███████████████████░ 92.8% 1,400 / 1,509
managed_warehouse ███████████████████░ 93.2% 15,792 / 16,947
authorization ███████████████████░ 93.2% 850 / 912
stamphog ███████████████████░ 93.3% 11,751 / 12,592
alerts ███████████████████░ 93.3% 14,214 / 15,228
web_analytics ███████████████████░ 93.5% 27,114 / 28,989
surveys ███████████████████░ 93.6% 7,847 / 8,388
exports ███████████████████░ 93.7% 4,474 / 4,777
approvals ███████████████████░ 93.7% 5,026 / 5,366
cross_project_dashboards ███████████████████░ 93.7% 867 / 925
context_layer ███████████████████░ 93.9% 4,075 / 4,342
marketing_analytics ███████████████████░ 93.9% 22,429 / 23,882
ai_observability ███████████████████░ 94.0% 41,209 / 43,862
mcp_store ███████████████████░ 94.0% 9,391 / 9,991
workflows ███████████████████░ 94.0% 30,411 / 32,343
billing_alerts ███████████████████░ 94.0% 2,332 / 2,480
messaging ███████████████████░ 94.1% 9,936 / 10,563
annotations ███████████████████░ 94.1% 1,460 / 1,552
customer_analytics ███████████████████░ 94.2% 31,845 / 33,808
access_control ███████████████████░ 94.3% 8,606 / 9,122
replay_vision ███████████████████░ 94.4% 33,460 / 35,451
logs ███████████████████░ 94.4% 20,549 / 21,764
reminders ███████████████████░ 94.5% 837 / 886
experiments ███████████████████░ 95.0% 47,460 / 49,972
growth ███████████████████░ 95.0% 11,603 / 12,217
endpoints ███████████████████░ 95.0% 9,725 / 10,239
warehouse_sources ███████████████████░ 95.0% 142,488 / 150,014
product_tours ███████████████████░ 95.1% 1,271 / 1,337
skills ███████████████████░ 95.1% 7,658 / 8,053
data_catalog ███████████████████░ 95.6% 4,749 / 4,965
subscriptions ███████████████████░ 95.7% 14,272 / 14,921
ui_customization ███████████████████░ 95.7% 714 / 746
tracing ███████████████████░ 95.8% 5,113 / 5,339
product_analytics ███████████████████░ 95.8% 31,464 / 32,849
feature_flags ███████████████████░ 95.8% 30,979 / 32,334
revenue_analytics ███████████████████░ 95.9% 1,877 / 1,958
data_quality ███████████████████░ 96.0% 8,583 / 8,937
groups ███████████████████░ 96.4% 2,068 / 2,145
aeo ███████████████████░ 96.4% 4,958 / 5,141
account_audits ███████████████████░ 96.5% 823 / 853
pulse ███████████████████░ 97.0% 2,026 / 2,089
analytics_platform ████████████████████ 98.0% 2,962 / 3,022

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 SQL — 1 new migration to review

We've detected new migrations on this PR. Review the SQL output for each migration:

products/messaging/backend/migrations/0017_transactionalemailkey_source_url.py

-- sqlmigrate failed for this migration (see the Validate migrations job log)

Last updated: 2026-11-12 05:11 UTC (9eaae33)

✅ Django migration risk — migration analysis complete

We've analyzed your migrations for potential risks.

Summary: 1 Safe | 0 Needs Review | 0 Blocked

✅ Safe

Brief or no lock, backwards compatible

messaging.0017_transactionalemailkey_source_url
  └─ #1 ✅ AddField
     Adding nullable field requires brief lock
     model: transactionalemailkey, field: source_url

📚 How to Deploy These Changes Safely

AddField:

This operation acquires a brief lock but doesn't rewrite the table.

Deployment uses lock timeouts with automatic retries, so lock contention will cause retries rather than connection pile-up.

Last updated: 2026-11-12 05:11 UTC (9eaae33)

List, read and label the emails a project sends from code under a
template_key that no template owns. Each key gets a nullable
source_url, the link to the file that sends it. The description and
tags live on the key's hidden workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Silthus
Silthus force-pushed the feat/transactional-code-emails-api branch from 9ffff96 to 2101c8e Compare November 9, 2026 07:55

@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 2101c8e: 1 Should fix.

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.

Retrieve and update now check the reader's access for the one email's
workflow instead of loading every viewable workflow id. Each code email
now carries the reader's effective access level to its workflow, so the
UI can decide editability per email. The update test now asserts that a
label edit leaves the workflow's version, revisions and steps untouched.

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

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

A save through the workflow API that was based on the older labels
now gets a 409 instead of overwriting them. The version stays the
same, because the steps do not change.

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

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

…tags

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

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

@Silthus
Silthus marked this pull request as ready for review November 10, 2026 09:01
@stamphog
stamphog Bot requested a review from a team November 10, 2026 09:01
@parameterai

parameterai Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Risk: No findings

This delta is a merge of master into the PR branch; the PR's own transactional-code-emails API code is byte-identical to what the last review verified, and the master-carried security-adjacent changes (messaging attachment uploads, alerts platform actions, MCP redaction, OOB-domain DNS guards) held up under tracing with no missing auth, scoping, or redaction found. No new security issues.

Sentinel reviewed 70dce92 · Review settings

@veria-ai

veria-ai Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

PR overview

No security issues were found in this pull request.

Reviews

stamphog[bot]

This comment was marked as outdated.

@stamphog
stamphog Bot dismissed their stale review November 11, 2026 19:01

New commits were pushed — dismissing the stamphog approval from an earlier head. Re-add the trigger label to request a fresh review.

stamphog[bot]

This comment was marked as outdated.

@trunk-io

trunk-io Bot commented Nov 11, 2026

Copy link
Copy Markdown

This pull request is queued for merge as part of 131668, which will merge 131583, 131585, 131586, 131587, 131582, 131634, 131668.

@stamphog
stamphog Bot dismissed their stale review November 12, 2026 04:35

New commits were pushed — dismissing the stamphog approval from an earlier head. Re-add the trigger label to request a fresh review.

@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 yet — waiting on the conditions below.

The Migration risk check has not finished for this commit, so stamphog cannot tell yet whether the change it covers is safe. The review runs again on the next push, or you can re-request it once the check reports.

Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✗ matches: migrations
size ✓ 389L, 11F substantive, 785L/17F incl. docs/generated/snapshots — within ceiling
tier ✗ classified as T2-never: T2-never (785L, 17F, two-areas, feat)
stamphog 2.8.0 .stamphog/policy.yml @ unknown · reviewed head 70dce92

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

@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 risky changes have owning-team authorship and targeted tests; the other team's changed file is generated schema output. No concrete unresolved substantive concern or other refusal ground is evidenced, and all formal reviews are on older commits.

  • Author wrote 33% of the modified lines and has 12 merged PRs in these paths (familiarity MODERATE).
Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✓ no deny categories matched
size ✓ 389L, 11F substantive, 785L/17F incl. docs/generated/snapshots — within ceiling
tier ✓ T1-agent / T1d-complex (785L, 17F, two-areas, feat)
stamphog 2.8.0 .stamphog/policy.yml @ 9eaae33 · reviewed head 9eaae33

@trunk-io
trunk-io Bot merged commit 3bcd257 into master Nov 12, 2026
281 checks passed
@trunk-io
trunk-io Bot deleted the feat/transactional-code-emails-api branch November 12, 2026 06:37
@trunk-io

trunk-io Bot commented Nov 12, 2026

Copy link
Copy Markdown

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

@deployment-status-posthog

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

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-11-12 06:56 UTC Run
prod-us ✅ Deployed 2026-11-12 07:16 UTC Run
prod-eu ✅ Deployed 2026-11-12 07:18 UTC Run

This table shows the posthog release only. Hogstation shows every service that this PR reaches, Kargo services included.

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

Labels

run-ci-backend Force ci-backend's full test matrices to run even on a draft PR run-ci-frontend Force ci-storybook's full visual-regression matrix to run even on a draft PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant