feat(deps)!: upgrade to @objectstack/spec 17.0.0-rc.1 and retire the wait timeout fields (#3101) - #3178
Merged
Merged
Conversation
…wait timeout fields (#3101) `waitEventConfig.timeoutMs` / `.onTimeout` became `retiredKey()` tombstones in rc.1 (framework#4158), so a value written there is now REJECTED at load — until this lands, Studio can produce flow metadata the author's own runtime refuses. That hazard opened when rc.1 published, not when this repo bumps, which is why the bump and the field removal ride together. #3101 also requires them together in the other direction: the sibling-block assertion is bidirectional, so deleting the fields against a spec that still declares them fails the reverse check. `wait` never had a timeout. `onTimeout` had zero readers; `timeoutMs`'s only reader used it as the timer DURATION when `timerDuration` was absent, and `timerDuration` accepts a bare number as milliseconds — so the old `timeoutMs: 60000` is `timerDuration: '60000'`, unchanged. The two zh label overrides go with the fields. Everything else here is fallout the bump surfaced, each verified rather than assumed: - `combo` is the sole addition to `ChartTypeSchema` in rc.1 (19 members → 20). It had been renderer-local, so neither surface that classifies a SPEC chart type routed it: a spec-valid combo fell through to the red "Unknown component type" panel on a dashboard and the out-of-spec notice on a report. Both now route it; the renderer-local derivation stays, since that is what makes an authored `type: 'combo'` render rather than merely validate. - `JoinStrategy` / `WindowFunction` / `PerformanceConfig` were removed upstream (framework#4286, #3896). The first two were bound under objectstack#4115's "derive, don't restate" rule; with no enum left to derive from, they are restated locally — verbatim from the last spec that published them — as the objectui query-AST vocabulary they have become. The AST is unchanged. - Three objectstack#4171 inverted pins FIRED: `NavigationItem`, `FormField` and `ConditionalValidation`'s branches are no longer `any`/`unknown` upstream. The assertions are inverted to record that, deliberately WITHOUT the burn-down each asks for — deriving those from the spec touches widely-used public types and does not belong in a version bump. Tracked in #3177. `JoinNode`'s pin is gone outright; the symbol no longer exists. - `dashboard.performance` was retired upstream and the dashboard form derives from the spec's own `dashboardForm`, so the field disappears for free. Its test now pins the absence — if that file ever hardcodes a field list again, a retirement would silently keep offering an input the loader rejects. The bump also arms the reconciliation ledger's `subflow` and `decision` panels, which feature-detect their spec exports and had never actually run (rc.0 predates framework#4278). The `script` panel's full bidirectional check stays skipped by design: rc.1 predates framework#4343, so only the one-directional check is meaningful there. It arms itself on the next rc. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ct9NXp2JumjKuARtQnrbPf
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
…nd additions `check:spec-symbols` runs in CI's Type Check job but not in `turbo run type-check`, so the local run was green while CI was not — my miss, and the reason this is a follow-up commit rather than part of the bump. Two stale DEBT entries: `JoinNode` (@object-ui/types) and `PerformanceConfig` (@object-ui/react) no longer collide with anything, because spec 17.0.0 retired both exports. The guard fails on a ledger entry that outlives the code it excuses, which is the point — removed. Two new collisions, triaged rather than parked in DEBT, because neither is a dialect of the spec's concept: - `@object-ui/types:FieldNode` — the spec's is a bare `string`, a field NAME, after objectstack#4196 narrowed `QueryAST.fields` to names. Ours is a NODE in objectui's own query AST, sibling to `LiteralNode` / `OperatorNode`. Deriving would replace a structured node with a string; there is nothing to import. - `@object-ui/app-shell:InboxNotification` — two layers, like the existing FormField entry. The spec's is the notification SERVICE contract (camelCase, `body`/`read` required). Ours is the materialized inbox ROW the popover groups: snake_case mirroring `sys_notification`, carrying the read-receipt keys the contract has no place for (ADR-0030), nullable where a stored row can be null. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ct9NXp2JumjKuARtQnrbPf
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
os-zhuang
marked this pull request as ready for review
August 2, 2026 07:48
os-zhuang
pushed a commit
that referenced
this pull request
Aug 2, 2026
Three conflict sites, all resolved mechanically:
* `scripts/check-spec-symbol-derivation.mjs` — took main's file
wholesale (it carries the rewritten case 2 / new case 2c header and
three new ALLOW entries from #3178/#3199 that this branch never
touched), then regenerated the DEBT block with `--ledger`. 45 → 29
collisions; removed is exactly this batch's 16, added is empty, the
other 13 packages are byte-identical.
* `packages/types/src/app.ts` — kept main's #3177 import block and
module header verbatim, adding only the `NavigationArea` import this
branch's derivation needs.
* `NavigationArea.navigation`'s justification and inverted pin —
retargeted, see below.
The spec bump is the substantive part. rc.1 gave `NavigationItem` a real
type, so this branch's stated reason for pinning
`NavigationArea.navigation` ("the spec erases it to `any`") expired, and
the inverted pin fired exactly as designed. Re-triaged: the override
stands, but on case 2c rather than case 2 — the spec's element is precise
and describes a different shape, and objectui's items still carry
`visible: boolean`, which the spec rejects at every tier. The pin now
asserts that blocker directly instead of the erasure that used to imply
it, and points at `spec-derived-unions.test.ts`, where #3177 pins the
other two.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Jdef6ZFhJmiNRhNCd4DW3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #3101.
为什么现在升,而不是等含 framework#4343 的下一个 rc
waitEventConfig.timeoutMs/.onTimeout在 rc.1 里已是retiredKey()墓碑(framework#4158),写进去的值会在加载时被拒绝。而本仓的wait面板仍在提供这两个字段——也就是说,现在有客户能在 Studio 里填出一份自家运行时会拒绝加载的流程元数据。这个洞在 rc.1 发布的那一刻就打开了,和本仓何时升版无关;升版 + 删字段正是把它关上。#3101 也明确要求两件事必须同一个 PR:sibling-block 断言是双向的,对着仍声明这两个键的 spec 提前删,会在反方向红。
wait从来没有超时:onTimeout零读者;timeoutMs的唯一读者在timerDuration缺失时把它当时长用——而timerDuration接受裸数字作为毫秒,所以旧的timeoutMs: 60000就是timerDuration: '60000',行为不变。两条 zh 标签覆盖随字段一并删除。升级带出的其余改动(逐项实测,非推测)
combo成为 spec 图表类型 —— rc.1 对ChartTypeSchema的唯一新增(19 → 20)。它此前是 renderer-local 的族,所以两个按 spec 图表类型分类的表面都没有路由它:一个合法的combo在 dashboard 上会掉进红色「Unknown component type」面板,在 report 上会落到 out-of-spec 提示。两处现已路由(widgetDispatch.SERIES_CHART_TYPES、planReportChart)。renderer 本地的推导保留——那才是让作者写的type: 'combo'真正渲染而不只是校验通过的东西。三个已退役的 spec 导出(spec 17.0.0 上游移除):
JoinStrategy/WindowFunction—— framework#4286 退役了query.joins与query.windowFunctions(查询路径上从没有引擎或驱动读过)。它们原本按 objectstack#4115 的「派生而非复述」规则绑定 spec 枚举;枚举没了,data-protocol.ts改为本地复述成员——逐字取自最后一个发布过它们的 spec——作为它们已然变成的 objectui query-AST 词汇。AST 本身不变。PerformanceConfig—— 随dashboard.performance退役(framework#3896)。本仓无人绑定它(@object-ui/react的usePerformance有自己的 interface,未受影响)。dashboard 表单派生自 spec 自己的dashboardForm,所以该字段自动消失;其测试改为钉住缺席。三处 inverted pin 触发了,本 PR 只记录不解决。 objectstack#4171 立的探针断言
NavigationItem/FormField/ConditionalValidation的分支在上游仍擦除为any/unknown——这正是本仓保留本地声明的前提。rc.1 把它们正确定型了,所以断言被翻转以陈述新事实。但它们要求的 burn-down(改为从 spec 派生)没有做:那会改动被广泛使用的公共类型,不该混进版本升级。已开 #3177 追踪。JoinNode的 pin 直接删除——符号本身已不存在。升级同时激活了什么
对账账本的
subflow/decision面板靠 feature-detect 自己的 spec 导出,而 rc.0 早于 framework#4278,所以它们从未真正运行过。现在执行并通过。script面板的完整双向检查按设计仍跳过:rc.1 早于 framework#4343,那边退役的分发分支仍是契约键,只有「表单不提供执行器不读的键」这个方向有意义。它会在下一个 rc 自动激活(已在 framework#4516 里对着本地构建的 spec 验证过)。验证
type-check78/78;lint45/45,改动文件零 error。subflow/decision首次运行通过,wait转绿,script单向断言通过 + 完整对账正确跳过。ChartTypeSchema成员逐一对比,确认combo是唯一差异。Related
wait表单仍提供已退役的waitEventConfig.timeoutMs/.onTimeout—— 下一次 spec rc 刷新会被对账测试点名 #3101 —— 本体 issue(wait退役字段)NavigationItem/FormField/ConditionalValidation该做 burn-down 了 #3177 —— 本 PR 记录、未解决的三处 inverted pin burn-downwait声明了超时契约但完全没有实现:onTimeout零读取者,timeoutMs被当成定时时长用 —— showcase 自己在依赖它 objectstack#4158 —— 退役wait超时键的 framework PRQueryASTdeclares 12 members no executor runs — the liveness ledger governs metadata types, not the request surface objectstack#4286 / #3896 ——JoinStrategy/WindowFunction/PerformanceConfig的退役来源script的 config 契约要接入 #4277 的执行期 parse,先得有判别式(actionType)形态 objectstack#4343 / #4516 —— 下一个 rc 会激活script完整对账🤖 Generated with Claude Code
https://claude.ai/code/session_01Ct9NXp2JumjKuARtQnrbPf
Generated by Claude Code