本贴是 domain:metadata 座位的唯一权威登记。 索引 = label:pm:seat,总入口 #4604 。本席由维护者 2026-08-07 批准自 domain:engine-core 拆出(PR #6370 )。
单写手规则 :只有在任座位 PM 编辑本贴正文;接管/移交 = 改正文 + 一条审计评论。活性判定(惰性):>24h 无产出可回收 —— ⚠️ 该阈值在维护者加急令面前不适用(注记 14)。
范围
packages/metadata*(含 metadata-fs、metadata-protocol、metadata-core)、packages/platform-objects。
红线:⛔ 元数据格式/接受面归 domain:spec(#6017 );ObjectQL 编译/查询执行/formula/core runtime 归 domain:engine-core;/meta 路由本体在 packages/rest 归 domain:cli;packages/lint 属 devx;⛔ content/docs/releases/ 恒不许碰。
⚠️ #6017 与 #6298 不是一回事 :接受面变更归 #6017 。⭐ 但 STOP 条件要写「改 接受面」而非「碰 spec」(注记 25)。
⭐⭐ 技能已于 2026-08-10T10:2xZ 重载(#7341 落地版)—— 四条改变本席行为
⛔ 旧交接笔记/转述里的旧规则一律以本节覆盖。
模型三档,逐卡显式传 model :下限 sonnet(机械卡)/ 默认 opus(判断卡)/ 上限 claude-fable-5。⛔ 强制条款 :凡改 .claude/skills/pm-dispatch/** 的卡一律 claude-fable-5 —— 本席任期复盘(注记 23)因此只能立卡派发,⛔ 不由 PM 自己编辑 。
M 及以上默认 mode:cloud 单独派卡 ;只有 S 级机械卡 留 mode:subagent。
报告在草稿 PR 时点到达([skill] pm-dispatch: 5 lessons from the domain:metadata seat's first term (8 cards MERGED / 0 rework / 4 dev-side falsifications) #6644 L2) ⇒「报告到了、CI 还没绿」是预期常态 ;CI 收敛 / 转 ready / 入队 / 落地全归 PM 。
派发令只带增量 (标准条款已下沉 .claude/agents/os-dev.md,⛔ 不粘正文);认领评论加 Container & model + Serial constraints cleared 两行。
当前 PM
os-zhuang · session_01W6bLax4KMrSfnE1ydFU8Dw · Seated 2026-08-08T08:35Z
姿态 :波次收工点(2026-08-10T12:0xZ)—— 在飞 0、决策箱 0、队列 2(均有未兑现的重启条件) 。本任期首次批次清零。
批次上限 5 ;常设指令「继续派发,优先 v17」——⚠️ v17 板连续五次探测为空 。
台账(os-zhuang 任期)
已 MERGED(34 卡 34 PR,零返工零升级)
判据统一 :六张新卡均以主题形状 无界 grep 命中 + 单父提交 确认 squash + 文件面与声明逐一相符,卡均 closed/completed,均已退订。
v17 摘 7 张。派发 38 单 38 中 (34 落地 + 4 STOP 设计出口;另 1 张让位他席后落地)。连带关闭 #6995 (非行政性,见事实 10)。
后继卡必读的落地事实 :
#4463 运行时发布门在 host-config 拓扑(environmentId 未绑定)上整体不跑——#5086 只把 code-only 拒绝移出了同一条短路 #6710 —— 发布门改读 authoringChannel。⚠️ 它 settle 的是哪些 kernel 激活门,不是哪些 type 门 dispatch(后者是 [P2] 运行时授权门扩到 object 写入 + 全量 runtime-safe 规则快照(#4463 P1 之后) #4716 )。cloud control-plane-preset.ts:99 一行声明为实际欠账 。
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 —— 已随 D9 退役,复查完成,永久划掉 (installedPackageBindingForObject 在 main 零命中)。
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 轴两半。⚠️ 已知未覆盖 :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 落地时变红。
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 —— start() 不再建目录;chokidar 无法 watch 不存在的路径是必须的补偿 。⚠️ 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 )仍未合并 。
Plugin-registered metadata types can carry org-scoped rows that cold boot skips — neither refused nor reported #6992 —— 冷启动审计扫 live registry;真正载体是 SchemaRegistry 。
[finding][drivers] DriverQuery 已经存在,但几处驱动调用方仍在用 as any / as QueryAST 兜住冗余的 object —— 连带把 where/orderBy/fields 的检查一起关掉 #6231 —— 三个读 helper 的参数改 DriverQuery,九个调用点 恢复检查。三个相邻 cast 被 EngineQueryOptionsSchema.search rejects the bare query string that ADR-0061 D1 calls canonical — so every engine caller that wants it must as any, losing the whole query's checking #7178 阻塞。
docs(adr-0029): amend D3 — a tenant object overlay is its own contributor layer (#6853) #7087 = ADR-0029 D9 设计 ;Implement ADR-0029 D9 — register a tenant object overlay as its own contributor layer instead of splicing out the packaged owner #7277 /f16e54e1d = D9 实现 。
⭐ metadata-fs watcher tests are merge-queue flaky, and #7208's 20s deadline hardening did NOT fix it — the event is suppressed, not late #7282 (ab07b5382)—— watcher 致盲窗口,生产缺陷非仅 flake 。chokidar 初扫异步 与首写竞争 ⇒ 目录 stat 永不再变,该路径终进程生命期无任何事件 。⚠️ 调 interval 效果精确为零 。修法:put() 经 trackWrittenPath 显式注册。⚠️ 遗留 metadata-fs: selfWrites suppression is time-keyed, so a poll tick landing inside the 200 ms window can swallow an external edit #7335 。
⭐ findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321 (d53bd0ba9)—— findData normalizer 的 arity 检查 ,跑在 $ 别名 pass 与 [P2] protocol.ts implements 4 of the 5 documented RPC alias precedences backwards — and disagrees with http-dispatcher.ts on three of them #3795 fold 之前 。⭐ leftover 桶 ⇒ 200 下的空页 (比 NaN 更糟)。⚠️ 数组合法的槽位不许一刀切;处置表由别名表派生 。⚠️ 遗留 finding: a repeated ?filter= on GET /data/:object cannot be told from a filter AST, so it is diagnosed as a malformed filter (and, rarely, succeeds) #7390 。
⭐⭐ Implement ADR-0029 D9 — register a tenant object overlay as its own contributor layer instead of splicing out the packaged owner #7277 (f16e54e1d)—— D9 实现 。overlay = 第三种非拥有 kind,base = overlay ?? own,解析逐位不变 。⚠️ D9.6 的成本已被维护者批准为一致读法 :重置亦被拒(仓库侧检查拓扑无关)。
⭐⭐ [finding] watch-dot-root.test.ts case 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 (2c4056b12)—— 计时形状加固,并证明了 ab07b5382 的修复面 。dev 先测量后编辑 :卡的原故障模式已消失 (事件 120/120 到达)⇒ 交付物明确不认领 他人功劳。剩下的是第二机制(投递 24–36s vs 硬编码 20s),同批迭代内 A/B 旧红 5/8、新绿 8/8。⭐ 精确计数保留但理由被更正 (重复投递不可能产生第二个事件;它真正防的是另一个 事件混入)。⭐ 一次预测落空催生了修复的另一半 (hookTimeout 成为下一个绑定预算)。⚠️ 遗留 [finding] watch-dot-root.test.ts case 2's 4s quiet window degrades to a false pass under load — measured against 32-36s delivery #7408 (负向用例的静默窗越忙越「通过」 )。
⭐⭐ A legacy env overlay on an artifact-backed item of a rolled-back type can no longer be REMOVED through the ordinary delete path (403) — only via OS_METADATA_WRITABLE #6960 (30bed706d)—— 档位边界靠 supportsOverlay 机械分离 。放行 delete 的是注册表自己的标志 而非硬编码类型清单 ⇒ object 档(supportsOverlay: false)结构上 够不着,不靠谁记得排除。两个拒绝点都动了(deleteMetaItem 的 environmentId 分支 + SysMetadataRepository.delete 新增 assertDeleteAllowed),后者拓扑无关 ,故控制面 kernel 同样被释放。⭐ 变体验证是接受它的理由 :把谓词放宽到所有 artifact-backed 类型 ⇒ D9 的 pin 文件 2 failed | 14 passed,恰是它那两条 delete pin。⚠️ 实际放行面比裁决枚举的六型宽 (含 tool/skill,同为 supportsOverlay: true),已在 PR 上显著标出供否决。⚠️ 遗留 deleteMetaItem's catch re-wrap drops the error code, so a repository refusal reaches the caller as a 403 with no catalogued code #7426 。
⭐⭐ [P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 (89d7b35a7)—— 成功路径的返回通道 。evaluateRuntimeAuthoringGate 由 => Error | null 改为返回 { error, advisories } 记录;saveMetaItem 仅非空时 展开该键 ⇒ 干净保存的响应字节不变。⭐ 契约半边比要求的更好:RuntimeAuthoringIssueSchema 在 packages/spec 声明一次 、metadata-protocol 再导出 ,删掉了一份平行手写接口。⭐ R4 把裁决里「已接受的代价」变成了实测 :无条件发 advisories: [] ⇒ 新增三条缺席 pin 红、既有五条 [#5563 附带裁决] SaveMetaItemResponseSchema 补齐实现实际返回的字段(version / seq / state / projectionApplied) #5745 用例全绿 ⇒ 既有闸门对这一类结构性失明 ,故声明必须刻意。⭐ 一次探针自曝无效 (把 spec build 重定向到 /dev/null、build 实际失败、测试读到陈旧 dist 报出假绿)—— dev 自己抓到并可见地重跑,再跑又暴露出构建期 的 authorable-surface 棘轮。⚠️ 类型级绑定今天无人检查 (metadata-protocol 无 typecheck script、tsup 不做类型检查,[P2] framework: 66 个包用 tsup 构建、无人做类型检查 —— 实测 18 个包共 380 处 code-tier 错误(#4118 的 framework 侧对应) #4311 );运行时绑定有 pin。
在飞 —— 0 (本任期首次清零)
决策箱(维护者)—— 0 张
本任期已裁,⛔ 勿重新提问 :#4717 (07:33Z 三问全按推荐)、#6960 (07:36Z delete 侧移动)、#7306 问题二 (hotlong 09:0xZ 批准 ⇒「重置亦被拒」的一致读法裁定成立 )。
队列(2 张,重启条件均未兑现)
本任期新立/待分诊 finding(⛔ 只记录不催)
本车道 :#7216 (点号守卫过窄)· #7390 (重复 ?filter= 与 filter AST 不可区分 ⇒ 拒绝归错因,偶发静默成功 )· #7408 (静默窗越忙越通过 )· #7426 (deleteMetaItem 的 catch 重包丢 code ⇒ 控制面拒绝到达调用方是 403 + code: undefined;这解释了 D9 控制面 pin 为何只断言消息子串 )
#4717 的三个拆分半边(12:0xZ 立,见注记 26) :objectui#4133 (Studio 渲染 advisory)· #7442 (docs「the gate」补第四列)· #7443 (P3 surfaces 泛化 —— ⚠️ 已写明先按 appetite 判该不该做 ,并指向 #7220 作为可能的真实拉动)
其他车道 :#7150 · #7177 · #7178 (阻塞 #6231 三个 cast)· #7294 · #7335 · #7095 · objectui#3950 · 本车道 pm:blocked:#7309 、#7134
运维注记(交接必读)
⭐⭐ AM 回报值完全不可诊断,判准只有队列分支或 main 上的 commit —— 本班四次 实测。两个形态:(a) method: MERGE(请求 SQUASH)—— 按结果测 fb5ebc5df/ab07b5382/f6e59f7e1 全部单父 squash ;(b) 空字段返回 —— 技能注记 21 说这是「只武装不入队」的签名、处方是翻转一次,而 fix(metadata-fs): register written paths with the watcher instead of trusting its scan (#7282) #7336 /fix(metadata-protocol): check query-parameter arity in findData's list-query normalizer (#7321) #7386 /test(metadata-fs): derive the dot-root watcher waits from the case budget instead of a fixed 20s race (#7369) #7409 /fix(metadata-protocol): allow REMOVING a legacy env overlay on a rolled-back overlayable type (#6960) #7429 /feat(spec,metadata-protocol): put the runtime authoring gate's advisory findings on the save response (#4717) #7435 五次空字段返回、五次正常入队 。⛔ 据回报值行动 = 去扰动一个正在正常排队的 PR。
⭐⭐ 队列分支缺席同样不能证否入队 —— max_entries_to_build 会截断。11:2xZ 实测:feat(spec,metadata-protocol): put the runtime authoring gate's advisory findings on the save response (#4717) #7435 有 webhook 确认入队却没有分支 ,fix(metadata-protocol): allow REMOVING a legacy env overlay on a rolled-back overlayable type (#6960) #7429 两者皆无。真正的判别式是「队列整体有没有动」 :队列未动 ⇒ 缺席无信息,⛔ 不许动;队列已动而只有本卡缺席 ⇒ 才命中注记 21 的签名。11:42Z 复核:队列前进且两条分支同时出现,歧义自解、零动作。
⭐⭐ 继承来的状态句必须回源核实 (三次实证)。⛔ 绝不可用 git log -N ;git log 默认无界 。⚠️ grep 会命中 body —— 用主题形状 --grep='(#7386)' 并核 parents。
裁决常由他席 PM 会话代记 —— 只认卡上评论。
session limit 灭批 ×3(11 人次):按 agentId 直发可复活,零丢失。
worktree footgun ×3:git checkout <ref> -- <path> 首提交前静默回退。
派发令三分区 + 后继定价必答项:38 单 38 中零返工 。锚定函数名而非行号。
PR body 必须英文。
STOP / needs_decision 是设计出口而非返工 (4 次)。三项决策已被维护者全数按推荐裁定 —— 菜单质量直接决定裁决速度。
⭐ 晋级不等于已验证 —— 须回读未兑现的前置闸 (六次)。[P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 最锋利:裁决解决了「该不该做」,却没兑现「谁先做」,而真正的硬闸(同函数栅栏)根本不在裁决里。
反向验证的四种诚实结果 :预测中的红;预测漏的红(记原因);双向绿的行 (guards 非证据);因短路未测量的预测 (明说不 claim)。⭐ revert 到自己的 base。⭐ 测试替身「更能干」是缺陷发生器(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 )。⭐ 读到陈旧构建等于没测(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 ;[P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 的 R1 首跑即此形,dev 自曝并重跑 )。⭐ 变体验证 (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 、findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321 、A legacy env overlay on an artifact-backed item of a rolled-back type can no longer be REMOVED through the ordinary delete path (403) — only via OS_METADATA_WRITABLE #6960 最决定性 —— 过宽修复让 D9 的 pin 变红)。⭐ 自我防御验证([finding][drivers] DriverQuery 已经存在,但几处驱动调用方仍在用 as any / as QueryAST 兜住冗余的 object —— 连带把 where/orderBy/fields 的检查一起关掉 #6231 )。⭐ 红的确定性也要预测 (metadata-fs watcher tests are merge-queue flaky, and #7208's 20s deadline hardening did NOT fix it — the event is suppressed, not late #7282 ,5/5)。⭐ 断言要连 code 和 status 一起断 (findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321 )。⭐⭐ 预测落空往往是修复不完整的唯一信号 ([finding] watch-dot-root.test.ts case 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 的 hookTimeout)。⭐⭐ 在替身上测到的红要说明它是替身上的 ([finding] watch-dot-root.test.ts case 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 )。⭐⭐ 把「已接受的代价」做成实测 ([P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 的 R4:证明既有闸门对该类结构性失明)。
⭐ PM 的机制假设会错,必须公开纠正 (九次,九次零返工)。
PM 亦会程序性失误 :[docs] ADR-0005 的「Index migration」段落描述的是已不存在的机制:addSysMetadataOverlayIndex 已随 #6771 删除,段落还写着 project_id 与 partial 键 #6825 派发前未读完评论;[P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 把 STOP 误指向 [PM seat] domain:spec-surface — 🟢 os-help #6298 ;findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321 曾按「同文件」过度排序(注记 22);用了不存在的 git 参数并吞掉 stderr(注记 25);[finding] watch-dot-root.test.ts case 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 派发令写死「必须带 changeset」而 test-only PR 应走 skip-changeset(dev 正确偏离并提问,已当众更正) ;[P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 的三个拆分半边「在派发时声明了、却没有立卡」(注记 26) 。
⭐ ACCEPT 绑定 head sha :head 变动须重核门禁。
⭐⭐ 空窗代价 :~4.5 小时空窗期间他席按加急令正当接管。教训:长空窗后第一动作全面回源 ;遇正当接管立即公开 stand down 并留下免重推导的信息 。
⭐ 被踢出合并队列先读五项签名 (fix(metadata-protocol): tier 3 refuses to unregister an object bound to an installed package (#7012) #7093 )。
⭐ 「仅在门口拒绝」必须回答「是否留下未覆盖调用方」 (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 )。
⭐ 不给自己没测过的东西定级 (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 )。
⭐ 改完回头验证自己的措辞是否仍字面为真 (Plugin-registered metadata types can carry org-scoped rows that cold boot skips — neither refused nor reported #6992 )。
⭐ 纪律的目的达成后,剩下的形式不是保护 (docs(adr-0029): amend D3 — a tenant object overlay is its own contributor layer (#6853) #7087 )。⚠️ 边界:批准尚未到位时不适用 。feat(objectql,metadata-protocol)!: register a tenant object overlay as its own contributor layer (ADR-0029 D9) #7306 完整走完这条曲线 。
⭐⭐ 卡上写的「机制」本身也会错,不只是 PM 的假设 (metadata-fs watcher tests are merge-queue flaky, and #7208's 20s deadline hardening did NOT fix it — the event is suppressed, not late #7282 首证,[finding] watch-dot-root.test.ts case 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 再证且更彻底 —— 连卡赖以成立的那次踢出都已被别处修掉)。已制度化 :这一族的派发令第一条一律是「先测量再编辑 」。
⭐ 排序约束要按原话核对,过度排序也是成本 (findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321 )。反转三理由:(a) 阻塞方是时长不定的人工按钮 ;(b) 他席的已裁变更正卡在本卡身上 ;(c) 串行落地由合并队列保证 。结果佐证:并行编写零冲突,六张卡先后干净落地。
⭐⭐ 消费晋级时,先 grep 在飞 PR 有没有把相反行为钉成 pin (A legacy env overlay on an artifact-backed item of a rolled-back type can no longer be REMOVED through the ordinary delete path (403) — only via OS_METADATA_WRITABLE #6960 / [P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 / [P2] 运行时授权门扩到 object 写入 + 全量 runtime-safe 规则快照(#4463 P1 之后) #4716 三次实证,三次都不在裁决里写着 )。
SKILL 复盘:前任 [skill] pm-dispatch: 5 lessons from the domain:metadata seat's first term (8 cards MERGED / 0 rework / 4 dev-side falsifications) #6644 ;⚠️ 本任期复盘只能立卡派发、强制 claude-fable-5 ,⛔ 不由 PM 自己编辑技能。候选见注记 1/2/3/10/11/13/20/21/22/23/25/26。
⭐⭐ 判定用的命令要先证明自己有效,且永远不要吞它的 stderr 。--no-max-count 不是 git 参数,同行的 2>/dev/null 把 fatal 吞成「干净的空结果」并被当成证据。
⭐⭐ 「派发时拆分」必须是 立卡**,不是在派发令里声明 。** [P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 的正文有四个勾选项,维护者 2026-08-07 裁定其中三个(objectui 渲染 / surfaces 泛化 / docs 第四列)拆出别席。本席在认领评论与派发令里都写了 这条拆分 —— 然后 PR 以 Fixes #4717 合并、卡整张关闭,而那三张后继卡当时并不存在 。差点让一次「已声明的拆分」变成一次静默的范围吞并。12:0xZ 补立三张(objectui#4133 / docs: the "the gate" table has no fourth column for the runtime publish surface (#4463 P1 shipped one) #7442 / [P3] Generalise the lint rule surfaces axis to an open N-surface dimension (#4463 P1 introduced a closed two-value one) #7443 )。⇒ 规则:凡在派发令里写「X 拆出别席」,同一动作里就把 X 立出来 ;拆分的存在性判据是卡号 ,不是句子。次选形态是 PR 首行用 Part of #N 而非 Fixes #N(技能里已有的那条),但立卡优先 —— Part of 只是让父卡不关,不会让缺失的半边有人认领。
定时器 :巡逻链 send_later(现役 trig_01FDDuG7wLRVeoPh2wnhVVjw @ 2026-08-10T12:13Z)。
本贴是
domain:metadata座位的唯一权威登记。 索引 =label:pm:seat,总入口 #4604。本席由维护者 2026-08-07 批准自domain:engine-core拆出(PR #6370)。单写手规则:只有在任座位 PM 编辑本贴正文;接管/移交 = 改正文 + 一条审计评论。活性判定(惰性):>24h 无产出可回收 ——⚠️ 该阈值在维护者加急令面前不适用(注记 14)。
范围
packages/metadata*(含metadata-fs、metadata-protocol、metadata-core)、packages/platform-objects。红线:⛔ 元数据格式/接受面归
⚠️ #6017 与 #6298 不是一回事:接受面变更归 #6017。⭐ 但 STOP 条件要写「改接受面」而非「碰 spec」(注记 25)。
domain:spec(#6017);ObjectQL 编译/查询执行/formula/core runtime 归domain:engine-core;/meta路由本体在packages/rest归domain:cli;packages/lint属 devx;⛔content/docs/releases/恒不许碰。⭐⭐ 技能已于 2026-08-10T10:2xZ 重载(#7341 落地版)—— 四条改变本席行为
⛔ 旧交接笔记/转述里的旧规则一律以本节覆盖。
model:下限sonnet(机械卡)/ 默认opus(判断卡)/ 上限claude-fable-5。⛔ 强制条款:凡改.claude/skills/pm-dispatch/**的卡一律claude-fable-5—— 本席任期复盘(注记 23)因此只能立卡派发,⛔ 不由 PM 自己编辑。mode:cloud单独派卡;只有 S 级机械卡留mode:subagent。.claude/agents/os-dev.md,⛔ 不粘正文);认领评论加Container & model+Serial constraints cleared两行。scripts/pm/dispatch-gates.mjs可用(check:*,已由他席立dispatch-gates.mjsprints package-scoped gates as barecheck:*, so two independent devs concluded an existing gate does not exist #7440);check-half-states.mjs本容器 401,⛔ 别当「无半状态」。当前 PM
os-zhuang·session_01W6bLax4KMrSfnE1ydFU8Dw· Seated 2026-08-08T08:35Z台账(os-zhuang 任期)
已 MERGED(34 卡 34 PR,零返工零升级)
e6025e9· #6417→#6666bb7cb417c· #5079→#6687114e72795· #6036→#670061282f906· #6285→#6708a5d25734c252f71bd6· #6620(v17)→#676875e6871bf· #6660→#6767d42a92fc6· #6418→#6770bed427f7e· #6602(v17)→#67794bb6f01afe78760861· #6621(v17)→#6807271cee131· #6562→#68115e247fd6b· #6772→#681750a8d115a· #6640→#68232ab1257c99960cd2a0· #6780(v17)→#6826725c7b023· #6699→#684553aeb027f30283263c· #6848→#6989c733ae8e0· #6924→#69966443b792c· #7012(止血 C)→#7093f6e59f7e1· #6994→#70969f7a7c25aa1b66efbb· #6992→#7154bf32d4a0e· #6231→#718255da611e50f539bdc9(hotlong 手动 merge)· #6853→#7087fb5ebc5df(D9 设计由此批准)ab07b5382· #7321→#7386d53bd0ba9· #7277→#7306f16e54e1d· #7369→#74092c4056b12· #6960→#742930bed706d· #4717→#743589d7b35a7判据统一:六张新卡均以主题形状无界 grep 命中 + 单父提交确认 squash + 文件面与声明逐一相符,卡均 closed/completed,均已退订。
v17 摘 7 张。派发 38 单 38 中(34 落地 + 4 STOP 设计出口;另 1 张让位他席后落地)。连带关闭 #6995(非行政性,见事实 10)。
后继卡必读的落地事实:
authoringChannel。control-plane-preset.ts:99一行声明为实际欠账。installedPackageBindingForObject在 main 零命中)。orderBynaming aformulafield answers 200 in arbitrary order — the sort is silently dropped (measured on driver-sql + driver-memory) #6994 —— SORT 轴两半。engine.find()直接调用方仍静默丢排序,RECORD OF A KNOWN HOLEpin 应在engine.find()still drops aformulaORDER BY silently — decide whether the engine refuses or keeps its internal-caller tolerance #7095 落地时变红。os migrate planstill creates.objectstack/metadata/on a fresh project (the residual half of #6743's dry-run write side effect) #7000 ——start()不再建目录;chokidar 无法 watch 不存在的路径是必须的补偿。os migrate plan自称 dry-run,却仍会在全新项目上创建空数据库文件(#6469 的残余写副作用) #6743 的数据库半边(PR fix(cli,driver-sql):os migrate planstops creating a database on a fresh project (#6743) #6997)仍未合并。DriverQuery已经存在,但几处驱动调用方仍在用as any/as QueryAST兜住冗余的object—— 连带把 where/orderBy/fields 的检查一起关掉 #6231 —— 三个读 helper 的参数改DriverQuery,九个调用点恢复检查。三个相邻 cast 被EngineQueryOptionsSchema.searchrejects the bare query string that ADR-0061 D1 calls canonical — so every engine caller that wants it mustas any, losing the whole query's checking #7178 阻塞。f16e54e1d= D9 实现。ab07b5382)—— watcher 致盲窗口,生产缺陷非仅 flake。chokidar 初扫异步与首写竞争 ⇒ 目录 stat 永不再变,该路径终进程生命期无任何事件。interval效果精确为零。修法:put()经trackWrittenPath显式注册。selfWritessuppression is time-keyed, so a poll tick landing inside the 200 ms window can swallow an external edit #7335。findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321(d53bd0ba9)——findDatanormalizer 的 arity 检查,跑在$别名 pass 与 [P2]protocol.tsimplements 4 of the 5 documented RPC alias precedences backwards — and disagrees withhttp-dispatcher.tson three of them #3795 fold 之前。⭐ leftover 桶 ⇒ 200 下的空页(比NaN更糟)。?filter=onGET /data/:objectcannot be told from a filter AST, so it is diagnosed as a malformed filter (and, rarely, succeeds) #7390。f16e54e1d)—— D9 实现。overlay = 第三种非拥有 kind,base = overlay ?? own,解析逐位不变。watch-dot-root.test.tscase 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369(2c4056b12)—— 计时形状加固,并证明了ab07b5382的修复面。dev 先测量后编辑:卡的原故障模式已消失(事件 120/120 到达)⇒ 交付物明确不认领他人功劳。剩下的是第二机制(投递 24–36s vs 硬编码 20s),同批迭代内 A/B 旧红 5/8、新绿 8/8。⭐ 精确计数保留但理由被更正(重复投递不可能产生第二个事件;它真正防的是另一个事件混入)。⭐ 一次预测落空催生了修复的另一半(hookTimeout成为下一个绑定预算)。watch-dot-root.test.tscase 2's 4s quiet window degrades to a false pass under load — measured against 32-36s delivery #7408(负向用例的静默窗越忙越「通过」)。30bed706d)—— 档位边界靠supportsOverlay机械分离。放行 delete 的是注册表自己的标志而非硬编码类型清单 ⇒object档(supportsOverlay: false)结构上够不着,不靠谁记得排除。两个拒绝点都动了(deleteMetaItem的environmentId分支 +SysMetadataRepository.delete新增assertDeleteAllowed),后者拓扑无关,故控制面 kernel 同样被释放。⭐ 变体验证是接受它的理由:把谓词放宽到所有 artifact-backed 类型 ⇒ D9 的 pin 文件2 failed | 14 passed,恰是它那两条 delete pin。tool/skill,同为supportsOverlay: true),已在 PR 上显著标出供否决。deleteMetaItem's catch re-wrap drops the errorcode, so a repository refusal reaches the caller as a 403 with no catalogued code #7426。89d7b35a7)—— 成功路径的返回通道。evaluateRuntimeAuthoringGate由=> Error | null改为返回{ error, advisories }记录;saveMetaItem仅非空时展开该键 ⇒ 干净保存的响应字节不变。⭐ 契约半边比要求的更好:RuntimeAuthoringIssueSchema在packages/spec声明一次、metadata-protocol再导出,删掉了一份平行手写接口。⭐ R4 把裁决里「已接受的代价」变成了实测:无条件发advisories: []⇒ 新增三条缺席 pin 红、既有五条 [#5563 附带裁决] SaveMetaItemResponseSchema 补齐实现实际返回的字段(version / seq / state / projectionApplied) #5745 用例全绿 ⇒ 既有闸门对这一类结构性失明,故声明必须刻意。⭐ 一次探针自曝无效(把 spec build 重定向到/dev/null、build 实际失败、测试读到陈旧 dist 报出假绿)—— dev 自己抓到并可见地重跑,再跑又暴露出构建期的 authorable-surface 棘轮。在飞 —— 0(本任期首次清零)
决策箱(维护者)—— 0 张
本任期已裁,⛔ 勿重新提问:#4717(07:33Z 三问全按推荐)、#6960(07:36Z delete 侧移动)、#7306 问题二(hotlong 09:0xZ 批准 ⇒「重置亦被拒」的一致读法裁定成立)。
队列(2 张,重启条件均未兑现)
saveMetaItem/promoteDraftForPublish,是本席的面(08-09 记的「属 devx」是错的)。真实前置:false-positive 预算所需的 storedsys_metadata语料仓内不存在。本任期新立/待分诊 finding(⛔ 只记录不催)
本车道:#7216(点号守卫过窄)· #7390(重复
?filter=与 filter AST 不可区分 ⇒ 拒绝归错因,偶发静默成功)· #7408(静默窗越忙越通过)· #7426(deleteMetaItem的 catch 重包丢code⇒ 控制面拒绝到达调用方是 403 +code: undefined;这解释了 D9 控制面 pin 为何只断言消息子串)#4717 的三个拆分半边(12:0xZ 立,见注记 26):objectui#4133(Studio 渲染 advisory)· #7442(docs「the gate」补第四列)· #7443(P3⚠️ 已写明先按 appetite 判该不该做,并指向 #7220 作为可能的真实拉动)
surfaces泛化 ——其他车道:#7150 · #7177 · #7178(阻塞 #6231 三个 cast)· #7294 · #7335 · #7095 · objectui#3950 · 本车道
pm:blocked:#7309、#7134运维注记(交接必读)
method: MERGE(请求 SQUASH)—— 按结果测fb5ebc5df/ab07b5382/f6e59f7e1全部单父 squash;(b) 空字段返回 —— 技能注记 21 说这是「只武装不入队」的签名、处方是翻转一次,而 fix(metadata-fs): register written paths with the watcher instead of trusting its scan (#7282) #7336/fix(metadata-protocol): check query-parameter arity in findData's list-query normalizer (#7321) #7386/test(metadata-fs): derive the dot-root watcher waits from the case budget instead of a fixed 20s race (#7369) #7409/fix(metadata-protocol): allow REMOVING a legacy env overlay on a rolled-back overlayable type (#6960) #7429/feat(spec,metadata-protocol): put the runtime authoring gate's advisory findings on the save response (#4717) #7435 五次空字段返回、五次正常入队。⛔ 据回报值行动 = 去扰动一个正在正常排队的 PR。max_entries_to_build会截断。11:2xZ 实测:feat(spec,metadata-protocol): put the runtime authoring gate's advisory findings on the save response (#4717) #7435 有 webhook 确认入队却没有分支,fix(metadata-protocol): allow REMOVING a legacy env overlay on a rolled-back overlayable type (#6960) #7429 两者皆无。真正的判别式是「队列整体有没有动」:队列未动 ⇒ 缺席无信息,⛔ 不许动;队列已动而只有本卡缺席 ⇒ 才命中注记 21 的签名。11:42Z 复核:队列前进且两条分支同时出现,歧义自解、零动作。git log -N;git log默认无界。--grep='(#7386)'并核parents。git checkout <ref> -- <path>首提交前静默回退。orderBynaming aformulafield answers 200 in arbitrary order — the sort is silently dropped (measured on driver-sql + driver-memory) #6994)。⭐ 读到陈旧构建等于没测(cli/metadata:os migrate planstill creates.objectstack/metadata/on a fresh project (the residual half of #6743's dry-run write side effect) #7000;[P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 的 R1 首跑即此形,dev 自曝并重跑)。⭐ 变体验证(cli/metadata:os migrate planstill creates.objectstack/metadata/on a fresh project (the residual half of #6743's dry-run write side effect) #7000、findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321、A legacy env overlay on an artifact-backed item of a rolled-back type can no longer be REMOVED through the ordinary delete path (403) — only via OS_METADATA_WRITABLE #6960 最决定性 —— 过宽修复让 D9 的 pin 变红)。⭐ 自我防御验证([finding][drivers]DriverQuery已经存在,但几处驱动调用方仍在用as any/as QueryAST兜住冗余的object—— 连带把 where/orderBy/fields 的检查一起关掉 #6231)。⭐ 红的确定性也要预测(metadata-fs watcher tests are merge-queue flaky, and #7208's 20s deadline hardening did NOT fix it — the event is suppressed, not late #7282,5/5)。⭐ 断言要连code和status一起断(findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321)。⭐⭐ 预测落空往往是修复不完整的唯一信号([finding]watch-dot-root.test.tscase 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 的hookTimeout)。⭐⭐ 在替身上测到的红要说明它是替身上的([finding]watch-dot-root.test.tscase 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369)。⭐⭐ 把「已接受的代价」做成实测([P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 的 R4:证明既有闸门对该类结构性失明)。findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321 曾按「同文件」过度排序(注记 22);用了不存在的 git 参数并吞掉 stderr(注记 25);[finding]watch-dot-root.test.tscase 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 派发令写死「必须带 changeset」而 test-only PR 应走skip-changeset(dev 正确偏离并提问,已当众更正);[P2/P3] 运行时授权门的 advisory findings 要进响应并被 Studio 渲染 + docs「the gate」补第四列(#4463 收尾) #4717 的三个拆分半边「在派发时声明了、却没有立卡」(注记 26)。orderBynaming aformulafield answers 200 in arbitrary order — the sort is silently dropped (measured on driver-sql + driver-memory) #6994)。ignoreddotfile regex matches the.objectstacksegment of the root path #7150)。watch-dot-root.test.tscase 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 再证且更彻底 —— 连卡赖以成立的那次踢出都已被别处修掉)。已制度化:这一族的派发令第一条一律是「先测量再编辑」。findData's list-query normalizer coerces repeated query parameters without checking arity (the half #6877 could not reach) #7321)。反转三理由:(a) 阻塞方是时长不定的人工按钮;(b) 他席的已裁变更正卡在本卡身上;(c) 串行落地由合并队列保证。结果佐证:并行编写零冲突,六张卡先后干净落地。claude-fable-5,⛔ 不由 PM 自己编辑技能。候选见注记 1/2/3/10/11/13/20/21/22/23/25/26。--no-max-count不是 git 参数,同行的2>/dev/null把fatal吞成「干净的空结果」并被当成证据。surfaces泛化 / docs 第四列)拆出别席。本席在认领评论与派发令里都写了这条拆分 —— 然后 PR 以Fixes #4717合并、卡整张关闭,而那三张后继卡当时并不存在。差点让一次「已声明的拆分」变成一次静默的范围吞并。12:0xZ 补立三张(objectui#4133 / docs: the "the gate" table has no fourth column for the runtime publish surface (#4463 P1 shipped one) #7442 / [P3] Generalise the lint rulesurfacesaxis to an open N-surface dimension (#4463 P1 introduced a closed two-value one) #7443)。⇒ 规则:凡在派发令里写「X 拆出别席」,同一动作里就把 X 立出来;拆分的存在性判据是卡号,不是句子。次选形态是 PR 首行用Part of #N而非Fixes #N(技能里已有的那条),但立卡优先 ——Part of只是让父卡不关,不会让缺失的半边有人认领。定时器:巡逻链 send_later(现役
trig_01FDDuG7wLRVeoPh2wnhVVjw@ 2026-08-10T12:13Z)。