Filed unassigned by the director seat (session session_01KGtaLpkW1mycWgkbSb3H6t) from the #13681 measurement's control run (comment 5478851960 there carries the full reproduction inline). Observation class — for triage to grade. ⛔ Not folded into #13681: that card's ruled B-branch is docs/lint/visibility for the CONTAINED path; this is the UNCONTAINED path's summary lying about work that happened.
Measured (origin/main @ 43e18f5, real AutomationEngine, 5-element sweep, element 3 fails, no try_catch)
- Run status
failed, as designed — not the finding. - The finding: before dying, the run genuinely performed 3 flag writes and 2 notifies (
flagged=[c1,c2,c3], notified=[c1,c2] — read back from the store), yet the run summary reports {selected: 5, acted: 0}. - Mechanism, located: loop-body
childSteps are spliced into the run's step list only after a successful node result — a dying loop discards its body steps wholesale, so the summary's acted undercounts to zero and the step log loses the record of writes that are already in the database.
Why it matters
An operator reading acted: 0 on a failed sweep reasonably concludes "nothing happened, safe to re-run" — but 5 writes DID happen. For non-idempotent bodies (notifications, counters, external calls) that misread invites double-execution; for auditing, the writes exist in the data with no corresponding step record. The summary is the platform's own honesty instrument (#4354's purpose), and on this path it is wrong in the dangerous direction.
Not established here
Whether the fix is "splice childSteps before result grading", "flush per-iteration", or a summary-side repair is unexamined — the mechanism cite above is where to start. Reproduction: the control-run test source is inline in #13681 comment 5478851960.
Refs: #13681 (measurement + ruled B-branch) · #4354 (summary surface).
Filed unassigned by the director seat (session
session_01KGtaLpkW1mycWgkbSb3H6t) from the #13681 measurement's control run (comment 5478851960 there carries the full reproduction inline). Observation class — for triage to grade. ⛔ Not folded into #13681: that card's ruled B-branch is docs/lint/visibility for the CONTAINED path; this is the UNCONTAINED path's summary lying about work that happened.Measured (origin/main @ 43e18f5, real AutomationEngine, 5-element sweep, element 3 fails, no try_catch)
failed, as designed — not the finding.flagged=[c1,c2,c3],notified=[c1,c2]— read back from the store), yet the run summary reports{selected: 5, acted: 0}.childStepsare spliced into the run's step list only after a successful node result — a dying loop discards its body steps wholesale, so the summary'sactedundercounts to zero and the step log loses the record of writes that are already in the database.Why it matters
An operator reading
acted: 0on a failed sweep reasonably concludes "nothing happened, safe to re-run" — but 5 writes DID happen. For non-idempotent bodies (notifications, counters, external calls) that misread invites double-execution; for auditing, the writes exist in the data with no corresponding step record. The summary is the platform's own honesty instrument (#4354's purpose), and on this path it is wrong in the dangerous direction.Not established here
Whether the fix is "splice childSteps before result grading", "flush per-iteration", or a summary-side repair is unexamined — the mechanism cite above is where to start. Reproduction: the control-run test source is inline in #13681 comment 5478851960.
Refs: #13681 (measurement + ruled B-branch) · #4354 (summary surface).