Skip to content

fix(cli): lint 的 action 去重改用复合注册键,不再按裸 name 误判 (#5510) - #5531

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-5510-lint-action-dedup-key
Aug 5, 2026
Merged

fix(cli): lint 的 action 去重改用复合注册键,不再按裸 name 误判 (#5510)#5531
baozhoutao merged 1 commit into
mainfrom
claude/issue-5510-lint-action-dedup-key

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #5510

问题

naming/namespace-prefix 规则对 PREFIXED_TYPES 里每一类都只按 items[i].name 去重。对 action 而言这不是它实际占用的键:引擎按 objectName:name 注册(ObjectQLPlugin.actionObjectKey,对象缺省时回落到 #3913 确立的规范无对象键 global),所以一个包里「每个对象各带一个 log_call」占的是互不相同的 N 个键,彼此不遮蔽。

裸名去重把这个合法形状判成了包内重复,噪音随对象数线性增长 —— HotCRM(5 对象 x 3 个活动 action)每次 objectstack lint 固定 12 条误报;而它给出的「rename one」处方,照做反而会破坏该形状赖以成立的 #592 共享 i18n 键设计。

改动

PREFIXED_TYPES 增加可选的 registryKey,把去重问题从「裸名是否相同」改成「是否落到同一个注册键上」。只有 actions 声明了它,其余六类保持裸名去重,消息文案逐字不变(已用整句断言钉住)。

两个刻意的取舍:

  • 只读 objectName,不做 ?? item.object 兼容链。 ActionSchema 的严格形状会直接拒绝 object / entity 并给出改名到 objectName 的处方,这两种拼写根本到不了一个 spec-valid 的配置;在消费端加兼容链只会把契约已经拒绝的拼写固化下来(Prime Directive Add comprehensive test suite for Zod schema validation #12)。这一点由 schema 自身的判决钉住(断言该键报 unrecognized_keys),而不是靠注释声明。
  • 无对象时回落到真实字面量 global,而不是 '' 之类的惰性哨兵。 issue 落点分析建议 ${objectName ?? ''};这里用了引擎真正注册的那个字面量,因为 global 是合法的对象名拼写 —— 一个声明在名字就叫 global 的对象上的 action,与一个无对象 action 同名时,在引擎的精确字符串 map 里是真冲突,必须报出来。'' 会漏掉这一对。PM 口径里「两个 objectless 同名仍告警」的不变量两种写法都满足,global 额外多守住了这一格。

真遮蔽依旧照报:同 objectName 同名、两个 objectless 同名、以及上面那个 global 组合。action 的处方也做了校准 —— 先建议「用不同的 objectName 区分」,再退到改名(改名建议与 fix 字段保留)。

反向验证(方向先判后跑,两次都与预判逐条吻合)

  • A:把 actions 的键还原成裸 name —— 预判恰好 2 红:HotCRM 形状(0 到 12)、以及同 objectName 那例(1 到 2,因为该 fixture 中间刻意插了一行不冲突的 crm_contact)。实跑 2 failed | 12 passed,红的正是这两条。注意 global 那例在 A 下保持绿,是因为两者裸名本就相同 —— 它绿得没有信息量,所以单靠 A 钉不住哨兵的选择。
  • B:把哨兵换成 '' —— 预判恰好 1 红,即 global 那例(1 到 0)。实跑 1 failed | 13 passed,红的正是它。

这也是为什么两次反向验证都做:A 证明复合键在起作用,B 证明哨兵取值在起作用,任何一次单独都留有一条绿得没有理由的用例。

测试

packages/cli 全量:81 passed / 801 passed;pnpm --filter @objectstack/cli typecheck 通过。新增用例覆盖 HotCRM 全尺寸形状、三类真冲突、action 文案、其余类型不受影响,以及走真实 normalizeStackInputlintConfig 这条命令实际路径(钉住归一化既不搬走顶层 actions 数组,也不丢 objectName)。

changeset:@objectstack/cli patch。


🤖 Generated with Claude Code

https://claude.ai/code/session_016FNvXhtSdnEGEfLEsMmvxh


Generated by Claude Code

…e name (#5510)

`naming/namespace-prefix` deduplicated every `PREFIXED_TYPES` entry on
`items[i].name` alone. For actions that is not the key they occupy: the
engine registers under `objectName:name` (`ObjectQLPlugin.actionObjectKey`,
falling back to the canonical object-less key `global`, #3913), so one
package declaring one `log_call` per object holds one distinct key per
object and nothing shadows anything.

The bare-name dedup flagged that shape as an intra-package duplicate, with
noise growing linearly in the object count — 12 fixed warnings per
`objectstack lint` run on HotCRM (5 objects x 3 activity actions) — and its
"rename one" prescription would have broken the shared i18n keys the #592
shape depends on.

Actions now dedup on `objectName:name`; the other six types keep bare-name
dedup and their message text byte-for-byte. Only `objectName` is read:
`ActionSchema` rejects `object`/`entity` outright with a rename
prescription, so a `??` chain here would only fossilize a spelling the
contract already refuses (Prime Directive #12).

Genuine shadowing still warns — same `objectName`, two object-less actions,
and an action on an object literally named `global` meeting an object-less
one (which is why the fallback is the real `global` literal rather than an
inert sentinel). The action remedy now offers separating by `objectName`
before renaming.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016FNvXhtSdnEGEfLEsMmvxh
@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 3:46pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests size/m tooling 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/cli.

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

  • content/docs/ai/skills-reference.mdx (via packages/cli)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli)
  • content/docs/automation/hook-bodies.mdx (via packages/cli)
  • content/docs/deployment/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/cli.mdx (via @objectstack/cli)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • content/docs/deployment/validating-metadata.mdx (via packages/cli)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/cli)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli)
  • content/docs/plugins/index.mdx (via @objectstack/cli)
  • content/docs/plugins/packages.mdx (via @objectstack/cli)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/cli)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/releases/implementation-status.mdx (via @objectstack/cli)
  • content/docs/releases/v16.mdx (via @objectstack/cli)
  • content/docs/releases/v17.mdx (via @objectstack/cli)

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.

@baozhoutao
baozhoutao marked this pull request as ready for review August 5, 2026 15:47
@baozhoutao
baozhoutao enabled auto-merge August 5, 2026 15:47
@baozhoutao
baozhoutao added this pull request to the merge queue Aug 5, 2026
Merged via the queue into main with commit 8c5a87c Aug 5, 2026
24 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-5510-lint-action-dedup-key branch August 5, 2026 16:12
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

2 participants