Skip to content

收紧 theme 全部/chart 五个站点的未知键,并按门测量把 chart 两个站点判为 no gate(#4001 批 15) - #5043

Merged
xuyushun441-sys merged 4 commits into
mainfrom
claude/issue-4001-ui-batch15
Aug 4, 2026
Merged

收紧 theme 全部/chart 五个站点的未知键,并按门测量把 chart 两个站点判为 no gate(#4001 批 15)#5043
xuyushun441-sys merged 4 commits into
mainfrom
claude/issue-4001-ui-batch15

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Part of #4001 —— ui/ 方向的第三波(批 15),两个文件,账本重测记的 21 个 strip 站点。

结论先说:21 个站点里 19 个该收紧,2 个不该 —— 而且这 2 个不是批 13 那种「没门」

两个文件账本上都是 authorable (p),(p) 是待验证,不是结论。逐个解完:

文件 站点 (p) 解出来是 本 PR 做了什么
theme.zod.ts 14 可授权,门是活的 ✅ 14 个站点全部 strictObject
chart.zod.ts 5 可授权,门是活的 ✅ config / axis / series / annotation / interaction 收紧
chart.zod.ts 2 no gate —— 承载键活,但没有 parse ⛔ 不收紧,三处留痕,归档 #5020

一、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 读这个文件的两半方式不同:

后一半仍然关上,依据两条实测而不是偏好:

  1. .strip 今天已经把多余键丢在引擎之前,所以没有作者依赖这份开放性,渲染器收到的东西一个字节都没变 —— 收紧改变的是作者被告知什么,不是运行时拿到什么。
  2. 逃生口已经存在且是声明过的:customVars 按名字发任意 CSS 自定义属性。想要 --font-size-huge 的作者写那里。把 token 阶梯开着,只会多出第二条没写进文档的路径 —— 而那条路径上的错拼和意图长得一模一样。

策展全部有实测锚点

⚠️ 其中两条墓碑故意不给替代槽位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.chartConfigReportChartSchema),已收紧。

⚠️ 严格性顺着 .extend() 传到 ReportChartSchema —— 这是 webhookview 都栽过的陷阱(finding 16),这次是有意的并且钉住了:report chart 只把 xAxis/yAxis 收窄成 dataset 维度/度量名、不新增键,所以继承的键集正好,不需要 extraKeys。测试同时验证基础 error map 也一起传过去了(report 面也拿得到改名建议)。

剩下 2 个:no gate,一个必须与 no door 分开的新类别

ChartAggregateSchemaChartGroupBySchema 的 object 分支:

测量 结果
承载键 活的 —— react 层 < ObjectChart objectName aggregate={…} >(ADR-0081),发布在 react-blocks 契约里,objectui 的 ObjectChartschema.aggregate 跑查询
BFS 可达性 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 —— 它是 objectui ObjectChart.tsx:602(schema as any).drillDown,未类型化,但后面真的驱动 drill drawer。

照抄进 strict 报错,就等于用平台的权威把一个刚改对的作者引向同一个闸门会再拒一次的键。已改成只点名确实存在的东西(onSegmentClick / ReportSchema.drilldown / dashboard widget 的 options 袋),文件里那段 #3752 原文也一并更正,并加测试钉死。底层缺口(渲染器实现了协议没声明的能力)归档 #5022

三、仪器自证(每一类断言先证红,再信绿)

破坏 应红的断言 结果
typography.fontSize 改回 z.object 「嵌套块也拒绝未知键」 ✅ 红
抽掉整张 COLOR_ALIASES shadcn 词汇改名 ✅ 红
删掉 rtl 墓碑 「8 个 #3494 键各带处方」 ✅ 红
两个键共用一条 guidance 字符串 「逐个点名而不是一次带过」 ✅ 红
ReportChartSchema.strip() .extend() 严格性传递 ✅ 红
ChartAggregateSchema 关上 「仍然 strip,故意的」 ✅ 红
ChartAggregateSchema 加 dashboard 承载键 常驻 BFS 不可达断言 ✅ 红
defineTheme 不再 parse 门本身 ✅ 红
恢复 drillDown 假处方 「永不指向 drillDown ✅ 红
账本表头改成 105 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 收紧 / 2 no gate
  • remaining-strip map:theme.zod.ts删除(反向 pin:闸门对已关闭却仍留行的情况报红),chart.zod.ts 7→2,表头与小计由存活行重算(不是拿旧数字减)。
  • 与批 13(feat(spec)!: 收紧 responsive/SDUI 样式形状的未知键,并把另外五个文件按实测改判(#4001 批 13) #5003,已入 main)冲突按预案处理:两边行全保留后重算,check:strictness-ledger 仲裁。已断言批 13 的 responsive.zod.ts 4/4 strict 与五个 no-door 文件的 strip 姿态在合并后原样存活。

五、验证(合并 origin/main 后完整重跑)

⚠️ 第一轮的下游失败与「command build not found」全部是 AGENTS.md §9,不是本分支的改动。 lint / metadata / formula / cli 根本没有 dist —— 合并后我只构建了 @objectstack/spec。报错原文是 Failed to resolve entry for package "@objectstack/formula",CLI 没构建自然也就没有 build/validate 子命令。补上全量构建后逐项复跑:

结果
全仓 pnpm build --concurrency=2 71/71 successful(7m53s)
@objectstack/spec 测试 298 文件 / 7613 用例通过
@objectstack/spec tsc --noEmit 干净
八个生成物闸门 check:generated 8/8 ✓ All generated artifacts are up to date
八个源审计(无生成物) liveness empty-state react-declaration-parity skill-examples variant-docs strictness-ledger exported-any dual-source-exports 逐个实跑 PASS
@objectstack/lint 56 文件 / 1052 用例通过
@objectstack/metadata 15 文件 / 336 用例通过

check:strictness-ledger 双向读数:

✓ strictness ledger: 67 file(s) across 5 triaged director(ies) — site counts match,
  no undeclared schema files, section totals balance.
✓ remaining-strip map: 40 open file(s) / 259 strip site(s) across 4 director(ies) —
  counts match, no file with strip sites is missing a row, no closed file still carries one.

ADR-0087:三个应用的构建产物,按槽位路径直接 parse

槽位路径溯源(批 12 的警告:chart config 几乎全是 optional,{} 都能过,按形状匹配会「找到」成千上万个无关对象并给出毫无意义的绿)。三个承载路径:themes[]dashboards[].widgets[].chartConfigreports[].chart

app-showcase     24 authored slot(s) at a real carrier, 0 rejected
app-crm           3 authored slot(s) at a real carrier, 0 rejected
app-todo          4 authored slot(s) at a real carrier, 0 rejected
TOTAL            31 slots parsed against the new contracts, 0 rejected

=== NEGATIVE CONTROLS (must all be REJECTED) ===
app-showcase themes[0]                             REJECTED — `palette`
app-showcase themes[1]                             REJECTED — `palette`
app-showcase dashboards[0].widgets[3].chartConfig  REJECTED — `chartType`
app-showcase dashboards[0].widgets[4].chartConfig  REJECTED — `chartType`
31/31 negative controls rejected OK

探针在产物缺失时拒绝报绿,这点值得单独记:第一轮它打的是 ZERO slots found — the probe proved nothing,正因为它不肯把「没找到任何东西」说成「全部通过」,那次缺失的构建才被抓出来,而不是被洗成一次通过的验证。三个 validate 也照跑(showcase 有两条与本批无关的 master-detail 权限 ⚠ 既有告警),但按 #5000 对 page 面是恒真空证,不作为证据。

六、一个必须自曝的坑:警告本身踩了它警告的坑

check:docs 在第一轮报红。查下去:我写在文件头、用来提醒别人不要触发 #3746 陷阱的那句话,自己触发了这个陷阱 —— 它引用了 doc-comment 的双星开头字面量,而 getFileDescription() 是拿裸正则在原始源码上找第一个 doc block,不区分那是不是在 // 行里。于是它匹配到一个空 block,theme.mdxchart.mdx 的页面描述被清空(「Color Palette Schema / Defines brand colors…」「Unified Chart Type Taxonomy…」整段消失)。

改写措辞后重生成,两个参考页与 main 逐字节相同(git diffcontent/docs/references/ 为空)。顺带把 clickAction 那段 finding-7 说明从 JSDoc 挪进 // 注释 —— 它是给下一个维护者的话,不是协议文档,不该发布到公开参考页。

这条留在代码注释里,因为下一个想在这两个文件头写警告的人会踩同一脚。

os-regen 四步

git merge origin/main(⛔ 未 rebase、未 force-push)→ 全量重装 + 重建 → check:generated --fix 后 8/8 绿 → 断言兄弟条目存活:批 13 的 responsive.zod.ts 4/4 strict、五个 no-door 文件 strip 姿态原样、四个兄弟 changeset(批 13 / #5006 / #5008 / #5004)全在。

归档的范围外发现(均未指派)

变更集:.changeset/unknown-key-strictness-ui-batch15.md(major,v17 rc 窗口)。

🤖 Generated with Claude Code

https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9


Generated by Claude Code

claude added 4 commits August 3, 2026 20:42
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
@vercel

vercel Bot commented Aug 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 4, 2026 12:42am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests protocol:ui tooling labels Aug 4, 2026
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

107 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@xuyushun441-sys
xuyushun441-sys marked this pull request as ready for review August 4, 2026 00:44
@xuyushun441-sys
xuyushun441-sys added this pull request to the merge queue Aug 4, 2026
Merged via the queue into main with commit 3af0354 Aug 4, 2026
25 checks passed
@xuyushun441-sys
xuyushun441-sys deleted the claude/issue-4001-ui-batch15 branch August 4, 2026 01:05
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants