Skip to content

fix(spec,runtime): the ai slot's remedy stops claiming nothing ships (#4093 follow-up) - #4301

Merged
os-zhuang merged 2 commits into
mainfrom
claude/dispatcher-handler-ready-1odd28
Jul 31, 2026
Merged

fix(spec,runtime): the ai slot's remedy stops claiming nothing ships (#4093 follow-up)#4301
os-zhuang merged 2 commits into
mainfrom
claude/dispatcher-handler-ready-1odd28

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

#4204 引入的一处错误 —— 由我自己引入,而且是这张表当初就是为了消灭的那一类,只是往外多走了一步。

现象

CORE_SERVICE_PROVIDERai 记了 null(因为这个 workspace 里没有包提供它),于是 discovery 报:

services.ai.message = "No implementation ships for the 'ai' slot — register a service under it to enable"

这是假的 —— @objectstack/service-ai 确实注册了这个槽位。我把 "不在这个仓库里" 等同于 "不存在"

这个错误是怎么进来的,值得点名

我当时说"ai 的提供者是 workspace 之外的 Cloud/EE 包" —— 这句是对的,但我是从一行文档和一段旧注释里读来的,没有验证。那正是 plugin-searchplugin-workflow 当初错掉的同一种来源。

现在按表里其他条目的同一标准、对着 cloud 仓库验证过了:

  • packages/service-ai/src/plugin.ts:759ctx.registerService('ai', this.service)
  • 包是 "private": true —— 不发布

所以是东西确实有,但没有任何东西可装 —— 这正是 null 依然正确、而句子又绝不能以 "Install" 开头的原因。

search / workflow / graphql 也用同样方式复查:两个仓库里都没有任何东西注册它们,所以那三个 null 和"nothing ships"是准确的 —— 现在是双边证据,不是单边。

改法(净删代码)

ai 加一条 REMEDY_DETAIL —— 就是 #4222 里已经为 ui 建好的那个机制:

Provided by @objectstack/service-ai in ObjectStack Cloud/Enterprise — no implementation ships in the open framework

连锁效果是删代码:/ai 域那个本地文案覆盖,存在的唯一理由就是"共享句在这里是错的"。把表教对之后,域和 discovery 一起修好了 —— 而覆盖永远够不到 discovery。于是覆盖、以及 capabilityUnavailablemessage? 参数一并删除,并在 helper 上写明为什么不留这个逃逸口:句子错了要改表,不是开局部例外

守卫

check:service-providers 保留 workspace-only 规则(它看不见另一个仓库,放宽它不是解法),但:

  • 不再在自己的输出里重复这个混淆(原来写 "N correctly report that nothing ships yet")
  • 失败文案现在会告诉下一个人在这种情况下该怎么做 —— 用 null + 一条 REMEDY_DETAIL。已通过"把表指向那个私有包"实测确认

顺带修好三处 #4222 该改而漏掉的

/ai 空服务应答在 #4222 已改成 501,但这三处还写着 404:docs/api/client-sdk.mdxdocs/releases/v17.mdx、以及 packages/client 那条 URL 一致性测试的注释。当时 drift check 提示过 client-sdk.mdx,我只扫了直接记录状态码的文件。

验证

全仓 pnpm test 132/132;runtime 954;spec provider 套件 8;build 71/71;pnpm lint、全部 check:*、spec api-surface 干净。

🤖 Generated with Claude Code

https://claude.ai/code/session_018UNGqBQcdJ2RYHtWgntJ9B


Generated by Claude Code

#4093 follow-up)

CORE_SERVICE_PROVIDER recorded `null` for `ai` because no WORKSPACE package
provides it, so `serviceUnavailableMessage('ai')` produced "No implementation
ships for the 'ai' slot". That is false — `@objectstack/service-ai` registers
the slot — and it is the same class of wrong answer this table was introduced
to end, one step further out: I conflated "not in this repository" with "does
not exist".

Worth naming how it got in. The claim that ai's provider is a Cloud/EE package
was true, but I asserted it from a doc line and an old code comment without
checking — exactly the provenance that made `plugin-search` and
`plugin-workflow` wrong. Verified properly now, against the cloud repository:
`packages/service-ai/src/plugin.ts` calls `ctx.registerService('ai', …)`, and
the package is `private: true`. So something ships AND there is nothing to
install — which is why `null` stays correct and why the sentence still must not
start with "Install".

`ai` gets a REMEDY_DETAIL entry, the mechanism `ui` already used for a slot the
simple sentence describes badly. Discovery (`services.ai.message`) and the /ai
501 body both report it.

`search`, `workflow` and `graphql` were re-checked the same way — nothing in
either repository registers them — so their `null` and their "nothing ships"
sentence are accurate, now on evidence from both sides rather than one.

This REMOVES code. `/ai`'s domain carried a local message override precisely
because the shared sentence was wrong there; correcting the table fixed the
domain AND discovery, which an override could never reach. The override and
`capabilityUnavailable`'s `message?` parameter are both gone, and the helper
now documents why there is no per-call escape hatch: a slot whose sentence is
wrong needs the table corrected.

check-service-providers keeps its workspace-only rule — it cannot see another
repository, and widening it is not the fix — but it no longer REPEATS the
conflation in its own output ("N correctly report that nothing ships yet"), and
its failure text now tells the next person what to do in exactly this case:
use `null` plus a REMEDY_DETAIL sentence when something ships that simply
cannot be installed. Verified by pointing the table at the private package and
reading the error.

Also corrected: three places still describing /ai's absent-service answer as a
404 — docs/api/client-sdk.mdx, docs/releases/v17.mdx, and a comment in
packages/client's URL-conformance test. Stale since #4222 made it 501; the
drift check had flagged client-sdk.mdx then and I only swept the files that
document status codes directly.

Verified: full `pnpm test` 132/132 tasks; runtime 954; spec's provider suite 8;
build 71/71; pnpm lint, every check:* gate and spec's api-surface clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018UNGqBQcdJ2RYHtWgntJ9B
@vercel

vercel Bot commented Jul 31, 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 Jul 31, 2026 4:48am

Request Review

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation protocol:system tests tooling labels Jul 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/runtime, @objectstack/spec.

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

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/runtime, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/runtime, packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/runtime)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/runtime)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

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.

…ted sentence

The drift check flagged it and a targeted grep found it: http-protocol.mdx's
discovery sample printed the `ai` slot's message as "No implementation ships
for the 'ai' slot" — the line I wrote in #4204, made stale by this PR
correcting the very claim it quotes.

The `workflow` entry beside it is left alone: nothing registers that slot in
either repository, so its sentence is still true.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018UNGqBQcdJ2RYHtWgntJ9B
@os-zhuang
os-zhuang marked this pull request as ready for review July 31, 2026 05:02
@os-zhuang
os-zhuang merged commit 05154a1 into main Jul 31, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/dispatcher-handler-ready-1odd28 branch July 31, 2026 05:02
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 protocol:system size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants