Skip to content

docs(spec): app.homePageId 墓碑说清真正的退役理由 —— 「no shell ever read it」是假的 (#4709) - #4846

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-4709-homepageid-tombstone-copy
Aug 3, 2026
Merged

docs(spec): app.homePageId 墓碑说清真正的退役理由 —— 「no shell ever read it」是假的 (#4709)#4846
os-zhuang merged 4 commits into
mainfrom
claude/issue-4709-homepageid-tombstone-copy

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #4709

#4709 维护者裁决 B(维持退役) 的强制附带项 (1) 墓碑与文档文案纠错

改的是「为什么删」的表述,不是删本身。 app.homePageId 在 spec 17.0.0 依旧退役:retiredKey() 机制、app-dead-authoring-keys-removed conversion 的 id / surface / apply / fixture、四张 ratchet、os migrate meta --from 16 的处方,一字未动。作者看到的处方前后完全一致(删键 → 重排 navigationisDefault)。

一、objectui 消费点实测读数

objectstack-ai/objectui@785b8a5(本会话挂载于 /workspace/objectui),packages/app-shell/src/console/AppContent.tsx:

675:  const landing = resolveLandingRoute(activeApp, { currentUserId: user?.id ?? null });
855:  function findNavItemById(items: any[], id: string): any | undefined {
875:  function resolveLandingRoute(activeApp: any, ctx?: NavTemplateContext): string {
876:    const homePageId: string | undefined = activeApp?.homePageId;
878:    if (homePageId) {
879:      const item = findNavItemById(navigation, homePageId);

函数体(实读):

function resolveLandingRoute(activeApp: any, ctx?: NavTemplateContext): string {
  const homePageId: string | undefined = activeApp?.homePageId;
  const navigation = activeApp?.navigation || [];
  if (homePageId) {
    const item = findNavItemById(navigation, homePageId);
    const route = buildItemRoute(item, ctx);
    if (route) return route;
  }
  return findFirstRoute(navigation, ctx);
}

结论:console 读过这个键,而且它是唯一决定 app 内落地页的地方。所以 #4667 墓碑里的「no shell ever read it」为
顺带,这段实现本身就是裁决 B 的论据:findNavItemById 找不到时 route 为空,静默落回 findFirstRoute —— 悬空 ID 无声回退,正是不该用 ID 交叉引用表达落地页的原因。

二、6 月审计的矛盾证据

docs/audits/2026-06-appschema-property-liveness.md:18,标题为 「LIVE & necessary (the sidebar core)」 的清单里明确含 homePageId:

`name`, `label`, `description`, `icon`, `active`, `isDefault`, `hidden`, `navigation` (whole tree),
`areas` (…), `contextSelectors` (all sub-fields), `homePageId`, `defaultAgent` (…), …

即 6 月审计说 live、8 月退役理由说 never read,两份本仓文档直接矛盾,两个月无人发现 —— 发现者是做 cloud pin bump 对账的第三方会话(#4709)。本 PR 不改这份审计的结论(它是对的),只在其后加一条指向 #4667/#4709 的后续注记,并把「退役单引用 liveness 必须对账既有审计」这条流程教训写进去。

三、.changeset/book-job-translation-app-authorwarn-keys-retired.md 是否已消费 —— 判定:未消费,故就地纠正

三条独立证据:

  1. 文件仍在 .changeset/(未被 changeset version 删除);
  2. .changeset/pre.json(mode: pre, tag: rc)的 changesets 数组共 641 条,不含 book-job-translation-app-authorwarn-keys-retired;
  3. packages/spec/CHANGELOG.mdgrep homePageId 零命中(当前顶部为 17.0.0-rc.1)。

三者一致 ⇒ 该 changeset 尚未进入任何已发布 CHANGELOG,不构成历史记录,按任务书就地纠正其论证段(把「its own hedge」换成真实理由),不另立「纠正说明」。

四、逐处改动清单

# 文件 改了什么 手改/生成
1 packages/spec/src/ui/app.zod.ts HOME_PAGE_ID_RETIRED 墓碑文案改为诚实版本(承认 objectui console 曾消费,给出真实理由:ID 交叉引用 + 悬空静默回退);上方 docblock 同步重写,记录假前提、6 月审计矛盾、以及「将来正确形状是 navigation[].landing,enforce-first」。处方部分逐字保留 手改
2 content/docs/references/ui/app.mdx:86 retiredKey().describe() 重生成 gen:docs
3 packages/spec/src/conversions/registry.ts:1623 app-dead-authoring-keys-removedsummary 散文:never readunread or wrongly encoded,并把 homePageId 分句换成真实理由。其他键的描述一字未动;id/surface/apply/fixture/expectedNotices 全部未动 手改(散文)
3a docs/protocol-upgrade-guide.md:200 头部即写明 GENERATED (ADR-0087 D4) — do not edit by hand,只能经 3 重生成 gen:upgrade-guide
3b packages/spec/spec-changes.json(2 处) 同上 gen:spec-changes
4 .changeset/book-job-translation-app-authorwarn-keys-retired.md:42 未消费(见 §三),就地把「its own hedge」论证段改为「a second source for one fact」+ 明说本条初版说反了、#4709 已纠正并维持退役 手改
5 packages/lint/src/lint-liveness-properties.test.ts:268/341 核实后未改 —— 两处注释只列举键名(app.homePageId 等)说明 lint 已对其静默,没有复述任何假前提
6 docs/audits/2026-06-appschema-property-liveness.md 结论原文不动,LIVE 清单后新增引用块注记:该键已于 v17 退役、本审计的 LIVE 判定是对的、退役理由已在 #4709 更正,并记录流程教训 手改
7 packages/spec/liveness/app.json (homePageId.note) 超出任务书清单、核实后判定必改:该 note 原文含同一句 No shell ever read itstatus 保持 deadverifiedAt 未动,只改 note 散文。理由:ledger 正是下一个退役单会去读的记录,假前提留在这里就是复发源 手改
8 content/docs/ui/apps.mdx:288 同上,手写文档:原文 The key was removed in 17.0.0 (#4667) because nothing ever read it. —— 同一句假话,改为真实理由 手改
9 examples/app-showcase/src/ui/apps/index.ts:29 同上,示例注释:原文 the spec's homePageId has no console consumer yet —— 既假(console 消费过)又过期(键已退役),改为「homePageId 已于 17.0.0 移除,首项即落地页」 手改
10 packages/spec/src/ui/app.test.ts 修正 1299 用例注释里复述假前提的一句;新增 pin 测试(见下) 手改
11 .changeset/homepageid-tombstone-premise-corrected.md 新增,@objectstack/spec: patch 新增

核实后判定不改的:packages/spec/liveness/README.md:511homePageId 分句为「the landing IS the first nav item; root landing follows isDefault routing」—— 描述的是 v17 之后的现状,事实成立,不含 never read 类假前提;为控制 blast radius(该行是极易冲突的巨型汇总行)不动。content/docs/ui/apps.mdx:181 同理(陈述现状,成立)。

五、新增回归 pin

packages/spec/src/ui/app.test.ts 新增 the tombstone states the REAL reason, not the false "no shell read it" premise (#4709):

expect(parse).not.toThrow(/no shell ever read/i);
expect(parse).toThrow(/did read it/i);
expect(parse).toThrow(/resolveLandingRoute/);
expect(parse).toThrow(/reorder `navigation`/s);   // 处方未随纠错改变

retiredKey(guidance) 把同一份 guidance 同时用作解析期报错和 .describe(),所以这条 pin 同时锁住了报错文案与生成文档文案。

六、changeset 定级

@objectstack/spec: patch。定级从实:本 PR 不改任何运行时行为、不改类型、不改 AppSchema 接受/拒绝的输入集合 —— 只改一条已经在拒绝的键所附带的解释性文字。同一批未发布的 major(#4667)已在队列中,patch 与之叠加无害。正文明确写了「改的是退役理由的表述,不是退役本身」。

七、验证(实测输出)

### check:generated (8/8)
  ✓ check:spec-changes         spec-changes.json
  ✓ check:upgrade-guide        docs/protocol-upgrade-guide.md
  ✓ check:skill-docs           skill docs (from SKILL.md frontmatter)
  ✓ check:skill-refs           skill references
  ✓ check:react-blocks         react-blocks contract
  ✓ check:authorable-surface   authorable-surface.json + JSON schemas
  ✓ check:api-surface          api-surface.json
  ✓ check:docs                 content/docs/references/**
rc-generated=0

### spec test (全量)
 Test Files  294 passed (294)
      Tests  7381 passed (7381)

### spec check:liveness
✓ all governed-type properties are classified, every registered type is governed or explicitly
  pending, no ledger row outlives its property, and all bound high-risk proofs resolve.

### lint test (全量,依赖构建后)
 Test Files  54 passed (54)
      Tests  961 passed (961)

### 全仓 typecheck
 Tasks:    122 successful, 122 total
   Time:    8m0.122s

合并 origin/main 后复验(merge 而非 rebase;四张 ratchet 无重叠 —— main 的 #4809 动了 api-surface.json / authorable-surface.json / json-schema.manifest.json,而本 PR 一张都没动,故无需 git checkout origin/main -- 重生成):

rc-build=0
  ✓ check:spec-changes / check:upgrade-guide / check:skill-docs / check:skill-refs
  ✓ check:react-blocks / check:authorable-surface / check:api-surface / check:docs
rc-generated=0
 Test Files  1 passed (1)      # src/ui/app.test.ts
      Tests  96 passed (96)

中途 check:api-surface 曾因 dist 未构建报 Could not resolve module symbol … Is the package built?,@objectstack/lintexample-showcase 也曾因 workspace 依赖未构建报 Failed to resolve entry for package "@objectstack/formula" / TS2307。构建后三者全绿(见上),与本 PR 改动无关。

八、明确不做

  • 不撤回退役(方案 A 已被裁决否决);不动 retiredKey()authorable-surface.jsonapp-dead-authoring-keys-removed行为条目。
  • content/docs/releases/ 一个字未碰。
  • objectui 侧 if (homePageId) 死分支与 findNavItemById 的清理、以及 docblock 里「CRM example 落在 Sales Dashboard」那句承诺的更正,均属跨仓项 (2),另见 objectstack-ai/objectui#3264,不在本 PR 内
  • 裁决的设计占位 (3)(将来用 navigation[].landing,enforce-first)已写进 app.zod.ts docblock 与 liveness ledger note,防 v18 回潮。

🤖 Generated with Claude Code

https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9


Generated by Claude Code

claude added 2 commits August 3, 2026 09:38
#4709)

改的是「为什么删」的表述,不是删本身。`homePageId` 依旧退役(`retiredKey`:编译期
`never`、解析期报错),conversion `app-dead-authoring-keys-removed` 的行为、四张
baseline、`os migrate meta --from 16` 的处方一字未动。

#4667 的理由「no shell ever read it」是假的,且与本仓自己的记录矛盾:2026-06 的
AppSchema liveness 审计把 `homePageId` 列在 LIVE 一侧,因为 objectui console 的
`resolveLandingRoute()`(`packages/app-shell/src/console/AppContent.tsx`,
objectui @785b8a5d)一直在读它,而且它是唯一决定 app 落地页的地方。两份文档矛盾
两个月无人发现 —— 假前提会让下一个读者据此做错判断,#4709 立单人正是先信了这句。

真正让它该走的是形状:把落地页编码成指向 `navigation` 的 ID 交叉引用,没有引用
完整性,id 悬空时静默回退到第一项。将来若要「落地页 ≠ 第一项」,正确形状是导航项
自身的标记(`navigation[].landing`),按 enforce-first 设计。

逐处纠正:`ui/app.zod.ts` 墓碑与 docblock、conversion 摘要(经 gen 重生成到
`docs/protocol-upgrade-guide.md` 与 `spec-changes.json`)、生成文档
`content/docs/references/ui/app.mdx`、`content/docs/ui/apps.mdx`、liveness ledger
的 `homePageId` note、`examples/app-showcase` 的过期注释、#4667 未消费 changeset
的论证段;6 月审计加后续注记(原结论不动)。新增 pin 测试防假前提回潮。

objectui 侧的 `if (homePageId)` 死分支另见 objectstack-ai/objectui#3264Fixes #4709

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9
@vercel

vercel Bot commented Aug 3, 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 3, 2026 10:38am

Request Review

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

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

106 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/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.

claude added 2 commits August 3, 2026 10:18
`packages/spec/spec-changes.json` 与 `docs/protocol-upgrade-guide.md` 在
`.gitattributes` 里走 `merge=os-regen`。合并 origin/main(含 #4831 退役
activationEvents)后实测:两文件**零冲突标记**地只保留了本分支一侧 ——
`plugin-activation-events-retired` 被静默吞掉(`grep -c` = 0),正是 #4616
预警的失效形态。

按规矩不做文本合并:`git checkout origin/main --` 取回两文件后,从合并后的
**源**(`conversions/registry.ts` 的 summary + `migrations/registry.ts` 的
step17.semantic)整体重新生成,得到正确并集。

重生成后核对:两条条目并存;#4616 的四个删除(system/EmailTemplate、
SMSTemplate、PushNotification、InAppNotification)未复活,幸存的
EmailTemplateDefinition 仍在;#4657/#4831 的 kernel/studio ActivationEvent
def 与 ActivationEventSchema 导出未复活,authorable-surface 里 activationEvents
仅剩 #4831 自己的 `[RETIRED]` 墓碑行。五张 ratchet 重生成后与 main 逐字节一致,
本分支一张未动。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9

Copy link
Copy Markdown
Contributor Author

#4831 同步完成 —— merge=os-regen 的静默吞噬在本分支实测复现,已按重生成路线修好

commit f2efe0b6a。轮询等到 #4831 落地 main(7445149cb,10:18Z)后同步。

1. 等待判据(实测)

每轮 git fetch origin main -q 后检查 origin/main:packages/spec/src/migrations/registry.ts 是否含 plugin-activation-events-retired:09:54Z / 10:03Z / 10:13Z 三轮为 0,10:18Z 命中:

FOUND: #4831 landed
7445149cb refactor(spec)!: 退役 activationEvents(两处键)与 ActivationEventSchema 词表 …… (#4657) (#4831)

2. ⚠️ 静默吞噬实测复现(这正是被预警的失效形态)

git merge origin/main rc=0,零冲突标记。合并刚结束、未重生成时对两个 merge=os-regen 文件取读数:

文件 本分支一侧(unread or wrongly encoded) main 一侧 #4831(plugin-activation-events-retired)
packages/spec/spec-changes.json grep -c = 2 grep -c = 0被吞
docs/protocol-upgrade-guide.md grep -c = 1 grep -c = 0被吞

即:若直接采信这次「干净合并」,#4831 刚落地的 D3 条目会无声消失在我这条 PR 里。#4616 的教训在本分支上一次复现成功。

两侧的都完好(合并本身没问题,坏的是生成物的文本合并):conversions/registry.ts 我的更正 = 1,migrations/registry.ts#4831 条目 = 1。

3. 修复路线:不做文本合并,整体重生成

git checkout origin/main -- packages/spec/spec-changes.json docs/protocol-upgrade-guide.md
pnpm --filter @objectstack/spec build && gen:schema && gen:spec-changes && gen:upgrade-guide && gen:docs

(我的更正本就派生自 conversions/registry.tssummary,#4831 的条目派生自 migrations/registry.ts,故从合并后的源重生成必然产出正确并集。)

pre-commit 的 os-regen 钩子独立复核并确认了这一路径:

os-regen: 2 generated artifact(s) were merged WITHOUT a text merge and must be regenerated
          from the merged tree before this commit.
  ✓ packages/spec/spec-changes.json — current
  ✓ docs/protocol-upgrade-guide.md — current
os-regen: all deferred artifacts are current — marker cleared.

4. 核对断言(第 5 条)

并存 —— 重生成后:

spec-changes.json  : app-dead-authoring-keys-removed(我的 "unread or wrongly encoded") = 2 ✅
spec-changes.json  : plugin-activation-events-retired (#4831)                          = 2 ✅
protocol-upgrade-guide.md : 我的更正 = 1 ✅ ; activationEvents (#4831) = 4 ✅

未复活 #4616 的删除(精确名,json-schema.manifest.json):

system/EmailTemplate = 0 ✅   system/SMSTemplate     = 0 ✅
system/PushNotification = 0 ✅   system/InAppNotification = 0 ✅
system/EmailTemplateDefinition = 3 ✅(幸存邻居,不同 def,应当在)

未复活 #4657/#4831 的删除:

kernel/ActivationEvent (manifest)          = 0 ✅
studio/ActivationEvent (manifest)          = 0 ✅
ActivationEventSchema  (api-surface.json)  = 0 ✅
authorable-surface.json 里 activationEvents 唯一命中:
  4284:    "kernel/DynamicLoadRequest:activationEvents [RETIRED]"   ← #4831 自己的墓碑行 ✅

五张 ratchet 仍零触碰:重生成后 git status 只有那两个文件,api-surface.json / api-surface-signatures.json / authorable-surface.json / json-schema.manifest.json / dual-source-exports.baseline.json 与合并后的 main 逐字节一致,本分支一张未动。

5. 同步后重跑读数

### check:generated
  ✓ check:spec-changes         spec-changes.json
  ✓ check:upgrade-guide        docs/protocol-upgrade-guide.md
  ✓ check:skill-docs           skill docs (from SKILL.md frontmatter)
  ✓ check:skill-refs           skill references
  ✓ check:react-blocks         react-blocks contract
  ✓ check:authorable-surface   authorable-surface.json + JSON schemas
  ✓ check:api-surface          api-surface.json
  ✓ check:docs                 content/docs/references/**
✓ All 8 generated artifacts are up to date.
rc-generated=0

### check:dual-source-exports
✅  no new dual-source exports: 4276 names across 16 entry points — 171 re-exported
    (single declaration), 0 accepted dual-source (baseline).
rc-dual=0                                  ← 0,符合要求

### check:liveness
✓ all governed-type properties are classified, every registered type is governed or explicitly
  pending, no ledger row outlives its property, and all bound high-risk proofs resolve.
rc-liveness=0

### spec test(全量)
 Test Files  295 passed (295)
      Tests  7359 passed (7359)          ← 与 #4831 自报的 295/7358 一致(+1 = 本 PR 新增的 pin)

### 全仓 typecheck
 Tasks:    122 successful, 122 total
   Time:    7m52.436s
rc-full-tc=0

6. 其他

  • 全程 git merge,未 rebase、未 force-push
  • push 后 main 又前进 4 个 commit(0657f6bdc / 0b795da8e / fa94b2cd3 / f4847a6b5),经核对均未触碰任何共同冲突面(spec-changes.json / protocol-upgrade-guide.md / 五张 ratchet / 两个 registry),故无需再次同步。
  • PR 仍为 draft,未 ready、未 auto-merge。

Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review August 3, 2026 10:43
@os-zhuang
os-zhuang enabled auto-merge August 3, 2026 10:43
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 3, 2026
Merged via the queue into main with commit 61cc079 Aug 3, 2026
22 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4709-homepageid-tombstone-copy branch August 3, 2026 11:01
os-zhuang pushed a commit that referenced this pull request Aug 3, 2026
os-regen 第三轮实测:#4846 对 app-dead-authoring-keys-removed summary 的散文修正
('WAS read by objectui')在合并中被静默吞掉(origin/main 2 处命中,合并后 0)。
按协议 checkout origin/main 后从合并源整体重生成;spec-changes.json 现三方并存:
#4657 activationEvents 4 条、#4846 散文 2 处、#4793 batch-row 2 条。
四张 ratchet 与 origin/main 逐字节相同(本单导出增删 0)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9
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/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

app.homePageId 退役的前提写错了 —— objectui 的 resolveLandingRoute() 一直在读它,现在成了永远走不到的死分支

2 participants