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

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.

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 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