Skip to content

[PM seat] domain:metadata — 🟢 os-zhuang #6367

Description

@hotlong

本贴是 domain:metadata 座位的唯一权威登记。 索引 = label:pm:seat,总入口 #4604。本席由维护者 2026-08-07 批准自 domain:engine-core 拆出(PR #6370)。

单写手规则:只有在任座位 PM 编辑本贴正文;接管/移交 = 改正文 + 一条审计评论。争用:动手前重拉正文、审计评论时间戳先到先得、写后回读。活性判定(惰性,仅接管冲突时评估):>24h 无产出可回收。⚠️ 实战修正:该阈值在维护者加急令面前不适用 —— 见注记 13。

范围

engine 的元数据半边:packages/metadata*(含 metadata-fsmetadata-protocolmetadata-core)、packages/platform-objects

红线:⛔ 元数据格式/接受面domain:spec;ObjectQL 编译/查询执行/formula/core runtime 归 domain:engine-core;/meta 路由本体在 packages/restdomain:cli;packages/lint 属 devx(#6715 实测);⛔ content/docs/releases/ 恒不许碰。跨半边按主要落点判,拿不准 FLAG 回分诊。

当前 PM

os-zhuang · session_01W6bLax4KMrSfnE1ydFU8Dw · Seated 2026-08-08T08:35Z

  • 姿态:Round 9 在飞期(2026-08-10T02:1xZ)——在飞 1、等维护者亲 merge 2、队列 3 张全外部依赖。
  • 批次上限 5;常设优先级「继续派发,优先 v17」——⚠️ 本席 v17 板持续为空(02:1xZ 实测 0 张)。
  • protocol.ts 并行授权:区域不相交可并行;落地端逐张串行;同函数/同区域恒不同批。

台账(os-zhuang 任期)

已 MERGED(25 卡 25 PR,零返工零升级)

卡 → PR → commit
#6563#6642 e6025e9 · #6417#6666 bb7cb417c · #5079#6687 114e72795 · #6036#6700 61282f906 · #6285#6708 a5d25734c
#6479(v17)→#6709 252f71bd6 · #6620(v17)→#6768 75e6871bf · #6660#6767 d42a92fc6 · #6418#6770 bed427f7e · #6602(v17)→#6779 4bb6f01af
#6659#6787 e78760861 · #6621(v17)→#6807 271cee131 · #6562#6811 5e247fd6b · #6772#6817 50a8d115a · #6640#6823 2ab1257c9
#6771(major,ADR-0087)→#6824 9960cd2a0 · #6780(v17)→#6826 725c7b023 · #6699#6845 53aeb027f
#6710(A1 裁决,v17)→#6971 30283263c · #6848#6989 c733ae8e0 · #6924#6996 6443b792c · #7012(止血 C)→#7093 f6e59f7e1 · #6994#7096 9f7a7c25a
#7000(dry-run 不留痕 FS 半边)→#7152 a1b66efbb · #6992(冷启动审计扩 live registry)→#7154 bf32d4a0e

v17 摘 7 张。派发 30 单 30 中(25 落地 + 2 停 ready 待人工闸 + 3 STOP 设计出口;另 1 张让位他席后落地)。

后继卡必读的落地事实:

  1. #4463 运行时发布门在 host-config 拓扑(environmentId 未绑定)上整体不跑——#5086 只把 code-only 拒绝移出了同一条短路 #6710 —— 发布门改读 authoringChannel,默认在装配缝与构造器两处解析。⚠️ [finding] validateEmptyCombinators gates the runtime publish path for flow only — the other filter-carrying metadata types reach the same door ungated #6715 实测边界:它 settle 的是哪些 kernel 激活门,不是哪些 type 门会 dispatch(后者是 [P2] 运行时授权门扩到 object 写入 + 全量 runtime-safe 规则快照(#4463 P1 之后) #4716,零类型开放)。cloud control-plane-preset.ts:99 一行声明为实际欠账
  2. Stop-the-bleed: tier-3 heal must not unregister a package-bound object — decide on the contributor's package binding, not isArtifactBacked (#6853 ruling C) #7012 —— tier-3 heal 改判 owner contributor 的 package binding;判据有证明(splice 只在两 id 匹配时触发 ⇒ 幸存 contributor 可证明携带 packaged owner id)。故意不问 enabled/status、不问 manifest objects 列表。
  3. assertSortFieldsExist's dotted-path SORT hint also prescribes an unmaterializable "formula or rollup" denormalization — same defect class as #6673, different axis #6924 + A non-dotted orderBy naming a formula field answers 200 in arbitrary order — the sort is silently dropped (measured on driver-sql + driver-memory) #6994 —— SORT 轴两半(dotted hint 改判 stored field;非 dotted formula 排序 400 INVALID_SORT)。⚠️ summary/rollup 真实列可正确排序;spec 的 COMPUTED_VALUE_TYPES契约不可用于 gate 排序。⚠️ 已知未覆盖:直接调 engine.find() 的内部调用方仍静默丢排序,套件内有 RECORD OF A KNOWN HOLE pin 断言该未修复行为,应在 engine.find() still drops a formula ORDER BY silently — decide whether the engine refuses or keeps its internal-caller tolerance #7095 落地时变红。
  4. cli/metadata: os migrate plan still creates .objectstack/metadata/ on a fresh project (the residual half of #6743's dry-run write side effect) #7000 —— FileSystemRepository.start() 不再建目录,改由 ensureRoot()put()/delete() 时建。⚠️ 必须的补偿:chokidar 无法 watch 不存在的路径,故 start() 仅在 root 存在时装 watcher、ensureRoot() 在 root 出现时装 —— 无此补偿会静默杀掉外部编辑检测(反向验证的 variant 2 专测此点)。⚠️ 更正:cli/driver-sql: os migrate plan 自称 dry-run,却仍会在全新项目上创建空数据库文件(#6469 的残余写副作用) #6743 的数据库半边(PR fix(cli,driver-sql): os migrate plan stops creating a database on a fresh project (#6743) #6997)尚未合并,故本 pin 只断言 metadata 路径而非 .objectstack/ 整体。落点是 packages/metadata-fs(包已拆分),非 packages/metadata
  5. Plugin-registered metadata types can carry org-scoped rows that cold boot skips — neither refused nor reported #6992 —— 冷启动审计扫描 = 声明的非 org-overridable 类型 ∪ 注册表未声明的全部 live 类型,经新的 listLiveMetadataTypes()拒绝区未动且分歧被测试钉死(未来"顺手统一"会挂 CI)。boot 顺序实测:内核 Phase 1 跑完全部 init 才进 Phase 2 审计 ⇒ 扩宽是活的;真正载体是 SchemaRegistry 而非 metadata service。flood 实测:扩宽增加段不增加行。

在飞(1 张)

停 ready 等维护者亲 merge(⛔ 永不挂 AM、不进队列;#6741)

PR head
#6981 #6825 ADR-0005 §Index migration 三句现逐句为假 ⇒ Amended 段 + 横幅 + Status 行;顺带补两个从未锚定的 owner 文件 c4ac01f3e
#7087 #6853 ADR-0029 修订提案(裁决 B 的设计交付) 746c47d

#7087 的 D9(实现卡必读):租户 overlay 注册为第三种非拥有 overlay kind,replace 语义作用于 base 层(base = overlay ?? own,extender 照常折叠)。决定性论据:逐位解析出与今日 splice 相同的结果 —— 动的只是注册表记住什么,不是呈现什么 ⇒ assertSingleOwnerPerObject 字面不变、computeFQN 保持 identity、base 选择按 kind 而非 priority。⚠️ 单独一条:getArtifactItem 的 object 分支须读 owner contributor 而非合并 body,否则 B 落地后 isArtifactBacked 仍说谎。#6995 被模型吸收。两处 open:ADR-0005 的「Amended by」指针待接受时再加;「迟装」留给实现卡。
维护者 08-10 01:0xZ 索要过业务解释,已答(定制地基 / 恢复默认无默认可恢复 / 撤销定制反而注销整个对象的 404 / 假成功保存;需裁因必须新增第三种 kind —— 当 extender 会夺走「定制删字段」能力,当第二 own 破坏单一所有者)。

队列与供给(3 张,全部外部依赖;可派 0)

跨车道备忘

运维注记(本任期实测,交接必读)

  1. flip 定点 6-9 分钟核 job 结论;AM 首挂可能静默失效 —— 落地双读数是唯一抓手;读 main 窗口宁大勿小AM 返回值字段为空是本仓已知假警报(六次实证)——判准是队列分支出现
  2. 台账读数会过期:跨席/决策箱条目消费前必须回源核实。裁决常由他席 PM 会话代记 —— 只认卡上评论。⭐ PM 自己也会传播陈旧读数:cli/metadata: os migrate plan still creates .objectstack/metadata/ on a fresh project (the residual half of #6743's dry-run write side effect) #7000 派发令称「cli/driver-sql: os migrate plan 自称 dry-run,却仍会在全新项目上创建空数据库文件(#6469 的残余写副作用) #6743 数据库半边已落地」,dev 实测发现 PR fix(cli,driver-sql): os migrate plan stops creating a database on a fresh project (#6743) #6997 仍是 open draft —— 我照抄了卡正文的措辞而没核。
  3. session limit 灭批 ×3(共 11 人次):SendMessage 复活零丢失;按名字不可达时用 spawn 返回的 agentId 直发
  4. worktree footgun ×3:git checkout <ref> -- <path> 首提交前静默回退。复盘项:进 os-dev 定义。
  5. 派发令三分区 + 后继定价必答项:30 单 30 中零返工。文件锚点会漂移 —— 锚定函数名而非行号(engine.ts 一天漂 ~800 行;repository.ts 甚至换了包)。
  6. 开发产出的 PR body 必须英文。
  7. needs_decision / STOP 是设计出口而非返工:#4463 运行时发布门在 host-config 拓扑(environmentId 未绑定)上整体不跑——#5086 只把 code-only 拒绝移出了同一条短路 #6710[finding] validateEmptyCombinators gates the runtime publish path for flow only — the other filter-carrying metadata types reach the same door ungated #6715Registry heal restores the metadata-map view but never re-registers a packaged contributor definition an overlay save replaced #6853(升级获裁 → 拆出止血卡 Stop-the-bleed: tier-3 heal must not unregister a package-bound object — decide on the contributor's package binding, not isArtifactBacked (#6853 ruling C) #7012 已落地 + ADR 提案 docs(adr-0029): amend D3 — a tenant object overlay is its own contributor layer (#6853) #7087)。菜单须给推荐 + 每项长期代价。
  8. 晋级不等于已验证 —— 消费分诊晋级时必须回读未兑现的前置闸(四次实证)。Registry heal restores the metadata-map view but never re-registers a packaged contributor definition an overlay save replaced #6853 的越闸理由被实测正面证伪,裁决据此正式撤回该前提。处置:改 verification-first / decision-scoping 派发。
  9. 反向验证的四种诚实结果都要保留:预测中的红;预测漏的红(记原因);双向绿的行(guards 非证据);因短路而未被测量的预测(明说不 claim)。无测试覆盖的改动应直言「无反向验证」并改报 gate 输出 —— 伪造的比缺席的更糟。⭐ revert 到自己的 base,不是移动中的 origin/main。⭐ 测试替身比真实实现「更能干」是缺陷发生器(A non-dotted orderBy naming a formula field answers 200 in arbitrary order — the sort is silently dropped (measured on driver-sql + driver-memory) #6994:stub 交回活引用 ⇒ 虚拟值被持久化)。⭐ 读到陈旧构建的反向验证等于没测(cli/metadata: os migrate plan still creates .objectstack/metadata/ on a fresh project (the residual half of #6743's dry-run write side effect) #7000:第一次 revert 全绿,因 plugin 测试导入 dist;重建后如预测变红)。⭐ 变体验证:除「修复有效」外,再跑一个「天真修复」变体证明补偿是必需的(cli/metadata: os migrate plan still creates .objectstack/metadata/ on a fresh project (the residual half of #6743's dry-run write side effect) #7000 的 variant 2)。
  10. PM 的机制假设会错,必须公开纠正(本任期九次,九次零返工):[finding] validateEmptyCombinators gates the runtime publish path for flow only — the other filter-carrying metadata types reach the same door ungated #6715 注册表注释、fix(metadata-protocol): the dialect arm of classifyIndexFailure walks cause to the conflict arm's depth (#6848) #6989 可复用 collector、fix(metadata-protocol): the dialect arm of classifyIndexFailure walks cause to the conflict arm's depth (#6848) #6989 cycle-safety、Registry heal restores the metadata-map view but never re-registers a packaged contributor definition an overlay save replaced #6853 三卡同行、assertSortFieldsExist's dotted-path SORT hint also prescribes an unmaterializable "formula or rollup" denormalization — same defect class as #6673, different axis #6924 rollup 虚拟、Stop-the-bleed: tier-3 heal must not unregister a package-bound object — decide on the contributor's package binding, not isArtifactBacked (#6853 ruling C) #7012 getPackage 返 null、A non-dotted orderBy naming a formula field answers 200 in arbitrary order — the sort is silently dropped (measured on driver-sql + driver-memory) #6994 materializability 不可答、cli/metadata: os migrate plan still creates .objectstack/metadata/ on a fresh project (the residual half of #6743's dry-run write side effect) #7000 只有读路径需要目录(实测是 watch 路径需要)、Plugin-registered metadata types can carry org-scoped rows that cold boot skips — neither refused nor reported #6992 metadata service 是载体(实测是 SchemaRegistry)。派发令的「机制假设(须实测,鼓励证伪)」分区正为此存在。
  11. PM 亦会程序性失误:[docs] ADR-0005 的「Index migration」段落描述的是已不存在的机制:addSysMetadataOverlayIndex 已随 #6771 删除,段落还写着 project_id 与 partial 键 #6825 派发前未读完卡上评论却写了「冲突时以分诊为准」。教训:派发前必须读完卡上全部评论
  12. ACCEPT 绑定 head sha:head 变动须重核门禁(不重做 step 7,只把证据重锚到会真正合并的 head)。
  13. ⭐⭐ 空窗代价:09:26Z→14:01Z 空了 ~4.5 小时,期间维护者裁了 org 作用域的 flow overlay 只在「本进程内发布后」绑定触发器,重启后静默失绑——冷启动两条读路径都把 organization_id 非空的行滤掉了 #6190、HOLD 解除,本席未接,他席按加急令正当接管。教训:(a) 长空窗后第一动作必须全面回源;(b) 遇他席正当接管立即公开 stand down 并留下免重推导的信息结局:org 作用域的 flow overlay 只在「本进程内发布后」绑定触发器,重启后静默失绑——冷启动两条读路径都把 organization_id 非空的行滤掉了 #6190 顺利落地,两边零浪费。
  14. 被踢出合并队列先读签名:无 triage 机器评论 + head 未变 + PR 全绿 + mergeable_state: clean + 整队清空且同批他卡已落地 ⇒ 判分组批次连带,可直接重挂(fix(metadata-protocol): tier 3 refuses to unregister an object bound to an installed package (#7012) #7093 实证一次即过)。
  15. 「仅在门口拒绝」必须回答「是否留下未覆盖调用方」(A non-dotted orderBy naming a formula field answers 200 in arbitrary order — the sort is silently dropped (measured on driver-sql + driver-memory) #6994 立范):答「是」时把缺口做成标注 KNOWN HOLE 的 pin(断言未修复行为 + 注明应在另一半落地时变红)并另立卡,而非写一句免责声明。
  16. 不给自己没测过的东西定级(metadata-fs: the FileSystemRepository chokidar watcher is inert in the production layout — its own ignored dotfile regex matches the .objectstack segment of the root path #7150 立范):立卡者未打 finding 标签,把两种读法都写出来交分诊 —— 因为决定严重性的那个输入(是否真有人在进程外编辑)没被测量。
  17. 改完回头验证自己的措辞是否仍字面为真,结论干净也要把这次检查报出来(Plugin-registered metadata types can carry org-scoped rows that cold boot skips — neither refused nor reported #6992getMetaItems 的检查)。
  18. SKILL 复盘:前任 [skill] pm-dispatch: 5 lessons from the domain:metadata seat's first term (8 cards MERGED / 0 rework / 4 dev-side falsifications) #6644;本任期复盘立卡安排在座位移交/收工信号时,候选见注记 4/8/9/12/13/14/15/16/17。

定时器:巡逻链 send_later(现役 trig_017EA891pnNYSGY4d2yRPXxL @ 2026-08-10T02:50Z);旧钟均已 spent。

Metadata

Metadata

Assignees

Labels

domain:metadatapm:seatPM seat registry issue - single-writer body, index = this label

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions