Skip to content

docs(spec,skills): 文档与 skill 追平端点执行器(#5040 E9) - #5246

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-5238-docs-skill-catchup
Aug 4, 2026
Merged

docs(spec,skills): 文档与 skill 追平端点执行器(#5040 E9)#5246
os-zhuang merged 1 commit into
mainfrom
claude/issue-5238-docs-skill-catchup

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Fixes #5238
Part of #5040(E9 —— 文档收尾件;例子已由 E8 / #5230 补齐)

本文中的路径占位符一律写作 {namespace} / {subpath} / {ttl}。仓库里的真身用尖括号,但 GitHub 的 issue/PR body 消毒器会把「左尖括号 + 字母」当 HTML 标签在存储时抹掉,首版 body 正是这样被吃掉了三处。以文件里的文本为准。

这一单摘掉的是什么

执行器已落(E1–E8),apis: 的整面硬拒已收窄为五道逐端点 publish 门。但三层散文仍在讲反话 —— 而对升级者(往往只有这段文字的 AI 维护者)那不是「过期」,是一条把人指离一个已经能用的能力的指令。

1. spec 内两处处方文本(本单唯一随包发布的一半)

App.apis 的 retiredKey 墓碑。原文:

Delete the key. Note the stack-level defineStack({ apis }) this prescription used to redirect to is ALSO not executable in v17 (#4936) … until the endpoint executor ships … Serve the route in code meanwhile。

一条重定向式墓碑必须对它指向的地方说真话。这条在同一句里把目的地称作死的,于是照着做的下一步就是继续用 handler 代码写路由 —— 恰好绕开了 E 系列刚建好的东西。

新文本只改失真的那一半:该面自 protocol 17 起真实服务、点名五道门、带上抬到 stack 级时必须做对的两件事(/api/v1/apps/{namespace}/{subpath} carve-out 与显式 manifest.namespace;authRequired 缺省 true,显式 false 是唯一打开匿名的开关,ADR-0121 D6 随即要求已装配 rateLimit),并指向 declarative-apis-endpoints-live 升级条目。

保留未动的两处:移除那一半(App.apis 从未被读过,仍然是删)、以及 #4936 这段历史 —— 历史正是这条重定向存在的理由,修的是时态与指针,不是抹历史。

defineStack({ server }) 模块头。原写 #5040「wires endpoint-level rateLimit —— still unwired today」。已接线。顺带补上服务端预算的作者真正需要的那层关系:端点桶键在独立命名空间,两份预算各计各的,不共享计数器。

两者经 gen:docs 传播到 content/docs/references/{ui/app,system/stack-server}.mdx

2. 手写文档

protocol/kernel/http-protocol.mdx —— 原来那句「since #4936 that surface has no executor」的 callout 换成一节真正的 Declarative Endpoints:

  • 服务链:匹配({prefix}/apps/ 下,METHOD+path,去一个尾斜杠)→ 策略链(rateLimitauthRequiredcacheTtl,并写明为什么计量在鉴权之前)→ 委派到内建路由同款流水线(callData / automation),带调用者自己的 execution context,所以 RLS/FLS 与 ADR-0049 曝光门等价适用;
  • 策略答案表:401 UNAUTHENTICATED / 429 + Retry-After / 成功答案才有的 Cache-Control: private, max-age={ttl}(并写明 private 是安全规则而非调优)/ cacheTtl: 0no-store / 错误答案永不带缓存指令也永不过 outputMapping;
  • 恒等语义,最容易被误读的一条:未匹配路径 与已声明路径上的方法不匹配都保持传输层裸 404 逐字节不变 —— 因为这条缝是 Hono notFound 而不是注册路由,没有方法集可以报 405(已注册路由的 405 契约不变);
  • 五道门一览 + 一段最小可跑的 apis: 声明(照 showcase 回迁件裁短)。

getting-started/quick-reference.mdx —— 按本页体例补一条速查:路径形状、显式 namespace、能执行的两种 typeauthRequired 缺省与 D6 配对、cacheTtl 语义 + 一段最小示例。

3. objectstack-api skill

原文把声明式面写成一句四臂 type 联合(flow / script / object_operation / proxy)加 target —— 其中两臂在 17.x 根本不执行。改为按现状教学:

  • 何时 apis: 胜过 contributes.routes,以及何时不(真需要 handler 代码时);
  • carve-out(以及「不从 manifest.id 推导」的理由);
  • 五道门当作「跑 objectstack validate 读报错处方」而不是背诵的条文 —— 报错自带处方,不在 skill 里复述第二套;
  • D6 的 enabled === true 判据(而非键存在)明写;
  • 映射键最小语义:按点路径搬运/改名,仅此;transform 被拒、bodyless 操作上的 inputMapping 被拒、目标路径不得互相包含;
  • 升级段指向 declarative-apis-endpoints-live,单一真源。

evals/ 目前是占位(README 明写 "Not yet implemented"),没有断言旧行为的 eval 可跑;其目录规划里那条 test-api-endpoint-types.md(原注 ApiEndpointSchema type/target/authRequired)已按翻转改写,并补了 carve-out / authRequired 缺省 / D6 三条规划项。

实测,不是相信

三条文档断言都拿已构建的 spec 跑过 defineStack:

PASS: gates accepted the doc example; apis = [{"name":"acme_lead_feed",...,"cacheTtl":30}]
PASS: omission shape accepted; authRequired resolved to true
PASS: D6 refusal:
  defineStack validation failed (1 issue):
  x apis.0.rateLimit: Endpoint 'acme_open' (apis[0]) declares `authRequired: false`
    without an ARMED rate limit. ...

墓碑新文本以两侧断言钉住(packages/spec/src/ui/app.test.ts):必须说新话(EXECUTES from protocol 17、carve-out、D6、升级条目 id)不得再说已退休的那两句,同时 #4936 仍须在场 —— 只钉在场会被「底下又加回旧话」骗过,只钉缺席会被空串骗过。

验证(真实输出)

pnpm --filter @objectstack/spec build                   ✓
pnpm --filter @objectstack/spec check:generated         ✗ 1 of 9 stale: content/docs/references/**
pnpm --filter @objectstack/spec check:generated --fix   ✓ gen:docs  (只重生了被证明陈旧的那一个)
pnpm --filter @objectstack/spec check:generated         ✓ 9/9(复跑)
pnpm --filter @objectstack/spec check:skill-examples    ✅ 204 prose examples type-check
pnpm --filter @objectstack/spec test                    Test Files 306 passed / Tests 7858 passed
pnpm --filter @objectstack/spec typecheck               tsc --noEmit clean
eslint(三个改动的 TS 文件)                              clean
pnpm check:doc-authoring                                ✓ 362 files clean
pnpm check:docs-audit-scope                             ✓ in sync
pnpm check:nul-bytes                                    ✓ 5293 tracked text files, no raw NUL
pnpm docs:build                                         ✓(新 MDX 全部渲染,404+ 页)

生成物移动只有两页 reference,且逐字对应本单改的两段处方文本;numstat 无 - - 行。

check:skill-examples 第一轮红过一次并已修:文档示例的 manifesttype,补 type: 'app' —— 一个正好证明这道门有用的失败。

顺手发现的、已单独立项的

边界

词表与运行时零触碰;未编辑 content/docs/releases/;与 #5231(源码注释)不重叠 —— 那批 structurally unreachable 措辞散在 packages/runtime|metadata|rest 内,本单一处未动。changeset 按纯处方文本的历史惯例记 @objectstack/spec: patch

现场已清:未起任何 dev server;worktree 在 PR 后移除。


🤖 Generated with Claude Code

https://claude.ai/code/session_01EYGdmvWP1ieZSLqvAW6uyd

执行器已落(#5040 E1–E8),整面硬拒已收窄为五道逐端点 publish 门,但三层散文
仍在讲反话。对升级者(往往只有这段文字的 AI 维护者)那不是「过期」,是把人
指离一个已经能用的能力的**指令**。

spec 内两处处方文本(本单唯一会随包发布的一半):

- `App.apis` 墓碑原写「stack 级 defineStack({ apis }) 在 v17 也不可执行
  (#4936)……等执行器」。一条重定向式墓碑必须对它指向的地方说真话,而这条
  在同一句里把目的地称作死的 —— 顺理成章的下一步就是继续用 handler 代码写
  路由。现改为:该面自 protocol 17 起真实服务,点名五道门,并带上抬到 stack
  级时必须做对的两件事(carve-out 与显式 `manifest.namespace`,以及
  `authRequired` 缺省 true / D6 的已装配 rateLimit 配对义务)。移除那一半
  原样保留 —— `App.apis` 从未被读过,仍然是删;#4936 也仍在,历史正是这条
  重定向存在的理由。
- `defineStack({ server })` 模块头原写 #5040「wires endpoint-level rateLimit
  —— still unwired today」。已接线。同时补上服务端预算作者真正需要的关系:
  端点桶键在独立命名空间,两份预算各计各的,不共享计数器。

两者经 gen:docs 传播到 content/docs/references/ 的两页,生成物只动这两页。

手写文档:http-protocol.mdx 把「该面无执行器」的 callout 换成真正的
Declarative Endpoints 一节(匹配 → 策略链 → 委派到内建路由同款流水线;五道
门;401 / 429+Retry-After / 成功答案才有的 Cache-Control: private;以及最易
搞错的恒等语义 —— 未匹配路径与**已声明路径上的方法不匹配**都保持传输层裸
404 逐字节不变,因为这条缝是 Hono notFound 而不是注册路由,没有方法集可以
报 405)。quick-reference.mdx 补速查条目。

objectstack-api skill 不再把 ApiEndpointSchema 描述成四臂 type 联合,改为按
现状教学:何时 `apis:` 胜过 `contributes.routes`(以及何时不 —— 真需要
handler 代码时)、carve-out、把五道门当作「跑 objectstack validate」而不是
背诵的条文、D6 的 `enabled === true` 判据、映射键的最小语义。指向
`declarative-apis-endpoints-live` 升级条目而不复述第二套规则。

以上每条都对着已构建的 spec 实测而非相信:文档示例能发布、省略
`authRequired` 的形状解析为 true、`authRequired: false` 旁只写窗口配额的
rateLimit 被带处方拒绝。墓碑新文本以两侧断言钉住(必须说新话 **且** 不得再
说已退休的那句,`#4936` 仍在),空串无法蒙混过关。

Fixes #5238
Part of #5040

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

vercel Bot commented Aug 4, 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 Aug 4, 2026 12:08pm

Request Review

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

107 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 @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/spec)
  • 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 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 @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @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/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • 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/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/authorization.mdx (via @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/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/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.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/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.

@os-zhuang
os-zhuang marked this pull request as ready for review August 4, 2026 12:08
@os-zhuang
os-zhuang enabled auto-merge August 4, 2026 12:08
@os-zhuang
os-zhuang marked this pull request as draft August 4, 2026 12:09
auto-merge was automatically disabled August 4, 2026 12:09

Pull request was converted to draft

@os-zhuang
os-zhuang marked this pull request as ready for review August 4, 2026 12:20
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 4, 2026
Merged via the queue into main with commit c142ced Aug 4, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5238-docs-skill-catchup branch August 4, 2026 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

E9(#5040 收尾):文档与 skill 追平执行器 —— 摘除「apis 被拒」失真表述,objectstack-api skill 纳入端点能力

2 participants