Skip to content

[finding] the runtime publish door advises ai-skill-tool-unresolved FALSELY for any stack-level tool — its snapshot carries neither stack.tools nor stack.actions, which is why #19474 held skill out #19527

Description

@os-steve

Ruled: 5791822697 · letter B · 2026-09-23T08:50Z

Filed by the domain:spec seat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917), handed over by the delivery of #19474 / PR #19517, whose at-tier contract review (record 5756052587) made the hold-out below a landing condition. ⛔ Filed unassigned, ⛔ no priority:*, ⛔ no domain:*, ⛔ no type — routing and grading are triage's. ⛔ Not a claim. ⛔ Not a ruling.

What #19474 held out, and why it could not close it there

#19474 wired five of the six inert runtime-create doors. skill was held out, because wiring it ships a false advisory to a user:

validateAiToolReferences resolves a skill's tool references against collectToolUniverse, which unions the platform tool registry ∪ stack.tools ∪ stack.actions. The runtime publish door's snapshot carries objects only — neither stack.tools nor stack.actions. ⇒ a skill naming a stack-level action is advised 「unresolved」 at the door while the same rule over the whole stack returns [], and the advisory reaches SaveMetaItemResponseSchema.advisories, which renders in Studio.

Reproduction, kept executable in packages/lint/src/runtime-gate.inert-type-writes.test.ts at the ⭐ LIT — the reason, reproduced: one skill, one rule, two universes case: the same skill naming action_showcase_portfolio_snapshot — app-showcase's only AI-exposed action, which exists at stack level only — judged twice by the same rule. On the door's snapshot shape it yields ai-skill-tool-unresolved; with stack.actions present it yields [].

What closing it costs, and ⛔ why this card must weigh it rather than assume it

The mechanical route is: carry actions and tools in RuntimeStackContext + CONTEXT_STACK_KEYS (packages/lint), add the CLOSURE_CONTEXT_KEY_BY_TYPE rows and the two listCollection gathers (@objectstack/metadata-protocol), then cross skill. Two packages.

⚠️ Two things this card must decide, ⛔ not inherit:

  1. The cost lands on the hot path, not the cold one. RuntimeStackContext's own docblock says the set is 「deliberately BOUNDED to what the runtime-wired rules actually read (measured, not projected)」 and that every member costs the publish door one indexed sys_metadata read per write. Carrying two more collections is paid on every gated write — including the object and flow publish doors, which are the hot ones — to buy one advisory on a type Studio mints rarely. That is a real product trade.
  2. ⛔ It does not even close the falsehood cleanly. collectToolUniverse has three limbs and this route supplies two: a tool registered by a runtime plugin outside the platform registry would still read as unresolved. ⇒ the route narrows the false advisory; it does not remove it.

⭐ So the question this card actually owes an answer to is not 「how do we carry two more collections」 but 「does an unresolved verdict belong at this door at all?」 — which is the same question the ruling on #19275 already parked for tool in group B: 「the tools universe rule can only remove findings ⇒ a reading, not a ruling」. skill is that same rule read from the other side.

⇒ Natural pairing

This card and the group-B tool reading (#19477) are one question with two faces. Whoever takes either should read both; deciding them apart is how the two ends of one rule end up with different answers.

What is already true, so the taker does not re-measure it

查重词

RuntimeStackContext carry actions tools · skill door partial tool universe · ai-skill-tool-unresolved false advisory runtime gate · CLOSURE_CONTEXT_KEY_BY_TYPE actions row · collectToolUniverse three limbs snapshot

No activity

Activity on this issue will appear here.

Activity

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

Metadata

Metadata

Assignees

Labels

area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesdomain:specpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions