在 #4572(spec 双源 C1)的三仓消费方扫描中发现,范围外,按第十条军规立案。 ## 现象 `packages/spec/src/api/rest-server.zod.ts` 的 OpenAPI 3.1 扩展块整体是 declared-but-unenforced: - `RestServerConfigSchema.openApi31`(`OpenApi31ExtensionsSchema`:`webhooks` / `callbacks` / `jsonSchemaDialect` / `pathItemReferences`)是可作者化的配置键,但 **没有任何运行时读取它**: - `packages/rest/src/rest-server.ts` 的 `normalizeConfig` 只读 `api` / `crud` / `metadata` / `batch` / `routes`,`openApi31` 被静默丢弃; - `GET <basePath>/openapi.json` 由静态 `@objectstack/spec/openapi.json` 加载后 enrich,不看配置; - `packages/spec/scripts/build-openapi.ts`(`gen:openapi`)零 webhook/callback/openApi31 引用; - `plugin-hono-server` 只透传 `RestServerConfig`,同样无人消费该键。 - `CallbackSchema` / `OpenApiWebhookEventSchema`(#4572 中由 `WebhookEventSchema` 改名)与 `OpenApi31ExtensionsSchema` 三个导出在三仓(framework / cloud / objectui)的 import 级消费方均为零(各自的单测除外)。 即:作者在 `openApi31.webhooks` 里声明的 webhook 定义永远不会出现在服务出的 OpenAPI 文档里 —— 典型的「declared ≠ enforced」(Prime Directive #10 corollary),与 #3197(connector webhooks 声明未强制)同类。 ## 建议处置(二选一,ADR-0049) 1. **enforce**:让 `/openapi.json` 的 enrich 阶段把 `openApi31.webhooks` / `callbacks` 合入输出文档(OpenAPI 3.1 顶层 `webhooks` 是标准能力);或 2. **remove**:整块删除(`openApi31` 键 + `OpenApi31ExtensionsSchema` + `CallbackSchema` + `OpenApiWebhookEventSchema`)。这是插件 TS 配置面(非 metadata 文件),但 `openApi31` 是 authorable-surface 记账键,删除需走 authorable-surface 台账 + major changeset;`RestServerConfigSchema` 非 strict,删除后作者继续写 `openApi31` 会被静默剥离 —— 需评估是否要 UNKNOWN_KEY_GUIDANCE/tombstone 位。 #4572 已把 `./api` 侧死掉的 `WebhookConfig(Schema)` 删除、`WebhookEvent(Schema)` 改名 `OpenApiWebhookEvent(Schema)`(消歧,不改变本 issue 的判定);本 issue 决定剩余整块的去留。 关联:#4572(发现现场)、#3197(同类:connector webhooks declared-not-enforced)、#4535(双源清账主单)、ADR-0049。
Activity
os-zhuang commentedon Aug 2, 2026
裁决(维护者 2026-08-02 委托,按四轴评估:长远合理性 / 防 AI 静默犯错 / 实际业务 / 不扩边界):remove ——
openApi31键 +OpenApi31ExtensionsSchema+CallbackSchema+OpenApiWebhookEventSchema整块删除。openApi31.webhooks的定义永远不会出现在/openapi.json,典型 declared ≠ enforced 假合规,制造虚假完成。实施按正文备注:authorable-surface 台账 + major changeset;
RestServerConfigSchema非 strict,需补UNKNOWN_KEY_GUIDANCE/ tombstone 位,防止作者继续写openApi31被静默剥离。v17 窗口内落地。Generated by Claude Code
os-zhuang commentedon Aug 3, 2026
🔒 认领(实施 A 线;#3207 已收口于 PR #4734,#3715 核实为已实现并关单)
session_0176qgxgCXTJCUv4YFLtusP9claude/issue-4579-retire-openapi31-blockopenApi31键 +OpenApi31ExtensionsSchema+CallbackSchema+OpenApiWebhookEventSchema整块删除;非 strict schema 补墓碑位防静默剥离;major,v17 窗口(pre.json 实测仍mode: pre)。.strict()on view/page schemas so mis-layered visibility keys are loud errors #2902/Remove dead objectenable.trash/enable.mrucapability flags (ADR-0049 enforce-or-remove) #3207/[P2] Execute ADR-0033's deletion of the unenforcedtool.requiresConfirmation(safety-shaped, gated by nothing) #3715 那型陈旧单)。Generated by Claude Code
feat(spec)!: 退役 RestServerConfig.openApi31 整块 —— declared ≠ enforced,…
os-zhuang commentedon Aug 3, 2026
🔁 入队协议 rebase 记录(PR #4764,
session_0176qgxgCXTJCUv4YFLtusP9)56470061d→832047c57(含 C13+C15 PR feat(spec)!: 双源清账 C13+C15 —— 退役 L1「Simple Sync」整层,integration 冲突枚举改名ConnectorConflictResolution,ui 侧保名 (#4738) #4760);head77cd00ee8,--force-with-lease已推。json-schema.manifest.json/authorable-surface.json/api-surface.json;rm -rf dist全量重建防孤儿 dts chunk)。三 def 的 gen:schema silently drops PageTabsProps since #2967 — references regen would delete real docs #2978 蓄意删行按门禁提示在同 commit 重做,authorable-surface 的 tombstone 门禁可被手编基线绕过 —— 删掉基线行就删掉了证据(#4638 / #4643 已两次这样过绿) #4650 门禁输出:3 baseline deletion(s) since 832047c57039 carry their own proof — def no longer emitted。check:generated8/8 全绿;check:dual-source-exportsPASS,基线保持 6 行不动;spec test 292 files / 7348 tests passed;spectypecheckexit=0;api-surface delta vs origin/main 恰为本单六行删除。releases/未触碰。{"rebased_onto": "832047c57", "checks": {"check:generated": "8/8 PASS", "check:dual-source-exports": "PASS (baseline 6, unchanged)", "spec_test": "292 files / 7348 tests passed", "spec_typecheck": "exit=0"}, "pushed": "77cd00ee8 (--force-with-lease)"}Generated by Claude Code
os-zhuang commentedon Aug 3, 2026
✅ PM 验收通过(session_0176qgxgCXTJCUv4YFLtusP9,04:25Z):PR #4764 已转正并启用 auto-merge。
核验记录(本地实测,不采信自报):
OpenApi31ExtensionsSchema/CallbackSchema/OpenApiWebhookEventSchema三 def 整删,api-surface −6、manifest −3、authorable −15/+1(openApi31以retiredKey()墓碑入账 [RETIRED]);迁移登记 D3 语义迁移的「插件 TS 配置面、stack 树无源可改写 ⇒ 免 D2」论证成立;pin 全入口负断言 + 防空转守卫;墓碑 sabotage 与 S1 双通道记录完整。WebhookEvent→OpenApiWebhookEvent改名并更正旧 changeset 指向被删导出的 TO 指引——「改名不发货为着陆点」的注记是诚实做法。合并后 ADR-0049 队列推进;A 线接 C17 #4737(studio 区,即刻并飞)。
Generated by Claude Code
feat(spec)!: 退役 RestServerConfig.openApi31 整块 —— declared ≠ enforced,…
test(spec): the second api/ file group's test titles state each cited…