收紧 theme 全部/chart 五个站点的未知键,并按门测量把 chart 两个站点判为 no gate(#4001 批 15) - #5043
Merged
Conversation
theme.zod.ts 14 个站点全部 strictObject;chart.zod.ts 5 个站点收紧, ChartAggregate/ChartGroupBy 两个站点按实测(有承载键但无 parse)留开并记录。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
ui/ triage: theme 行改判 authorable+strict;chart 行拆出并记 5 收紧 / 2 no gate。 remaining-strip map: theme 行删除(已关闭),chart 7→2,表头 123→104, 小计由存活行重算 102 of 104。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
…batch15 # Conflicts: # docs/audits/2026-07-unknown-key-strictness-ledger.md
getFileDescription() 用裸正则在原始源码上找第一个 doc block,所以在 // 行里 引用那个双星开头的字面量也会被匹配成文件的首个 doc block —— 于是这条警告 自己把 theme/chart 两个参考页的描述清空了。check:docs 抓到;改写措辞后 两页与 main 逐字节相同。 同时把 clickAction 的 finding-7 说明从 JSDoc 移到 // 注释:它是给下一个 维护者的话,不是协议文档,不该发布到公开参考页。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 107 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
xuyushun441-sys
marked this pull request as ready for review
August 4, 2026 00:44
xuyushun441-sys
enabled auto-merge
August 4, 2026 00:44
xuyushun441-sys
pushed a commit
that referenced
this pull request
Aug 4, 2026
Ledger `ui/` section conflicted in four regions, as planned — 批 14 and 批 15
both edit it. Every row and both sides' prose kept; nothing resolved in favour
of a side.
- classification table: kept 批 14's fuller `no door` wording (it adds the
call-site half of the measurement and names #4988/#5015) AND 批 15's new
fifth class `no gate`. The two are NOT the same verdict: `no door` has no
carrier key at all and points at ADR-0049 removal; `no gate` has a LIVE
carrier (`<ObjectChart aggregate>`) with no parse between author and
runtime and points at wiring the gate. Opposite follow-ups — collapsing
them would prescribe the destructive action on one of the two.
- class prose: both blocks kept (批 14's positive-control requirement and
per-SCHEMA split finding; 批 15's no-door/no-gate table).
- rows: auto-merged clean — 批 15 deleted `theme` and took `chart` 7 -> 2,
批 14 had deleted `action`/`report`/`dataset`/`dashboard` and taken
`sharing` 2 -> 1.
Header and subtotal RECOMPUTED FROM THE SURVIVING ROWS, not decremented:
29+20+9+2+7+6+4+4+4+3+1+1+1 = 91. Cross-checked from both directions (110 - 14
theme - 5 chart = 91; 100 - 3 dataset - 2 report - 2 dashboard - 1 action - 1
sharing = 91). 批 13 wrote 119, 批 14 wrote 110, 批 15 wrote 100 — each correct
against its own branch, all three wrong against the merge, and 91 is a number no
side ever wrote down. Seventh instance of the failure the automation/ section
documents. Subtotal 65 of 91 authorable; 26 in the two no-parse classes (24
`no door`, 2 `no gate`). check:strictness-ledger arbitrates and is green.
os-regen four-step: merged (never rebased), reinstalled + rebuilt spec, reset all
seven generator-owned paths to origin/main, regenerated wholesale. Delta vs
origin/main is exactly one file — content/docs/references/ui/sharing.mdx — so the
regeneration reproduced main's artifacts byte-identically. Sibling coexistence
asserted: 批 15's ui/theme.mdx and ui/chart.mdx both present and 0 changed lines
against main, beside 批 14's sharing.mdx.
Re-verified on the merged tree: spec 299 files / 7639 tests passed, tsc --noEmit
clean, all sixteen gates green (8 generated + 8 source audits).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
xuyushun441-sys
pushed a commit
that referenced
this pull request
Aug 4, 2026
…#5043 landed) Ledger ui/ section was the only conflict, as expected for a three-way contended table. Every side's rows kept; header and authorable subtotal RECOMPUTED from the surviving rows rather than resolved in favour of a side: rows: 29+20+9+2+7+5+4+4+4+3+1+1+1 = 90 strip of 198 authorable = 90 - 40 no-parse (38 no door + 2 no gate) = component 29 + view 20 + app 1 = 50 Neither side's number survives — 批 16 computed 118 against a tree where 批 14's and 批 15's rows still existed, main carried 91. Eighth instance of the pattern this table documents; recorded as such. Merge resolution detail: main split the combined `chart / i18n` triage row into two, so 批 16's i18n verdict was rehomed onto main's standalone i18n row, and main's 批 15 chart row was kept verbatim. `theme.zod.ts` left the remaining-strip map on main's reverse pin (0 strip) and stays gone. os-regen four-step done: merge → restore the seven driver-managed artifact paths from origin/main → rebuild spec → `check:generated --fix` (all 8 already current; strictness changes no generated snapshot, same as 批 14/15) → sibling entries asserted surviving (批 13/14/15/16 changesets all present, theme/chart/dataset/ sharing strictObject counts intact). Post-merge verification (§10, overlapping packages): @objectstack/spec 301 files / 7709 tests pass, tsc --noEmit clean, check:strictness-ledger green.
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.
Part of #4001 ——
ui/方向的第三波(批 15),两个文件,账本重测记的 21 个 strip 站点。结论先说:21 个站点里 19 个该收紧,2 个不该 —— 而且这 2 个不是批 13 那种「没门」
两个文件账本上都是
authorable (p),(p)是待验证,不是结论。逐个解完:(p)解出来是theme.zod.tsstrictObjectchart.zod.tschart.zod.tsno gate—— 承载键活,但没有 parse一、
theme.zod.ts—— 14/14,门有两道(p)解在两个真实解析点上:stack.zod.ts声明themes: z.array(ThemeSchema)(所以defineStack()在每次启动和objectstack build时解析每一个主题),defineTheme()直接解析一个。BFS 从 24 个 metadata-type root 加ObjectStackSchema出发,文件内每个 schema 都可达。对照是双向的,这点比结论本身重要:同一次运行里
PageSchema/DashboardSchema/ReportSchema/WebhookSchema/StateMachineSchema五个阳性对照全部root-graph,批 13 实测的 no-door 形状(TouchTargetConfigSchema/GestureConfigSchema)全部UNREACHABLE。一个对什么都说「可达」的仪器不算证据。没有多 claim:
theme故意不在BUILTIN_METADATA_TYPE_SCHEMAS里,所以存储态 theme 行不经过 metadata REST 门。本文件提供的是授权门,文件头注释按原样写明,不暗示自己没有的触及面。passthrough的问题是逐块问的,不是逐文件objectui 的
ThemeEngine读这个文件的两半方式不同:colors/borderRadius/shadows/typography.fontFamily走固定映射表(COLOR_TO_CSS_MAP等)或具名属性读取 —— 多余的键永远不会被任何东西读到。fontSize/fontWeight/lineHeight/letterSpacing/duration/timing/zIndex是Object.entries(...)展开,发出--font-size-<key>…,给什么发什么。这就是 fix(spec): make the bulk-action option item's openness deliberate, not accidental (#4001) #4909 那个形状。后一半仍然关上,依据两条实测而不是偏好:
.strip今天已经把多余键丢在引擎之前,所以没有作者依赖这份开放性,渲染器收到的东西一个字节都没变 —— 收紧改变的是作者被告知什么,不是运行时拿到什么。customVars按名字发任意 CSS 自定义属性。想要--font-size-huge的作者写那里。把 token 阶梯开着,只会多出第二条没写进文档的路径 —— 而那条路径上的错拼和意图长得一模一样。策展全部有实测锚点
card→surface、foreground→text、destructive→error)来自 objectui 自己的COLOR_TO_CSS_MAP,它在出口处重命名了每一个调色板键 —— 读渲染结果的作者会把 shadcn 名字写回来,编辑距离够不着。md→base(fontSize)与base→normal(fontWeight)是同文件内的阶梯打架:borderRadius/shadows有md,字号阶梯没有;三个兄弟阶梯把中间档叫base,字重叫normal。radius→base,因为base发出的是裸--radius,那是 objectui 样式表真正读的唯一 radius 变量。easeIn→ease_in:animation.timing是本文件唯一的 snake_case 词汇,违反 AGENTS.md Implement ObjectStack protocol specification with Zod schemas and TypeScript interfaces #3,所以 camelCase 拼写是作者在遵守仓库自己的命名规则,不是错字。guidance逐键原样发一条 bullet,共享字符串会把同一段打印 N 次 —— 批 10 的教训)。touchTarget/keyboardNavigation看起来该指向ui/touch.zod.ts/ui/keyboard.zod.ts—— 而批 13 刚测出这两套词汇根本没有承载键(#4988)。指过去等于把作者从一次响亮的拒绝领进一次静默的失效,正是账本的 finding 7。有测试钉死错误信息里不出现这两个文件名。二、
chart.zod.ts—— 5 个收紧,2 个按测量留开5 个从
dashboard/report两个 metadata-type root 可达(DashboardWidget.chartConfig、ReportChartSchema),已收紧。.extend()传到ReportChartSchema—— 这是webhook和view都栽过的陷阱(finding 16),这次是有意的并且钉住了:report chart 只把xAxis/yAxis收窄成 dataset 维度/度量名、不新增键,所以继承的键集正好,不需要extraKeys。测试同时验证基础 error map 也一起传过去了(report 面也拿得到改名建议)。剩下 2 个:
no gate,一个必须与no door分开的新类别ChartAggregateSchema和ChartGroupBySchema的 object 分支:< ObjectChart objectName aggregate={…} >(ADR-0081),发布在 react-blocks 契约里,objectui 的ObjectChart读schema.aggregate跑查询UNREACHABLE(同一次运行里上面 5 个是root-graph).parse()唯一审查作者所写
aggregate的是 react 页发布 lint,它手写重推了这个 schema 的规则(CHART_FUNCTIONS、count/field refinement、结果列命名各一份),从不检查未知键。所以groupby/dateGranularty今天被静默丢弃,加上strictObject之后照样被静默丢弃 ——.strict()是 parse 的属性。这不是批 13 的 no-door:那里没有作者,正确动作是 ADR-0049 退役;这里作者和渲染器都在,退役会打断一个能用的功能,正确动作是把闸门接上。合并成一类会把下一批指向恰好错误的动作,所以账本分类规则表里并列新增第四类,并附对照表。归档 #5020。
留痕三处:
chart.zod.ts两个 schema 上方的注释、chart.test.ts的 pin(含一条常驻 BFS 断言 —— 谁给aggregate加上 metadata 承载键,它就变红并把人指回来)、账本行。收紧前拦下 finding 7 的第三次发生
#3752 写在本文件里的
clickAction迁移处方是 "Migration:drillDown"。核了一下:spec 从未声明过drillDown—— 它是 objectuiObjectChart.tsx:602的(schema as any).drillDown,未类型化,但后面真的驱动 drill drawer。照抄进 strict 报错,就等于用平台的权威把一个刚改对的作者引向同一个闸门会再拒一次的键。已改成只点名确实存在的东西(
onSegmentClick/ReportSchema.drilldown/ dashboard widget 的options袋),文件里那段 #3752 原文也一并更正,并加测试钉死。底层缺口(渲染器实现了协议没声明的能力)归档 #5022。三、仪器自证(每一类断言先证红,再信绿)
typography.fontSize改回z.objectCOLOR_ALIASESrtl墓碑ReportChartSchema补.strip().extend()严格性传递ChartAggregateSchema关上ChartAggregateSchema加 dashboard 承载键defineTheme不再 parsedrillDown假处方drillDown」check:strictness-ledger算术其中一次破坏抓到了我自己的仪器缺陷,而且是最值得记的一条:常驻 BFS 断言第一版写完就绿,阳性对照却也绿 —— 因为
lazySchema的 Proxy target 是function lazyZod() {},typeof v !== 'object'把每一个 lazy 节点都跳过了,BFS 在第一跳就停了。先证红这一步不做,这条 pin 会以一个「什么都不可达」的空洞绿落地,而它的全部价值恰恰是判「不可达」。(build-schemas.ts的同类遍历从没踩到:它在OS_EAGER_SCHEMAS=1下跑,根本没有 Proxy。)四、账本
no gate,与批 13 的no door并列,附「承载键 / parse / 正确的下一步」对照表 —— 因为两者失败于同一项测量却处方相反,读错会破坏性地删掉能用的功能。ui/triage:theme.zod.ts改判authorable+ strict as of 批 15;chart.zod.ts从合并行拆出单独成行,记 5 收紧 / 2no gate。theme.zod.ts行删除(反向 pin:闸门对已关闭却仍留行的情况报红),chart.zod.ts7→2,表头与小计由存活行重算(不是拿旧数字减)。check:strictness-ledger仲裁。已断言批 13 的responsive.zod.ts4/4 strict 与五个 no-door 文件的 strip 姿态在合并后原样存活。五、验证(合并 origin/main 后完整重跑)
lint/metadata/formula/cli根本没有 dist —— 合并后我只构建了@objectstack/spec。报错原文是Failed to resolve entry for package "@objectstack/formula",CLI 没构建自然也就没有build/validate子命令。补上全量构建后逐项复跑:pnpm build --concurrency=2@objectstack/spec测试@objectstack/spectsc --noEmitcheck:generatedlivenessempty-statereact-declaration-parityskill-examplesvariant-docsstrictness-ledgerexported-anydual-source-exports逐个实跑 PASS@objectstack/lint@objectstack/metadatacheck:strictness-ledger双向读数:ADR-0087:三个应用的构建产物,按槽位路径直接 parse
按 槽位路径溯源(批 12 的警告:chart config 几乎全是 optional,
{}都能过,按形状匹配会「找到」成千上万个无关对象并给出毫无意义的绿)。三个承载路径:themes[]、dashboards[].widgets[].chartConfig、reports[].chart。探针在产物缺失时拒绝报绿,这点值得单独记:第一轮它打的是
ZERO slots found — the probe proved nothing,正因为它不肯把「没找到任何东西」说成「全部通过」,那次缺失的构建才被抓出来,而不是被洗成一次通过的验证。三个validate也照跑(showcase 有两条与本批无关的 master-detail 权限 ⚠ 既有告警),但按 #5000 对 page 面是恒真空证,不作为证据。六、一个必须自曝的坑:警告本身踩了它警告的坑
check:docs在第一轮报红。查下去:我写在文件头、用来提醒别人不要触发 #3746 陷阱的那句话,自己触发了这个陷阱 —— 它引用了 doc-comment 的双星开头字面量,而getFileDescription()是拿裸正则在原始源码上找第一个 doc block,不区分那是不是在//行里。于是它匹配到一个空 block,theme.mdx与chart.mdx的页面描述被清空(「Color Palette Schema / Defines brand colors…」「Unified Chart Type Taxonomy…」整段消失)。改写措辞后重生成,两个参考页与
main逐字节相同(git diff对content/docs/references/为空)。顺带把clickAction那段 finding-7 说明从 JSDoc 挪进//注释 —— 它是给下一个维护者的话,不是协议文档,不该发布到公开参考页。这条留在代码注释里,因为下一个想在这两个文件头写警告的人会踩同一脚。
os-regen 四步
git merge origin/main(⛔ 未 rebase、未 force-push)→ 全量重装 + 重建 →check:generated --fix后 8/8 绿 → 断言兄弟条目存活:批 13 的responsive.zod.ts4/4 strict、五个 no-door 文件 strip 姿态原样、四个兄弟 changeset(批 13 / #5006 / #5008 / #5004)全在。归档的范围外发现(均未指派)
ChartAggregateSchema有活的承载键却没有任何 parse:react 页发布闸门手写重推了它的规则,未知键从不检查(#4001 批 15 的no gate首例) #5020 ——ChartAggregateSchema有活承载键却无任何 parse;react 页发布闸门手写重推规则、不查未知键(本 PR 留开 2 个站点所依据的那件事)--font-size-*/--z-*/--duration-*…):ADR-0049 该判去留 #5021 —— 主题引擎发出的 9 组 CSS 变量零消费方,ADR-0049 该判去留(不是未知键问题,不并进本批)drillDown是 objectui 读的活能力,却不是 spec 声明的任何键 —— #3752 的迁移处方曾指向它 #5022 ——drillDown是 objectui 读的活能力却不是 spec 声明的任何键变更集:
.changeset/unknown-key-strictness-ui-batch15.md(major,v17 rc 窗口)。🤖 Generated with Claude Code
https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
Generated by Claude Code