refactor(types,rest,metadata,analytics): Postgres "x" of relation "y" 短语收归 @objectstack/types 一处 - #7021
Merged
os-project-manager merged 3 commits intoAug 9, 2026
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 4 package(s): 19 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
os-project-manager
marked this pull request as ready for review
August 9, 2026 09:53
os-project-manager
deleted the
claude/issue-6615-relation-subobject-phrase
branch
August 9, 2026 10:07
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 #6615
普查结果(先测量,再动手)
卡片说三处,实测也是三处生产站点,另有第四份拷贝在测试里(同一条短语,按 scope 规则一并收编):
packages/rest/src/rest-server.tsmapDataError(#5352)400 INVALID_FIELD而非404packages/services/service-analytics/src/analytics-service.tsMISSING_COLUMN_OF_RELATION(#6035)packages/metadata/src/utils/schema-sync-errors.tsMISSING_TABLE.excludes(#6347)service-analytics/src/__tests__/missing-column-phrase-hard-failure.test.ts:200它们一致吗? A 与 B 逐字节相同;C 刻意不同,且站点注释已写明理由。所以不是「三处不一致、要挑一个最好抽的」——而是两种宽度都对,取决于每处哪个方向的误差安全:A/B 提取,过宽会把真缺表变成硬失败、回退 #5033 的宽容,漏匹配只是消息含糊;C 排除,过宽只是把良性判定变响亮,漏匹配会让
event_seq从 1 重启撞进有行的历史表。故按分诊要求做成两个独立导出,未合并。D 是最值得记的一处:它为「两张面孔别对不上」而写,却把断言打在其中一面的私有复述上——它本身就是它要防的漂移。现改为直接问共享解析器,并顺带断言取出的列名。
卡片正文的两处更正(实测,均已按更正后的事实实施)
卡片正文有两处与
origin/main不符,都在动手前测出,本 PR 按实测结果而非卡片结论实施:packages/metadata不依赖@objectstack/types」——错。packages/metadata与packages/rest的dependencies里都已有@objectstack/types;真正没有这条边的是packages/services/service-analytics(其 deps 仅@objectstack/core+@objectstack/spec)。卡片把「需要检查依赖方向」的警告挂错了包,因此下面「新依赖边」一节讨论的是 service-analytics,而不是卡片点名的 metadata。isMissingTableError(loadMetaFromDb 用 /no such table/i 正则判「良性首启」,其余 sys_metadata 读失败吞成 console.warn + loaded:0 —— isMissingTableError 的手抄第二份 #5841)作为「选家先例」——错。 它并不在@objectstack/types,而在packages/metadata/src/utils/schema-sync-errors.ts,经@objectstack/metadata/errors再导出。唯一约束冲突没有单一判别谓词:仓内四套各自为政的方言词表,REST 的 409 映射漏掉 MySQL(Duplicate entry落成 500 INTERNAL_ERROR) #6250 的 docblock 引用它指的是「命名一个共享判定」这个动作先例,不是落户位置先例。types 里真正的同类先例是unique-violation.ts(唯一约束冲突没有单一判别谓词:仓内四套各自为政的方言词表,REST 的 409 映射漏掉 MySQL(Duplicate entry落成 500 INTERNAL_ERROR) #6250,驱动错误串解析)与module-not-found.ts(framework#3265,「single shared owner … so the parallel loaders cannot drift apart」)——本 PR 依据的是这两个。改动
packages/types/src/relation-sub-object.ts(新,不 import 任何东西):matchMissingColumnOfRelation(message)—— 严格提取器,返回列名isRelationSubObjectPhrase(message)—— 宽检测器,无捕获组(故意,使其无法被误用来提取)两条模式与原站点逐字节相同,行为逐字保持。
反向验证(预测先写盘,三轮)
types红 /rest红 /analytics红 /metadata绿(对照)→ 400 INVALID_FIELD那条)、4 红、588 全绿metadata红 /rest+analytics绿(镜像对照)轮 1 的
metadata全绿与轮 3 的镜像,共同钉住两种宽度仍是两条——合并成一条正是卡片记录在案的风险。轮 1 红 + 轮 2 同一包转绿,才是「B 确实在读这个家」的证明;任一轮单独都不是。超串洞本身在
relation-sub-object.test.ts里被显式钉住:column "label" of relation "sys_team" does not exist逐字包含合法的relation "sys_team" does not exist,且后者能被两处都在用的 postgres 锚点匹配——所以这不是能靠收紧正则绕开的擦边。一条新依赖边 —— 经 PM 裁定 A 保留
@objectstack/metadata与@objectstack/rest本来就依赖@objectstack/types;只有@objectstack/service-analytics需要新增这条边。#6250 立下的「每个消费者都已依赖它,所以采纳从不加边」的条件在这里不成立,故当初显式上报而非默认通过:@objectstack/types的依赖闭包是{@objectstack/spec},而spec无仓内依赖 ⇒ 除spec自身外,任何包都不可能因依赖types成环。这不是判断,是可证的否。core与spec;把一个 Postgres 驱动错误串解析器放进spec(authorable-metadata 的 zod 规范)是范畴错误,放进core则把它与它所仿照的兄弟unique-violation.ts拆开——那才是「绕道」。仅收敛 rest + metadata、把 service-analytics 留在开码状态,等于把漂移恰好留在最近一次踩到这个洞的那个包里([finding]isMissingSourceError仍把 Postgres 的「缺列」措辞column "c" of relation "t" does not exist判为「缺源」——文档明说不该,今天靠读路径不产生该措辞而无害 #6035)。回滚成本:1 行
package.json+ 1 行 import。验证
@objectstack/types9 files / 230 tests、@objectstack/metadata28 / 588、@objectstack/service-analytics71 / 1440、@objectstack/rest73 / 1142 —— 合并origin/main(落后 36 commits)后重装重建复测,全绿。build全过(这三个消费者无typecheck脚本,类型检查走 tsupdts)。pnpm lint绿;check:error-code-casing/check:route-envelope/check:engine-double-contract/check:spec-parsed-alias/check:published-files/check:type-check-coverage/check:nul-bytes/check:empty-changeset全 PASS。check:api-surface经核查仅覆盖@objectstack/spec自身 subpath 基线(无基线提及@objectstack/types),本 PR 未触碰packages/spec,故不涉及。Changeset
@objectstack/typesminor(新增导出、纯追加),三个消费者 patch(内部实现,行为逐字不变)。Generated by Claude Code