Skip to content

fix(spec): 导航项四条「展开」别名改为跨变体散文 target,消除二次拒绝 (#5555) - #5664

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-5555-nav-expanded-aliases
Aug 5, 2026
Merged

fix(spec): 导航项四条「展开」别名改为跨变体散文 target,消除二次拒绝 (#5555)#5664
os-zhuang merged 1 commit into
mainfrom
claude/issue-5555-nav-expanded-aliases

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #5555

问题

expanded 只声明在 group 导航变体上(NAV_VARIANT_KEYS.group = ['expanded', 'children']),但 defaultOpen / open / collapsed / isOpen 四条别名写在 NAV_ITEM_ALIASES —— 一张被盖进全部九个变体的共享表。于是在另外八个变体上,作者的路径是:

  1. { type: 'url', url: '/x', defaultOpen: true }
  2. 得到 Did you mean `defaultOpen` → `expanded`?
  3. 照做改成 expanded: true
  4. 再次被拒,而且第二次没有任何建议

这正是 #4001 战役要消灭的失败模式(ledger finding 7 的「二次拒绝」),由该战役自己的修复产生。

修法

四条别名从共享表挪进按变体拼装那一段,与既有六条跨变体别名同形:

  • group 保留裸键名重定向(expanded 在它身上是真键,指过去就能过);
  • 另外八个变体给散文 target type: 'group' (with expanded) —— 回答的是「键名对、变体错」,而裸键名说不出这件事。

拆成 NAV_EXPANDED_ALIASES_ON_GROUP / NAV_EXPANDED_ALIASES_ELSEWHERE 两张字面表(而非派生),因为散文串是契约面:闸门白名单按字面匹配它,顺着报错 grep 过来的读者要能落到这里。

闸门联动(两处,均在 shared/alias-integrity.test.ts)

  1. 删除 isPinnedExpandedDefect ≤32 容差整段(而非收到 0)—— 债已还清,判据 2 现在零容差;原地留下一段注释说明这条容差去哪了。
  2. PROSE_ALIAS_TARGETS 扩入第七条 type: 'group' (with expanded)。白名单带陈旧检查,四条别名共用一条 target(它们共享同一个答案)。散文 target 仍受既有 PROSE_TARGET_SURFACE 正则约束,未放宽 surface 家族。

验证(先证红)

红(修改前,方向为事先预测):未改 app.zod.ts,仅让容差失效 → 判据 2 报 恰好 32 条,4 别名 × 8 个非 group 变体,group 正确缺席:

AssertionError: expected [ …(32) ] to deeply equal []
+ "this `url` navigation item": `defaultopen` -> `expanded` — `expanded` is not a known key here
…

绿(修改后):alias-integrity.test.ts 18 passed;@objectstack/spec 全量 317 files / 8072 tests passed;typecheck 通过。

反向注入 A —— 共享表加第五种拼法 expand: 'expanded':判据 2 转红 8 条(容差已删,无物吸收),证明清理后判据仍然咬得住。

反向注入 B —— 把四条散文 target 打错一个字母:判据 2 转红 32 条 「every prose-target exemption is still load-bearing」陈旧检查同时转红 —— 两处联动都是活的。

解析期行为测试

新增 packages/spec/src/ui/app-nav-expanded-alias.test.ts(12 例):八个非 group 变体(separator 因分支未导出,走 AppSchema.navigation 真门)四种拼法均得到散文、且不再出现 → `expanded` 死重定向;group 上四条仍重定向到 expanded

可达性按「值判据」写成 full-parse-green:{ type: 'group', expanded: true } 必须真的解析通过 —— 指向一个不可达的目的地正是本次要修的缺陷,所以只断言 expanded 是个「被识别的键名」不够。另有一例把旧 target 为何是死的这个事实钉住:expanded 写在 url 项上确实被拒,且第二次报错不含 Did you mean

Changeset

@objectstack/spec patch:纯面向作者的报错文案改进。接受/拒绝的键集合、类型、默认值全部不变,已有元数据不受影响,group 上的别名行为也不变 —— 没有形状变更,故不取 minor。

范围

只动 ui/app.zod.ts + shared/alias-integrity.test.ts + 新测试 + changeset。消费半径已扫:全仓无 fixture 拼写这四个别名(platform-objects/src/apps/account.app.ts 只有一条记述历史的注释),生成物与文档均未固化该散文串。


🤖 Generated with Claude Code

https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D


Generated by Claude Code

`expanded` 只声明在 `group` 变体上,四条别名却写在被盖进九个变体的
`NAV_ITEM_ALIASES` 共享表里。于是另外八个变体把作者指向一个它们同样拒绝的
键 —— 照做之后再次被拒,且第二次没有任何建议(ledger finding 7 的二次拒绝,
由 #4001 战役自己的修复产生)。

把四条挪进按变体拼装段:`group` 保留裸键名,另外八个用散文 target
`type: 'group' (with expanded)`,与既有六条跨变体别名同形。

闸门联动(alias-integrity.test.ts):
- 删除 `isPinnedExpandedDefect` ≤32 容差整段 —— 债已还清,判据 2 现在零容差;
- `PROSE_ALIAS_TARGETS` 扩入第七条(白名单带陈旧检查,漏改会红)。

只改面向作者的报错文案,schema 形状不变。

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

vercel Bot commented Aug 5, 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 5, 2026 11:20pm

Request Review

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

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

109 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/tenancy-modes.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/apps.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.

@os-zhuang
os-zhuang marked this pull request as ready for review August 5, 2026 23:22
@os-zhuang
os-zhuang enabled auto-merge August 5, 2026 23:23
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 5, 2026
Merged via the queue into main with commit 414395b Aug 5, 2026
25 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5555-nav-expanded-aliases branch August 5, 2026 23:43
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.

ui/app.zod.ts 导航项:4 条 expanded 别名在另外 8 个变体上把作者指向该变体同样拒绝的键(二次拒绝)

2 participants