Post-release sweep for 17.1.0, automation lane. Selected because 17.1.0 carries three BREAKING automation HTTP-status changes inside a minor — SDK-visible, and ^17.x consumers pick them up on their next install.
Environment
Identical to the priority:P0 companion run (#10224): framework 19f98fa1fffbeb305bdcb6af64bc826fb25a46b1, .objectui-sha / console dist stamp both 9a3daf8d37ad973a621e5edd276fe32467f90684, showcase on port 3456 against file:/tmp/<run>/qa-17.1.0/data.db, 2026-08-20T13:59Z.
Execution mode: SEQUENTIAL, declared. No subagent fan-out — findings stand, but this run does not support a "nothing else was missed" claim.
Scope
Selector area:automation → 10 runnable items (1 blocked hidden: automation.rollup-summary-filter, blocked{by: fixture, ref: #3358}).
Per-item verdicts
| item | rev | verdict | oracle evidence |
|---|
automation.flow-node-type-matrix | 3 | pass | pin flow-node.dogfood.test.ts green |
automation.trigger-type-matrix | 1 | pass | pin flow-trigger-conformance.test.ts green |
automation.durable-suspend-restart | 1 | pass | pin flow-durable-suspend.dogfood.test.ts, 11 assertions |
automation.flow-toggle-kill-switch | 1 | pass 4/4 | hand-driven, detail below |
automation.flow-run-step-nesting | 2 | not-run | 5 clauses, needs screenshot oracle |
automation.time-relative-trigger | 2 | not-run | 5 clauses |
automation.flow-error-handling | 3 | not-run | 7 clauses |
automation.connector-dispatch-matrix | 1 | not-run | 4 clauses; note the sandbox cannot reach showcase_status_api (see gaps) |
automation.flow-runs-page-test-trigger | 1 | not-run | 5 clauses |
automation.screen-flow-roundtrip | 2 | blocked(environment) | its only pin is objectui e2e/live/screen-flow.spec.ts — not runnable from this repo |
No fail recorded, so no reproduction rules are owed.
automation.flow-toggle-kill-switch (rev 1) — clause detail
Flow showcase_urgent_task_alert. Every showcase_task create returned 201, so the "no new run" assertion is load-bearing rather than vacuously satisfied by a broken payload.
| clause | verdict | evidence |
|---|
| [0] baseline fires exactly once | pass | runs 0 → 1 after the first urgent create |
| [1] OFF is a kill switch | pass | create B returns 201, runs stay 1 == 1 — absence of a new run, asserted |
| [2] runtime state mirrors the toggle | pass | /automation/_status: {enabled:true,bound:true} → {enabled:false,bound:false} → {enabled:true,bound:true}. Both fields flip, so the toggle unbinds the trigger rather than merely guarding execute() — which is exactly what the NEGATIVE demands |
| [3] ON restores firing | pass | runs 1 → 2 after the third urgent create |
| NEGATIVE (unknown flow) | pass | POST /automation/does_not_exist/toggle → 404 RESOURCE_NOT_FOUND, not 2xx |
Independent corroboration, from a different oracle entirely: the console notification panel (captured while running platform-core.console-login) lists "Urgent task: QA killswitch C" and "A" and no B — a second, unrelated confirmation that the OFF-window create did not fire the flow.
Directed verification of the 17.1.0 BREAKING status codes
These behaviours are new in 17.1.0 and no checklist clause covers them yet (see the checklist-gap note below). Verified directly against the running server because they are the release's highest-risk surface.
| declared contract | measured | verdict |
|---|
trigger routes answer real HTTP for a run that ran and failed (was: 200 wrapping {success:false}) | 400 + FLOW_FAILED, message carrying the node failure verbatim (condition failed to evaluate as CEL: Unknown variable: priority …) | ✅ |
| disabled flow ⇒ 409 | 409FLOW_DISABLED on bothPOST /api/v1/automation/:name/triggerand legacy POST /api/v1/automation/trigger/:name | ✅ |
| no such flow ⇒ 404 | 404RESOURCE_NOT_FOUND on both routes | ✅ |
| flow with no start node ⇒ 422 | no such fixture on stock showcase | blocked(fixture) |
resume answers real HTTP | unknown runId → 404 RESOURCE_NOT_FOUND | ✅ (partial — the FLOW_FAILED / RESUME_IN_PROGRESS / INVALID_SCREEN_INPUT arms need a genuinely paused run) |
The response body still carries the {success:false, error:{…}} envelope; what changed is the transport status, which is precisely the point of the change — raw-HTTP callers treating 2xx as success now see the failure one level up.
Checklist gap (for the wave anchor card — NOT extracted)
area:automation has no clause covering the trigger/resume HTTP status contract. The three 17.1.0 BREAKING changes landed against a lane whose items assert flow behaviour but never the status code a caller observes — so a regression that reverted 409/422/400 back to 200 {success:false} would pass this area today. Worth an authored item (automation.trigger-status-contract-shaped, deriving its matrix from the changeset's own table) rather than leaving the coverage to directed one-offs like this run.
Fixture / environment gaps
showcase_declarative_connector_ping fails on every record-change firing: connector_action(showcase_status_api.request) failed: fetch failed — the sandbox cannot reach that host. This is why automation.connector-dispatch-matrix was not attempted here; on a network-restricted runner it needs a declared stub or a blocked(environment) note on the item.automation.screen-flow-roundtrip is pinned solely in objectui; from this repo it is neither pin-evidenced nor drivable.
Not reached — handoff
flow-run-step-nesting (rev 2) · time-relative-trigger (rev 2) · flow-error-handling (rev 3) · connector-dispatch-matrix (rev 1) · flow-runs-page-test-trigger (rev 1) — 26 clauses total, mostly screenshot/log oracles needing browser driving.
Companion run: #10224 (priority:P0).
Post-release sweep for 17.1.0, automation lane. Selected because 17.1.0 carries three BREAKING automation HTTP-status changes inside a minor — SDK-visible, and
^17.xconsumers pick them up on their next install.Environment
Identical to the
priority:P0companion run (#10224): framework19f98fa1fffbeb305bdcb6af64bc826fb25a46b1,.objectui-sha/ console dist stamp both9a3daf8d37ad973a621e5edd276fe32467f90684, showcase on port 3456 againstfile:/tmp/<run>/qa-17.1.0/data.db, 2026-08-20T13:59Z.Execution mode: SEQUENTIAL, declared. No subagent fan-out — findings stand, but this run does not support a "nothing else was missed" claim.
Scope
Selector
area:automation→ 10 runnable items (1 blocked hidden:automation.rollup-summary-filter,blocked{by: fixture, ref: #3358}).Per-item verdicts
automation.flow-node-type-matrixflow-node.dogfood.test.tsgreenautomation.trigger-type-matrixflow-trigger-conformance.test.tsgreenautomation.durable-suspend-restartflow-durable-suspend.dogfood.test.ts, 11 assertionsautomation.flow-toggle-kill-switchautomation.flow-run-step-nestingautomation.time-relative-triggerautomation.flow-error-handlingautomation.connector-dispatch-matrixshowcase_status_api(see gaps)automation.flow-runs-page-test-triggerautomation.screen-flow-roundtripobjectui e2e/live/screen-flow.spec.ts— not runnable from this repoNo
failrecorded, so no reproduction rules are owed.automation.flow-toggle-kill-switch(rev 1) — clause detailFlow
showcase_urgent_task_alert. Everyshowcase_taskcreate returned 201, so the "no new run" assertion is load-bearing rather than vacuously satisfied by a broken payload.0 → 1after the first urgent create1 == 1— absence of a new run, asserted/automation/_status:{enabled:true,bound:true}→{enabled:false,bound:false}→{enabled:true,bound:true}. Both fields flip, so the toggle unbinds the trigger rather than merely guardingexecute()— which is exactly what the NEGATIVE demands1 → 2after the third urgent createPOST /automation/does_not_exist/toggle→ 404RESOURCE_NOT_FOUND, not 2xxIndependent corroboration, from a different oracle entirely: the console notification panel (captured while running
platform-core.console-login) lists "Urgent task: QA killswitch C" and "A" and no B — a second, unrelated confirmation that the OFF-window create did not fire the flow.Directed verification of the 17.1.0 BREAKING status codes
These behaviours are new in 17.1.0 and no checklist clause covers them yet (see the checklist-gap note below). Verified directly against the running server because they are the release's highest-risk surface.
{success:false})400+FLOW_FAILED, message carrying the node failure verbatim (condition failed to evaluate as CEL: Unknown variable: priority …)409FLOW_DISABLEDon bothPOST /api/v1/automation/:name/triggerand legacyPOST /api/v1/automation/trigger/:name404RESOURCE_NOT_FOUNDon both routesblocked(fixture)resumeanswers real HTTPrunId→404 RESOURCE_NOT_FOUNDFLOW_FAILED/RESUME_IN_PROGRESS/INVALID_SCREEN_INPUTarms need a genuinely paused run)The response body still carries the
{success:false, error:{…}}envelope; what changed is the transport status, which is precisely the point of the change — raw-HTTP callers treating 2xx as success now see the failure one level up.Checklist gap (for the wave anchor card — NOT extracted)
area:automationhas no clause covering the trigger/resume HTTP status contract. The three 17.1.0 BREAKING changes landed against a lane whose items assert flow behaviour but never the status code a caller observes — so a regression that reverted 409/422/400 back to200 {success:false}would pass this area today. Worth an authored item (automation.trigger-status-contract-shaped, deriving its matrix from the changeset's own table) rather than leaving the coverage to directed one-offs like this run.Fixture / environment gaps
showcase_declarative_connector_pingfails on every record-change firing:connector_action(showcase_status_api.request) failed: fetch failed— the sandbox cannot reach that host. This is whyautomation.connector-dispatch-matrixwas not attempted here; on a network-restricted runner it needs a declared stub or ablocked(environment)note on the item.automation.screen-flow-roundtripis pinned solely inobjectui; from this repo it is neither pin-evidenced nor drivable.Not reached — handoff
flow-run-step-nesting(rev 2) ·time-relative-trigger(rev 2) ·flow-error-handling(rev 3) ·connector-dispatch-matrix(rev 1) ·flow-runs-page-test-trigger(rev 1) — 26 clauses total, mostly screenshot/log oracles needing browser driving.Companion run: #10224 (
priority:P0).