Skip to content

feat(spec)!: 移除 ./automation 的孤儿 EventSchema —— C6 双源清账,基线 13 → 12 (#4658) - #4745

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-4658-event-dual-source
Aug 3, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-4658-event-dual-source

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #4658

关联:#4535(主账本 C6)、#4650(删行自证门禁,本单走其「整 def 消失」路径)、#4642(pin 形态)、#4446 / #4506(gate 本体)。

按维护者裁决走路线 A:删除 ./automation 侧的孤儿 EventSchema。两侧键集完全不相交 —— automation 侧是 XState 式信号声明 { type, schema? },kernel 侧是事件总线信封 { id?, name, payload, metadata } —— 收敛等于在合同里写假话,故删孤儿而非收敛;kernel 侧一字未动,成为全包唯一声明。

1. 重验前提(未采信旧结论,全部实测)

三仓 import 语句级扫描(objectstack @ 本分支基线 / cloud @ 5df2c69 / objectui @ 785b8a5,后者恰为本次 rebase 携带的 console pin 版本):

  • packages/spec 之外裸名 EventSchema 零命中(cloud 连子串命中都是 0;objectui 仅 TimelineEventSchema / CalendarEventSchema 等复合名,及 packages/types 的 export type * as Automation / as Kernel 命名空间隔离再导出)。
  • 本仓消费方:automation 侧零引用(定义行即全部);kernel 侧消费链完好 —— kernel/events/dlq.zod.ts:24,71 嵌入 + kernel/events.test.ts,export type Event 同文件。
  • StateMachineSchema 确不引用被删 schema:状态机事件类型是 on: 的记录键(纯字符串)。

真图可达性(以 #4650 门禁同款真 Zod 图 BFS,对合并基线版源码实测):

roots: 24 metadata types [action, agent, app, book, dashboard, dataset, datasource, doc,
  email_template, field, flow, hook, job, mapping, object, page, permission, position,
  report, seed, skill, tool, translation, view]
closure: 4689 schema instances reachable from the roots
  automation EventSchema (merge-base orphan): NOT reachable
  automation StateMachineSchema: REACHABLE
  kernel EventSchema (envelope): NOT reachable
  kernel EventTypeDefinitionSchema: NOT reachable

孤儿不可达、而 StateMachineSchema 本身可达 —— 删除是外科式的,不伤作者面。与裁决零冲突。

2. #4650 门禁对被删行的判定(实跑输出,rebase 后重跑)

ℹ️  1 baseline deletion(s) since 072806aa58a5 carry their own proof (#4650):
     - automation/Event:* (2 line(s)) — def no longer emitted by this build; whole-schema
       removals are adjudicated by json-schema.manifest.json (#2978) and check:api-surface.

即「整 def 消失」自证路径;两个裁决点本 PR 均满足:json-schema.manifest.json 删 automation/Event 键(#2978 蓄意移除通道,门禁错误信息指定的同 PR 手删),check:api-surface 全绿(api-surface.json 恰好只有 ./automation 一行删除)。authorable-surface.json 删的两行(automation/Event:type / :schema)与生成器规范形逐字节一致(check:authorable-surface ✓)。

3. 基线 13 → 12(实跑)

dual-source-exports.baseline.json 删 EventSchema — [./automation (const)] ≠ [./kernel (const)] 一行,其余 12 行一字未动:

✅  self-test: flags same-name different-declaration exports, and nothing else.
✅  no new dual-source exports: 4328 names across 16 entry points — 168 re-exported
    (single declaration), 12 accepted dual-source (baseline).

4. 回归 pin + sabotage(C14 形态,#4642 纪律)

packages/spec/src/automation/state-machine.test.ts 新增 [#4658] describe 块:

  • compiler-API pin:入口从 package.json exports map 枚举(17 个,防新入口逃逸),断言 ./automation 不再命名 EventSchema(且表面非平凡,防真空通过)、./kernel 仍导出且声明落在 src/kernel/events/core.zod.ts、全入口范围内任何叫 EventSchema 的导出都必须解析到该唯一声明;模块符号解析带防空转守卫。

  • 运行时命名空间断言:automation 命名空间无该属性、kernel 有;信封样例 parse 通过、XState 信号声明样例(type 为 APPROVE 的对象)被拒 —— 两概念从未收敛的运行时证据。

  • sabotage 实证(均已回滚):

    S1 重加 export const EventSchema → 2 条 pin 红:

    × resolves the export surface: no entry but ./kernel declares `EventSchema`
      AssertionError: expected [ 'flowForm', 'defineFlow', …(262) ] to not include 'EventSchema'
    × keeps the runtime namespaces consistent with the compiler view
      AssertionError: expected true to be false
    

    S2 走被否决的收敛路线(符号同一性此时是单声明,骗得过 dual-source gate 的视角):

    export { EventSchema } from '../kernel/events/core.zod';

    → pin 仍是同样 2 条红 —— 拦的是「名字离开 ./automation」这条裁决本身,不只是名字存在性。

  • 干净态:state-machine.test.ts 8/8 通过。

5. changeset 定级(逐条自证)

@objectstack/spec major:已发布导出名的移除,外部消费方将以 TS2305 编译失败(与 C14 同形):

// FROM —— TS2305
import { EventSchema } from '@objectstack/spec/automation';
// TO(要信封)
import { EventSchema } from '@objectstack/spec/kernel';
// TO(要事件定义)
import { EventTypeDefinitionSchema } from '@objectstack/spec/kernel';
// 要状态机信号声明:该表面从来不存在 —— 事件类型写在 on: 的记录键上,无需替代物

同时零元数据迁移:def 从元数据根不可达(§1 BFS 输出),没有任何元数据文档曾被它解析,无 tombstone、无 ADR-0087 conversion / migration(spec-changes.json / upgrade-guide 两 gate 零变化)。三仓零消费者 ⇒ 预期 TS2305 实际命中数为 0。全文见 .changeset/event-schema-dual-source-c6.md。

6. 全量验证(实跑)

验证 结果
check:generated(8 门) ✓ 全部 up to date(rebase 后重跑)
check:dual-source-exports ✓ 12 条基线(13 → 12)
check:liveness ✓ all governed-type properties classified
check:strictness-ledger ✓(automation 段 87 → 86 sites、state-machine.zod.ts 行 7 → 6,按 gate 实跑指令更新并留 −1 注记 —— C3 教训)
check:empty-state ✓ all classified (1 closed, 2 open, 4 output, 9 scope)
check:variant-docs ✓ 19 unions — 8 governed, 11 exempt
check:exported-any ✓ 1893 types + 1637 schemas across 16 entry points
check:skill-examples ✓ 202 prose examples type-check
spec pnpm test ✓ 294 files / 7400 tests 全过
spec typecheck ✓
全仓 pnpm typecheck ✓ 122/122 tasks successful

7. 并行协议合规(#4535 2026-08-03 新纪律)

改动清单(11 文件):state-machine.zod.ts(删孤儿 + 指路注释)、state-machine.test.ts(pin)、基线/manifest/api-surface/authorable-surface/docs-import-surface 各一行级收缩、references/automation/events-core.mdx 随生成器消失 + meta.json 同步、严格性台账、changeset。

🤖 Generated with Claude Code

https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9

…./kernel` (#4658)

`EventSchema` 曾由 `./automation` 与 `./kernel` 各自导出一个声明,且两侧键集完全
不相交:automation 侧是 XState 式信号声明 `{ type, schema? }`,kernel 侧是事件总线
信封 `{ id?, name, payload, metadata }`。收敛等于在合同里写假话(把信号声明说成信
封),按维护者裁决(#4658,路线 A)删除 automation 侧孤儿:`StateMachineSchema` 从
不引用它(状态机事件类型是 `on:` 的记录键),objectstack / cloud / objectui 三仓
import 语句级零消费者,且以 #4650 门禁同款真 Zod 图 BFS 实测其从 24 个元数据根不可达
(同一次 BFS 中 `StateMachineSchema` 本身可达 —— 删除是外科式的)。

- state-machine.zod.ts:删除孤儿声明,留 #4658 指路注释
- dual-source-exports.baseline.json:删 `EventSchema` 行(13 → 12)
- authorable-surface.json:`automation/Event:type` / `:schema` 随整 def 出账
  (#4650 门禁判定:def no longer emitted,输出见 PR)
- json-schema.manifest.json:删 `automation/Event` 键(#2978 蓄意移除通道)
- api-surface.json:`./automation` 仅一行删除;docs-import-surface.baseline.json
  经生成器收缩一行;references/automation/events-core.mdx 随生成器消失
- 回归 pin(state-machine.test.ts):compiler-API 断言 `./automation` 无
  `EventSchema`、`./kernel` 为全包唯一声明(package.json exports 全入口枚举),
  防空转守卫;S1(重加导出)/ S2(禁止的 re-export 收敛路线)sabotage 均红
- 严格性台账:automation 87 → 86 sites,state-machine 行 7 → 6(实跑判定)
- changeset:@objectstack/spec major(移除已发布导出名,TS2305),零元数据迁移

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

vercel Bot commented Aug 3, 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 3, 2026 1:26am

Request Review

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

107 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/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/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 packages/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/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/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/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/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/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/kernel/runtime-capabilities.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/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/spec)
  • content/docs/releases/v9.mdx (via @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.

@github-actions github-actions Bot added the size/m label Aug 3, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 3, 2026 01:28
@os-zhuang
os-zhuang enabled auto-merge August 3, 2026 01:28
@os-zhuang
os-zhuang marked this pull request as draft August 3, 2026 01:29
auto-merge was automatically disabled August 3, 2026 01:29

Pull request was converted to draft

@os-zhuang
os-zhuang marked this pull request as ready for review August 3, 2026 01:30
@os-zhuang
os-zhuang enabled auto-merge August 3, 2026 01:30
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 3, 2026
Merged via the queue into main with commit 51c5227 Aug 3, 2026
24 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4658-event-dual-source branch August 3, 2026 01:49
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 3, 2026
…6 双源清账,TenantPlan 唯一真源在 ./cloud (objectstack-ai#4739) (objectstack-ai#4752)

`TenantPlan(Schema)` 曾由 `./cloud` 与 `./system` 各自导出一个声明:cloud 侧
5 值(free/starter/pro/enterprise/custom)嵌 `EnvironmentSchema.plan` /
`TenantContextSchema.plan` / `ProvisionTenantRequestSchema.plan`,cloud 仓
service-tenant 实际消费;system 侧 3 值子集只嵌 `TenantProvisioningRequest/
Result`,而该 provisioning 协议(连同 contracts 的 `IProvisioningService` /
`ITenantRouter`)objectstack / cloud / objectui 三仓 import 语句级实测零实现
零调用 —— declared-only,已被 cloud 的 `Provision*` 家族整体取代。按维护者
裁决(objectstack-ai#4739,路线 B)删 system 侧全家族,cloud 侧一字未动。

- 删 system/provisioning.zod.ts(+测试):TenantPlan / TenantRegion /
  TenantProvisioningStatus / ProvisioningStep / TenantProvisioningRequest /
  TenantProvisioningResult 六 def 全家
- 删 contracts/provisioning-service.ts、contracts/tenant-router.ts(+测试):
  两文件除三个 declared-only 接口外无他物,整文件退役;两 index 留 objectstack-ai#4739
  指路注释(objectstack-ai#4212/objectstack-ai#4451 同款)
- dual-source-exports.baseline.json:删 TenantPlan / TenantPlanSchema 两行
  (12 → 10,rebase 携带 C6 objectstack-ai#4745 落地后的起点)
- authorable-surface.json:21 行随三个整 def 出账(objectstack-ai#4650 门禁判定三组
  「def no longer emitted」自证路径,输出见 PR)
- json-schema.manifest.json:删六 def 键(objectstack-ai#2978 蓄意移除通道)
- api-surface.json:恰好 15 行删除(./system 12 + ./contracts 3),零新增
- docs:system/provisioning.mdx 与幽灵页 cloud/provisioning.mdx 随生成器
  消失,cloud/TenantPlan 文档回到真家 cloud/tenant.mdx(objectstack-ai#4696 病灶随重名
  根因消除);docs-import-surface.baseline.json 经生成器收缩一行
- 回归 pin(cloud/tenant.test.ts):compiler-API 断言全入口(package.json
  exports 枚举)任何叫 TenantPlan(Schema) 的导出唯一解析到 cloud 声明、
  ./system 不再命名之、三个契约接口全包消失,防空转守卫;S1(重加声明)/
  S2(禁止的 re-export 路线)sabotage 均红
- changeset:@objectstack/spec major(移除 15 个已发布导出名,TS2305),
  零元数据迁移;strictness-ledger 实跑零变化(该文件不在台账辖区)


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 Oct 7, 2026
… — no queued PR left the queue on a draft conversion (objectstack-ai#20845)

Fixes objectstack-ai#20764

Clause-②: no

## What changes

`.claude/skills/pm-dispatch/references/platform-readings.md`, lines
41-43 only. The rewrite is net 0 lines, and the three new lines are 120
/ 118 / 120 bytes (cap 120).

| line | before | after |
|:--|:--|:--|
| `:41` | 转 draft 不是可靠的踢队手段:两向相反读数并存,处置按最坏走。 | 转 draft
不是可靠的踢队手段:本仓与姊妹仓均见已入队转 draft 仍保位照合,处置按最坏走。 |
| `:42` | 本仓转 draft 同时掉 auto-merge 与队列成员资格,不自动恢复,转正后重挂;姊妹仓曾保位照合。 | 本仓转
draft 同秒掉 auto-merge 仅见于未入队时,转正后重挂;已入队者 2026-08-08、09-29 照合。 |
| `:43` | 补救:转 draft 与卸载 auto-merge 都做 —— 本仓卸载 auto-merge 单独不踢队。 | 补救:转
draft 与卸载 auto-merge 都做,本仓卸载单独不踢队;两手齐做亦未见踢队(08-08、09-28)。 |

The remedy on `:43` is unchanged: do both acts. No rule is added. The
in-file citations are dates, because `pnpm check:pm-skill-id-lint` goes
red on a `#`-number anywhere under `.claude/skills/pm-dispatch/`, and
this file cites no PR number today. The PR numbers and timeline events
are in this body. That is where the id-lint header puts a reading's
provenance.

## The readings (re-readable: `GET
/repos/objectstack-ai/objectstack/issues/N/timeline`)

I ran a read-only timeline scan over objectstack-ai#4700-objectstack-ai#4900, objectstack-ai#6650-objectstack-ai#6850 and
objectstack-ai#20400-objectstack-ai#20840. It looked for two patterns: a `convert_to_draft` between
`added_to_merge_queue` and the next `removed_from_merge_queue`, and a
`convert_to_draft` on a PR that was armed but not queued. The scan found
every row below. The table is complete for those windows only, not for
the whole repo.

**Queued, then converted to draft.** None of the four left the queue
because of the conversion.

| PR | queued | draft | disable sent? | what followed |
|:--|:--|:--|:--|:--|
| objectstack-ai#6732 | 2026-08-08T14:01:50Z | 14:04:32Z | claimed in objectstack-ai#6799's text; no
`auto_merge_disabled` event | the queue merged it at 14:38:56Z, 34 min
later, still draft |
| objectstack-ai#20420 | 2026-09-28T13:43:01Z | 14:02:28Z | claimed in the seat's
14:04Z comment; no event | its own group `pr-20420-3cf6449` had `Lint &
Type Check` = failure at 14:01:49Z, before the draft;
`github-merge-queue[bot]` removed it at 14:11:24Z, unmerged |
| objectstack-ai#20442 | 2026-09-28T13:45:42Z | 14:02:50Z | claimed in the seat's
14:04Z comment; no event | the queue built a new group
`pr-20442-b285508` for it at 14:11:29Z, 9 min after the draft; that
group's `CI` = failure at 14:30:14Z; removed at 14:35:44Z, unmerged |
| objectstack-ai#20695 | 2026-09-29T23:32:51Z | 23:57:02Z | no (the card discloses:
draft alone) | the queue merged it at 00:04:21Z, 7 min later, still
draft |

**Armed, not queued, then converted to draft.** Each one dropped
auto-merge.

| PR | armed | draft | `auto_merge_disabled` | after |
|:--|:--|:--|:--|:--|
| objectstack-ai#4745 | 2026-08-03T01:28:46Z | 01:29:30Z | 01:29:30Z (same second) |
ready, re-armed 01:30:52Z, queued, merged |
| objectstack-ai#6727 | 2026-08-08T13:42:58Z | 13:44:36Z | 13:44:36Z (same second) |
ready, re-armed 13:46:02Z |
| objectstack-ai#6829 | 2026-08-08T23:37:05Z | 23:40:25Z | 23:40:26Z (1 s) | ready and
enqueued 6 h later |

Each disable event carries the converter as its actor. A timeline cannot
tell whether the platform wrote it or a scripted follow-up did. The line
records what was observed ("同秒").

## Where the old reading came from

- The "drops queue membership" reading first appears in `db6581a5`
(objectstack-ai#4893, card objectstack-ai#4892, 2026-08-03). It cites no PR. That is the same day
objectstack-ai#4745 dropped auto-merge on an armed PR that was not queued. The
queue-membership half has no instance behind it.
- `cd704cc4` (objectstack-ai#6799) later cited objectstack-ai#6732 for "only draft evicts; disable
alone does not". In objectstack-ai#6732's own timeline the PR stays queued after the
draft and is merged by the queue 34 minutes later.
- The sister-repo half ("姊妹仓曾保位照合", objectui 2026-08-25) is carried over
as it was. I did not re-read it.

## How this departs from the triage direction (5903760674)

I did not choose these quietly. Each one is a place where a measurement
changed what the direction assumed:

1. **`:42` is split by queue state, not "mixed" in the sense of opposite
readings.** No queued PR in the scanned windows left the queue because
of a draft conversion. The direction assumed the old half had its own
measurement. It has none, and the one PR later cited for it reads the
other way. What does go both ways in this repo is the effect by state:
unqueued, auto-merge drops; queued, the PR keeps its place.
2. **`:43` says "not seen to dequeue", not "not measured".** Three PRs
(objectstack-ai#6732, objectstack-ai#20420, objectstack-ai#20442) have both acts claimed in writing, and none was
removed by them. The caveat: on a queued PR, the disable leaves no
timeline event, so whether it was sent rests on the seats' own comments.
3. **`:41` loses "两向相反读数并存".** No opposite reading survived the re-read.

## Acceptance notes

- **Out of scope, same family, Tier H.** `AGENTS.md` states the
falsified reading as a premise in three places. Prime Directive objectstack-ai#14 says
"draft is what removes queue membership, disabling alone drops only the
arming". Multi-agent §7 says "flipping back to draft drops auto-merge
and queue membership at once". The "State on your PR" paragraph says the
draft flag "flipped back destroys auto-merge and queue membership at
once". I did not touch them. They are reported to the seat.
- **Eviction.** The only dequeue acts measured in this repo are these
two. First, the queue's own ejection after a red group build (objectstack-ai#20420,
objectstack-ai#20442). Second, a manual removal by a maintainer with no draft
conversion (objectstack-ai#20797, `removed_from_merge_queue` 2026-09-30T07:33:36Z).
Whether the remedy should name a different act is a question for the
seat. It is not a rule this PR adds.
- **Changeset.** `.claude/**` is not in any package's `files[]`, so this
PR publishes nothing. `skip-changeset` is the seat's to apply.
- **Governed surface, Tier S (`.claude/**`).** This PR stays a draft
until a `## Contract review` record at `CONTRACT_REVIEW_TIER` exists for
its head.

## Verification (head `02ea176a1`)

- The 20 gates from `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands` all exit 0. They are
`check-closing-keyword-parity` (plus `--self-test`),
`check-comment-mask-corpus`, `check-governed-queue-guard --self-test`,
`check-harness-current --self-test`, `lint
check:doc-formula-expressions` (after building `@objectstack/lint` and
its dependency closure under `os-verify-lock.sh`),
`check:agent-test-spelling`, `check:cross-package-test-inputs`,
`check:doc-authoring`, `check:driver-memory-census`,
`check:gitlink-declared`, `check:nul-bytes`, `check:pm-governed-merges`,
`check:pm-half-states`, `check:pm-skill-id-lint`,
`check:pm-skill-ratchet`, `check:refd-timer-probe`,
`check:required-contexts`, `check:skill-frame-sync` and
`check:watch-hint-literal`.
- `pnpm check:pm-settings-deny-roster` was also run, because its roster
lives under `.claude`. Exit 0.
- `--ran` reconciliation: 20 derived, 20 run, 0 NOT-MEASURED. All 20
recorded an exit code.
- `check:pm-skill-ratchet` printed: `platform-readings.md is 469 lines
(ceiling 469; headroom 0)`, widest table row 0 bytes (pin 0).
- Not measured locally: `check-required-contexts --verify-required-set`
and `check-half-states --provenance`, which read the workflow event, and
the four CI type-check lanes. This diff touches no TypeScript.

## 维护者速读(草稿)

- **改了什么**:PM 协议参考文件 `platform-readings.md` 第 41-43 行,关于「已入队 PR 转 draft
能否踢出合并队列」的三条平台读数。行数不变。
- **为什么改**:旧文说本仓转 draft 会掉出队列。回查时间线后发现,本仓 4 个已入队后转 draft 的 PR 都没有因此出队。其中
2 个带着 draft 状态被队列直接合入,另外 2 个是在自身队列构建变红之后才被移出。旧说法唯一引用的实例,时间线恰好反向。转 draft
会掉 auto-merge,这一点只在「未入队」时成立。
- **风险与代价(含回滚)**:只改文档读数,不改任何规则或代码。补救仍是两手都做。风险在于读者以为有可靠的踢队手段,而实际没有。回滚就是
revert 这一个提交。
- **席位意见**:
- **你要做的**:无需操作,由席位按 Tier S 复核后落地。若要让 `AGENTS.md` 里的同一旧说法一并修正(Tier
H),需要你点头另开 PR。

---
_Generated by [Claude
Code](https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg)_

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 size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec 双源清账 C6:EventSchema(./automation ≠ ./kernel)—— 1 条

2 participants