Repository navigation
Three unannounced @objectstack/spec 17.4.0 changes this repo asserts against — job.timeout retired, flow node outcome enum narrowed, dashboard gap help text rewritten #8785
Description
Surfaced by #8772 / PR #8783 (the 17.3.0 → 17.4.0 line move). Of sixteen reds that bump produces, thirteen are a held card's declared trigger. These three are predicted by nothing: the full held-card population (148 cards carrying pm:blocked or pm:on-hold) was searched and none names them.
⛔ Deliberately not repaired in #8783 — that PR's ruling is that an unpredicted red is a stop-and-report, because a red nobody predicted is an unannounced upstream behaviour change, not bump fallout.
Each is measured against both spec versions, so "changed in 17.4.0" is a reading rather than an inference.
1. job.timeout was retired in favour of timeoutMs
apps/console/src/__tests__/preview-samples-spec-valid.test.ts — "job sample is valid metadata". Path jobs.0.timeout. Tombstone message from the spec:
job.timeoutwas removed in @objectstack/spec 17 — its unit (milliseconds) lived only in the description
Measured: the tombstone is present in 17.4.0's dist and absent from 17.3.0's.
⭐ Same ruling family as #7783 (refreshInterval → refreshIntervalSeconds): a duration key whose unit lived only in prose gets the unit into the name. But this is a different key with no card, so nothing was waiting for it.
2. The flow node outcome enum narrowed to completed | refused
Same test file — "flow sample is valid metadata". Path flows.0.nodes.13.config.outcome.
Measured: neither member appears in 17.3.0's automation dist; both appear in 17.4.0's.
outcome: 'refused') consumes this value but does not predict this sample going red — it is the consumer half, not the sample's contract. ⛔ Do not fold this into #7707.
3. The spec rewrote the dashboard gap help text
packages/app-shell metadata-form-i18n.test.ts — "drops the Tailwind units developer vocabulary". The test asserts the English producer copy still says "Tailwind"; 17.4.0 changed it to "Space between widgets, in steps of 0.25rem (4 = 1rem)".
Measured: "Tailwind" — 14 occurrences in 17.3.0's ui dist vs 11 in 17.4.0's; "in steps of 0.25rem" — 0 vs 3.
⭐ Worth noting: the test's own comment anticipated the producer fixing this copy. It predicted the event and no card was ever filed, so the prediction could not act. That is the same orphaning shape #8773 is auditing.
Scope
Per red: decide whether this repo's assertion or its sample is what must move, then move it. ⛔ Do not patch any of them green by relaxing the assertion — in all three the spec is the producer and it changed deliberately; the repo is asserting a stale fact.
Provenance
Filed by the domain:cli-lane PM session session_019wtfW1ZxGnP1XKGc9uZVms while landing #8772. Dedup: the dev searched all 148 held cards; this seat additionally found no open issue naming job.timeout, the outcome enum narrowing, or the gap help text. domain:* / priority:* are triage's — domain:ui set here on the maintainer direct-dispatch channel, ⛔ a pm:retriage if triage disagrees.
Activity
os-bill commentedon Sep 9, 2026
Claim: PM loop — FOLDED into the #8772 family dispatch⚠️ Re-declare from the delivered diff: if the repair for (1) or (2) turns out to require editing the sample metadata to a shape the spec now admits differently, say so — that is still not a widening, but it is worth naming.⚠️ Shares
Session:
session_019wtfW1ZxGnP1XKGc9uZVmsBranch:
claude/issue-8772-objectstack-17-4-0-line(shared, named for the chain head #8772)Worktree:
objectui-issue-8772Domain:
domain:uiFile surface:
apps/console/src/__tests__/preview-samples-spec-valid.test.ts(the job and flow samples) andpackages/app-shellmetadata-form-i18n.test.ts(thegaphelp-text assertion) — stop on breachContainer & model:
M,mode:subagent,model: opusClause-②: no — three stale assertions re-pointed at a published spec change.
Thread-read: none (card filed by this seat minutes ago)
Serial constraints cleared: full check on the chain-head claim (#8772).
metadata-form-i18n.test.tswith #7783 — same-file HARD SERIAL, and one of the two reasons this whole set is a single dispatch.⭐ This is the only member with no pre-existing card, because nothing predicted it. It is folded because its three reds sit in the same branch and the same queue position as the thirteen predicted ones — #8783 goes green only when all sixteen are answered.
⛔ The card's own ruling stands and is not re-litigable here: none of the three is patched green by relaxing the assertion. In all three the spec is the producer and it changed deliberately; this repo is asserting a stale fact.
Generated by Claude Code