Skip to content

[finding] skills/objectstack-ai tells authors metadata_assistant is "not vocabulary" while the platform's own Studio app pins defaultAgent: 'metadata_assistant' #14461

Description

@os-litant

Out-of-scope by-product of the skills optimization flight on #14305 (audit finding "incidental falsehood 3"). Filed unassigned for triage — no doc edit was made for it, because the contradiction is between the skill's advice and shipped platform code, and which side moves is a ruling, not a rewrite.

The two sides

The published skill (unchanged by the flight, both before and after):

data_chat to ask and metadata_assistant to build resolve through the alias table for old bookmarks and persisted agent_ids; they are not vocabulary — always write ask / build.

The platform's own shipped apppackages/platform-objects/src/apps/studio.app.ts:50:

  // Studio is the metadata-authoring host, so its ambient copilot is
  // pinned to the schema-architect agent. Resolved by the ambient chat
  // endpoint via `app.defaultAgent` — no UI-side `?agent=` override
  // needed. Every other app falls back to the data-query agent.
  defaultAgent: 'metadata_assistant',

Measured at origin/main d16df74: this is the only app.defaultAgent usage in the repo (the audit's real-usage census found 1). So the single live example of the key an author would copy spells the alias the catalog tells them never to write.

Why it needs grading rather than a patch

Three readings, and they lead to different edits:

  1. The code is residue. Studio should be re-pinned to 'build', and the alias table keeps working for persisted agent_ids only. Cheapest, and makes the one live example match the advice.
  2. The alias is load-bearing here. If the cloud AI-Studio plugin registers under the legacy id and the alias resolves at read time, re-pinning is a behaviour change in a repo that cannot see the consumer (service-ai-studio lives in the closed cloud repo). Then the doc advice is right for third parties and the platform pin is a deliberate internal exception that should say so in a comment.
  3. Neither. The retired-spelling ledger should simply carry this as a known residue with an owner.

Reading 2 is not disprovable from this repo — which is exactly why this is a finding and not a fix.

Suggested triage inputs

Dedupe: one targeted search_issues over this repo (repo-scoped REST is 403 for the filing seat), validated in-session by a control query that returned its known hit. Nothing open covers this.


Triage addendum — there is a THIRD side, and it is maintainer-ruled

Measured at origin/main ed44512. Two corrections to the card above, both material to whichever way this is decided.

(a) #6041's lint landed, and it passes this value by design. The card's closing line — "If reading 1 wins, #6041's lint is what would have caught it" — does not hold. The rule shipped as packages/lint/src/validate-ai-agent-authoring.ts, and its docblock at :30-45 records the outcome verbatim: "the maintainer ruling on #6041 (2026-08-07, reaffirmed 2026-08-09) is option A: add the value check at warning tier, reusing PLATFORM_AGENT_NAMES rather than narrowing the schema to an enum". And :91 is

const PLATFORM_AGENT_NAMES = new Set(['ask', 'build', 'data_chat', 'metadata_assistant']);

with :139-140 short-circuiting on membership. So defaultAgent: 'metadata_assistant' is not merely unlinted — it is deliberately accepted, under a ruling, with a docblock at :83-90 explaining that all four names are legitimate references to a platform record "directly or through its alias".

⇒ The platform has treated the alias as a legal authored value twice: once in the Studio pin, once in a maintainer-ruled gate roster. The published skill is the lone dissenter. Reading 1 is therefore not a one-line change plus a pin test; it is a two-site change that reopens #6041's ruling.

(b) Reading 2's unfalsifiability is now documented in-repo, not just suspected. validate-ai-agent-authoring.ts:85 states the aliases are "registered via the cloud alias registry — ADR-0063 §2". So alias resolution is confirmed to be a cloud-side mechanism this repo cannot inspect. That does not prove service-ai-studio registers under the legacy id, but it does establish that the question the card flagged as undecidable really is undecidable from here.

Why this is needs-user-decision and not dispatchable

Every limb is above the seat. Editing published skill text is a change to the authoring contract every agent and third party reads; skills changes are ADR-class and run through the dedicated skills seat with the maintainer. Narrowing the lint roster reopens a standing maintainer ruling. And reading 2 turns on a closed repo. The seat can measure the sides — it cannot pick one.

<!-- os-decision-facets -->

推荐:A —— 手册那句话原地不动;studio.app.ts:50 改回 'build';lint 的 defaultAgent 取值那一限用 ask / build(声明-遮蔽那一限继续认全部四个名字,它判的是另一回事)。四棱同向,②有拉动⇒按分歧推荐序荐①的长远终态。
回退:B —— 若 cloud 侧确实按旧 id 注册(读数 2),则手册对第三方是对的,平台这一钉是有意的内部例外,就在 studio.app.ts 写清楚为什么,并把这条残留登进退役拼法台账。
置信缺口(本分析看不见什么): 看不见 cloud 仓。validate-ai-agent-authoring.ts:85 只说别名注册在 cloud 的别名注册表里,没有service-ai-studio 用哪个 id 注册 —— 这一条正是能把 A 翻成 B 的唯一变量,本仓无法证伪。另外 A 会重开 #6041 的既有裁决(2026-08-07 裁、08-09 重申),这一点不是本席能代裁的。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions