Repository navigation
Conversation
Silthus
force-pushed
the
feat/workflows-activation-events
branch
from
October 7, 2026 11:33
5bd2fa4 to
a35f68f
Compare
This was referenced Oct 7, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Feature flags: None control this increment. The behavior applies regardless of rollout flags.
Warning
Merge risk: medium (qa-swarm danger rubric)
try/catch.Fork handoff for source #111267. Modernized head
a35f68f183863e4cf2fc9b3ae8766f216c657b42. This draft prepares review and recreation in the upstream repository.Changes
workflowsproduct intent on the server, whatever channel created it.HogFlowViewSet.perform_createcallsProductIntent.register, which emitsuser showed product intentwithintent_context: workflow_created.Note
The intent now fires when a workflow is saved, not when someone clicks "New workflow". A click that never leads to a saved workflow no longer counts, so the first funnel step reads lower than its history.
quotaproperty. The funnel step is about messages, so a destination block would add noise.email domain verifiedfrom #110516 onwards.user showed product intent(existing)product_key: workflows,intent_context: workflow_created,is_first_intent_for_productworkflows message deliveredworkflow_id,channel: emailworkflows send blockedworkflow_id,channel: email,reason: quota_limitedworkflows send failedworkflow_id,channel: email,reason: unverified_domainormissing_recipientcaptureTeamEvent: the distinct ID is the team UUID, withprojectandorganizationgroups, so a funnel can run per team.WorkflowsActivationReporterwired throughcdp-services, the consumers andCdpApi, as a required dependency of each reporting service.How did you test this code?
Built test-first. Test seams:
test_create_hog_flow_registers_workflows_product_intentfails if creation stops registering the intent.WorkflowsActivationReporter.report: catches a per-send event flood, dedupe that leaks across teams, and a crash on an unknown team. It also catches a team silenced for an hour after a failed lookup, a missing team, or a failed capture.shouldBlockHogFlowDueToQuota: the existing block test now runs for an email-quota block, which reports, and a destination-quota block on a webhook, which does not.EmailService.executeSendEmail: the existing unverified-domain test now runs for a workflow send, a workflow test send, and a hog function send. Only the first reports.RecipientPreferencesService.shouldSkipAction: a missing recipient reports for marketing and transactional sends, not test sends.CdpApi: aDeliverynotification reportsworkflows message deliveredfor a workflow and for a deleted workflow, and nothing for a hog function.HogFunctionHandler.execute: the existing recipient-preferences test now asserts that the test-send flag reaches the check.Test rationale: each new assertion extends the nearest existing test, except the reporter, which is a new unit, and the delivery case, which no existing webhook test covered.
Verify the reporting end to end through the SES webhook, from
nodejs/:pnpm jest src/cdp/services/messaging/email-tracking.service.test.ts -t "activation step"Expect 3 passing tests: a workflow delivery reports, a delivery after the workflow is deleted reports, and a hog function delivery does not.
Run locally: the touched Jest suites, the Python test above, the nodejs typecheck, ESLint and oxlint on the touched files,
hogli ci:preflight --strict, and semgrep on the diff (0 findings).Not run: the full nodejs ESLint pass and repo-wide mypy, which timed out on the shared devbox. No live CDP send or capture in a running stack.
Known gap, not fixed here: a test send whose SES notification lacks the tracking header falls back to a short tag with no test flag, so it counts as a real delivery. The bug predates this PR and affects the Metrics tab the same way.
Modernization on
5bd2fa405dfee: Preserves upstream cohort parsing and dead-letter reporting. Focused Node activation, invocation-pipeline, and email tests pass; workflow-create API cases and strict preflight pass. Fresh browser rendering remains unchecked. Historical proof above describes the earlier head. Fresh CI remains unverified.Combined handoff proof
The 14-layer stack now descends from pinned upstream
b75567aca6cce9f0499e882463fc7e71d65a064c. Fresh checks passed: 136 frontend behavior tests across 12 suites, 333 Node delivery/engagement tests across 6 suites with 7 snapshots, the backend committed-creation intent test, and 15 project-config/permission overlap tests. Frontendtsgoand normal Nodetscpassed; all 14 strict increment gates passed. Node Jest required--forceExitfor existing lingering handles. Upstream workflow step edits and MCP opt-in policy remain intact. The new replay consumer now receives its required activation reporter from the bottom layer. The final backend audience/template/sender/quota/unsubscribe and upstream-proposal overlap run passed 225 cases. Historical proof and screenshots above belong to their recorded heads. Fresh upstream CI, a new full mypy run, OpenAPI regeneration, a fresh Claude review, and combined browser rendering remain unchecked.Release status
Fork handoff only. This task does not activate rollout flags. Upstream CI and the unavailable Opus review remain handoff gaps.
No feature flag controls this change
This change is behind a feature flag and is not available to users
This change makes a previously flagged feature available to everyone
Publish to changelog?
Docs update
None. These are internal analytics events.
🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Agent: Claude Code, Claude Opus 5.5 (1M context)
/tdd,/writing-tests,/reviewing-with-coderabbit,/writing-pr-descriptions,/qa-swarm.🤖 Generated with Claude Code
Modernization: T3 Code, Codex, gpt-6.1-sol. Skills: modernize-pr, pr, writing-pr-descriptions, writing-voice, unslop, running-ci-preflight. A fresh Claude Opus 5.5 review attempt hit an API rate limit; the modernization review remains incomplete.
Fork handoff: T3 Code, Codex, GPT-6.1 Sol (
gpt-6.1-sol). Skills: pr, writing-pr-descriptions, writing-voice, unslop, stacking-prs, running-ci-preflight. A fresh Claude Opus 5.5 review remains unavailable. No rollout flags or preview labels were activated for this fork draft.