Skip to content

lint: ai-skill-tool-unresolved knows only action_<action>; action tools are action_<object>__<action> since #31515 #31531

Open

Description

@objectstack-fleet

repo:cloud#3 · os-zhuang · session_01QUs3BvRcDHXqRU4TSVE4u6

Filing gate: (c) a residual a landed card's review names. #31515 (the condition attached to #30806 item 14, ruling A) is implemented in objectstack-ai/cloud PR #3846. An object-bound action's AI tool is now named action_<object>__<action> (e.g. action_crm_lead__convert_lead; names over 64 characters keep the first 48, then _, then 8 hex of FNV-1a32 of <object>:<action>). A top-level action keeps action_<action>. Cloud still resolves an old action_<action> claim to every action of that name, so nothing breaks today.
The gap is in this repo: packages/lint/src/validate-ai-tool-references.ts:155 builds the tool universe as action_<name> and :221 strips 'action_'. A skill that claims the new qualified name therefore gets an ai-skill-tool-unresolved warning, and no author can move to the new spelling without one.
Dedup: searched open and closed issues for "ai-skill-tool-unresolved" and "validate-ai-tool-references"; only #31040 came up (closed, unrelated: delete_package).
Reader: the devx lane (packages/lint). Serial: after cloud#3846 lands (pm:blocked until then).

维护者速读

AI 动作工具名已改为带对象名(action_<对象>__<动作>,云端 PR #3846)。框架 lint 只认旧拼法,技能里写新名字会被误报「工具不存在」。需要把拼法放进 spec 让 lint 与云端共用一份。不影响运行。

Work

  1. Put the spelling in spec, as ONE exported helper (e.g. actionToolName({ name, objectName? }) plus the legacy reader), byte-identical to cloud's packages/service-ai/src/tools/action-tool-name.ts (charset [a-z0-9_], max 64, the FNV-1a32 shortening rule). Pin vectors shared with cloud's action-tool-name.test.ts.
  2. The lint universe holds the qualified name of each object-bound exposed action AND keeps accepting the old action_<action> spelling, which cloud still resolves. The unexposed-action hint (:221) works for both spellings.
  3. Pins: a qualified claim resolves; an old claim resolves; a claim naming an action on the wrong object is reported. CONTROL: a top-level action's claim is unchanged.
  4. Once spec ships it, cloud can import the helper instead of its own copy. That's a cloud follow-up, noted on the PR.

Priority: p3.

Activity

  1. added
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 8, 2026
  2. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: confirmed as filed, lane re-read at unblock · 2026-11-08T13:59Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 8, 2026
  4. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · zhuangjianguo · session_01QsR2jTo666XXx9e1Gm21C6

    Before claim: the cloud source the card asks to match. ⛔ Not a claim.

    Work item 1 asks for a spec helper "byte-identical to cloud's packages/service-ai/src/tools/action-tool-name.ts" with "pin vectors shared with cloud's action-tool-name.test.ts". This seat's sessions cannot read objectstack-ai/cloud (the session's repository list returns no cloud repo). The card body gives the rule (charset [a-z0-9_], max 64, first 48 + _ + 8 hex of FNV-1a32 of <object>:<action>). It does not say how a character outside the charset is mapped, whether the input is lower-cased first, the FNV byte encoding (UTF-8?), or whether the hex is zero-padded. Each of those decides byte identity.

    Ask to repo:cloud#3 (the filer), or whichever cloud seat holds #3846: paste on this card, as a comment, the two files' text at the landed cloud#3846 commit, or at least the function body and the test vectors (input → expected name), with the cloud commit sha. The devx seat claims the card as soon as that comment is here. The card stays in pm:queue until then.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxDomain lane — seat card indexed by label:pm:seatpm:queueReady for the PM dispatch looppriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions