Skip to content

feat(workflows): add a T3 Code step that starts a T3 Code agent run - #127118

Closed
Silthus wants to merge 2 commits into
feat/webhook-body-hmac-signingfrom
feat/t3-code-workflows-step
Closed

Silthus wants to merge 2 commits into
feat/webhook-body-hmac-signingfrom
feat/t3-code-workflows-step

Conversation

@Silthus

@Silthus Silthus commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Problem

  • T3 Code users want their coding agent to start when their product reports an error or a failed payment. Today that needs a hand-built, signed webhook step.

Impact: Grow Workflows: more orgs start and activate workflows.

Note

Stacked on #127117, (webhook signing). The Django and frontend wiring, #127225, merges first. Moved from fork PR #126070.

Warning

🟡 Merge risk: medium · two-way door (merge-risk rubric)

  • A new CDP delivery step, only for teams with workflow-t3-code-step.
  • Revert: revert the merge commit. The flag stops new steps only.

Changes

  • A T3 Code template posts instructions, event and person to a T3 Code webhook task. feat(workflows): gate and list the t3 code step behind its flag #127225 lists it as a Beta step behind the flag.
  • With a signing secret, the step signs with HMAC-SHA256. T3 Code dedupes retries on the webhook-id.
  • A 429 or 5xx reply retries. Other errors fail the step with T3 Code's error code.
  • Connection-reset logs carry the hostname, not a URL that may hold a token.
Step picker (fork) Config (fork story preset, Data {})
Step picker T3 Code step config

T3 Code step filled in, flag on

Config at 520px

T3 Code step config at 520px

How did you test this code?

Test rationale: the template test catches a leaked secret, a missing webhook-id, or a dropped T3 Code error.

Live run transcript
# Live run: #126070 at 15e7ed1ea75b2244e6bedf0d1d21ade3a2e32585

The T3 Code template through the real HogExecutorAsyncService.executeFetch, against a T3 Code scratch webhook task that requires x-hub-signature-256 (hex, sha256= prefix) and dedupes on {{headers.webhook-id}}. URL token and secret are not in this record.

    {
      "label": "signed T3 Code step, delivered twice as a retry would",
      "queued_signing": {
        "hmac_sha256": {
          "secret_input": "signing_secret",
          "webhook_id": "d6b2071c-341f-4756-a3b0-fcaec132506a"
        }
      },
      "queue_payload_holds_secret": false,
      "sent": [
        {
          "headers": {
            "Content-Type": "application/json",
            "webhook-id": "d6b2071c-341f-4756-a3b0-fcaec132506a",
            "x-hub-signature-256": "sha256=3d4a002d57722cf04893552abcd2022b20976095410ee40e245ff3379e66b4c0"
          },
          "bodyBytes": 451
        },
        {
          "headers": {
            "Content-Type": "application/json",
            "webhook-id": "d6b2071c-341f-4756-a3b0-fcaec132506a",
            "x-hub-signature-256": "sha256=3d4a002d57722cf04893552abcd2022b20976095410ee40e245ff3379e66b4c0"
          },
          "bodyBytes": 451
        }
      ],
      "replies": [
        {
          "logs": []
        },
        {
          "logs": []
        }
      ]
    }


    {
      "label": "T3 Code step without a signing secret, to a task that requires one",
      "queued_signing": {},
      "queue_payload_holds_secret": false,
      "sent": [
        {
          "headers": {
            "Content-Type": "application/json",
            "webhook-id": "cc90bbe3-6a2c-4f7b-8d66-5212c8fae7bd"
          },
          "bodyBytes": 451
        }
      ],
      "replies": [
        {
          "error": "HTTP fetch failed on attempt 1 with status code 401.",
          "logs": [
            "HTTP fetch failed on attempt 1 with status code 401."
          ]
        }
      ]
    }


    {
      "label": "signed T3 Code step with the wrong secret",
      "queued_signing": {
        "hmac_sha256": {
          "secret_input": "signing_secret",
          "webhook_id": "ab312461-b8f5-4c7d-ba31-721863db3784"
        }
      },
      "queue_payload_holds_secret": false,
      "sent": [
        {
          "headers": {
            "Content-Type": "application/json",
            "webhook-id": "ab312461-b8f5-4c7d-ba31-721863db3784",
            "x-hub-signature-256": "sha256=9e3bcc85dbbb75753a4338a3f3d559976fb772f64335cc3deda8a371bd391287"
          },
          "bodyBytes": 451
        }
      ],
      "replies": [
        {
          "error": "HTTP fetch failed on attempt 1 with status code 401.",
          "logs": [
            "HTTP fetch failed on attempt 1 with status code 401."
          ]
        }
      ]
    }


