[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/maind16df74: this is the onlyapp.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/mained44512. 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

constPLATFORM_AGENT_NAMES=newSet(['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 重申),这一点不是本席能代裁的。

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    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/maind16df74: this is the onlyapp.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/mained44512. 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

    constPLATFORM_AGENT_NAMES=newSet(['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 重申),这一点不是本席能代裁的。

    Activity

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

    Metadata

    Metadata

    Assignees

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      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/maind16df74: this is the onlyapp.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/mained44512. 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

      constPLATFORM_AGENT_NAMES=newSet(['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 重申),这一点不是本席能代裁的。

      Activity

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

      Metadata

      Metadata

      Assignees

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        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/maind16df74: this is the onlyapp.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/mained44512. 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

        constPLATFORM_AGENT_NAMES=newSet(['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 重申),这一点不是本席能代裁的。

        Activity

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

        Metadata

        Metadata

        Assignees

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          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/maind16df74: this is the onlyapp.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/mained44512. 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

          constPLATFORM_AGENT_NAMES=newSet(['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 重申),这一点不是本席能代裁的。

          Activity

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

          Metadata

          Metadata

          Assignees

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            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/maind16df74: this is the onlyapp.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/mained44512. 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

            constPLATFORM_AGENT_NAMES=newSet(['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 重申),这一点不是本席能代裁的。

            Activity

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

            Metadata

            Metadata

            Assignees

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              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/maind16df74: this is the onlyapp.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/mained44512. 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

              constPLATFORM_AGENT_NAMES=newSet(['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 重申),这一点不是本席能代裁的。

              Activity

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

              Metadata

              Metadata

              Assignees

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                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/maind16df74: this is the onlyapp.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/mained44512. 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

                constPLATFORM_AGENT_NAMES=newSet(['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 重申),这一点不是本席能代裁的。

                Activity

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

                Metadata

                Metadata

                Assignees

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions