Skip to content

fix(service-analytics): 空 $and/$or 按布尔单位元归约,两个编译器对齐五后端,四条进一致性表 (#5322) - #5365

Merged
os-zhuang merged 8 commits into
mainfrom
claude/issue-5322-empty-combinator-identity
Aug 5, 2026
Merged

fix(service-analytics): 空 $and/$or 按布尔单位元归约,两个编译器对齐五后端,四条进一致性表 (#5322)#5365
os-zhuang merged 8 commits into
mainfrom
claude/issue-5322-empty-combinator-identity

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #5322

拍板依据

2026-08-04 维护者拍板(#5322 评论):采纳主案 取布尔单位元,service-analytics 两处对齐。publish/lint 编写期对字面量空组合子的响亮拒收另立 #5330,⛔ 不在本单范围。按 spec 车道链序,本 PR 排在 #5323(driver-mongodb 归约)之后合入。

前提复核 — 两轮实测矩阵(sql.js 逐行执行,非推断)

issue 正文矩阵是 @ 175d789 的,已过时。实测两轮:

第一轮(base f1cc3a316):read-scope-sql 的后两格已由 #5297/#5326 修复;normalizer 四格全错。

第二轮(#5335 于 00:00Z 合入 main 后重测,base c89d18c16)——#5335 把 normalizer 的后两格也修了:

编译器 @ merged main {$and:[]} {$or:[]} {$or:[{a:'x'},{}]} {$not:{}}
期望(#5134/#5322) 全部行 零行 全部行 零行
read-scope-sql 抛错 抛错 全部行 ✓(#5297/#5326) 零行 ✓
filter-normalizer 抛错 抛错 全部行 ✓(#5335) 零行 ✓(#5335)

结论:前提成立但范围收窄 —— 剩余工作是两个编译器的空数组单位元(第 1、2 格)+ 双侧 pin 翻向 + 四条进表。#5335 的三个重叠文件按「取 main 的 const 节点体系」解决冲突,我此前自研的 {kind:'false'} 方案整体弃用,最终 delta 收敛为 9 文件。

修后矩阵:两编译器 × 四格与期望列逐格一致(全部行/零行/全部行/零行)。

改动

验证(全部在 merged main 态,flock 串行)

@objectstack/service-analytics   45 files / 659 tests 全绿
@objectstack/driver-sql          61 passed | 4 skipped / 798 passed | 44 skipped
@objectstack/driver-memory       12 files / 328 tests 全绿
@objectstack/formula             16 files / 361 tests 全绿
@objectstack/driver-sqlite-wasm  17 files / 241 tests 全绿
@objectstack/driver-mongodb      7 passed | 5 skipped / 143 passed | 125 skipped(见下)
@objectstack/spec                308 files / 7885 tests 全绿;check:generated 9/9 up to date;tsc --noEmit 通过
check:type-check-coverage OK;check:driver-conformance 20 cells OK;check:nul-bytes OK + 改动文件控制字节自扫无命中;eslint 改动文件无告警

反向验证 —— 方向先预测、两轮如实记录

第一轮(pre-#5335 base):预测还原两侧源码后 23 红,实测 23 红/预测逐条命中;其中 read-scope-sql-conformance 四条新行只红 2({} 吸收与 {$not:{}} 在 main 已被 #5297/#5326 修复,保持绿)—— 与派发模板预设的「四条全红」不同,方向如实记录。

第二轮(merged #5335 后重做):预测 19 红(native-sql conformance 从 4 红缩为 2 红,因 #5335 已覆盖后两格),实测 19 红/预测逐条命中,分布逐文件一致

driver-mongodb:「预期红」在本容器不可观测,如实说明

派发词预告本地 driver-mongodb 四条会红(#5323 未合入)。实测本容器全绿,且这不是覆盖达成:translation 侧 suite 用进程内 matcher 把译文 document 桥接到行 id,而该 matcher 建模的是 MongoDB 的文档求值语义($and:[].every = true,$or:[].some = false)——真实服务端对空数组是整条查询拒绝(must be a nonempty array),只有需要真 mongod 的 mongodb-filter-logic-conformance.test.ts 半边能观测到,而本容器取不到 mongod 二进制(125 skipped)。因此:在能取到 mongod 的 CI 上,本 PR 的四条新行会在该 suite 红,解除条件 = #5323 合入(其归约让服务端半边转绿)。这正是 #5323 PR body 第 2 节记录的依赖方向,不在本单修复。

合并次序与 #5323 的文件交叠

#5323 与本 PR 都动 packages/spec/src/data/filter-logic-conformance.ts:#5323头部 docblock 记「三族已裁定未进表」注记,本 PR 在 cases 数组加四行 —— 区域不同,git 可干净合并。#5323 先合后,本 PR 随车道 rebase 时需做两件小事(留给接力方或届时我方处理):

  1. 该注记的「族 1(空组合子)」段落删除(本 PR 已让其过时),族 2/3 保留;
  2. fix(driver-mongodb): 空 $and/$or/$not 归约成布尔单位元,非 filter 节点先响亮拒收 (#5239) #5323filter.zod.ts 写的「Deliberately NOT declared here」段中空组合子一句,可改为正式声明(两端已 enforced,declared ≠ enforced 顾虑解除)—— 属可选跟进,不阻塞。

范围外


🤖 Generated with Claude Code

https://claude.ai/code/session_01ErbEDVAg1No9gdg1pgDAGB


Generated by Claude Code

claude added 5 commits August 4, 2026 23:41
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ErbEDVAg1No9gdg1pgDAGB
…ty-combinator-identity

# Conflicts:
#	packages/services/service-analytics/src/strategies/filter-normalizer.ts
#	packages/services/service-analytics/src/strategies/native-sql-strategy.ts
#	packages/services/service-analytics/src/strategies/objectql-strategy.ts
@vercel

vercel Bot commented Aug 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 5, 2026 4:09am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling size/m labels Aug 5, 2026
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/service-analytics, @objectstack/spec.

109 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/data-api.mdx (via @objectstack/service-analytics)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/service-analytics, @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/service-analytics, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/service-analytics, @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/service-analytics, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/service-analytics, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/service-analytics, @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/service-analytics, @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

os-zhuang pushed a commit that referenced this pull request Aug 5, 2026
本 PR 的 spec 半边是契约文档,机械合并会把 base 时代的论断带上 main;
逐条对当前 origin/main 实测后校订:

- FilterConditionSchema 的 NULL-safe $not 合规段:read-scope-sql 已由
  #5326 对齐(#5297 关闭)、filter-normalizer 已由 #5335 对齐(#5325
  关闭),七个面全部一致 —— 「尚未合规、指向 #5297」改写为已闭合的事实。
- 「Deliberately NOT declared here」:空组合子单位元由「两立场对峙、
  上交 #5322」改为「#5322 已拍板取单位元,实施在 #5365(排在本 PR 之后
  合入);main 上两个 analytics 编译器今天仍拒收,故本 PR 仍不在此声明,
  声明随 #5365 翻正」;{ field: {} } 由「无后端设闸」改为「#5327 已闸
  四家,driver-mongodb 是唯一还在作答的后端(#5376)」。
- filter-logic-conformance.ts 族 2/3 状态行同步重测:族 2 的后端阻塞
  已清零,唯余 fixture 工作;族 3 的四家闸门已落,阻塞改为表形扩展 +
  mongodb(#5376)。族 1 段落一字未动 —— 由 #5365 在其同步轮删除,
  已约定分工。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ErbEDVAg1No9gdg1pgDAGB
claude added 2 commits August 5, 2026 03:32
…ty-combinator-identity

# Conflicts:
#	packages/services/service-analytics/src/strategies/filter-normalizer.ts
- filter.zod.ts:按 #5323 同步散文预留的交接("The declaration flips to
  stated contract with that PR"),空组合子单位元从「Deliberately NOT
  declared」段转为正式契约段;{field:{}} 半边保持未宣告(#5376 仍开)。
- filter-refusal-envelope.test.ts(#5366 新到):空数组两行从 REFUSALS 翻入
  ACCEPTED(单位元树断言),同一守卫点的非数组拼写补位 REFUSALS,信封不变。
- filter-logic-conformance.ts:族 1 段落按分工删除(四行已进表),族 2/3 原样。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ErbEDVAg1No9gdg1pgDAGB
@github-actions github-actions Bot added size/l and removed size/m labels Aug 5, 2026

Copy link
Copy Markdown
Contributor Author

收官同步完成(#5323 合入 main 后的最后一轮,head 2e35e2528,合入 main @ 71f205d18 = #5323)。

保持 draft,PM 侧接手 ready + queue。


Generated by Claude Code


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review August 5, 2026 03:52
@os-zhuang
os-zhuang enabled auto-merge August 5, 2026 03:52
…补位 400

REST 层是 #5352 refusal pin 的第三份拷贝(service-analytics 两份已翻)。
harness 的 executeAggregate 从常量改为按引擎侧 filter 求值,四条单位元
断言(空 $or 零行、空 $and 全部行、{$not:{}} 零行、{} 析取项吸收)
因此承重 —— 200 之外还钉行数,与被丢弃的 filter 可区分。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ErbEDVAg1No9gdg1pgDAGB
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 6, 2026
…bjectstack-ai#5239) (objectstack-ai#5323)

* fix(driver-mongodb): reduce empty $and/$or/$not to their boolean identity, refusing non-nodes first (objectstack-ai#5239)

`translateFilter` passed combinator arrays through verbatim, and MongoDB
answers an empty one with neither TRUE nor FALSE but a third behaviour: it
refuses the query (`$and/$or/$nor must be a nonempty array`). So `{$and: []}`
and `{$or: []}` reached find/count/updateMany/deleteMany as a server error
carrying no ADR-0112 code, while driver-sql (objectstack-ai#5134), driver-memory and formula
all answered them as identities.

Replaced with the same STRUCTURAL three-valued reduction: reduce the whole tree
to true/false/clause first, then emit. Empty `$and` becomes TRUE (no condition);
empty `$or` becomes FALSE and emits a real zero-row condition
(`{_id: {$in: []}}`) — emitting nothing would be `{}`, which find/updateMany/
deleteMany read as EVERY document, the opposite answer. Every `$and`/`$or`
array emitted is therefore guaranteed non-empty.

Shape rejection lands in the same change and runs BEFORE any identity: measured
on main, `{$or: [new Date()]}` translated to `{$or: [{}]}` (every document) and
`{$or: 'x'}` / `{$not: null}` translated to `{}` (every document). updateMany
and deleteMany translate the same `where`, where that is data loss rather than a
wrong row count. Non-nodes now raise INVALID_FILTER / 400 naming the position;
the gate judges by PROTOTYPE, since Date/RegExp/class instances satisfy
`typeof x === 'object'` while enumerating empty.

spec is documentation only: FilterConditionSchema's contract TSDoc now states
the NULL-safe `$not` semantics ruled in objectstack-ai#5146, and filter-logic-conformance.ts
records the measured matrix for the three ruled-but-not-yet-enrolled case
families. The four FILTER_LOGIC_CASES rows objectstack-ai#5239 asks for are deliberately NOT
added: read-scope-sql and the analytics filter-normalizer, both enrolled
backends, refuse empty combinators fail-closed by design and pinned test, which
contradicts the identity ruling — escalated as objectstack-ai#5322.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ErbEDVAg1No9gdg1pgDAGB

* docs(spec): 同步轮散文校订 —— 对 main@cdfbee2f0 实测后落笔 (objectstack-ai#5239)

本 PR 的 spec 半边是契约文档,机械合并会把 base 时代的论断带上 main;
逐条对当前 origin/main 实测后校订:

- FilterConditionSchema 的 NULL-safe $not 合规段:read-scope-sql 已由
  objectstack-ai#5326 对齐(objectstack-ai#5297 关闭)、filter-normalizer 已由 objectstack-ai#5335 对齐(objectstack-ai#5325
  关闭),七个面全部一致 —— 「尚未合规、指向 objectstack-ai#5297」改写为已闭合的事实。
- 「Deliberately NOT declared here」:空组合子单位元由「两立场对峙、
  上交 objectstack-ai#5322」改为「objectstack-ai#5322 已拍板取单位元,实施在 objectstack-ai#5365(排在本 PR 之后
  合入);main 上两个 analytics 编译器今天仍拒收,故本 PR 仍不在此声明,
  声明随 objectstack-ai#5365 翻正」;{ field: {} } 由「无后端设闸」改为「objectstack-ai#5327 已闸
  四家,driver-mongodb 是唯一还在作答的后端(objectstack-ai#5376)」。
- filter-logic-conformance.ts 族 2/3 状态行同步重测:族 2 的后端阻塞
  已清零,唯余 fixture 工作;族 3 的四家闸门已落,阻塞改为表形扩展 +
  mongodb(objectstack-ai#5376)。族 1 段落一字未动 —— 由 objectstack-ai#5365 在其同步轮删除,
  已约定分工。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ErbEDVAg1No9gdg1pgDAGB

* chore(spec): gen:schema 前移 authorable-surface 锚点至合并后的 merge-base (cdfbee2)

合并 origin/main 后重建时由 gen:schema 写出(先 commit merge 再跑生成,
objectstack-ai#5370 的锚点倒退陷阱按序避开):baseRev 28ad90ecdfbee2,随锚点带入
objectstack-ai#5312 的 api/ApiEndpoint 键面。check:generated 9/9 up to date,
check:authorable-surface 绿。非手改。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ErbEDVAg1No9gdg1pgDAGB

---------

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 6, 2026
…摆纠偏、飞行中重叠、预期红停放 (objectstack-ai#5441) (objectstack-ai#5501)

* docs(pm-dispatch,os-dev): 串行接力一夜沉淀的六条缺口补进 SKILL —— 接力模式、锚点措辞、裁决传播扫描、停摆纠偏、飞行中重叠、预期红停放 (objectstack-ai#5441)

2026-08-04/05 夜 spec 车道以串行接力连落 10 个 PR(objectstack-ai#5304objectstack-ai#5365),六个情形是
现行 SKILL 没有覆盖、靠现场即兴的,各有实付学费。按 issue 注明的落点章节逐条插入:

- 第 7 步「入队与落地」新增平行小节「串行接力」:每棒一整圈(auto-merge 由 PM 挂、
  dev 永不碰,ready 与 auto-merge 顺序不可反且每棒各走一次)、相邻棒同文件交接语义
  而非文本(objectstack-ai#5318/objectstack-ai#5319 实例)、两棒散文互锁由 PM 指派分工(objectstack-ai#5323objectstack-ai#5365objectstack-ai#5335)。
- 「入队与落地 A」新增锚点断言措辞:authenticity = baseRev 是 origin/main 祖先 且
  keys 与该 commit 逐行一致;baseRev 允许滞后;⛔ 不得要求 baseRev == merge-base
  (那会教唆手改锚点,即 objectstack-ai#4650 攻击自身)。四步序的第 3 步补上「先 commit merge」,
  并引用 objectstack-ai#5370 / objectstack-ai#5371 两个新陷阱(仅引用,不实现)。
- 第 5 步派发词 + 第 7 步 review 新增「裁决传播 = 全仓 pin 扫描」:翻 pin 一轮翻完
  且必须保留承重(objectstack-ai#5322 裁决、objectstack-ai#5365 的 REST 层漏翻)。
- 第 6 步 Collect 的 subagent 半边新增停摆纠偏:watcher 永不触发,中途状态即停摆
  信号,第三次视为不可靠改走接手协议。生产端半边同步落到 os-dev.md 资源纪律第 6 条。
- 第 5 步 same-day churn 新增姊妹段「飞行中范围重叠」:每轮读 origin/main 时对每个
  在飞 dispatch 做相交判断,相交即预警(objectstack-ai#5322 × objectstack-ai#5335 实例)。
- 「入队与落地 B」新增依赖 PR 的预期红停放:draft 停放 + 签名级预期红清单 + 解除
  条件,新签名才是真问题(objectstack-ai#5365 的 REST 红即由此识别)。

仅改 `.claude/` 内部 agent 协议文本,不发布任何包;六条落点之外未动任何段落。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE

* docs(pm-dispatch): 停摆纠偏第三条的交叉引用改指「step 5」—— 接手协议在第 5 步,不在第 6 步之下

自查发现的方向错误:「Handing off an interrupted dev」小节是第 5 步的子节
(SKILL.md:839),而新增段落写在第 6 步(:923),原文写「below」会把读者指向
第 6 步之后的 Cloud mode 段。同段里对 cloud-mode ~2h 阈值的「below」是对的,保留。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE

* docs(pm-dispatch): 飞行中重叠一段的时间戳改用可核验值 —— objectstack-ai#5335 的 merged_at 是 23:49:44Z,不是 00:0xZ

issue objectstack-ai#5441 正文写「objectstack-ai#5335 在 00:0xZ 合入」,核 GitHub API 的 merged_at 与 main 上
squash 提交的 committer date,两者一致给出 2026-08-04T23:49:44Z。改写成「起飞后
32 分钟合入(merged_at 2026-08-04T23:49:44Z)」,把不可核验的钟点换成可核验的
时间差 + 权威字段;起飞时刻 23:17Z 沿用 issue 的记述(无仓内产物可核,且非承重)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/l tests tooling

Projects

None yet

2 participants