PASS src/cdp/templates/_destinations/t3_code/t3-code.liveproof.test.ts (7.316 s)

## T3 Code side

One new thread 'PostHog webhook HMAC proof (scratch)' (created 2026-10-31T10:26:10Z), runCount 1: the two signed attempts with webhook-id d6b2071c-341f-4756-a3b0-fcaec132506a started one run. The unsigned and wrong-secret requests got 401 and started none.

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: /writing-tests, /writing-user-facing-copy, /writing-pr-descriptions, full-stop, impact, tdd, qa-swarm, merge-risk

Question Answer Who Where
Scope Thin template 👤 comment
Owner rule Dropped, #126468 takes it 👤 comment
Fork PRs Moved upstream 👍 comment
Lane split Node here, wiring in #127225 🤖 comment
Grandfathering Step and template id 🤖 comment
Flag Hidden, flag-gated 🤖 comment

Involvement: three fork review rounds, a live run, a UI walk.

More context for AI agents

🤖 Generated with Claude Code

@Silthus Silthus added hogbox-preview Spin up a per-PR PostHog preview on a hogland hogbox posthog-review labels Nov 2, 2026
@Silthus Silthus self-assigned this Nov 2, 2026
@Silthus
Silthus added this pull request to stack #127119 November 2, 2026 06:31
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

✅ Trunk lane — non-backend lane

This PR is assigned to the non-backend lane. It does not run backend Python tests and may merge in parallel with PRs in other lanes.

⚠️ Complexity (TypeScript) — 4 functions above the limit (max 51)

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.

Function Location Complexity Limit
onDrop products/workflows/frontend/Workflows/hogflows/hogFlowEditorLogic.tsx:2862 51 10
fitView products/workflows/frontend/Workflows/hogflows/hogFlowEditorLogic.tsx:3080 15 10
getBranchLabel products/workflows/frontend/Workflows/hogflows/hogFlowEditorLogic.tsx:102 14 10
<anonymous> products/workflows/frontend/Workflows/hogflows/hogFlowEditorLogic.tsx:2785 11 10
⚠️ Duplication (Python) — 14 new duplicated blocks (worst 175 tokens)

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.

First copy Second copy Lines Tokens
products/product_analytics/backend/hogql_queries/lifecycle/test/test_lifecycle_data_warehouse.py:231 products/product_analytics/backend/hogql_queries/lifecycle/test/test_lifecycle_data_warehouse.py:448 19 175
products/warehouse_sources/backend/temporal/data_imports/sources/qdrant/qdrant.py:10 products/warehouse_sources/backend/temporal/data_imports/sources/slash/slash.py:8 18 170
products/warehouse_sources/backend/temporal/data_imports/sources/openrouter/openrouter.py:1 products/warehouse_sources/backend/temporal/data_imports/sources/pylon/pylon.py:1 17 120
products/warehouse_sources/backend/temporal/data_imports/sources/pendo/pendo.py:4 products/warehouse_sources/backend/temporal/data_imports/sources/railway/railway.py:3 16 102
products/warehouse_sources/backend/temporal/data_imports/sources/recreation/recreation.py:2 products/warehouse_sources/backend/temporal/data_imports/sources/zonka_feedback/zonka_feedback.py:2 12 100
products/warehouse_sources/backend/temporal/data_imports/sources/paystack/paystack.py:5 products/warehouse_sources/backend/temporal/data_imports/sources/prefect_cloud/prefect_cloud.py:8 13 94
products/warehouse_sources/backend/temporal/data_imports/sources/megaphone/megaphone.py:2 products/warehouse_sources/backend/temporal/data_imports/sources/recreation/recreation.py:3 12 93
products/approvals/backend/actions/feature_flags.py:490 products/approvals/backend/actions/feature_flags.py:806 13 89
products/warehouse_sources/backend/temporal/data_imports/sources/lodgify/lodgify.py:4 products/warehouse_sources/backend/temporal/data_imports/sources/qdrant/qdrant.py:5 12 88
products/warehouse_sources/backend/temporal/data_imports/sources/drata/drata.py:2 products/warehouse_sources/backend/temporal/data_imports/sources/prefect_cloud/prefect_cloud.py:5 12 80
products/autoresearch/backend/temporal/schedule.py:48 products/signals/backend/anomaly_scores/schedule.py:28 14 78
products/warehouse_sources/backend/temporal/data_imports/sources/mono/mono.py:6 products/warehouse_sources/backend/temporal/data_imports/sources/qdrant/qdrant.py:5 11 72
products/tasks/backend/models.py:1292 products/tasks/backend/models.py:1714 11 71
products/warehouse_sources/backend/temporal/data_imports/sources/recreation/recreation.py:192 products/warehouse_sources/backend/temporal/data_imports/sources/spotlercrm/spotlercrm.py:135 21 70
⚠️ Duplication (TypeScript) — 11 new duplicated blocks (worst 136 tokens)

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.

First copy Second copy Lines Tokens
products/data_warehouse/frontend/scenes/SchemaScene/ConfigurationTab.tsx:267 products/data_warehouse/frontend/scenes/SourceScene/tabs/SchemasTab.tsx:765 26 136
frontend/src/scenes/billing/billingSpendLogic.ts:1 frontend/src/scenes/billing/billingUsageLogic.ts:1 21 126
frontend/src/lib/components/LemonTextAreaMarkdown/LemonTextAreaMarkdown.tsx:82 frontend/src/lib/components/RichContentEditor/LemonRichContentEditor.tsx:167 32 101
frontend/src/lib/components/LemonTextAreaMarkdown/LemonTextAreaMarkdown.tsx:82 products/conversations/frontend/components/Editor/SupportEditor.tsx:761 32 101
products/product_analytics/frontend/insights/trends/RegionMap/regionMapLogic.tsx:1 products/product_analytics/frontend/insights/trends/WorldMap/worldMapLogic.tsx:1 24 90
frontend/src/scenes/dashboard/dashboardTemplateEntities.ts:252 frontend/src/scenes/hog-functions/filters/cdpFilterSeries.ts:97 14 89
frontend/src/layout/today/todaySessionSelectionLogic.ts:53 frontend/src/lib/components/ViewTraceButton/traceDialogOpenLogic.ts:55 22 76
frontend/src/lib/logic/billing/billingLogic.tsx:1965 frontend/src/lib/logic/billing/billingLogic.tsx:2021 15 76
frontend/src/lib/logic/billing/billingLogic.tsx:1967 frontend/src/lib/logic/billing/billingLogic.tsx:1984 11 73
frontend/src/lib/components/ChartFilter/ChartFilter.tsx:15 products/product_analytics/frontend/insights/retention/filters/RetentionChartPicker.tsx:9 12 71
products/product_analytics/frontend/insights/stickiness/StickinessLineChart/StickinessLineChart.tsx:11 products/product_analytics/frontend/insights/trends/shared/useTrendsPartOfWholeChart.tsx:11 15 70
⚠️ Bundle size — 🔺 +181 B (+0.0%)

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

Total: 75.13 MiB · 🔺 +181 B (+0.0%)

No file changed by more than 1000 B.

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.02 MiB · 25 files no change █████████░ 88.8% 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
2.99 MiB · 622 files 🔺 +46 B (+0.0%) ██████████ 98.5% of 3.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
6.46 MiB · 2,235 files 🔺 +46 B (+0.0%) ██████████ 95.4% of 6.77 MiB
dashboard scene
src/scenes/dashboard/Dashboard.tsx
9.97 MiB · 3,728 files 🔺 +46 B (+0.0%) ██████████ 99.5% of 10.01 MiB
today home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
6.71 MiB · 2,337 files 🔺 +46 B (+0.0%) ██████████ 96.4% of 6.96 MiB
AI-first home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
7.28 MiB · 2,426 files 🔺 +46 B (+0.0%) ██████████ 96.7% of 7.53 MiB
events scene
src/scenes/activity/explore/EventsScene.tsx
9.40 MiB · 3,500 files 🔺 +46 B (+0.0%) ██████████ 98.0% of 9.59 MiB
web analytics scene
src/scenes/web-analytics/WebAnalyticsScene.tsx
10.36 MiB · 3,767 files 🔺 +46 B (+0.0%) ██████████ 95.6% of 10.83 MiB
replay detail scene
src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
7.99 MiB · 2,968 files 🔺 +46 B (+0.0%) ████████░░ 84.4% of 9.47 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers 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/scenes/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/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers 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
🟢 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
🟢 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
🟢 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/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
🟢 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
🟢 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/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/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

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.7 KiB src/index.tsx
1.7 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.7 KiB src/lib/utils/bootTiming.ts
1.2 KiB src/RootErrorBoundary.tsx
949 B src/scenes/ChunkLoadErrorBoundary.tsx
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
325.0 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
217.5 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
102.9 KiB src/products.tsx
86.6 KiB src/lib/api.ts
67.9 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
27.0 KiB ../node_modules/.pnpm/tailwind-merge@2.2.2/node_modules/tailwind-merge/dist/bundle-mjs.mjs
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
325.0 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 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
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.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
102.9 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
86.6 KiB src/lib/api.ts
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
Size File
325.0 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 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
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
144.1 KiB ../packages/quill/packages/primitives/dist/index.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
102.9 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
Size File
325.0 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 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
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.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
102.9 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
86.6 KiB src/lib/api.ts
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
325.0 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 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
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
144.1 KiB ../packages/quill/packages/primitives/dist/index.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
102.9 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/activity/explore/EventsScene.tsx
Size File
325.0 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 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
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
144.1 KiB ../packages/quill/packages/primitives/dist/index.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
102.9 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/web-analytics/WebAnalyticsScene.tsx
Size File
325.0 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 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
187.9 KiB src/queries/validators.js
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
144.1 KiB ../packages/quill/packages/primitives/dist/index.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
102.9 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
Size File
325.0 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
316.5 KiB ../node_modules/.pnpm/posthog-js@1.443.0_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 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
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.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
102.9 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js

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

✅ Toolbar bundle — eager 2.33 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.33 MiB · 19 files 🔺 +46 B (+0.0%) ████░░░░░░ 40.8% of 5.72 MiB
Deferred (lazy) 2.11 MiB · 42 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
941.7 KiB dist/toolbar/toolbar-app-UY2NCWYC.css
695.9 KiB dist/toolbar/chunk-chunk-6WXNMHAK.js
261.2 KiB dist/toolbar/chunk-chunk-T5DKNJQU.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
130.4 KiB dist/toolbar/chunk-chunk-KGKL5HTO.js
75.7 KiB dist/toolbar/toolbar-app-ZCFHYZKE.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
33.8 KiB dist/toolbar/chunk-chunk-FR2SFTP5.js
21.7 KiB dist/toolbar/chunk-chunk-Q7N4W6V5.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 — 🔺 +2.6 KiB (+0.0%)

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

Total: 966.34 MiB · 🔺 +2.6 KiB (+0.0%)

✅ Hogbox preview — ready, open the preview

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend on the PostHog :master base (frontend unchanged by this PR)
🔗 Link stable across rebuilds: a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit e0508c3 · box box-0a526026d410 · ready in 1599s (push → usable) · build log · rebuilds on every push, torn down on close

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

This is the only automatic review while this pull request is a draft. Comment @posthog review to review new changes sooner. Otherwise, a review of the new changes runs when you mark it ready for review.

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.

'method': 'POST',
'headers': {
'Content-Type': 'application/json',
'webhook-id': generateUUIDv4()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 · Keep the delivery ID stable across workflow recovery

If a worker dies after T3 Code accepts the POST but before workflow results persist, recovery executes this step again and generates a different webhook-id. T3 Code's replay key then accepts a duplicate agent run. Signing also replaces this header with a fresh random ID in fetch-handler.ts; derive both paths' delivery ID from the stable workflow step dispatch key.

A hidden Node destination template, template-t3-code. It posts the
workflow's instructions, event and person to a T3 Code webhook task and
signs the body through the webhook fetch's hmac_sha256 option, with a
webhook-id that stays the same across retries.

Connection-reset retry logs in cdpTrackedFetch now carry the hostname
and template id instead of the full URL, which can hold a token.

The flag gate, the step catalog entry and the icon land in the Django
and frontend PR, which must merge first.

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

Silthus commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

Note

🤖 Claude Opus 5.5 responding on behalf of Michael

Decision lines for the T3 Code step PRs: #127117, #127118 and #127225.

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

Copy link
Copy Markdown
Contributor

This PR hasn't seen activity in a week! Should it be merged, closed, or further worked on? If you want to keep it open, please remove the stale label – otherwise this will be closed in another week. If you want to permanently keep it open, use the waiting label.

@Silthus

Silthus commented Nov 13, 2026

Copy link
Copy Markdown
Contributor Author

Closed in the 2026-11-13 draft triage: no map or thread owns the T3 Code step, and nothing replaced it. The branch stays. Its webhook-signing base, #127117, goes ahead on its own.

This branch was successfully deployed

1 active deployment
hogbox-preview — e0508c39 Deployed Nov 2, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

hogbox-preview Spin up a per-PR PostHog preview on a hogland hogbox

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants