Filed unassigned by the dev on #12722. Dedupe search run: one targeted search against the broken-sweep / spec-TSDoc family, control hits returned (#12722 and #12685 both came back), no existing card for this surface.
#12685 established — with a measured A/B, pinned in run-summary.test.ts — that selected > 0 AND acted = 0 AND unmeasured = 0 cannot separate a healthy idempotent sweep from a dead gate: both match, on every run, so "over N consecutive runs" does not rescue it either. #12721 corrected sys_automation_run's field descriptions and content/docs/automation/flows.mdx. #12722 corrected the two packages/spec surfaces its dispatch named — automation/execution.zod.ts and integration/connector.zod.ts.
A third surface in the same package carries the same unqualified claim. It sat outside #12722's declared file surface, so it was left standing deliberately rather than fixed in passing.
packages/spec/src/automation/flow-function.zod.ts — FlowFunctionEffectSchema's doc block:
'writes' — it performs writes, or dispatches effects, that the platform cannot see or count. The step reports ExecutionStepMetrics.unmeasuredEffect, so the run's unmeasured tally keeps the broken-sweep query (selected > 0 AND acted = 0 AND unmeasured = 0) off it — and only off the flows that actually call such a function.
"the broken-sweep query", definite article, naming the three-clause predicate as the detector — the same false predicate #12685 disproved. This block ships in .d.ts exactly like the two #12722 fixed.
Three weaker mentions in the same file, worth triaging with it but not plainly wrong on their own:
Suggested shape, mirroring what #12721 landed and #12722 applied so all surfaces agree: state the predicate as the FIRST FILTER, not a verdict, and point at the per-node fold (nodes[] / gates[]) as the discriminator. The clause's own point stays correct and should survive: a declared-writes function makes acted INCOMPLETE, not zero.
One material difference from #12722, worth knowing before dispatch.#12722 needed no artifact regeneration — its two doc blocks feed nothing generated (verified: check:generated reported all 14 artifacts up to date after the reword). This file is not like that: its @module doc comment IS emitted as the page intro of content/docs/references/automation/flow-function.mdx, where the prose appears verbatim. So a reword here moves a generated artifact and must run gen:schema && gen:docs in the same PR; the history string at line 155 is authored schema text on the same path.
Why it is worth a card rather than a shrug: the same severity argument #12722 was graded on. The failure mode is an operator wiring an alert to the documented predicate, watching it fire during normal operation, and muting it — leaving a dead sweep unmonitored while looking monitored. Correcting two of the three packages/spec surfaces and leaving the third reproduces exactly the disagreement the parent card exists to end.
Related: #12722, #12685, PR #12721, #4354 (shipped the measurement), #4347 (the original silent no-op), #4396 (declared script effects).
Filed unassigned by the dev on #12722. Dedupe search run: one targeted search against the broken-sweep / spec-TSDoc family, control hits returned (#12722 and #12685 both came back), no existing card for this surface.
#12685 established — with a measured A/B, pinned in
run-summary.test.ts— thatselected > 0 AND acted = 0 AND unmeasured = 0cannot separate a healthy idempotent sweep from a dead gate: both match, on every run, so "over N consecutive runs" does not rescue it either. #12721 correctedsys_automation_run's field descriptions andcontent/docs/automation/flows.mdx. #12722 corrected the twopackages/specsurfaces its dispatch named —automation/execution.zod.tsandintegration/connector.zod.ts.A third surface in the same package carries the same unqualified claim. It sat outside #12722's declared file surface, so it was left standing deliberately rather than fixed in passing.
packages/spec/src/automation/flow-function.zod.ts—FlowFunctionEffectSchema's doc block:"the broken-sweep query", definite article, naming the three-clause predicate as the detector — the same false predicate #12685 disproved. This block ships in
.d.tsexactly like the two #12722 fixed.Three weaker mentions in the same file, worth triaging with it but not plainly wrong on their own:
selectedcan only make the broken-sweep alert quieter, never wrong": names the alert without spelling the predicate.historystring around line 155 — "which is what keeps Surface flow run summaries (selected / acted / skipped) — a scheduled flow that does nothing is currently indistinguishable from one with nothing to do #4354's broken-sweep alert quiet on the run that needed it".Suggested shape, mirroring what #12721 landed and #12722 applied so all surfaces agree: state the predicate as the FIRST FILTER, not a verdict, and point at the per-node fold (
nodes[]/gates[]) as the discriminator. The clause's own point stays correct and should survive: a declared-writesfunction makesactedINCOMPLETE, not zero.One material difference from #12722, worth knowing before dispatch.#12722 needed no artifact regeneration — its two doc blocks feed nothing generated (verified:
check:generatedreported all 14 artifacts up to date after the reword). This file is not like that: its@moduledoc comment IS emitted as the page intro ofcontent/docs/references/automation/flow-function.mdx, where the prose appears verbatim. So a reword here moves a generated artifact and must rungen:schema && gen:docsin the same PR; thehistorystring at line 155 is authored schema text on the same path.Why it is worth a card rather than a shrug: the same severity argument #12722 was graded on. The failure mode is an operator wiring an alert to the documented predicate, watching it fire during normal operation, and muting it — leaving a dead sweep unmonitored while looking monitored. Correcting two of the three
packages/specsurfaces and leaving the third reproduces exactly the disagreement the parent card exists to end.Related: #12722, #12685, PR #12721, #4354 (shipped the measurement), #4347 (the original silent no-op), #4396 (declared
scripteffects).