feat(spec)!: 退役 RestServerConfig.openApi31 整块 —— declared ≠ enforced,零运行时读者 (#4579) - #4764
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 107 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
…零运行时读者 (#4579) 按 2026-08-02 委托裁决(remove)整块删除 OpenApi31ExtensionsSchema / CallbackSchema / OpenApiWebhookEventSchema + RestServerConfig.openApi31 键: normalizeConfig 只读 api/crud/metadata/batch/routes,/openapi.json 由预生成 契约 enrich 而来,gen:openapi 零 webhook/callback 引用 —— 作者写进 openApi31.webhooks 的定义从未出现在任何服务出的文档里(ADR-0049 假合规)。 三仓(objectstack / cloud@5df2c699b / objectui@785b8a5d4)import 级零消费者。 - rest-server.zod.ts:三 schema 删除留指路注释;openApi31 走 retiredKey() 墓碑(非 strict schema,裸删会静默剥离 —— requireAuth #3963 同款) - conversion 评估(#4734 先例):RestServerConfig 是插件 TS 配置面, stack 树的 api 块只声明四个 scoping/auth 键,sys_metadata 不可能携带 openApi31,无源可改写 ⇒ 不登记 D2 conversion,登记 D3 semantic migration rest-server-openapi31-block-removed(validateOnly 先例) - authorable-surface:14 行随三个整 def 出账(#4650 门禁判定 def no longer emitted,输出见 PR);api/RestServerConfig:openApi31 → [RETIRED] - json-schema.manifest.json:三 def 删行(#2978 蓄意移除通道) - api-surface.json:./api 六行删除(3 const + 3 type) - 回归 pin(rest-server.test.ts):compiler-API 断言全入口不再命名六个 导出名(防空转守卫)+ 运行时命名空间一致性;墓碑 sabotage(authored openApi31 → 拒绝且文案指向本单;正常键仍过);S1 sabotage 实测两 pin 红 - changeset:@objectstack/spec major(删已发布导出名 + 键,TS2305); 同 major 内吸收 #4572 的 WebhookEvent→OpenApiWebhookEvent 改名 (webhook-dual-source-api-side.md 的 TO 指引同步更正) - 严格性台账:check:strictness-ledger 实跑 PASS,api/ 行属 coarse 汇总 层(非门禁校验面),不动 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9
os-zhuang
force-pushed
the
claude/issue-4579-retire-openapi31-block
branch
from
August 3, 2026 04:23
924e8a2 to
77cd00e
Compare
os-zhuang
marked this pull request as ready for review
August 3, 2026 04:25
os-zhuang
enabled auto-merge
August 3, 2026 04:25
os-zhuang
pushed a commit
that referenced
this pull request
Aug 3, 2026
…§7) os-regen merge driver 对 json-schema.manifest.json / authorable-surface.json / api-surface.json 不做文本合并,rebase 回退了蓄意手删;本 commit 重放:manifest 删 system/EnvironmentArtifact* 9 键 + system/Sha256Digest 在列,authorable-surface 删 46 行(#4650 门禁以新 merge-base 695cfbd 重新自证,7 组「def no longer emitted」),api-surface / spec-changes / upgrade-guide / docs 全量重生成。 复验:check:generated 8/8、check:dual-source-exports(基线 6 → 3)、 strictness-ledger / variant-docs / liveness / empty-state 全绿;spec 测试 292 文件 / 7348 全过;全仓 typecheck 122/122;docs 产物无行首 import/export (Build Docs 措辞修复在 rebase 后仍生效)。 Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9 Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Aug 3, 2026
…re 形,./cloud re-export (objectstack-ai#4740) (objectstack-ai#4767) * feat(spec)!: EnvironmentArtifact 信封收敛为单一声明 —— C10 双源清账,./system 持活 wire 形,./cloud re-export (objectstack-ai#4740) `EnvironmentArtifact(Input|Schema)` 曾由 `./cloud` 与 `./system` 各自导出一个 声明:cloud 侧是活的 wire 形(checksum 为 64 位 hex 字符串、metadata = ObjectStackDefinitionSchema),全仓唯一 runtime Zod parse (packages/metadata/src/plugin.ts `_parseAndRegisterArtifact`)与 cloud 仓 3 处 type import 都用它;system 侧是文档化「v0」(checksum 对象、分类袋 metadata、内联 functions[]、必填 manifest、payloadRef 保留位),三仓 (objectstack / cloud / objectui)import 级实测零代码消费者、从未有 producer 产出过。两侧互相解析不过。按维护者裁决(objectstack-ai#4740,路线 A′)收敛: - system/environment-artifact.zod.ts 重写为活 wire 形(唯一声明); Sha256Digest(Schema) 随声明搬入 ./system(./cloud 仍导出) - cloud/environment-artifact.zod.ts 改为纯 re-export(同一符号,两个入口) - 从未实现的 functions / manifest / payloadRef 走 retiredKey() tombstone 退役(ADR-0049):tsc 处 never、parse 处 prescription;无 ADR-0087 conversion —— 信封是传输形状,不落 sys_metadata、不在 conversion walker 的 stack 树上,存量行不可能携带(objectstack-ai#4734 先例逐条评估,论证见 PR) - v0 家族 16 个导出名(8 const + 8 type)自 ./system 移除;9 个 system/EnvironmentArtifact* def 停止发布(json-schema.manifest.json objectstack-ai#2978 蓄意删键;authorable-surface 46 行经 objectstack-ai#4650 门禁 7 组「def no longer emitted」自证删除) - 符号身份 pin(compiler API,exports-map 枚举 16 入口 + 防空转守卫): 三名字全入口唯一解析到 src/system/environment-artifact.zod.ts;S1 (重加被删名)/ S2(cloud 侧新声明的禁止路线)sabotage 均红 - objectstack-ai#4666 盲区:checksum 对象→字符串是 key 级门禁不可见的类型变更,parse pin 钉住(旧对象形 → 拒;64 位 hex 字符串 → 过),changeset 显式警示 - packages/metadata runtime parse 一字未动(收敛目标即其已解析形状), 14 文件 290 测试全绿 - north-star.mdx §6.3 锚点同步(单一声明 + re-export;字段清单改为 wire 形) - 基线 6 → 3(dual-source-exports.baseline.json 删 3 行) - changeset:@objectstack/spec major(移除 16 个已发布导出名,TS2305), 零元数据迁移;strictness-ledger 实跑零变化 Fixes objectstack-ai#4740 Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9 Co-authored-by: Claude <noreply@anthropic.com> * fix(docs): 头注措辞避开行首 `import` —— 生成器按行成段,MDX 把该行当 ESM 解析(Build Docs 红) build-docs.ts 把 docblock 按行拆成独立段落,`system/environment-artifact.zod.ts` 头注中断行后有一行以 `import ` 开头,MDX/acorn 将其解析为 ESM import 语句, `content/docs/references/system/environment-artifact.mdx` SyntaxError。改写措辞 (「so the chosen entry point can never change the shape a consumer gets」), 重生成后两个 environment-artifact.mdx 均无行首 `import `/`export `(代码围栏内 的 TypeScript Usage 示例不受影响),`pnpm --filter @objectstack/docs build` exit 0,`check:docs` 248 文件同步。 生成器坑本体(docblock 行成段 + 行首 import 炸 MDX,objectstack-ai#4696 家族)记入 PR 顺带 发现,不在本 PR 修生成器。 Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9 Co-authored-by: Claude <noreply@anthropic.com> * chore(spec): rebase 到含 objectstack-ai#4764 的 main 后全量重生成 —— 蓄意删键重放 + 生成物从新基重算(objectstack-ai#4535 §7) os-regen merge driver 对 json-schema.manifest.json / authorable-surface.json / api-surface.json 不做文本合并,rebase 回退了蓄意手删;本 commit 重放:manifest 删 system/EnvironmentArtifact* 9 键 + system/Sha256Digest 在列,authorable-surface 删 46 行(objectstack-ai#4650 门禁以新 merge-base 695cfbd 重新自证,7 组「def no longer emitted」),api-surface / spec-changes / upgrade-guide / docs 全量重生成。 复验:check:generated 8/8、check:dual-source-exports(基线 6 → 3)、 strictness-ledger / variant-docs / liveness / empty-state 全绿;spec 测试 292 文件 / 7348 全过;全仓 typecheck 122/122;docs 产物无行首 import/export (Build Docs 措辞修复在 rebase 后仍生效)。 Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9 Co-authored-by: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Aug 3, 2026
…ctstack-ai#4634,ADR-0049) (objectstack-ai#4783) * feat(spec)!: 退役 DriverCapabilities 31 个零读者能力位 —— 全表活性审计,3 活 31 死 (objectstack-ai#4634) objectstack-ai#4484 findStream 收尾发现 streaming 位指向已删除的契约方法;按 issue 自述倾向对 DriverCapabilitiesSchema 全部 34 位做两仓活性审计(objectstack + cloud,objectui 零引用确认):仅 queryDateGranularity(engine 聚合分派 + date-bucket parity)、 autonumber(engine 让渡自增生成)、batchSchemaSync(engine 与方法存在性 AND) 三位有决策读者;其余 31 位人人写、无人读,describe 承诺的引擎降级路径从未存在, 且零读者让写错的值(SqlDriver streaming:false 却实现 findStream;InMemoryDriver streaming:true 却全表物化)三个版本无人发现 —— ADR-0078 假可供性。 - driver.zod.ts:31 位 retiredKey() 墓碑(非 strict schema,裸删会被静默剥离; DriverConfigSchema.capabilities 及 SQL/NoSQL 扩展确有 parse 路径),逐位 prescription 指明真实机制(方法存在性门控:beginTransaction / aggregate / syncSchema;objectstack-ai#4001 教训);batchSchemaSync .default(false) → .optional() (两处读者本就按缺省=false 消费) - ADR-0087 评估(objectstack-ai#4484/objectstack-ai#4764 先例):driver 是代码不是 stack 树元数据, supports 字面量在 driver 类里、DriverConfig 是插件 TS 配置,均非 sys_metadata 形态(stack 树近邻 datasource.capabilities 已于 objectstack-ai#4583 单独退役)⇒ 不登记 D2 conversion,登记 D3 semantic migration driver-capabilities-inert-bits-removed - driver 字面量同步:memory {} / mongodb { batchSchemaSync: true } / sql { queryDateGranularity, autonumber, batchSchemaSync: false } - 回归 pin(driver.test.ts):31 位逐位 parse 拒绝 + prescription 断言; compiler-API 断言 34 键形状且退役位类型坍缩为 undefined、活位可写(反空转 守卫);S1(schema 复活 streaming)5 pin 红、S2(driver 字面量复活)TS2416 红,均实跑验证后还原 - 生成物:authorable-surface 31 行 [RETIRED]、spec-changes / upgrade-guide / references docs 全量再生成;14 项 spec 门禁全绿,全仓 typecheck 122 任务绿 - changeset:spec + 三 driver 包 major,FROM→TO 映射与一行修复齐备 Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9 * chore(spec): merge main(含 C10 objectstack-ai#4767)后按规重整生成物 —— 三敏感文件取 main 版再重生成 json-schema.manifest.json / authorable-surface.json / dual-source-exports.baseline.json 一律先取 origin/main 版本(避免静默复活 C10 蓄意删除的 system/EnvironmentArtifact* 键),再以合并后源码全量重跑 gen:schema/check:generated:DriverCapabilities 31 行 [RETIRED] 由生成器重新写入,manifest 与 authorable-surface 中 C10 删键保持已删 (实测两文件 system/EnvironmentArtifact 零残留)。8/8 生成物门禁 + 8 项源码审计 全 PASS,spec 292 文件 7374 测试全绿。 Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9 --------- Co-authored-by: Claude <noreply@anthropic.com>
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 #4579
按 2026-08-02 委托裁决(remove)整块删除:
openApi31键 +OpenApi31ExtensionsSchema+CallbackSchema+OpenApiWebhookEventSchema。enforce 等于新建「配置驱动的 OpenAPI webhooks/callbacks 文档合成」能力 —— 三仓零消费者、零运行时读者,没人在等它;作者写进openApi31.webhooks的定义永远不会出现在/openapi.json,典型假合规(ADR-0049)。三仓零 reader 重验(真实输出)
扫描基线:objectstack
65f184ba5(开工时 origin/main)、cloud @5df2c699b(= origin/main)、objectui @785b8a5d4(= origin/main)。逐模式 grep(*.ts/*.tsx/*.mts/*.mjs,排除 node_modules / dist / .d.ts):(objectui 的
ActionCallbackSchema是其自有无关 schema,\b词界已排除。objectuitypes/src/index.ts:935的export type * as API是命名空间 type 透传,三名零成员引用,零迁移。)运行时侧闭合调用图:
packages/rest/src/rest-server.ts的normalizeConfig只读api/crud/metadata/batch/routes(config.openApi31被静默丢弃);rest-server.ts/plugin-hono-server/src/hono-plugin.ts/packages/spec/scripts/build-openapi.ts三文件对openApi31|OpenApi31|webhooks|callback的 grep 零命中。墓碑机制取舍
RestServerConfigSchema非 strict ⇒ 按技能手册分叉表走retiredKey()墓碑(本文件已有requireAuth#3963 同款先例,无需新建 guidance 机制;UNKNOWN_KEY_GUIDANCEmap 是.strict()schema 的路线,不适用)。两通道:tsc(输入类型never)+ parse(错误文案即处方,指向本单与「该能力从未生效」事实 + 未来 enforce 须经 ADR)。实测拒绝输出:三个整 def(纯值 schema,除自身单测外零消费者)随键删除 —— 导出无消费者的 schema 会被读成能力(#3950 先例)。
conversion 评估结论(#4734 先例):不登记 D2,登记 D3 semantic
RestServerConfig是插件 TS 配置面:仅有的作者门是 REST 插件构造参(rest-api-plugin.ts的api?: RestServerConfig)与plugin-hono-server的restConfig?: RestServerConfig。stack.zod.ts的api块是独立内联对象,只声明requireAuth(墓碑)/enableProjectScoping/projectResolution/enforceProjectMembership四键,从未有openApi31;defineStack严格 parse 下未声明键根本进不了元数据面 ⇒ 存量sys_metadata行不可能携带openApi31,无源可改写。batch-options-validate-only-retired「HTTP-only、非 stack conversion」同形),按 fix(spec): #3207 收尾 — 补上 enable.trash/mru 退役缺失的 ADR-0087 迁移面,墓碑改指 #3146 #4734 的评估纪律免登记 D2,改登记 D3SemanticMigration:rest-server-openapi31-block-removed,surfacerestServer.openApi31(满足 build-schemas 检查 (b) 对 newly-tombstoned key 的登记要求),reason/acceptanceCriteria完整,并入 step17 rationale。spec-changes.json/ upgrade-guide 均已投影(gen:spec-changes/gen:upgrade-guide实跑)。#4650 门禁自证(实跑输出)
authorable-surface 14 行随三个整 def 出账,门禁判定路径 3(def no longer emitted):
json-schema.manifest.json三 def 删行走 #2978 蓄意移除通道(gen:schema 先红、同 PR 删行后绿);api/RestServerConfig:openApi31翻转为[RETIRED](生成器自写)。检查 (b) 由上述 semantic surface 满足(未登记时该门确会红,登记后静默通过)。基线不涉及:本单非dual-source-exports.baseline.json条目(#4572/C1 已清),KNOWN_STILL_DUAL_SOURCE/RENAMED_DEFS未动。回归 pin + sabotage(C6 PR #4745 形态)
rest-server.test.ts):从package.jsonexports 枚举全部公共入口,断言任一入口不再命名六个导出名(3 const + 3 type),带防空转守卫(module symbol 必解析、./api表面 > 50 导出、幸存邻居RestServerConfigSchema/RestApiConfigSchema在位);另有运行时命名空间一致性断言。openApi31: {...}→ 拒绝且文案匹配/RestServerConfig\.openApi31.*removed.*Delete the key/s;对照测试证明五个正常键仍全过(防「拒绝一切」),且 parse 结果not.toHaveProperty('openApi31')。export const OpenApi31ExtensionsSchema→2 failed | 45 passed(compiler-API pin 与 runtime-namespace pin 双双转红),revert 后 47/47 全绿。WebhookEventSchema/WebhookConfigSchema不回流)保留并从条件类型改为运行时断言(packages/spec 的「编译期 pin」是失效的:tsconfig 排除了 *.test.ts,vitest 也不做类型检查 #4642:本包条件类型 pin 空转)。changeset 论证(major 据实)
rest-server-openapi31-block-removed.md:major(删已发布导出名 ⇒ TS2305;删可作者化键 ⇒ parse 拒绝)。FROM→TO 与一行修法写明:删键即可、无替代值;真实出站 webhook 用automation的Webhook、connector 事件用integration的WebhookEvent;未来 enforce 经 ADR。零元数据迁移(上文论证)。webhook-dual-source-api-side.md的 TO 指引原指向OpenApiWebhookEvent(本 PR 删除的名字),已更正为幸存去处并注明 superseded —— 否则 CHANGELOG 会指导升级者 import 一个不存在的导出。该改名当时未走RENAMED_DEFS(先于 C9 机制),表内无需清理。严格性台账(实跑结论)
check:strictness-ledgerPASS(改动前后均实跑)。api/行属台账「Other directories (coarse; classify per schema before touching)」汇总层,非门禁校验面;用台账自带countSites实测当前 api/ 总数为 411,而行内记录 426 —— 漂移大部分先于本 PR(本 PR 贡献 -3)。按手册 §5「以实跑结论为准、不反射式改」不动该行,漂移事实在此记录。并行协议合规
api/(rest-server)+ 全局登记面(migrations registry / changeset / 生成物),未触碰 system/、contracts/、automation/、integration/、data/、ai/ 的任何 def 文件。./system的 declared-only tenant-provisioning 家族 —— C16 双源清账,基线 12 → 10 (#4739) #4752 落地后,本分支已 rebase 至56470061d,生成物按协议从合并树重新生成(merge driver 主动拒绝 text-merge,rm -rf dist全量重建后gen:api-surface;曾捕获孤儿 dts chunk 把 C16 已删导出带回 api-surface 的 stale-dist 陷阱,清 dist 重建后消除),重跑check:generated8 门全绿 + spec 全量测试,并断言 api-surface delta vs origin/main 恰为本 PR 的六行删除。pre-commit 的 os-regen 钩子亦确认三份延迟生成物 current。flock /tmp/os-heavy-verify.lock+NODE_OPTIONS=--max-old-space-size=4096。.changeset/pre.json开工实测仍mode: pre/tag: rc(v17 窗口内)。验证汇总
check:generated8 门:全绿(rebase 后重跑)check:liveness/check:empty-state/check:skill-examples/check:variant-docs/check:strictness-ledger/check:exported-any/check:dual-source-exports/check:react-declaration-parity全 PASS(liveness 台账无 api/ 条目,rest-server不在 24 元数据类型内,无台账行可动)pnpm --filter @objectstack/spec test:292 files / 7373 tests passed(rebase 后);typecheckPASSpnpm typecheck --concurrency=2:122/122 successfulpnpm check:i18n:9 包 in sync(无 form 变动)content/docs/releases/未触碰🤖 Generated with Claude Code
https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9
Generated by Claude Code