Skip to content

E1(#5040 执行器契约面):IMetadataService.matchEndpoint? / generateOpenApi? + IHttpServer.setFallbackHandler? 可选契约方法与契约测试 #5080

Closed

Description

@os-zhuang

Part of #5040(E 系列第 1 单,contract-first 首件)。⛔ Blocked-by: v17 切版 —— 按 #4936 裁决的分期(v17 = 响亮拒绝,17.x = 执行器),本单在 .changeset/pre.json 退出 mode: pre / tag: rc(即 v17 发版)之前不可派发;认领前先核该文件现状,窗口未关即让行。维护者已批准提前入队占位(2026-08-04)。

范围(纯声明 + 契约测试,零行为变更)

依 #5040 设计文档(§1-C / §2 / §3.5,设计全文)与 ADR-0121:

  1. IMetadataService.matchEndpoint?(packages/spec/src/contracts/metadata-service.ts):可选成员,与既有 watch? 同风格。签名按设计 §2:

    matchEndpoint?(query: { path: string; method: string }): Promise<ApiEndpointMatch | undefined>;
    interface ApiEndpointMatch {
      endpoint: ApiEndpoint;            // ApiEndpointSchema.parse 后形状,默认值已物化
      params: Record<string, string>;   // 17.x 恒 {};为未来路径模板预留,不定义模板语法
    }
  2. IMetadataService.generateOpenApi?:同文件,可选成员。⚠️ describe/注释中须注明:GET /openapi.json 现属主为 packages/rest(GET /openapi.json 有两个属主:rest-server 真serve,http-dispatcher 的 generateOpenApi 分支全仓无实现(ADR-0076 D1 影子重复) #5078 实测),该方法接线前必须先裁「一路一主」(E6 前置)—— 契约声明不预设裁决结果。

  3. IHttpServer.setFallbackHandler?(packages/spec/src/contracts/http-server.ts):设计 §1 方案 C 的传输层兜底 seam,可选方法;语义:仅在全部显式路由未命中后调用,handler 契约含 req.body 可读(与 use() 的「body 不填充」契约区分,adapter.ts:362)。

  4. 三者的契约测试(与既有 contracts 测试同风格),及生成物如受影响(api-surface.json 等)整体重生成 —— os-regen 四步纪律照旧。

约束

  • 词表冻结:ApiEndpointSchema 零改动(ADR-0121;命名空间 publish 门属 E7,不在本单);
  • 可选方法 = 消费端 typeof === 'function' 探测,契约先行不阻塞 runtime 侧(E2/E3 Blocked-by: 本单);
  • 认领时按 [PM] 分片分工登记表 — 谁在管哪个仓库的队列 #4604 协调要求声明完整文件面(contracts 两文件 + 测试 + 生成物)。

关联

ADR-0121(D1–D7)、#5040(E 系列总表;E2/E3 待本单)、#4936 / #4939 / PR #5065(阶段一,已合入 29c6c9d)、#5078(E6 前置,domain:cli)、#4910-Q1(server: seam 先例)。

来源:执行器车道 PM session_01EYGdmvWP1ieZSLqvAW6uyd 按维护者批准转交 spec 车道(跨车道转移协议:队列标签即通道)。

Activity

  1. added
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Aug 4, 2026
  2. os-zhuang commented on Aug 4, 2026

    @os-zhuang
    ContributorAuthor

    范围收窄(认领前必读,依 #5078 实测 + #5040 E6 设计修正,2026-08-04):正文「范围」第 2 项 IMetadataService.generateOpenApi? 剔除,不要实现 —— 实测确认 GET /api/v1/openapi.json 由 rest-server 独占应答且 dispatcher 探测分支双重死,OpenAPI 面走 rest 管线(E6 重定义,见 #5040),在 metadata 契约上加该成员会制造 ADR-0076 禁止的第二属主。本单剩余范围:IMetadataService.matchEndpoint?(第 1 项)+ IHttpServer.setFallbackHandler?(第 3 项)+ 契约测试与生成物(第 4 项)。其余约束不变,Blocked-by: v17 切版 不变。


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 4, 2026
  4. self-assigned this
    on Aug 4, 2026
  5. os-zhuang commented on Aug 4, 2026

    @os-zhuang
    ContributorAuthor

    认领 —— PM 会话 session_01EYGdmvWP1ieZSLqvAW6uyd(执行器车道),分支 claude/issue-5080-executor-contracts,即刻派发 os-dev。

    ⛔ 门槛撤销:正文的「Blocked-by: v17 切版」已由维护者放行(2026-08-04:「这个需求挺重要的,可以先开发」)—— 对 E1–E6 的开发与落地生效;E7(翻转)/E8 仍守裁决分期等 v17 发出拒绝后进行。以本评论为准。

    文件面声明(#4604 协调):packages/spec/src/contracts/metadata-service.ts、packages/spec/src/contracts/http-server.ts、对应契约测试、生成物整体重生成(api-surface.json 等,os-regen 四步)、.changeset/*.md 一枚。范围以正文 + 收窄评论(generateOpenApi? 剔除)为准。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:specDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions