Found while executing #14945 lane (1) (PR #15889, which appends refused to ExecutionStatus). Observation-level, unassigned, no domain:* / type — triage grades it.
Blocked-by: #14945
The shape
packages/runtime/src/domains/automation-runs-query-validation.test.ts:320-322 pins the ?status= forwarding of GET /api/automation/:name/runs with a HAND-COPIED list:
it.each(
['pending', 'running', 'paused', 'completed', 'failed', 'cancelled', 'timed_out', 'retrying'],
)('forwards every declared ExecutionStatus member — ?status=%s', async (member) => {
// The gate reads its members from the spec's `ExecutionStatus` enum, the
// same one `ListRunsRequestSchema` is built from, so this pins that the
The comment claims the case covers "every declared ExecutionStatus member"; the list is a copy, not a read. The moment the enum gains a member (it does in #15889: refused, appended last) the pin stays green while covering eight of nine — the phantom-pin shape: a test named for a property it no longer measures. The boundary itself is fine (packages/runtime/src/domains/automation.ts:1822 reads ExecutionStatus.options, so ?status=refused is forwarded), which is exactly why nothing goes red.
Two prose siblings in the same package restate the count as a literal and rot the same way: packages/runtime/src/query-param.ts:180 ("bounds it to the eight ExecutionStatus members") and packages/runtime/src/domains/automation.ts:1799 ("z.enum([...8 ExecutionStatus members])").
What would close it
Related: #14945 · #15889 · #15788 (lane 2, which consumes the ExecutionStatus reader census in the PR body).
Generated by Claude Code
Found while executing #14945 lane (1) (PR #15889, which appends
refusedtoExecutionStatus). Observation-level, unassigned, nodomain:*/ type — triage grades it.Blocked-by: #14945
The shape
packages/runtime/src/domains/automation-runs-query-validation.test.ts:320-322pins the?status=forwarding ofGET /api/automation/:name/runswith a HAND-COPIED list:The comment claims the case covers "every declared ExecutionStatus member"; the list is a copy, not a read. The moment the enum gains a member (it does in #15889:
refused, appended last) the pin stays green while covering eight of nine — the phantom-pin shape: a test named for a property it no longer measures. The boundary itself is fine (packages/runtime/src/domains/automation.ts:1822readsExecutionStatus.options, so?status=refusedis forwarded), which is exactly why nothing goes red.Two prose siblings in the same package restate the count as a literal and rot the same way:
packages/runtime/src/query-param.ts:180("bounds it to the eightExecutionStatusmembers") andpackages/runtime/src/domains/automation.ts:1799("z.enum([...8 ExecutionStatus members])").What would close it
it.each(ExecutionStatus.options)(import from@objectstack/spec/automation), so the pin reads the vocabulary it claims to cover — the same discipline the boundary already applies (finding:ListRunsRequestSchema.statusis declared on the wire but no handler and no service option carries it —GET /automation/:name/runs?status=failedsilently lists every run #7359), turned on its own test.Related: #14945 · #15889 · #15788 (lane 2, which consumes the
ExecutionStatusreader census in the PR body).Generated by Claude Code