Observation
packages/services/service-automation/src/builtin/http-nodes.ts:139 returns { output: { deliveryId, enqueued: true }, metrics: { acted: 1 } } for a delivery that has only been enqueued to the HTTP outbox. sys_http_delivery carries its own terminal outcomes (including dead), decided by the dispatcher afterwards — so a flow-run summary can read acted: 1 for an HTTP delivery that later dead-letters, and the operator-facing summary disagrees with the durable record.
This is the same defect class #7747 (PR #7875) just fixed for the notify node, at the sibling node. Found by that card's dev while measuring the notify path; deliberately left out of scope there rather than ridden along.
Why it is likely the same fix shape
#7875 established the pattern in this exact codebase: acted counts only what a channel accepted terminally; a merely-enqueued effect is reported as unmeasuredEffect, which is the platform's existing qualifier for "an effect happened but the outcome is not yet knowable". That keeps healthy outbox-backed runs out of the documented broken-sweep alert (selected > 0 AND acted = 0 AND unmeasured = 0) without asserting success, and respects connector.zod.ts:613's rule against a blanket acted: 0.
Worth confirming before assuming it transfers: whether the HTTP node has an inline (non-outbox) path whose outcome IS terminal at return time, as MessagingService.emit() did — if so, the same two-path narrowing applies; if every HTTP delivery goes through the outbox, the fix is simpler.
Where
Refs
Observation
packages/services/service-automation/src/builtin/http-nodes.ts:139returns{ output: { deliveryId, enqueued: true }, metrics: { acted: 1 } }for a delivery that has only been enqueued to the HTTP outbox.sys_http_deliverycarries its own terminal outcomes (includingdead), decided by the dispatcher afterwards — so a flow-run summary can readacted: 1for an HTTP delivery that later dead-letters, and the operator-facing summary disagrees with the durable record.This is the same defect class #7747 (PR #7875) just fixed for the notify node, at the sibling node. Found by that card's dev while measuring the notify path; deliberately left out of scope there rather than ridden along.
Why it is likely the same fix shape
#7875 established the pattern in this exact codebase:
actedcounts only what a channel accepted terminally; a merely-enqueued effect is reported asunmeasuredEffect, which is the platform's existing qualifier for "an effect happened but the outcome is not yet knowable". That keeps healthy outbox-backed runs out of the documented broken-sweep alert (selected > 0 AND acted = 0 AND unmeasured = 0) without asserting success, and respectsconnector.zod.ts:613's rule against a blanketacted: 0.Worth confirming before assuming it transfers: whether the HTTP node has an inline (non-outbox) path whose outcome IS terminal at return time, as
MessagingService.emit()did — if so, the same two-path narrowing applies; if every HTTP delivery goes through the outbox, the fix is simpler.Where
packages/services/service-automation/src/builtin/http-nodes.ts:139EmitResult.enqueuednarrowing inservice-messaging)sys_http_delivery(packages/services/service-messaging)Refs