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-zhuangos-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

vercelBot commented Aug 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 4, 2026 12:08pm

Request Review

@github-actions

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 queueAug 4, 2026
Merged via the queue into main with commit c142cedAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:systemprotocol:uisize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants

@os-zhuang@claude