test(e2e,showcase): 执行器收官验收 —— showcase 端点回迁 + 真实 boot 探针(#5040 E8) - #5230
Merged
Conversation
#4936 把 showcase 的两条 `apis:` 声明注释掉,理由是当时端点面全链路零执行:没有 挂载、没有匹配器、每个键(包括 `authRequired`)解析通过而不生效。E1–E7 建成执行器 并把整面硬拒收窄为逐端点 publish 门之后,那条理由不复存在。本单把两条声明按原意 恢复 —— 同名、同 target、同 `authRequired`、同 `cacheTtl` —— 只做 ADR-0121 D1 要求的一处修改:路径迁入本应用的命名空间保留区 `/api/v1/apps/showcase/…`。 - examples/app-showcase:恢复 TaskFeedEndpoint / InquiryPurgeEndpoint;coverage 的 `apis` 从 waived 翻回 demonstrated(理由改写为「由真实 boot 测量」而不是 「声明即证明」—— 这正是 #4936 抓到的那类假覆盖);gap-fill 的反向断言改回正向, 并新增命名空间与「零匿名面」两条静态钉子。 - packages/qa/dogfood:两个真实 boot e2e。showcase 一份走真实 artifact 摄入路径 (MetadataPlugin + local-file),证明匹配命中执行、find 的 data 与内建 /data 路由逐字节相同、匿名 401、cacheTtl 只随成功答案、挂载点下未声明路径与挂载点外 的裸 404 完全一致、/meta/api 与 /openapi.json 描述的正是挂载的东西;fixture 一份补上 ADR-0121 D6 的匿名分支 —— 省略 authRequired 拒绝匿名、显式 false 服务 匿名、已装配预算耗尽后 429 且 Retry-After 真的在线上。 RED-first:两份断言先于 showcase 回迁写就并运行,pre-restore 状态下 9 条失败(全部 是 #4936 记录的那个裸 404),回迁后 14 + 7 全绿。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EYGdmvWP1ieZSLqvAW6uyd
E7b(#5189/#5203)在 main 上落地之后,「一次绕过 publish 的直写不会变成活路由」 从待办 TODO 变成可以真实断言的事:往 store 里直接写一条 `authRequired: false` 且没有已装配预算的 api 条目(D6 最危险的那个形状),两种调用者都必须拿到 404 —— 不是「因为匿名所以 401」,而是压根没有这条路由。 同时把 fixture 里那条「故意省略 authRequired」的声明改标 `ApiEndpointInput`: `ApiEndpoint` 是 schema 的输出类型,`.default(true)` 已被物化,该键在上面是必填, 所以用它做注解的 TS 作者根本写不出升级指南推荐的那个安全形状(另立 #5227 记录)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EYGdmvWP1ieZSLqvAW6uyd
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
os-zhuang
marked this pull request as ready for review
August 4, 2026 11:11
os-zhuang
enabled auto-merge
August 4, 2026 11:11
This was referenced Aug 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #5112
Part of #5040(E8 —— 收尾件)
这一单做了什么
#4936 把 showcase 的两条
apis:声明注释掉,理由是当时端点面全链路零执行:没有挂载、没有匹配器、每个键(包括authRequired)解析通过而不生效。E1–E7 建成执行器、把整面硬拒收窄为逐端点 publish 门之后,那条理由不复存在。本单按原意恢复这两条 —— 同名、同 target、同authRequired、同cacheTtl—— 只做 ADR-0121 D1 要求的一处修改:匿名面没有增加:两条历史声明本来就都是
authRequired: true。一个例子不该长出它从来没有过的公开面 —— 匿名分支改由一份一次性 fixture 承担(见下)。RED-first(证据,不是说法)
两份 e2e 的断言先于 showcase 回迁写就并运行。pre-restore 状态下:
九条全部是 #4936 记录的那个裸 404。通过的 5 条正是两个状态下都必须成立的:挂载点下未声明路径的裸 404、挂载点外的裸 404、方法不匹配、以及「不宣告运行时不服务的东西」。回迁后:
两份 e2e,分工是刻意的
showcase-declarative-endpoints.dogfood.test.ts—— 走真实 artifact 摄入路径(MetadataPlugin+local-file,createStandaloneStack用的同一条),所以这次 boot 本身就再证明了一遍 E7 的 publish 门接受回迁后的声明。覆盖:匹配命中执行、find的data与内建/data路由逐字节相同、匿名 401、cacheTtl只随成功答案上线、挂载点下未声明路径与挂载点外裸 404 byte-identical、/meta/api与/openapi.json描述的正是挂载的东西。按 #5112 的验收注记,不断言
components.schemas与内建$ref解析(存量 #5168),只断言端点 path 条目。declarative-endpoint-policy.dogfood.test.ts+ fixture —— ADR-0121 D6 的匿名分支。省略authRequired拒绝匿名(升级指南「omission is SAFE」这句话第一次被测量而不是被相信)、显式false服务匿名、已装配预算耗尽后 429 且Retry-After真的在线上、429 不带缓存指令、预算是逐端点的。外加 E7b(#5189/#5203)的直写拒绝探针:绕过 publish 直接往 store 写一条authRequired: false且无已装配预算的条目,两种调用者都拿 404。真实 boot 探针(原始输出,已裁剪)
pnpm dev:showcase -- --fresh -p 39720 --seed-admin,47 plugins,29 flows,130 seed rows。没有 429 的真实 boot 探针,因为回迁的两条都没有声明
rateLimit—— 而给一个已发布示例加一条它历史上没有的限流(必然连带一条匿名端点)正是不该做的事。429 +Retry-After由 fixture 那份 e2e 在同样真实的 boot 上证明。P7 的说明:声明式端点走的是
setFallbackHandler(HononotFound),不是注册路由,所以方法不匹配是 404 而不是 405 +Allow—— 与「挂载点不改变任何人的未匹配答案」是同一件事。405 +Allow的对照在已注册路由上仍然成立。升级文档安全复核 —— PASS
docs/protocol-upgrade-guide.md的declarative-apis-endpoints-live条目,逐条对着实现读:/api/v1/apps/{manifest.namespace}/{subpath}namespaceGate+DEFAULT_RUNTIME_PREFIX+APP_ENDPOINT_SEGMENTmanifest.id推导回落NAMESPACE_RE,无 derive 分支(Q1=A)authRequired缺省true,省略是安全的false打开匿名false的端点匿名 200rateLimit.enabled === true,不是键存在policyGate:authRequired === false && !armedenabled会得到匿名且完全不计量的端点」objectstack validate判红并给出处方objectstack validate证明没有 17.x 不能执行的形状反证的原始输出:
指令在场、准确、可执行 —— 一个没有其它上下文的 AI 维护者照着 grep
authRequired: false、照着报错处方改,就能落地。未编辑生成文件。两条精度备注(不构成 FAIL,建议走 registry 修):
/api/v1写成字面量,而门确实硬编码DEFAULT_RUNTIME_PREFIX—— 重设了 dispatcher prefix 的部署无法发布任何端点。这是 17.x 立项:建设声明式 ApiEndpoint 执行器(挂载 + matchEndpoint + authRequired/cacheTtl/inputMapping/outputMapping 逐键接线) #5040 §7-8 的已知开放问题,文档里没有点出这个前提。apis:块。已经以sys_metadata行存在的api条目(pre-17 的 Studio 写入)没有东西可 grep —— 而那正是 声明式端点的两个机器可读面会说谎:runtime-authoredapi行在 /meta/api 与 /openapi.json 里在场,匹配器却永远看不见(真实 boot 实测) #5224 那条路径。如实报告的三件事
多租户交错验收(E5b)—— 无法表达,不是没做。 端点步骤的多租户分支判据是
isMultiTenantHost(),即kernel-resolver服务是否注册。全仓 grep:该服务在本仓只有消费者没有提供者(http-dispatcher.ts、rest-api-plugin.ts、current-user-endpoints.ts都是getService),提供方在 cloud 分发里。bootStack({ multiTenant: true })给的是多组织(tenancy posture),单内核,isMultiTenantHost()恒为 false。所以「按请求自己的环境解析」与「环境解析不出 → 拒绝服务(404 + warn)」两条在本仓的任何真实 boot 上都不可达。顺带查出:那条 decline 分支的提示语在全仓只出现在dispatcher-plugin.ts源码里,没有任何测试引用它 —— 该分支目前零覆盖。 建议作为 E 系列的收尾 followup 单独派发(需要在 packages/runtime 里用桩 kernelResolver 驱动)。composed-stack(设计 §7-7)—— 仍然开放。
composeStacks在本仓只有packages/spec自己的定义与测试引用,examples/与任何 first-party 启动路径都不组合 stack。所以「组合栈的端点加载」在示例层无法探针,E7 的结论(composeStacks 不重新解析)未被本单改变。覆盖真相。 E 系列没有留下 istanbul/c8 豁免或 coverage 配置条目;它留下的是散在源码里的「结构性不可达」断言,而这些断言在 E7 翻转 + 本单回迁之后已经不成立了。这些文件都在本单文件面之外(#4604),仅列出供 PM 派发:
packages/runtime/src/route-ledger.ts:298——* /apps/**行仍写着「Structurally unreachable today: a non-emptyapis:is rejected at publish until the 17.x 立项:建设声明式 ApiEndpoint 执行器(挂载 + matchEndpoint + authRequired/cacheTtl/inputMapping/outputMapping 逐键接线) #5040 E7 flip」;packages/runtime/src/endpoint-executor.ts:31-34、api-endpoint-step.ts:24-27、endpoint-policy.ts:49-53、dispatcher-plugin.ts:1430—— 同类措辞;packages/metadata/src/metadata-manager.ts:1551、packages/rest/src/openapi-endpoints.ts:60,332—— 同类措辞(openapi-endpoints.ts那两处还说「Today it emits nothing」,本 PR 的 P9 就是反例)。顺手发现的、已单独立项的
api行在 /meta/api 与 /openapi.json 里在场,匹配器却永远看不见(真实 boot 实测) #5224 —/meta/api与/openapi.json宣告了匹配器永远看不见的 runtime-authoredapi行(OpenAPI 还把它标成security: []的公开端点),两个面读的是两个库。真实 boot 实测。showcase_inquiry_purge清扫流从来没删掉过任何记录 —— delete_record 节点每次都失败(Delete requires an ID or options.multi=true) #5225 —showcase_inquiry_purge的delete_record节点每次都失败,该清扫流从未删除过任何记录(声明式端点与内建路由两条路径逐字相同的报错)。objectstack dev --fresh上 sys_audit_log 表不存在 —— 每次元数据写入都以 ERROR + 「Audit write failed」告终,审计轨迹静默丢失 #5226 —objectstack dev --fresh上sys_audit_log表不存在,每次元数据写入都以 ERROR + 「Audit write failed」告终。ApiEndpoint是输出类型,authRequired在上面是必填 #5227(finding) —ApiEndpoint是输出类型,authRequired在上面必填,所以 TS 作者写不出升级指南推荐的「省略」形状。验证(真实输出)
现场已清:dev server 全部按 PID 停止,
--fresh的 OS_HOME 临时目录随退出自动删除,e2e 自己的 tmpdir 在afterAll里rmSync。🤖 Generated with Claude Code
https://claude.ai/code/session_01EYGdmvWP1ieZSLqvAW6uyd
Generated by Claude Code