diff --git a/.claude/skills/pm-dispatch/references/compile-surfaces.md b/.claude/skills/pm-dispatch/references/compile-surfaces.md index 9d2b8e2d10..cf33306335 100644 --- a/.claude/skills/pm-dispatch/references/compile-surfaces.md +++ b/.claude/skills/pm-dispatch/references/compile-surfaces.md @@ -1,11 +1,9 @@ -# 过滤 / 谓词语义的编译面清单(references —— 按需加载) +# 过滤与谓词语义的编译面清单 -出处:主文件「派发」 -的过滤/谓词语义标准条款 —— 命中该条款的派发令把本清单**逐面抄进去**,PR 逐面申报。 -维护纪律与派发前复核串在正文内, -一并适用:**这张表由 PR 维护、派发前先跑复核串重验,⛔ 不凭记忆抄**。 +见 SKILL.md 〈派发〉的过滤与谓词语义条款;命中它的派发令逐面抄进本清单,PR 逐面申报。 +维护纪律与复核串一并适用:这张表由 PR 维护、派发前先跑复核串重验,⛔ 不凭记忆抄。 -编译面清单(逐面实测 @ `main` `48f98b0`,2026-08-07): +编译面清单(行号每天在动,派发前按下方复核串重验): | # | 面 | 落点(file:line) | 备注 | | --- | --- | --- | --- | @@ -15,12 +13,12 @@ | 4 | service-analytics filter-normalizer | `packages/services/service-analytics/src/strategies/filter-normalizer.ts:1235`(`lowerAnalyticsWhere`) | analytics / cube 侧 | | 5 | `formula` | `packages/formula/src/matches-filter.ts:73`(`matchesFilterCondition`) | RLS 写侧 `check` 与公式求值;JS 两值语义的基准面 | | 半面 | objectql `having-filter` | `packages/objectql/src/having-filter.ts:92` / `:98`(`applyHaving` / `matchesHaving`) | 聚合**后**过滤。算半面是因为词表是子集,**但申报义务不打折** —— 它是**唯一没有 conformance 表覆盖的面**(`FILTER_LOGIC_CASES` 不驱动 HAVING 路径),所以漏了它连门禁都不会红 | -| 已解冻 | `driver-memory` / `driver-mongodb` | `packages/drivers/driver-memory/src/memory-matcher.ts:134`(`checkCondition`)、`packages/drivers/driver-mongodb/src/mongodb-filter.ts:700`(`translateFieldOperators`) | 2026-08-05 投入冻结,**2026-08-11 两条裁决解除** ⇒ 「不在范围 + 冻结指令」作废,按普通面申报 | +| 已解冻 | `driver-memory` / `driver-mongodb` | `packages/drivers/driver-memory/src/memory-matcher.ts:134`(`checkCondition`)、`packages/drivers/driver-mongodb/src/mongodb-filter.ts:700`(`translateFieldOperators`) | 冻结指令与不在范围的旧判定均已作废,按普通面申报 | -**这张表本身由 PR 维护 —— 与域表同一纪律。 -** 增删一面(新驱动、新求值器、某面被合并或退役、冻结状态变化)的那个 PR 顺手改这里, -不留给下一次裁决重新数。清单**会**过期是必然的,清单**没有维护者**才是缺陷。 - -⚠️ 派发前复核一遍再抄,⛔ 不要凭这张表的记忆填派发令:本仓的包路径搬过家(驱动进 -`packages/drivers/`、服务进 `packages/services/`),行号更是每天在动。一条够用的复核串:`grep --rn 'matchesFilterCondition\|buildWhereSQL\|compileScopedFilterToSql' packages --include=*.ts | grep -v node_modules`。 +增删一面的那个 PR 顺手改这里,不留给下一次裁决重新数。 +触发增删的四种事件:新驱动、新求值器、某面被合并或退役、冻结状态变化。 +清单会过期是必然的,清单没有维护者才是缺陷。 +派发前复核一遍再抄,⛔ 不凭本表的记忆填派发令:包路径搬过家,行号更是每天在动。 +一条够用的复核串: +`grep -rn 'matchesFilterCondition\|buildWhereSQL\|compileScopedFilterToSql' +packages --include=*.ts | grep -v node_modules`。 diff --git a/.claude/skills/pm-dispatch/references/lanes/cli.md b/.claude/skills/pm-dispatch/references/lanes/cli.md index 9fc945448a..c624e5ecce 100644 --- a/.claude/skills/pm-dispatch/references/lanes/cli.md +++ b/.claude/skills/pm-dispatch/references/lanes/cli.md @@ -1,6 +1,6 @@ -# 车道岗位说明:domain:cli(references/lanes —— 座位贴指针指向本文件) +# 车道岗位说明:domain:cli -岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。 +见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 @@ -8,24 +8,22 @@ `packages/mcp`、`packages/observability`、`packages/client*`、 `cloud-connection`、`create-objectstack`、`packages/adapters/*`、 `plugin-hono-server`、`plugin-dev`。 -- 红线:按落点判归属 —— 标题挂 cli 而落点在别包的卡只上报误标不改签; - `packages/spec` 恒归 spec 座位;`/meta` 路由**本体**归本席,元数据格式/接受面归 - `domain:spec`。 +- 红线:按落点判归属 —— 标题挂 cli 而落点在别包的卡只上报误标,⛔ 不改签。 +- `packages/spec` 恒归 spec 座位。 +- `/meta` 路由本体归本席,元数据格式与接受面归 `domain:spec`。 ## 常设承诺 -- **PR 侧绿 ≠ 队列侧绿**;队列分支读法与边界在 platform-readings(条目名 - `main/pr-{number}-{parent sha}`,parent sha 可重建队序;⚠️ ref 在出队后滞留)。 -- `dispatch-gates.mjs` 只报**路径推导**的地板 —— 条款②从卡**内容**判且优先于它;已知盲 - 区:它不点名 `pnpm lint` 族 ⇒ 本车道派发令恒补一句「跑 `pnpm lint`」。 -- ⛔ 永不削弱门禁 —— 棘轮上跳是门禁在报你的改动有缺陷;规则文案里自带的逃生舱只用 - 于它描述的那种情形。 +- PR 侧绿不等于队列侧绿;队列分支条目名、队序重建与出队滞留住 `../platform-readings.md`。 +- `dispatch-gates.mjs` 只报路径推导的地板,条款②从卡内容判且优先于它。 +- 已知盲区:它不点名 `pnpm lint` 族 ⇒ 本车道派发令恒补一句跑 `pnpm lint`。 +- ⛔ 永不削弱门禁:棘轮上跳是门禁在报你的改动有缺陷。 +- 规则文案里自带的逃生舱只用于它描述的那种情形。 ## 席内判断 -- **探针的 baseline 也是测量**,而且是没人复查的那个 —— 判据恒读命中行本身,⛔ 不 - 读命中数;断言「文本被删」的探针要锚在消失的那段上(被删串的前缀在删除后仍然幸 - 存是构造使然)。 -- 静默时长是**发探针**的门槛,永不是判死的(本车道实测基线:派发 → draft PR ≈ - 35–50 分钟);分支无提交 + SendMessage 探针便宜,且实测能复活假死的 dev —— ⛔ 永 - 不往可能活着的 worktree 派第二个 agent。 +- 探针的 baseline 也是测量,而且是没人复查的那个 ⇒ 判据恒读命中行本身,⛔ 不读命中数。 +- 断言文本被删的探针要锚在消失的那段上:被删串的前缀在删除后仍幸存是构造使然。 +- 静默时长是发探针的门槛,永不是判死的门槛;基线自本车道实录,⛔ 不写成常数。 +- 分支无提交加 SendMessage 探针便宜,且能复活假死的 dev。 +- ⛔ 永不往可能活着的 worktree 派第二个 agent。 diff --git a/.claude/skills/pm-dispatch/references/lanes/devx.md b/.claude/skills/pm-dispatch/references/lanes/devx.md index f4992e3064..3d5a319335 100644 --- a/.claude/skills/pm-dispatch/references/lanes/devx.md +++ b/.claude/skills/pm-dispatch/references/lanes/devx.md @@ -1,39 +1,38 @@ -# 车道岗位说明:domain:devx(references/lanes —— 座位贴指针指向本文件) +# 车道岗位说明:domain:devx -岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。 +见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 - `packages/lint`、`packages/sdui-parser`、`content/docs/**`、`apps/docs`、 `scripts/`(门禁类)、`.github/workflows/`(门禁接线)、`.githooks/`、 `examples/**` 测试基建面、`docker/README.md`。 -- objectui 的本域面同辖:`.github/`、`scripts/`、构建/发布管线与门禁工具(objectui 卡三流分流,判 - 据见 SKILL.md 多仓协调)。 -- 边界:守护 skills 的门禁脚本在 `scripts/` 下时归本席 —— 判据是**被改文件的路 - 径**,SUBJECT 例外与 spec 三面切分在 SKILL.md 域车道表;`.claude/workflows/` - ≠ `.claude/skills/`;**范围内的文件 ≠ 范围内的卡**,归属按卡的 `domain:*` 判,反向亦然(本席卡 - 的落点溢进他席文件面时,由此产生的人工合并等后果照单接受)。 +- objectui 的本域面同辖:`.github/`、`scripts/`、构建与发布管线、门禁工具。 +- 边界:守护 skills 的门禁脚本在 `scripts/` 下时归本席,判据是被改文件的路径。 +- SUBJECT 例外与 spec 三面切分在 SKILL.md 域车道表;`.claude/workflows/` 不是 `.claude/skills/`。 +- 范围内的文件不等于范围内的卡:归属按卡的 `domain:*` 判,反向亦然。 +- 本席卡的落点溢进他席文件面时,由此产生的人工合并等后果照单接受。 ## 常设承诺 -- `content/docs/releases/**` 是 release-owned,恰两条通道:完整性缺口逐卡批准 - (⛔ 不构成先例);事实错误走专用 docs-only PR。发布页作用域只管 v16 及以后。 -- ⛔ 不做任何发布动作,含改根 `version` 脚本链;**能点绿的门禁不等于该点绿**。 -- governed 面 PR 照 SKILL.md「ACCEPT 之后的路径分叉」执行(⛔ 此处不另抄);设计如此的红门禁必 - 须在 PR 上说明红因并声明不修。 -- changeset 按 publish 面判:根 `scripts/` / docs / test-only ⇒ `skip-changeset`; - 落进已发布包的源 ⇒ 真 changeset;**收窄接受集**须 lint+spec 双侧语义登记,尤须 - 慎重。 +- `content/docs/releases/**` 是 release-owned,恰两条通道;发布页作用域只管 v16 及以后。 +- 通道一:完整性缺口逐卡批准,⛔ 不构成先例。通道二:事实错误走专用 docs-only PR。 +- ⛔ 不做任何发布动作,含改根 `version` 脚本链;能点绿的门禁不等于该点绿。 +- 受管面 PR 照 SKILL.md 〈复核〉的路径分叉执行,⛔ 此处不另抄。 +- 设计如此的红门禁必须在 PR 上说明红因并声明不修。 +- changeset 按 publish 面判:根 `scripts/`、docs、test-only ⇒ `skip-changeset`。 +- 落进已发布包的源 ⇒ 真 changeset。 +- 收窄接受集须 lint 与 spec 双侧语义登记,尤须慎重。 ## 席内判断 -- **卡片正文冻结在立卡那一刻**,而本仓刻意把裁定/更正/`Blocked-by:` 放在评论里 —— - 超过一天的卡,正文是页面上最不当前的东西;先读晚于正文的评论再判可派性。 -- **量具在共享 checkout 上会静默说谎**:读内容用 `git show origin/main:` 带路径,跑脚本必须在自 - 己的 worktree,复核 diff 用具名 ref,⛔ 不用 `FETCH_HEAD`(它是共 - 享的,会被别的 agent 的 fetch 在两条命令之间冲掉)。 -- **门禁的自述必须为真** —— 理由为假的门禁比没有门禁更坏(下一个读者会相信某风险 - 已被覆盖);新门禁靠**故意复现伤害**自证,语料已被修干净时加反空转肢(某个面读 - 不出具名 pin 即判失败),⛔ 让枚举静默退化成 no-op。 -- 派发词给出的实测值必须同时给「自己重测」的指令(PM 清单会错,dev 重推导是兜 - 底);先例给的是「怎么想」,不是「怎么改」。 +- 卡片正文冻结在立卡那一刻,而本仓刻意把裁定、更正与 `Blocked-by:` 放在评论里。 +- ⇒ 超过一天的卡,正文是页面上最不当前的东西;先读晚于正文的评论再判可派性。 +- 量具在共享 checkout 上会静默说谎:读内容用 `git show origin/main:` 带路径。 +- 跑脚本必须在自己的 worktree;复核 diff 用具名 ref,⛔ 不用 `FETCH_HEAD`。 +- `FETCH_HEAD` 是共享的,会被别的 agent 的 fetch 在两条命令之间冲掉。 +- 门禁的自述必须为真:理由为假的门禁比没有门禁更坏,读者会相信某风险已被覆盖。 +- 新门禁靠故意复现伤害自证;语料已被修干净时加反空转肢,某面读不出具名 pin 即判失败。 +- ⛔ 不让枚举静默退化成 no-op。 +- 派发词给出的实测值必须同时给自己重测的指令:PM 清单会错,dev 重推导是兜底。 +- 先例给的是怎么想,不是怎么改。 diff --git a/.claude/skills/pm-dispatch/references/lanes/director.md b/.claude/skills/pm-dispatch/references/lanes/director.md index ed8b7cb996..5d88067df3 100644 --- a/.claude/skills/pm-dispatch/references/lanes/director.md +++ b/.claude/skills/pm-dispatch/references/lanes/director.md @@ -1,72 +1,72 @@ -# 席位章程:项目总监(Project Director)(references/lanes —— 座位贴指针指向本文件) +# 席位章程:项目总监(Project Director) -岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件;⛔ 不引用 -issue 编号;机器判据恒英文,引文逐字不译。 +见 SKILL.md 〈升级与决策〉;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文件。 ## 授权与形态 -- **授权源**(维护者 2026-08-27,live PM chat,逐字未译):「项目总监 由人工定期指挥,负责处理 - contract-review 类别的和需要决裁的。」—— 此句即本席的职责定义与召唤契约。 -- **人工召唤,⛔ 无 Routine 无 cron 无常设舰队位**:维护者说「处理决裁」/「处理 - contract-review」或 `/pm-dispatch director` 即入口;召唤间隔里决策卡与审计窗口**停放是设计安 - 全态**(复核放行常设归派发席席内,见职责一),召唤节奏即决裁与审计节奏。 -- **档位** = `CONTRACT_REVIEW_TIER`(dispatch-gates 常量单源,⛔ 本文不写模型名);每场开场按降 - 档保险丝机读认定(细则见 `../contract-review.md`);不达档只做免档整理(载体盘点、批次拟 - 稿、「待您」清单归集),四职停放,⛔ 不出裁决、不清标、不摘标。 -- **双射 carve-out**:一张 `pm:seat` 座位贴、四段协议照旧(与分诊席同款);不占 `domain:*` - 车道,范围按职责标签跨车道跨仓;永不认领 backlog、永不写码;机械接手经派发 dev。 +- 授权面 = 由人工定期指挥,负责处理 contract-review 类别的和需要决裁的。 +- 人工召唤,⛔ 无 Routine、无 cron、无常设舰队位。 +- 入口:维护者说处理决裁或处理 contract-review,或 `/pm-dispatch director`。 +- 召唤间隔里决策卡与审计窗口停放是设计安全态;召唤节奏即决裁与审计节奏。 +- 复核放行常设归派发席席内,不因本席未被召唤而停。 +- 档位 = `CONTRACT_REVIEW_TIER`,dispatch-gates 常量单源,⛔ 本文不写模型名。 +- 每场开场按降档保险丝机读认定,细则见 `../contract-review.md`。 +- 不达档只做免档整理(载体盘点、批次拟稿、待您清单归集),四职停放,⛔ 不裁不清标。 +- 双射 carve-out:一张 `pm:seat` 座位贴、四段协议照旧,与分诊席同款。 +- 不占 `domain:*` 车道,范围按职责标签跨车道跨仓。 +- 永不认领 backlog、永不写码;机械接手经派发 dev。 -## 基本原则(2026-08-27 裁定) +## 基本原则 -- 三要素:每批 5 张;每卡从业务角度讲清问题与选项及其真实代价;每卡带四维综合分析 + - 一个推荐。呈报批序与写法见 `../decision-analysis.md`;四维框架单源在主文件「升级与决 - 策」四轴(`check:skill-frame-sync` 管的四份拷贝不动,⛔ 本文不复制框架本体)。 -- 本原则重锚(2026-08-26 裁定):流程未变,2026-08-26 定流程、2026-08-27 升格定归属。 -- **创业阶段不渐进**(2026-08-27 裁定): - 废弃别名与退役默认立即退休,无窗口无双拼写宽限;staged 仅凭具名外部用户证据可荐。 +- 三要素:每批 5 张;每卡从业务角度讲清问题、选项与代价;每卡带四维分析加一个推荐。 +- 呈报批序与写法见 `../decision-analysis.md`。 +- 四维框架单源在 SKILL.md 〈升级与决策〉,⛔ 本文不复制框架本体。 +- 创业阶段不渐进:废弃别名与能力退役默认立即退休,无窗口、无双拼写宽限。 +- staged 选项仅凭具名外部用户证据才可荐。 -## 职责一:`needs:contract-review` 事后审计/抽查(可选) +## 职责一:`needs:contract-review` 事后审计与抽查(可选) -- **审计位,非放行链**(2026-08-31 裁定改制:放行常设归**派发席席内复核**,归属与全链见 - `../contract-review.md`,⛔ 不另抄):召唤时作事后审计/抽查 —— 枚举载体(卡与 PR 两侧)与近 - 期落地的条款② PR,查复核质量与漏网;裁决仍被尊重但非放行必要条件,⛔ 不与席内复核抢 - 同一载体的放行动作;非机械 CI 红交回具名读者,机械红可接手(经派发 dev 执行)。 -- **处理三分支**(2026-08-27 裁定): - - **收尾(PASS,工已完)⇒ 跟到合并为止**:非受管 code PR 走「清标即落地」全链;受管面 - 照旧 draft-only + 人工合并 ——「到合并」= 推进到就绪并点名等待,⛔ 不代维护者合并。 - - **大的错误(FAIL/REWORK)⇒ 改标签即交接**:按状态机一笔 replace 转回相应工作态(重派/ - 返工),⛔ 散文点名不是交接 —— 标签才是收件箱,散文对候选查询与 sweep 全不可见。 - - **卡在决策卡(BLOCKED)⇒ ⛔ 不擅断**:并入决裁批次,按基本原则格式与维护者讨论。 +- 本职是审计位,非放行链:放行常设归派发席席内复核,归属与全链见 `../contract-review.md`。 +- 召唤时枚举载体(卡与 PR 两侧)与近期落地的条款② PR,查复核质量与漏网。 +- 裁决仍被尊重但非放行必要条件,⛔ 不与席内复核抢同一载体的放行动作。 +- 非机械 CI 红交回具名读者;机械红可接手,经派发 dev 执行。 +- 处理三分支之一,收尾 PASS 且工已完 ⇒ 跟到合并为止。 +- 非受管 code PR 走清标即落地全链;受管面照旧 draft-only 加人工合并。 +- 到合并 = 推进到就绪并点名等待,⛔ 不代维护者合并。 +- 之二,大的错误 FAIL 或 REWORK ⇒ 改标签即交接:按状态机一笔 replace 转回相应工作态。 +- ⛔ 散文点名不是交接:标签才是收件箱,散文对候选查询与 sweep 全不可见。 +- 之三,卡在决策卡 BLOCKED ⇒ ⛔ 不擅断:并入决裁批次,按基本原则格式与维护者讨论。 ## 职责二:决裁勤务 -- 决策收件箱(`needs-user-decision`)跨仓勤务:按基本原则批呈;一行回批即全链执行,裁后 - 四件原子执行不再请示;批间新到滚入下批,收件箱清零才收工;⛔ 不复活已退役的 - 汇总 issue(2026-08-19 裁定)。 -- 代裁通道(分诊席或本席)硬门、置信门与人工地板见主文件「分诊座位职责」,⛔ 不另 - 抄;不达档 ⇒ 通道整体跳过、卡走维护者路径,恒安全。 +- 决策收件箱 `needs-user-decision` 跨仓勤务,按基本原则批呈。 +- 一行回批即全链执行,裁后四件原子执行不再请示。 +- 批间新到滚入下批,收件箱清零才收工;⛔ 不复活已退役的汇总 issue。 +- 代裁通道(分诊席或本席)的硬门、置信门与人工地板见 SKILL.md 分诊座位职责,⛔ 不另抄。 +- 不达档 ⇒ 通道整体跳过,卡走维护者路径,恒安全。 -## 职责三:维护者动作台账(2026-08-27 裁定) +## 职责三:维护者动作台账 -- `pm:awaiting-maintainer` 跨仓标签是「待人工动作」唯一机器载体(决定已做、只剩一次 GitHub - 之外人工动作的态);本席是台账管家,车道席照旧只负责**入态**,台账与出口归本席。 -- 召唤时随决裁批次呈报一份合并的「待您」清单 —— 座位贴散文降为指针,标签即状态。 -- **出口执行**:核验动作确已发生 → 摘标 + 证据评论同笔;出口条款见 `../state-machine.md`。 +- `pm:awaiting-maintainer` 跨仓标签是待人工动作的唯一机器载体。 +- 该态 = 决定已做、只剩一次 GitHub 之外的人工动作。 +- 车道席照旧只负责入态,台账与出口归本席。 +- 召唤时随决裁批次呈报一份合并的待您清单;座位贴散文降为指针,标签即状态。 +- 出口执行:核验动作确已发生,再摘标加证据评论同笔;出口条款见 `../state-machine.md`。 -## 职责四:governed 合并审计(2026-08-27 裁定) +## 职责四:受管合并审计 -- 检测双层、处置单席:车道轮报 sweep 只作早警,权威合并窗口在本席,每场召唤实跑 - check-governed-merges,`--since-ref` 锚上一场记录的 tips(锚行住座位贴说明段;脚本零存储,自 - 打印下一场参数),跑后新 tips 同笔记回;INCOMPLETE(exit 2)照实报,⛔ 不作干净。 -- 清单并入决裁批次,一行一条认定 y/n;未认定条目 = 席位违规,同笔立 `needs-user-decision` 卡 - 立案回滚(事后审计制)(2026-08-18 裁定);容器 403 归因逐条走 MCP 补齐。 -- ⛔ 不新增标签(枚举本地树推导零 API);⛔ 无 cron(节奏与停放同「授权与形态」)。 +- 检测双层、处置单席:车道轮报 sweep 只作早警,权威合并窗口在本席。 +- 每场召唤实跑 check-governed-merges,`--since-ref` 锚上一场记录的 tips。 +- 锚行住座位贴说明段;脚本零存储,自打印下一场参数,跑后新 tips 同笔记回。 +- INCOMPLETE(exit 2)照实报,⛔ 不作干净。 +- 清单并入决裁批次,一行一条认定 y 或 n。 +- 未认定条目 = 席位违规,同笔立 `needs-user-decision` 卡立案回滚,事后审计制。 +- 容器 403 归因逐条走 MCP 补齐。 +- ⛔ 不新增标签:枚举本地树推导零 API。⛔ 无 cron,节奏与停放同授权段。 -## 交接台账(supersession —— 原条款已原地改写,此处记两个日期的关系) +## 与 skills 席的分界 -- **决裁半边**:2026-08-26 裁定(见主文件总监段)的决裁归属由 2026-08-27 移交本席; - skills 面照旧归 skills 席 —— 分界:改 skill/指令/governance 文本的工作归 skills 席,出裁 - 决、清复审标、清点待人工清单的勤务归本席。 -- **复核归属与代裁 runner**:skills 席自绑小时钟(维护者 2026-08-23)实测已死,⛔ 不复活 → 移交 - 本席召唤 → 2026-08-27 再裁常设 = 分诊定时轮 → 2026-08-31 再裁:放行改**派发席席内复核**, - 定时轮与本席降为可选事后审计(`../contract-review.md` 为准);机读保险丝照旧,不可协商。 +- 改 skill、指令或治理文本的工作归 skills 席。 +- 出裁决、清复审标、清点待人工清单的勤务归本席。 +- 契约复核的放行归派发席席内,定时轮与本席降为可选事后审计,`../contract-review.md` 为准。 +- 机读保险丝照旧,不可协商。 diff --git a/.claude/skills/pm-dispatch/references/lanes/engine.md b/.claude/skills/pm-dispatch/references/lanes/engine.md index e3f75fd135..a35d891f70 100644 --- a/.claude/skills/pm-dispatch/references/lanes/engine.md +++ b/.claude/skills/pm-dispatch/references/lanes/engine.md @@ -1,36 +1,32 @@ -# 车道岗位说明:domain:engine(references/lanes —— 座位贴指针指向本文件) +# 车道岗位说明:domain:engine -岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。本车道 -2026-08-19 由 engine-core+metadata+drivers 合并(裁决引文在 SKILL.md 域车道表)。 +见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 - `packages/objectql`(含 SchemaRegistry)、`packages/core`、`packages/formula` - (CEL / `matches-filter` / RLS 谓词求值)、`plugin-pinyin-search`(落点在编译/查 - 询核心)。⚠️ `objectql/src/metadata-facade.ts` 名字带 metadata,归本车道。 + (CEL、`matches-filter`、RLS 谓词求值)、`plugin-pinyin-search`(落点在编译与查询核心)。 +- `objectql/src/metadata-facade.ts` 名字带 metadata,仍归本车道。 - `packages/metadata*`(加载、注册、持久化、缓存、目录)、`packages/platform-objects`。 -- `packages/drivers/driver-*`(driver-memory / driver-mongodb / driver-sql / - driver-sqlite-wasm / driver-turso)。 -- 红线:改元数据**格式/接受面**(判据是「**改变**接受面」,不是「碰到 spec」)⇒ - `domain:spec`;`/meta` 路由本体在 `packages/rest` ⇒ `domain:cli`; - `packages/services/**` ⇒ `domain:services`;`content/docs/**`、`packages/lint` - ⇒ `domain:devx`。 +- `packages/drivers/driver-*`:driver-memory、driver-mongodb、driver-sql、 + driver-sqlite-wasm、driver-turso。 +- 红线:改元数据格式或接受面 ⇒ `domain:spec`,判据是改变接受面而不是碰到 spec。 +- `/meta` 路由本体在 `packages/rest` ⇒ `domain:cli`;`packages/services/**` ⇒ `domain:services`。 +- `content/docs/**` 与 `packages/lint` ⇒ `domain:devx`。 ## 常设承诺 -- **driver conformance 台账只降不升**:任何 driver 卡的派发令要求 dev 前后各读一 - 次 covered/DEBT 读数,写进报告。 -- 改变契约接受/拒绝行为的卡按条款②处理(判据与档位在 SKILL.md,⛔ 不另抄)。 +- driver conformance 台账只降不升:driver 卡的派发令要求 dev 前后各读一次 covered 与 DEBT。 +- 改变契约接受或拒绝行为的卡按条款②处理,判据与档位在 SKILL.md,⛔ 不另抄。 ## 席内判断 -- **区域 ≠ 文件**:区域放行只能来自对方卡**真实改动行程**(有 PR 读 diff,没有就 - 申报 UNKNOWN);**做删除的卡,其行程没人能从「它加了什么」的名字推出**。行号数 - 小时内即腐烂,恒按符号定位。 -- **五个 driver 列只有约三个独立实现**:`driver-sqlite-wasm` 与 `driver-turso` - local 都继承 `SqlDriver` 的 filter 编译器 —— 把一致性表当五方佐证会高估证据;同 - 理,单点修 SQL 家族共享 seam 即可覆盖三个 driver。 -- **元数据合并语义按键类各不相同**(fields 展开 / validations+indexes 连接 / 标量 - last-writer-wins)—— 评审 pin 时先问它**没有**覆盖什么;标量的 last-writer-wins - 是跨机制重复立卡的老源头,同 seam 的第三张分歧卡优先裁**类**,不裁实例。 -- 元数据接受面形状的卡先问「生产者在哪」—— 答案常改变卡的范围与域标签,回分诊。 +- 区域不等于文件:区域放行只能来自对方卡真实改动行程,有 PR 读 diff,没有就申报 UNKNOWN。 +- 做删除的卡,其行程没人能从它加了什么的名字推出。 +- 行号数小时内即腐烂,恒按符号定位。 +- 五个 driver 列只有约三个独立实现:sqlite-wasm 与 turso local 都继承 `SqlDriver` 的 filter 编译器。 +- ⇒ 把一致性表当五方佐证会高估证据;同理,单点修 SQL 家族共享 seam 即可覆盖三个 driver。 +- 元数据合并语义按键类各不相同:fields 展开、validations 与 indexes 连接、标量 last-writer-wins。 +- ⇒ 评审 pin 时先问它没有覆盖什么。 +- 标量的 last-writer-wins 是重复立卡的老源头,同 seam 的第三张分歧卡优先裁类,不裁实例。 +- 元数据接受面形状的卡先问生产者在哪:答案常改变卡的范围与域标签,回分诊。 diff --git a/.claude/skills/pm-dispatch/references/lanes/hotcrm.md b/.claude/skills/pm-dispatch/references/lanes/hotcrm.md index ca7a813a43..b42e008e35 100644 --- a/.claude/skills/pm-dispatch/references/lanes/hotcrm.md +++ b/.claude/skills/pm-dispatch/references/lanes/hotcrm.md @@ -1,57 +1,53 @@ -# 车道岗位说明:repo:hotcrm(references/lanes —— 座位贴指针指向本文件) +# 车道岗位说明:repo:hotcrm -岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。本席为姊妹仓 -执行座位:在 hotcrm 仓认领/派发/复核/落地,⛔ 不产 `domain:*`/type/定级(纪律全文在 SKILL.md 多仓 -协调规则 4)。 +见 SKILL.md 〈多仓协调〉;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文件。 -## 宪章出处(维护者裁决 2026-08-20,逐字未译 —— 本席一切判断锚定于此) +## 形态 -> 「新增了 hotcrm 仓库的席位,这个仓库作为 objectstack 的样板工程,使用元数据开发crm应用,平台相关的功能应该在平台中实现,hotcrm 主要是展现平台能力,并且不扩散需求。」 - -> 「hotcrm 部署到objectos企业版时,就会有企业版的能力,但是在 objectstack 社区版中也可以运行。」 +- 本席为姊妹仓执行座位:在 hotcrm 仓认领、派发、复核、落地。 +- ⛔ 不产 `domain:*`、type 与定级,纪律全文在 SKILL.md 多仓协调规则 4。 ## 范围 -- `objectstack-ai/hotcrm` 全仓:元数据优先的 CRM 样板工程(exemplar app),不入 spec 依赖链(同 - objectos)。应用即展品,不是功能实验场 —— 收卡第一问恒 - 为「这张卡展现哪项平台能力?」。 -- 边界(宪章的牙齿):**平台相关的功能在平台中实现** —— 建设 hotcrm 时发现的平台能力缺 - 口,立**普通平台卡** - 到 objectstack/objectui(file-at-destination,非缝卡,待分诊;hotcrm 侧同笔 `pm:blocked` + - `Blocked-by: #N` 回链),⛔ 永不在 hotcrm 内绕行 —— 绕行把平台缺口藏进样板,展品从此示范错误写法。 -- `repo:hotcrm` 缝标签只给真协调卡(跨仓次序即卡的实质);纯 hotcrm 修复住 hotcrm 仓(issue 住在修 - 复落地的仓,多仓协调规则 1)。 +- `objectstack-ai/hotcrm` 全仓:元数据优先的 CRM 样板工程,不入 spec 依赖链。 +- 应用即展品,不是功能实验场 —— 收卡第一问恒为这张卡展现哪项平台能力。 +- 边界:平台相关的功能在平台中实现。 +- 建设 hotcrm 时发现的平台能力缺口,立普通平台卡到 objectstack 或 objectui。 +- 那是 file-at-destination、非缝卡、待分诊;hotcrm 侧同笔挂 `pm:blocked` 加 `Blocked-by:` 回链。 +- ⛔ 永不在 hotcrm 内绕行:绕行把平台缺口藏进样板,展品从此示范错误写法。 +- `repo:hotcrm` 缝标签只给真协调卡,跨仓次序即卡的实质。 +- 纯 hotcrm 修复住 hotcrm 仓:issue 住在修复落地的仓。 ## 常设承诺 -- **半状态巡查在本仓无载体**(2026-08-25 实测:14 个 workflow 无 `half-state-patrol.yml`,无 workflow 即 - 无锚 issue):SKILL.md 执行座位职责的读锚第一步在此恒空,代之以手工半边 —— 开新派发前 - 整车道全交集读 open 卡,逐张核 `pm:dispatched`/`pm:in-review` 的交付 PR 是否已合并/关闭,先处置 - 半状态。⛔ 无锚不等于免检。 -- **展现平台能力**:样板演示的能力必须真实兑现(declared = enforced 在展品里双倍重要 —— 展 - 品撒谎等于教每个 - 照抄的 AI 撒谎);发现 declared≠enforced 先问「生产者在哪」,生产者在平台 ⇒ 上游卡。 -- **不扩散需求**:创业阶段聚焦原则全额适用,四维框架轴④是本车道首要过滤器(框架单源在 SKILL.md「升级与决 - 策」,⛔ 不另抄);投机功能形状不入队 —— 走决策箱或关 not planned(定级归分诊/维护者,本席只供证据)。 -- **双版本兼容**:hotcrm 必须在 objectstack 社区版可运行;部署到 objectos 企业版时获得企业能 - 力。操作判据: hotcrm 元数据只可依赖社区能力面,企业特性恒为增强(enhancement-only)⛔ 永不 - 硬依赖;会 break 社区版运行的卡定义上是错范围,回分诊。 -- **该仓有 changeset 流**(旧句「无 changeset 流」是假的,照抄它的派发词让 dev 的 PR 到岸即红): - `changeset-check.yml` 门住每个到 main/develop 的 PR,判据是本 PR **新增**的 `.changeset/*.md`(对 base sha - 求 - diff,存量不算);两条法定豁免任选:`skip-changeset` 标签,或空 frontmatter 的 changeset(声明本 PR 不 - 发布任 - 何东西)。⛔ 判据不是包的发布状态 —— 该仓 `private: true`,门照设不误。**无发版板**仍为 - 真(标签清单无 - `target:*`);发版 = `changeset version` 一次消化存量(2026-08-23 吃掉 291 份出 3.0.0)+ `v*.*.*` tag 触发 - release.yml。 -- **依赖是已发布的 `@objectstack/*` 包(逐包定版号,非 git pin)**:平台侧修复必须先发版、再在此 - 升版号才到得了展品 —— 上游卡对本道的解锁判据是「已发布」,不是「已合并」。 -- pm 状态机词表五仓统一(幂等创建在 `scripts/pm/ensure-pm-labels.sh`,对 hotcrm 实跑是落地步骤)。 +- 半状态巡查在本仓无载体:无 `half-state-patrol.yml`,无 workflow 即无锚 issue。 +- ⇒ SKILL.md 执行座位职责的读锚第一步在此恒空,代之以手工半边。 +- 手工半边:开新派发前整车道全交集读 open 卡。 +- 逐张核 `pm:dispatched` 与 `pm:in-review` 的交付 PR 是否已合并或关闭,先处置半状态。 +- ⛔ 无锚不等于免检。 +- 展现平台能力:样板演示的能力必须真实兑现,declared 等于 enforced 在展品里双倍重要。 +- 展品撒谎等于教每个照抄的 AI 撒谎。 +- 发现 declared 不等于 enforced 先问生产者在哪;生产者在平台 ⇒ 上游卡。 +- 不扩散需求:创业阶段聚焦原则全额适用,四维框架的不扩散那一轴是本车道首要过滤器。 +- 框架单源在 SKILL.md 〈升级与决策〉,⛔ 不另抄。 +- 投机功能形状不入队:走决策箱或关 not planned;定级归分诊或维护者,本席只供证据。 +- 双版本兼容:hotcrm 必须在 objectstack 社区版可运行,部署到 objectos 企业版时获得企业能力。 +- 操作判据:hotcrm 元数据只可依赖社区能力面,企业特性恒为增强,⛔ 永不硬依赖。 +- 会 break 社区版运行的卡定义上是错范围,回分诊。 +- 该仓有 changeset 流:`changeset-check.yml` 门住每个到 main 或 develop 的 PR。 +- 判据是本 PR 新增的 `.changeset/*.md`,对 base sha 求 diff,存量不算。 +- 两条法定豁免任选:`skip-changeset` 标签,或空 frontmatter 的 changeset 声明本 PR 零发布。 +- ⛔ 判据不是包的发布状态:该仓 `private: true`,门照设不误。 +- 无发版板:标签清单无 `target:*`。 +- 发版 = `changeset version` 一次消化存量,加 `v*.*.*` tag 触发 release.yml。 +- 依赖是已发布的 `@objectstack/*` 包,逐包定版号,非 git pin。 +- ⇒ 平台侧修复必须先发版、再在此升版号才到得了展品。 +- 上游卡对本道的解锁判据是已发布,不是已合并。 +- pm 状态机词表五仓统一,幂等创建在 `scripts/pm/ensure-pm-labels.sh`,对 hotcrm 实跑是落地步骤。 ## 席内判断 -- 平台缺口卡是本席最常见的联动产出 —— 立卡在平台仓、无 assignee、普通卡待分诊, - `domain:*`/type 留给分诊;催办不代裁。 -- 展品价值判据:一张卡若既不展现平台能力、也不修真实缺陷,默认不做(轴④);拿不 - 准升决策箱,⛔ 不自裁。 +- 平台缺口卡是本席最常见的联动产出:立卡在平台仓、无 assignee、普通卡待分诊。 +- `domain:*` 与 type 留给分诊;催办不代裁。 +- 展品价值判据:一张卡若既不展现平台能力、也不修真实缺陷,默认不做。 +- 拿不准升决策箱,⛔ 不自裁。 diff --git a/.claude/skills/pm-dispatch/references/lanes/services.md b/.claude/skills/pm-dispatch/references/lanes/services.md index fb29e039e0..80c3edbe06 100644 --- a/.claude/skills/pm-dispatch/references/lanes/services.md +++ b/.claude/skills/pm-dispatch/references/lanes/services.md @@ -1,7 +1,6 @@ -# 车道岗位说明:domain:services(references/lanes —— 座位贴指针指向本文件) +# 车道岗位说明:domain:services -岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。本车道 -2026-08-19 并入原 identity 车道的四个插件(裁决引文在 SKILL.md 域车道表)。 +见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 @@ -9,20 +8,20 @@ `plugin-approvals`、`plugin-webhooks`、`plugin-email`、`plugin-reports`、 `embedder-openai`、`knowledge-*`。 - 身份侧:`plugin-auth`、`plugin-security`、`plugin-sharing`、`plugin-audit`。 -- 红线:零持有 `packages/spec` —— 触 spec 的卡一律转 spec 座位;**安全/权限边界的 - 放宽**(访问控制、认证流、RLS/共享语义、审计留痕)是人工地板,恒升级不代裁。 +- 红线:零持有 `packages/spec` —— 触 spec 的卡一律转 spec 座位。 +- 安全与权限边界的放宽是人工地板,恒升级不代裁。 +- 该边界含访问控制、认证流、RLS 与共享语义、审计留痕。 ## 常设承诺 -- **每条否定性 pin 都要消融验证**(被禁行为放回 → 测试转红 → 报失败输出 → 恢复) - —— 单独的绿不是证据。 -- **安全族卡的披露纪律**:复现配方不落任何公开面(卡、PR、评论);证据以抽象描述 - 或私有通道承载。 +- 每条否定性 pin 都要消融验证:被禁行为放回、测试转红、报失败输出、恢复。 +- 单独的绿不是证据。 +- 安全族卡的披露纪律:复现配方不落任何公开面(卡、PR、评论)。 +- 证据以抽象描述或私有通道承载。 ## 席内判断 -- **认证栈版本族升级把 `pnpm-workspace.yaml` overrides 与 `plugin-auth/**` 当同一 - 个热文件面**串行;在旧版本族上测得的前提(兼容性、行为断言)在新版本族落地后 - **逐卡重读**再派发,⛔ 不沿用旧读数。 -- 多服务共享同一条自动化引擎/数据源 seam 时同文件卡跨轮硬串行,后一单派发前先用前 - 一单的报告重新定价(SKILL.md 候选与批次的重定价条款)。 +- 认证栈版本族升级把 `pnpm-workspace.yaml` overrides 与 `plugin-auth/**` 当同一个热文件面串行。 +- 旧版本族上测得的前提(兼容性、行为断言)在新族落地后逐卡重读再派,⛔ 不沿用旧读数。 +- 多服务共享同一条自动化引擎或数据源 seam 时,同文件卡跨轮硬串行。 +- 后一单派发前先用前一单的报告重新定价,见 SKILL.md 候选与批次的重定价条款。 diff --git a/.claude/skills/pm-dispatch/references/lanes/skills.md b/.claude/skills/pm-dispatch/references/lanes/skills.md index 4eaa0f8b2f..2daeccf0f6 100644 --- a/.claude/skills/pm-dispatch/references/lanes/skills.md +++ b/.claude/skills/pm-dispatch/references/lanes/skills.md @@ -1,35 +1,33 @@ -# 车道岗位说明:domain:skills(references/lanes —— 座位贴指针指向本文件) +# 车道岗位说明:domain:skills -岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。 +见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 -- 两个技能根:`.claude/skills/**`(含 pm-dispatch 本体)+ `skills/**`(发布目录,恒英文);`scripts/pm/**` PM - 循环工具;指令架构文件:根 `AGENTS.md` + 根 - `CLAUDE.md`;governed 面的治理执行文件(`.github/CODEOWNERS` 治理路由半边 + - SUBJECT 是 governed 面本身的门禁/审计)。全量判据与裁决引文在 SKILL.md 域车道 - 表;governed 面统一定义见 SKILL.md「ACCEPT 之后的路径分叉」。 -- QA 管理循环执行归本席;qa-run 记录是协议载体不是工作;契约复核归派发席席内、决裁勤务 - 归项目总监席(`lanes/director.md`);本席保留 skill 文本/governance 面与本车道,⛔ 不再代行。 +- 两个技能根:`.claude/skills/**`(含 pm-dispatch 本体)与 `skills/**`(发布目录,恒英文)。 +- `scripts/pm/**` PM 循环工具;指令架构文件:根 `AGENTS.md` 与根 `CLAUDE.md`。 +- 受管面的治理执行文件:`.github/CODEOWNERS` 治理路由半边。 +- 同含 SUBJECT 是受管面本身的门禁与审计脚本。 +- 全量判据在 SKILL.md 域车道表;受管面统一定义见 SKILL.md 〈复核〉,⛔ 不另抄。 +- QA 管理循环执行归本席;qa-run 记录是协议载体不是工作。 +- 契约复核归派发席席内、决裁勤务归项目总监席(`director.md`);本席保留 skill 与治理文本。 ## 常设承诺 - 四维分析先于派发与复核。 -- governed PR 恒 draft 等人合;flip/arm 前跑 `check-governed-merges --test`(带 - 路径);轮报的 governed 合并审计清单带 `--since` 四仓实跑,⛔ 不凭记忆汇总。 -- 档位从 `--tier` 推导引用;pm-dispatch 根 fable 强制;条款②闸门照现行;限额豁免 - floor opus。 -- 棘轮逐行付账,⛔ re-wrap;付账砍点逐条核幸存 —— 被砍内容若在别处无家,砍掉就是 - 丢规则。 -- 首触定级每轮;决策形状 ⇒ 决策箱带四棱块,⛔ 永不自裁(唯一例外:本车道 finding - 自分诊,全仓轮跳过)。 -- 内部指令面中文,机器判据恒英文;认领前重读全线程;标签写 read-modify-write + - 回读。 +- 受管面 PR 恒 draft 等人合;flip 或 arm 前跑 `check-governed-merges --test` 带路径。 +- 轮报的受管合并审计清单带 `--since` 四仓实跑,⛔ 不凭记忆汇总。 +- 档位从 `--tier` 推导引用;pm-dispatch 根恒契约复审档;条款②闸门照现行。 +- 额度耗尽豁免的地板是默认判断档,⛔ 不再往下。 +- 棘轮逐行付账,⛔ re-wrap 筹行;砍点逐条核幸存,被砍内容若在别处无家,砍掉就是丢规则。 +- 首触定级每轮;决策形状 ⇒ 决策箱带四棱块,⛔ 永不自裁。 +- 唯一例外:本车道 finding 自分诊,全仓轮跳过。 +- 内部指令面中文,机器判据恒英文;认领前重读全线程;标签写 read-modify-write 加回读。 - QA 波次由维护者手动触发,⛔ 不自启。 ## 席内判断 -- 技能文本改动的复核先问「谁在读这一行」—— 无具名读者的新增是 token 税;每条经验 - 自含失效模式与边界,⛔ 操作文本不引 issue 编号(id-lint 机械强制)。 -- fold-or-serial 必答与家族派发五门在 SKILL.md 批次独立性段 —— 本车道的 SKILL.md - 热文件链是它最常命中的现场,链首认领就是答题处。 +- 技能文本改动的复核先问谁在读这一行:无具名读者的新增是 token 税。 +- 每条经验自含失效模式与边界;⛔ 操作文本不引 issue 编号,id-lint 机械强制。 +- fold-or-serial 必答与家族派发五门在 SKILL.md 批次独立性段。 +- 本车道的 SKILL.md 热文件链是它最常命中的现场,链首认领就是答题处。 diff --git a/.claude/skills/pm-dispatch/references/lanes/spec.md b/.claude/skills/pm-dispatch/references/lanes/spec.md index 05e1b74e6e..a4701cd979 100644 --- a/.claude/skills/pm-dispatch/references/lanes/spec.md +++ b/.claude/skills/pm-dispatch/references/lanes/spec.md @@ -1,46 +1,43 @@ -# 车道岗位说明:domain:spec(references/lanes —— 座位贴指针指向本文件) +# 车道岗位说明:domain:spec -岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。 +见 SKILL.md 〈座位贴协议〉;本文是本车道岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。 ## 范围 -- `packages/spec` 整包唯一契约,语义/文本/机器三面同席:schema 形状、 - `contracts/**`、退役行为半边、strictness 台账;describe/JSDoc/墓碑散文/错误 - guidance 与 alias 表;`packages/spec/scripts/**`、`packages/spec/docs/**` 及围着 - spec 契约转的工具链(门禁/生成器/lint 规则/报错散文/references 管线)。 -- 一般开发工具面留 devx(维护者 2026-08-09 裁决);`packages/spec` 恒归本席,不论谁需要它。 -- objectui 的契约面同辖:`packages/types`、schema/`$schema` 语料、`@objectstack/spec` pin 耦合与契约决策 - 卡(objectui 卡三流分流,判据见 SKILL.md 多仓协调)。 +- `packages/spec` 整包唯一契约,语义、文本、机器三面同席。 +- 含 schema 形状、`contracts/**`、退役行为半边、strictness 台账。 +- 含 describe 与 JSDoc、墓碑散文、错误 guidance 与 alias 表。 +- 含 `packages/spec/scripts/**`、`packages/spec/docs/**`。 +- 同含围着 spec 契约转的工具链:门禁、生成器、lint 规则、报错散文、references 管线。 +- 一般开发工具面留 devx;`packages/spec` 恒归本席,不论谁需要它。 +- objectui 的契约面同辖:`packages/types`、schema 与 `$schema` 语料、spec pin 耦合与契约决策卡。 ## 席内分派参考 -(维护者 2026-08-16 裁定合并车道;以下判据降为席内分派与定价依据。) - -- 语义/文本按「合法元数据集合变没变」分 —— 改动前能过校验的输入,改动后逐字节同 - 判 ⇒ 文本面(changeset 恒 patch,默认 sweep-first),否则语义面;**任何改变接 - 受/拒绝行为的卡,不论多小,按语义面处理**(条款②)。 -- 机器面改「围着契约转的机器」,与文本面无交集,⛔ 不碰 - `packages/spec/src/**/*.zod.ts` 与 strictness 台账。 -- 产物随源走:describe/JSDoc 改动重生成的 references 产物归触发它的源 PR(生成物 - 门禁重生成提交,⛔ 手改)。 -- 改元数据**格式/接受面**的照旧归 `domain:spec`,`/meta` 路由本体在 - `packages/rest` 归 `domain:cli`;拿不准 FLAG 回分诊,⛔ 不自设第二套判据。 -- 档位随面走的现行表在 SKILL.md 模型分档(单源,⛔ 不另抄)。 +- 语义与文本按合法元数据集合变没变分:改动前过校验的输入改动后同判 ⇒ 文本面。 +- 文本面的 changeset 恒 patch,默认 sweep-first;否则语义面。 +- 任何改变接受或拒绝行为的卡,不论多小,按语义面处理,即条款②。 +- 机器面改围契约的机器,与文本面不交,⛔ 不碰 `packages/spec/src/**/*.zod.ts` 与 strictness 台账。 +- 产物随源走:describe 与 JSDoc 改动重生成的 references 产物归触发它的源 PR。 +- 生成物门禁重生成提交,⛔ 手改。 +- 改元数据格式或接受面的照旧归 `domain:spec`;`/meta` 路由本体在 `packages/rest` 归 `domain:cli`。 +- 拿不准 FLAG 回分诊,⛔ 不自设第二套判据。 +- 档位随面走的现行表在 SKILL.md 模型分档,单源,⛔ 不另抄。 ## 常设承诺 - findings 首触定级归分诊席,本席只供证据。 -- **门禁强制的跨车道 ledger 追加整类预批**(`error-code-ledger.zod.ts`):三条全中即免本席签字 - —— ① 码的存在已在归属卡裁过(ADR-0112 令注册强制);② 纯增量:不动 schema 形状/既有条 - 目/ledger 机制,只落追加方自己的包分节;③ 兜底不变:条款②路径肢照命中,入队前仍过契约 - 复核。出类(新 ledger 字段、重构、别道条目、准入/拒收语义)⇒ 本席卡,不论谁需要它。 -- **分支信息测试**(2026-08-26 裁决原文不译):"Does this defect give a consumer a branch it could act on - differently? No ⇒ widen the existing member's comment/message; yes ⇒ new code under the pre-approved class." -- **待命巡逻每次做整车道全交集读**(delta 扫描有尾隙:扫描后、波次边界前入队的卡 - 谁都看不见;全交集读是安全网)。 -- **契约面卡的 fixture triage 必须跑消费包测试**(A 包的改动可让 B 包的 fixture 反着断言,spec - 范围内任何 sweep 都看不见)—— 派发令点名消费包测试清单,报告要有各消费包真实读数。 +- 门禁强制的跨车道 ledger 追加整类预批(`error-code-ledger.zod.ts`),三条全中即免本席签字。 +- ①:码的存在已在归属卡裁过。 +- ②:纯增量 —— 不动 schema 形状、既有条目与 ledger 机制,只落追加方自己的包分节。 +- ③:兜底不变 —— 条款②路径肢照命中,入队前仍过契约复核。 +- 出类(新 ledger 字段、重构、别道条目、准入或拒收语义)⇒ 本席卡,不论谁需要它。 +- 分支信息测试(原文不译):Does this defect give a consumer a branch it could act on differently? + No ⇒ widen the existing member's comment/message; yes ⇒ new code under the pre-approved class. +- 待命巡逻每次做整车道全交集读:delta 有尾隙,扫描后至波次边界入队的卡谁都看不见。 +- 契约面卡的 fixture triage 必须跑消费包测试:A 包的改动可让 B 包的 fixture 反着断言。 +- spec 内任何 sweep 都看不见它 ⇒ 派发令点名消费包测试清单,报告要有各消费包真实读数。 ## 席内判断 -- 候选卡评论必读(SKILL.md 候选与批次);裁决与撤销住在评论里,即使正文已是决策形状。 +- 候选卡评论必读,见 SKILL.md 候选与批次;裁决与撤销住在评论里,即使正文已是决策形状。 diff --git a/.claude/skills/pm-dispatch/references/platform-readings.md b/.claude/skills/pm-dispatch/references/platform-readings.md index 8fce82f9fb..404ed68944 100644 --- a/.claude/skills/pm-dispatch/references/platform-readings.md +++ b/.claude/skills/pm-dispatch/references/platform-readings.md @@ -1,397 +1,359 @@ -# 平台读数事实表(references —— 按需加载) +# 平台读数事实表 -出处:主文件「平台读数纪律」。本表 = GitHub API / 工具行为的**实测事实**,做对应操作的那 -一刻查阅;原则住主文件。⛔ 不引用 issue 编号 —— 每条自含失效模式与边界。 +见 SKILL.md 〈平台读数纪律〉;本表是 GitHub API 与工具行为的读数事实,操作时查阅。 ## 队列成员资格与 auto-merge -- **「本仓是否强制队列」是仓库 ruleset 事实**:`grep merge_group` 答的是另一个问题(队列内是否 - 重跑 CI),两者独立、缺席不构成反证(实测:某仓 ruleset 强制而无 trigger,队列照收 PR);权威读 - 数 = 合并尝试本身(回 405 `Changes must be made through the merge queue`)或 rulesets API;姊妹仓不一 - 致(objectos 2026-08-18 起有队列,hotcrm 只有 ruleset)⇒ 新仓靠实测,⛔ 不由缺席推断(2026-08-20)。 -- 判「在不在合并队列」的**决断**读数是 timeline 事件 `added_to_merge_queue` / - `removed_from_merge_queue`(REST `GET /repos/{owner}/{repo}/issues/{pr}/timeline`)—— 它**可按需 - 重查、一次调用双向答**,分得开「从未入队」与「入队后被踢」;`pull_request.enqueued` webhook - 订阅了的会话确实收得到(与 timeline 差 ~1 秒),但推送式**不可重读** —— 新上下文或当时 - 没订阅就取不回,故只作旁证,⛔ 不作决策依据。⛔ `auto_merge` 字段不只是空,是**不稳 - 定**:同一 PR 一分钟内先 `set` 后 `None`(2026-08-26 实测),入队后又回落为 off(维护者 - 2026-08-11 裁定;2026-09-01/09-02 又两次)—— 永不据它判「没挂上」而重挂(重挂踢队重排)。 -- **成功序列读间隔不读事件名**:`removed_from_merge_queue` 后 ~1 秒内跟 `merged` 是落地不是被踢; - 真被踢是其后无 `merged`、几分钟后 PR 仍 open。 -- 「不在 `origin/main` 上」是二义读数(在队列里等 / 没入队,处置相反)—— 落地检查永远两个 - 读数:**队列成员资格 和 `origin/main`**,缺一不可;`origin/main` 那一读**按内容读**(grep 本 PR 该 - 产出的产物),⛔ 不按 PR head sha 的祖先性、也不按 `merged` 布尔:队列落的是**另一个提 - 交**,`git merge-base --is-ancestor origin/main` 对已完全合入的 PR 答 NO(非浅检出),而同 - 一 PR 的 `list_pull_requests` 实测回过自相矛盾的行:`merged: false` 与 `merged_at` 有值并存 —— - 只读布尔的一切判据把已落地读成「没合」(2026-08-23 落地时刻实测)。 -- **`mergeable_state` 惰性计算,`unknown` 不是读数**(2026-08-25 实测:头已 dirty 的 PR 整窗答 - unknown,席位误读「auto-merge 被清」在脏头上重挂 —— 挂 unknown = 挂在可能脏的头上);`dirty` - 即队列入口否决(冲突对象是**当前** main);draft PR 恒回 `draft`;判头脏的决断读数是零配额本 - 地试合并:fetch PR ref 后 `git merge-tree --write-tree origin/main `(冲突文件直接列出;随 fetch - 老化,重跑先 fetch;与 enable 序列的队列 ref/update-branch 探针互补,彼答入队与暗冲突、此在挂 - 前答头脏)。⚠️ 它只答「默认文本合并」会不会冲突:不套用 `.gitattributes` 的 merge driver - ⇒ 两侧同动一条 `merge=os-regen` 路径时系统性低报,方向危险(报干净而真合并会停;2026-09-03 - 实测 0 冲突 vs `dirty`)—— 这类 diff 由 `mergeable_state` 或 scratch worktree 里的真 `git merge` 定 - 夺。入队决策点才 `get` 一次:挂了 flip 定点(landing-operations)到点读,⛔ 不又查又等。 -- **状态核验用最小字段**(search/list + `fields`)或等事件,整对象 `get` 留给入队决策点; - 门禁放行判据 = 承载门禁族 job 的 conclusion,聚合(`blocked`/`dirty`) - 只作阴性筛查再定位,放行按名定向读单条 job,⛔ 不拉全表(按名定位失败才拉);⚠️ 订阅 - 来的 `check_suite.completed` 按名读到时农场早已绿 —— 它是**唤醒**不是放行读数(2026-09-02)。 -- **转 draft 不是可靠的踢队手段 —— 两向相反实测,处置按最坏走**:本仓转 draft 同时掉 - auto-merge 与队列成员资格(均不自动恢复,转正后重挂);objectui 2026-08-25 已入队 PR 转 draft 条目 - 保位、~40 分钟后队列照样合并(仓别/时机未分辨)。补救:转 draft + disable 都做(本仓 - `disable_pr_auto_merge` 单独不踢队、objectui 彼时径直拒绝);出队按下方「队列 ref」条阳性探针 - 答不在队向,加未落地;ref 缺席只作旁证,⛔ 永不承载结论、不据单读数报补救。 -- **`update_pull_request` 不管传不传都发送 `draft` 位 ⇒ 对 draft PR 的任何调用必须显式带 - `draft: true`**(reviewers/title/body/labels 单字段调用同坑;objectui 2026-08-25 实测:一次只传 - reviewers 的请审把治理面 draft 发布进合并队列,后果见上条);请审免碰 draft 位的专用路 - = REST `POST /pulls/{n}/requested_reviewers`(文档载明、未实测:载荷只有 reviewers/team_reviewers; - 门开席位优先,MCP-only 席才用 update + 显式 `draft: true`)。undraft 可用路径只有 MCP 这条: - 传 `draft: false` 落地(2026-08-24 三张 PR 逐张回读确认);**裸 GraphQL 会话内被拒**(回「only - the pinned set of PR-review operations is served」,它建议的「改用 REST」对 undraft **是错的**);**裸 - REST `PATCH /pulls/{n}` 传 `draft: false` 回 200 而无操作** —— 接口性质 ⇒ 池 0 只能等重置。 -- **`enable_pr_auto_merge` 一律显式传 `mergeMethod: "SQUASH"`**(不传时静默退回被禁的 merge-commit = - 无操作);**回显两向不可靠,空回显≠未挂上**:传 SQUASH 后回读 `auto_merge.merge_method` 仍 - `merge`(2026-08-24 两张 PR、一张 disable→enable 复验同值)、队列路径回显空字段而入队照发,落 - 地仍无一例外单亲 squash(方法归队列,本仓 `allow_merge_commit:false`)⇒ ⛔ 不拿回显当任何方向 - 的证据、不为它翻转空转;「空字段=静默空转签名」旧读法已推翻,权威信号见下两条。 -- **配额枯竭时 `enable_pr_auto_merge` 回成功而挂载根本没发生**(实测:「成功」后 2.5 小时零动 - 静,同期别的 PR 正常合入;配额恢复后同一调用 ~1 分钟内落地)⇒ **验效果,不验回应**,按下 - 条阳性探针确认,⛔ 不拿成功报文收工;回读 `auto_merge` 非空本接口给不了(`pull_request_read` - 与 `fields` 枚举都无该成员,armed 与否读回逐字节相同)⇒ 效果读数 = 下条探针①②、timeline - 入队事件、最终落地,队列分支仅在场时算;已死假说:已绿 PR 会静默空转。 -- **队列 ref 答 BUILD 不答成员资格**(旧读法「存在即在队」作废):`gh-readonly-queue/*` **只在存在 - 时**有意义(= 有 build 在跑),⛔ 缺席不是任何方向的读数。**阳性探针按成本序**:① - `update_pull_request_branch` 回「Branches that are queued for merging cannot be updated」= 在队,正常返回顺 - 带逼出暗冲突(它不踢已挂 PR、只是永不入队);② `merge_pull_request` 回 405「Pull Request is in the - merge queue」= 在队(2026-08-28 两席各一次,均零 ref),405「Merge commits are not allowed」= 不在队,改 - 挂 auto-merge。⛔ enable 与其验证间永不插 `disable`(入队 webhook 乱序迟到,会撤掉真实入 - 队)。**进度**读 `GET /actions/runs?event=merge_group`,⚠️ 批次分支按**批内最后一个 PR** 命名 ⇒ - 自己的 PR 号不在运行列表里不等于没在跑(2026-09-01/09-02)。**踢出成因两则**:兄弟抢先落地 - ⇒ `MERGE_CONFLICT`;缺必需批准 ⇒ 治理守卫 merge_group - 腿 `CI_FAILURE`。在场时它还答**位置**:名形 `…/pr--` 的 `` 是前一条目的 tip - ⇒ 从根在当前 `origin/main` 的那条起走父-tip 链即真实排队序(`ls-remote` 的字典序无意义),零 - 配额、答 timeline 答不了的「我排第几」,⛔ 只读现在、不重建历史(2026-09-03 实测五条链:自 - 以为被踢的 PR 实为第三位)。 -- **队列踢出先认签名再决定重投**:已知 flaky 核对失败签名一致 ⇒ 原样重投; - 止血修复合入后**同一签名再现就不再是那条 flaky**,是新问题必须重新诊断, - ⛔ 禁止条件反射式重投;第三种签名:本 PR 名下**没有任何** `merge_group` run 且批次同伴的 run - 全部 `success` = 队列重建的连带取消不是红 —— 带签名读数收据重投一次(收据留在 PR 上), - ⛔ 无收据不重投;同一 PR 第二次被踢 ⇒ 停止重投,按签名四分支重判。 -- **实测吞吐两则**:合并队列落地 ≈ 每 PR 15–30 分钟且串行(⛔ 不据「还没落」 - 提前判异常);单容器重验证(build+test)并发甜点 ≈3,排批按它定上限。 +- 本仓是否强制队列是仓库 ruleset 事实;`grep merge_group` 答的是队列内是否重跑 CI,两者独立。 +- 缺席不构成反证:有仓 ruleset 强制而无 trigger,队列照收 PR;新仓靠实测,⛔ 不由缺席推断。 +- 权威读数 = 合并尝试本身(回 405 `Changes must be made through the merge queue`)或 rulesets API。 +- 判在不在合并队列的决断读数是 timeline 事件 `added_to_merge_queue` / `removed_from_merge_queue`。 +- 拼写 `GET /repos/{o}/{r}/issues/{pr}/timeline`:可按需重查、一次调用双向答。 +- 它分得开从未入队与入队后被踢;`pull_request.enqueued` webhook 推送式不可重读,只作旁证。 +- `auto_merge` 字段不只是空,是不稳定:同一 PR 一分钟内先 set 后 None,入队后又回落 off。 +- ⛔ 永不据它判没挂上而重挂 —— 重挂踢队重排。 +- 成功序列读间隔不读事件名:`removed_from_merge_queue` 后 ~1 秒内跟 `merged` 是落地不是被踢。 +- 真被踢是其后无 `merged`、几分钟后 PR 仍 open。 +- 不在 `origin/main` 上是二义读数:在队列里等 / 没入队,两者处置相反。 +- ⇒ 落地检查恒两个读数:队列成员资格 和 `origin/main`,缺一不可。 +- `origin/main` 按内容读(grep 本 PR 的产物),⛔ 不按 head sha 祖先性、不按 `merged` 布尔。 +- 队列落的是另一个提交:`git merge-base --is-ancestor origin/main` 对已完全合入的 PR 答 NO。 +- 同 PR 的 `list_pull_requests` 会回 `merged: false` 与 `merged_at` 并存 ⇒ 只读布尔即读成没合。 +- `mergeable_state` 惰性计算,`unknown` 不是读数 —— 挂 unknown 等于挂在可能脏的头上。 +- `dirty` 即队列入口否决(冲突对象是当前 main);draft PR 恒回 `draft`。 +- 判头脏走零配额本地试合并:fetch PR ref 后 `git merge-tree --write-tree origin/main `。 +- 它直接列出冲突文件;读数随 fetch 老化,重跑先 fetch。 +- 它只答默认文本合并,不套 `.gitattributes` 的 merge driver。 +- ⇒ 两侧同动一条 `merge=os-regen` 路径时系统性低报,方向危险:报干净而真合并会停。 +- 这类 diff 由 `mergeable_state` 或 scratch worktree 里的真 `git merge` 定夺。 +- 入队决策点才整对象 `get` 一次;挂了 flip 定点到点读,⛔ 不又查又等。 +- 状态核验用最小字段(search/list 加 `fields`)或等事件。 +- 聚合读数(`blocked`/`dirty`)只作阴性筛查再定位;放行按名定向读单条 job,⛔ 不拉全表。 +- 按名定位失败才拉全表;订阅来的 `check_suite.completed` 是唤醒不是放行读数。 +- 转 draft 不是可靠的踢队手段:两向相反读数并存,处置按最坏走。 +- 本仓转 draft 同时掉 auto-merge 与队列成员资格,不自动恢复,转正后重挂;姊妹仓曾保位照合。 +- 补救:转 draft 与 `disable_pr_auto_merge` 都做 —— 本仓 disable 单独不踢队。 +- 出队按队列 ref 阳性探针答不在队向,加未落地;ref 缺席只作旁证,⛔ 永不承载结论。 +- `update_pull_request` 不管传不传都发送 `draft` 位 ⇒ 任何调用必须显式带 `draft: true`。 +- reviewers/title/body/labels 的单字段调用同坑,曾把治理面 draft 发布进合并队列。 +- 请审专用路 = REST `POST /pulls/{n}/requested_reviewers`,载荷只有 reviewers/team_reviewers。 +- 它不碰 draft 位;门开席位优先走它,MCP-only 席才用 update 加显式 `draft: true`。 +- undraft 可用路径只有 MCP 这条:传 `draft: false` 落地。 +- 裸 GraphQL 在会话内被拒,它建议的改用 REST 对 undraft 是错的。 +- 裸 REST `PATCH /pulls/{n}` 传 `draft: false` 回 200 而无操作 ⇒ 接口性质,池 0 只能等重置。 +- `enable_pr_auto_merge` 恒显式传 `mergeMethod: "SQUASH"`;不传静默退回被禁的 merge-commit = 无操作。 +- 它存的方法恒为 `merge`,不论请求了什么;REST `auto_merge.merge_method` 读回 `merge`。 +- 仓库 `allow_merge_commit:false` 时同样读回 `merge`;无 REST 端点设该方法。 +- 设方法的 GraphQL mutation 不服务 agent 会话 ⇒ 席位既设不了也纠不了。 +- 它在本仓无实效:`main` 的合并队列规则带 `merge_method: SQUASH`,合并由队列执行。 +- ⇒ 落地方法读分支规则,⛔ 永不读 auto-merge 请求;树上每 PR 一个 squash 提交。 +- 回显两向不可靠,空回显不等于未挂上 ⇒ ⛔ 不拿它当任何方向的证据、不为它空转。 +- 配额枯竭时 `enable_pr_auto_merge` 回成功而挂载根本没发生 ⇒ 验效果,不验回应。 +- 回读 `auto_merge` 非空本接口给不了:`pull_request_read` 与 `fields` 枚举都无该成员。 +- 效果读数 = 下列阳性探针、timeline 入队事件、最终落地;队列分支仅在场时算。 +- 队列 ref 答 BUILD 不答成员资格:`gh-readonly-queue/*` 只在存在时有意义,即有 build 在跑。 +- ⛔ 它的缺席不是任何方向的读数。 +- 阳性探针 ①:`update_pull_request_branch` 回已入队分支不能更新 = 在队。 +- 它正常返回则顺带逼出暗冲突;它不踢已挂 PR,只是永不入队。 +- 阳性探针 ②:`merge_pull_request` 回 405 `Pull Request is in the merge queue` = 在队。 +- 同接口回 405 `Merge commits are not allowed` = 不在队,改挂 auto-merge。 +- ⛔ enable 与其验证之间永不插 `disable`:入队 webhook 乱序迟到,会撤掉真实入队。 +- 进度读 `GET /actions/runs?event=merge_group`;批次分支按批内最后一个 PR 命名。 +- ⇒ 自己的 PR 号不在运行列表里不等于没在跑。 +- 踢出成因两则:兄弟抢先落地 ⇒ `MERGE_CONFLICT`;缺批准 ⇒ 治理守卫 merge_group 腿 `CI_FAILURE`。 +- 队列 ref 在场时还答位置:名形 `…/pr--` 的 `` 是前一条目的 tip。 +- 从根在当前 `origin/main` 的那条起走父-tip 链即真实排队序;`ls-remote` 的字典序无意义。 +- 该读法零配额,答 timeline 答不了的排第几;⛔ 只读现在、不重建历史。 +- 队列踢出先认签名再决定重投:核对失败签名与已知 flaky 一致 ⇒ 原样重投。 +- 止血修复合入后同一签名再现就不再是那条 flaky,是新问题须重新诊断,⛔ 禁反射式重投。 +- 第三种签名:本 PR 名下没有任何 `merge_group` run,且批次同伴的 run 全部 `success`。 +- 队列重建的连带取消不是红 ⇒ 带签名收据重投一次,收据留在 PR 上,⛔ 无收据不重投。 +- 同一 PR 第二次被踢 ⇒ 停止重投,按签名四分支重判。 +- 吞吐两则:合并队列落地 ≈ 每 PR 15–30 分钟且串行,⛔ 不据还没落提前判异常。 +- 单容器重验证(build 加 test)并发甜点 ≈3,排批按它定上限。 ## API 配额 -- **配额按账户计,不跨席共享;按查询复杂度计费,不按调用次数**:各席位跑在**不同 GitHub 账 - 户**下,「所有 agent 共用一个身份」只在**席位内部**成立(故认领必须在评论里写 session - ID)⇒ ⛔ 不据限流报文里的 user ID 推「池子跨席共用、优化自己没用」,本席额度**完全由 - 本席做法决定**;计费按复杂度/节点数 ⇒ 优化方向是**每次少拿**,不是少调用。实测 - (`/rate_limit` 前后差量,2026-08-22):上限 5000/时;一次 `list_issues`(34 张卡、perPage=100)= 107 - 点;单个 dev 子代理 ~15 分钟烧 ~5658 点 ⇒ **最大消耗方是 dev 子代理,PM 巡检是噪声**。 -- **perPage 按预期 population 取,⛔ 不按习惯取 100**:上条计费规则(点数 ≈ 请求节点数/100)使 - perPage 成为唯一杠杆 —— 34 张卡付了 100 张的钱,只要 3 条的 perPage=100 读法多付约 33 倍; - 只要 `totalCount` 的健康指标取 perPage=1,只要最近 N 张就取 N(2026-08-23)。 -- **批量写 ~1 秒一发**:小时池之外还有**分钟级二级限流** —— GraphQL 端点 2,000 点/分、并发 - ≤100,官方指引:**变更类请求间停 ~1 秒**(mutation 按 5× 计)。双载体清标、批量重分诊这类 - 把写挤在同一秒的扫动,会在小时池仍绿时撞上分钟墙(官方文档 2026-08-23 复核)。 -- **REST 可达性是会话属性(GitHub App 会话门),⛔ 不是端点或席位类型的 —— 开轮探一次,按班 - 存档;探针必须 repo-scoped**:会话门(起点快照)先于端点应答,门关着 repo-scoped 路径**整类**回 - 403 `GitHub access is not enabled for this session`(⛔ 不是限流,重试无用;403 对具体端点零分辨力),而 - `/rate_limit` 照答 200、兼任不了探针;探针 = 一条真 repo-scoped 读,403 后凭据判别见 - `references/rest-channel.md`。**按班矩阵**:2026-08-25 两车道 5+ dev 席全被门拒(读写同门,评论 PATCH - 同死 ⇒ 更正=重发);门开会话四个 dev 容器独立实测加法 POST 200(各独立 GET 读回),通道宽于 - 标签:issue POST 201、评论写、卡/评论读同通;顶层席同窗分裂(两 403、一 200)⇒ **门态逐会话 - 变**,⛔ 不据他席、他日读数推本席,唯一安全读法即本行探针。**门关着时的降级梯**:① - git 先行(「零成本等价物」);② 公开仓 payload 档(下方「公开仓」条);③ MCP:search 定向一 - 击、列表**单标签**读全 + 本地求交(`labels` 是 OR,见 MCP 参数条);④ 等重置。 -- **两通道的信封在配额、权限、传输三样上都不同 ⇒ 任一侧的拒绝只是那一侧的读数**:限 - 流 / 403 / 传输失败都要**试过另一侧**才说得出「我没手段」(2026-09-03 实 - 测:`POST /actions/runs/{id}/rerun-failed-jobs` REST 回 403 而 MCP 回 201;job 日志只有 MCP 取得回,REST 侧 - 转 blob 存储 `http=000`;同分钟 MCP 限流而 REST core 满 15000)⇒ MCP 限流先探 REST 再定退避,⛔ 不 - 据一侧限流把整个平台的写都停掉。 -- **默认读序 git → payload → REST → MCP/GraphQL**(2026-08-23 策略翻转,2026-08-25 增补 payload 档; - ⚠️ REST 档以**本班 repo-scoped 探针绿**为前提 —— 前提就住本行,403 会话改按降级梯读)。 - list/查重/卡与 PR 读/标签回读默认走容器 curl 的 REST 通道 —— App installation token,core - 15,000/时,与 GraphQL 池**独立计**(实测 GraphQL 池两次耗尽时 core 余 14,938);GraphQL 池(5000/时) - 只留给**没有 REST 对应物**的那几件:draft 翻转、auto-merge/入队挂载、 - 语义 `/search/*`、Projects field_values、`issue transfer`。逐操作通道归属(✓ 按席位类别限定)、 - 写侧配方与队列路由三读法见 `references/rest-channel.md`,⛔ 不在本表复述。 -- **MCP list/search 家族整个走 GraphQL 稀缺池**(反复撞上的限流墙就是它; - `issue_write` 连查找半边都吃);配额红时认领类动作排队,评论(REST 桶)先行把结论发出去。 -- **`gh` CLI 的动词按传输分两桶,池枯竭时只死一半**(2026-08-24 同分钟实测:GraphQL 0 / core - 4987):porcelain 家族(`gh issue view` / `gh pr list`)与 `gh pr create` 走 GraphQL 当场回限流,同一批事实 - 改走 `gh api` 的 REST 路径照常返回(含开 draft PR)。⚠️ 容器无 `gh`,本条只对本机席位适用。 -- **红窗调度**:`until remaining > 阈值` 的守候**只给上面那几件 GraphQL-only - 的**(逐件判据与官方文档核对日期住 `references/rest-channel.md`),⛔ 其余一切不为配额空等; - 走队列的仓落地必经 auto-merge ⇒ 红窗里**无退路**,直合仓有(合并本身有 REST 端点)。 -- **MCP 侧限流下,只有 MCP/GraphQL 做得了的那两件(draft 翻转、auto-merge 挂载)整窗不可得 —— - 被这样挡住的翻转是在等窗口,不是关于该 PR 的信号**(2026-09-04 02:17Z 实测:MCP - `update_pull_request` 回 `API rate limit already exceeded for user ID …`,同刻本席 repo-scoped REST 读回满 - 额;两桶分离本身见上「信封」条,⛔ 不重复)⇒ ⛔ 不据它重挂、不据它改判 PR 状态,其 - 余(评论、标签、请审、读、timeline)照常走 REST。⚠️ 报文里的 user ID 只是报文:据它 - 推「MCP 池按身份跨席共享」与本节首条的禁令正面冲突,⛔ 未裁不写成事实。 -- **`issue transfer` 因配额或权限拿不到 ⇒ 当轮改走多仓协调条款的「在目的仓重建」 - 配方**(出处头 + 裸 `#N` 改全名 + 关源单为 moved):纯 REST、配额免疫,⛔ 不为转移空等重置。 -- **两个「瘦身参数」都不省池**:`fields` 省载荷不省池 —— MCP list/search 服务器端无条件抓 - Project field_values,池枯竭时**最小字段请求同样全体失败**(报错串 `failed to fetch issue field - values: API rate limit already exceeded`);⛔ **`minimal_output: true` 不裁 `list_issues` 的 `body`**(2026-08-22 - 实测:返回字段仍含 `body`),**永不当省额度手段写进任何 skill**;没有参数能关掉 `body`: - 要么整表 107 点要么换窄接口(点数未测)。⚠️ 站得住的证据是直接观察 `body` 在, - 不是前后体积对比(两次调用相隔数小时、population 已变)。 -- **git 先行**:本地检出 / `git log` / `ls-remote` 不花配额,断粮期分支存在性检查照常可用,PR 文 - 件读取同走 git(REST PR files 端点实测可瞬态 404)。**零成本等价物四条**(API 两次挂掉期间实 - 测可用):合并队列 `git ls-remote origin 'refs/heads/gh-readonly-queue/*'`;是否落地 - `git log --format='%H %s' -40 origin/main` 按 PR 号 grep;squash 验证 `git rev-list --parents -n1`(父提交 - 数);分支存在性 `git ls-remote origin 'refs/heads/**'`。开轮先读配额(`curl` 带 Bearer `$GH_TOKEN` - 打 `/rate_limit`,免费;⚠️ 它答不了通道在不在,repo-scoped 探针另跑),graphql remaining < 1000 ⇒ - 本轮按默认读序走 git + REST;**派 dev 之前同样先读一次**,额度不足先等重置再派 —— 中途 - 撞限流的 dev **完不成强制查重**,只能把发现交回 PM 代为归档,⛔ 不盲目开卡。打满时:待 - 执行写**排成有序清单挂进巡逻词**(不靠记忆),恢复窗口按序连清;重试对齐整点(REST core 整 - 点重置)优于指数退避,⛔ 绝不忙轮询;文档载明未实测:条件请求答 `304` 不计 core 池。 -- **公开仓零配额读法两档,payload 档优先 —— 只有 body 精确**:单卡页 `/issues/N` 内嵌 JSON 载 - **原始 body**,零配额 —— 取含 `bodyHTML` 的 `script[type="application/json"]` 块,读 - `payload.preloadedQueries[0].result.data.repository.issue.body` 与 `frontTimelineItems`/`backTimelineItems`。⚠️ - 评论表与标量字段**都不可信**:时间线只渲染**前 15 项**且 `hasNextPage: true`(实测 12 条评论 - 只回 3 条、4–12 重取仍缺),`assignees` 实测为陈旧空值而权威读非空,`labels`/`state` 由此**存 - 疑、未实测**(⛔ 不写成已测)⇒ ⛔ 认领承载字段(`assignees`、`pm:*` 标签、`state`)永不从本档 - 读;⛔ **本档的缺席不是读数** —— 要么 `hasNextPage: false`、要么第二通道,自己刚写的按原 - 写入通道回读(2026-09-03 三例,失效方向是空转与重发)。边界:⛔ 只因仓库公开成立;⛔ 覆盖 - 单卡读、**不覆盖 issue search**(搜索页无 SSR 结果);⛔ 永 - 不拿渲染列表定规模(静默只显一页,实测 12 vs 权威 147)。渲染层 WebFetch 仍在(~15 分缓存、 - 有损)。 -- **「本档的缺席不是读数」的成因:本档经 CDN 缓存,专对最新内容失效且绕不掉** —— 内容 - 可滞后数分钟到数十分钟,实测三次抓取横跨 75 分钟(其中一次带 cache-busting 查询串 + - no-cache 头)都没取到一条已存在 75 分钟的评论(2026-08-30)。⚠️ 它**没有位置性对照**:更早 - 的内容全在、读起来完全正常,只有最新几条缺席 ⇒ 前 15 项那条判别式在此不成立,唯一 - 出路是第二通道;失效方向是据它对**别人的工作**下「没有认领」的判词。 -- **查重先 `search_issues`,并按它的契约拼**:它是**语义**匹配器 —— ⛔ `query` 里永不放 GitHub - 限定符(`repo:` / `is:` / `label:` / `in:title`),范围走 `owner` / `repo` 参数,`query` 写成描述缺陷 - 的**句子**;限定符形对每个带自由词的查询回 `total_count: 0` 且 `incomplete_results: false`,同一意 - 图换文档形回 18 条、首条即目标(2026-09-02/09-03 两席实测)。body 文本匹配是 repo-scoped `list` - 做不到的,`list` + 本地扫描是**确定性回退,⛔ 不是默认**(2026-08-18 那 - 次「`total_count` 精确」只对文档形成立;继承说法不是读数,复述必带实测日期)。 -- **`search_issues` 可整会话静默归零 —— 控制词一并归零**(2026-08-23 实测:某会话对**每个**查 - 询回 `total_count: 0`,含已知必中的控制词;同时刻另一会话正常 ⇒ 故障是**会话级**)。⛔ - **空查重结果不是读数,除非本会话内一个已知必中的控制词答了** —— ⛔ 不是「可疑时 - 才验」:归零下空结果与真无重复逐字节同形,读作「搜过了,没有」⇒ 重复卡照开、空车道 - 照停(实测:控制词对一张刚派发几分钟的卡回 0)。控制词回 0 ⇒ 本会话 search 已坏,**立刻 - 换通道,⛔ 不重试**(重试只烧配额);换哪条按上面的探针与降级梯 —— 探针绿走 **REST 列 - 表端点** `GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N`(core 桶、 `labels` 真 AND;⛔ 完整性 - 自证:`&page=N` + 总数核对 —— ⚠️ **页码翻页在偏移 ~9,900 硬拒**:`page=100` 回 422 - `Pagination with the page parameter is not supported for large datasets`,与结果规模、`per_page` 都无关(453 - 条的 `state=open` 同样在 `page=100` 拒,`per_page=1` 拒在 `page=9000`)⇒ 总体超过它就按 `sort=created` - 拆成 `asc` + `desc` 两趟 ≤99 页(`created` 序**承重**:新卡只追加到尾,页不在脚下重排),以两趟 - 的**重叠**证覆盖、对号码线闭合、缺号逐个直取核实(2026-09-01);`GET /search/issues` **不是**退 - 路,见下条),403 走降级梯 MCP 档(单标签一 - 次读全 + 本地求交 —— ⛔ **不是翻页手扫**:实测 226 张 open 只扫了 100 张,**不完整枚举比 - 零结果更危险**)。 -- **会话代理只服务 repo-scoped 路径,`/search/*` 的 403 体解析成净零**:代理回 403 + 体 - `sessions are bound to their configured repositories`,而那是**合法 JSON** —— 读 `total_count` 得 None、 - 打印成 `total: None`,与真空集只差一个字符,三连查重于是回三个干净的零,而请求根本没跑 - (2026-08-26 实测);`/search` 类问题的仪器是 MCP search 工具,repo-scoped 枚举不受影响。⭐ 推论: - 阳性对照**先跑** —— 合乎预期的零是永不复检的那个,本例正是对照同归零才逮住。 -- **`search_issues` 不可靠地返回分钟级新卡**:同轮发现的东西查重,搜索之外必须按创建时间列 - 近期 issue(`list_issues` + `orderBy: CREATED_AT`)—— 实测一张 ~7 分钟大的同实例卡被关键词与 - 语义搜索双漏,靠日期列表才逮到;边界:两次观察,断言只到可能漏分钟级(2026-08-20 实测)。 -- **自由文本的否定在 `search_pull_requests` 静默失效**:引号短语前的 `-` 被丢弃 —— `-"Part of"` - 与 `"Part of"` 回同一 `total_count`(197)与同一头名,而 197+197 ≠ 未过滤的 216,故两者不是任何 - 分层;同查询的限定符半边照常精确(`linked:issue` 2903 + `-linked:issue` 216 = 总体 3119)⇒ **一次 - 调用里限定符半边算术正确、文本半边静默胡说**(2026-08-26 实测;文本半边是语义匹配非字 - 面 grep,其否定无物可否)。⇒ 自由文本分层必跑补集与总体求和,不对账即分层是编造的。 -- **会话中途轮换凭据把 GitHub MCP 服务器杀到不可恢复**:此后一切 `mcp__github__*` 回 - `Streamable HTTP error: invalid session`,只有新会话重绑 —— 轮换前提醒维护者:在飞席位丢整条 - GitHub 通道;配额池按身份计,换身份即清零燃烧,共享身份结构不变。 -- **组织侧授权变更后仓库访问逐步传播**(同一端点数分钟内 403→200);该 403 - 体同样解析成净零 ⇒ 空车道先对仓库 `open_issues_count` 反查再信,零命中纪律覆盖 list 读。 - 同族:**满页的首页零命中是截断不是缺席**(`GET /branches?per_page=100` 正好回 100 行而无目标 - ⇒ 翻完再判,2026-09-03 实测)。 -- **MCP 参数两陷阱**:`list_issues` 多标签过滤是 **OR(并集)**不是 - AND —— 混入别车道同状态卡与本车道全状态卡,结果良构、失效全静默;**判据 = - 结果比任一输入都宽**(三席独立实测:两标签的「交集」回 135 张,而其中一个车道自身只有 - 132 张)。正确读法 = **整车道单标签一次读全 + 本地对 labels 求交**, - 或改走 REST —— **两个通道的 `labels` 语义相反**:REST 列表端点的 `labels=a,b` 是**真 AND** - (交集),MCP 的 `labels` 数组是 **OR** ⇒ 要交集按上面的探针与降级梯选档,⛔ 不无条件「改走 - REST」。`issue_write` 的 `labels` 是**整组替换**不是追加 —— 同一动作内重读现值合并再写 - (隔轮旧读数 = 无效快照,按其回写静默剥别的标签);真追加走 REST `POST /issues/{n}/labels`, - ⚠️ 同样先过探针 —— 403 会话没有真追加通道,只能整组替换;⚠️ 摘标签也没有加法端 - 点(`finding` 定级这类必须删标签的动作只能整组写,carve-out 保留);写后照标签纪律回读。 -- **PR 标签的三条读腿全盲、两条静默**(2026-08-28 同日实测):① `issue_read get_labels` 传 PR 号 - 回「Could not resolve to an Issue」—— REST「PR 也是 issue」的惯例在此方法不成立;**响亮失败即 - 路由信号**,改走腿③。② `pull_request_read get` 的 `labels` **时缺时滞**:dev 席同一张新 PR 两读 - 整个字段缺席(非空数组),PM 席三张老 PR 三读齐备 ⇒ 连盲都不稳定,比整类缺席更险。③ - payload 档:issue 页的 `href` 锚点 grep(`/labels/NAME`)在 PR 页命中**零**,PR 侧拼写是 - `data-name="NAME"`(片链到 `issues?q=…label%3A…`)。⇒ **读成功而标签空/缺席 ⛔ 不读 - 作「没有标签」**:按 `data-name=` 确认,否则整集作 UNKNOWN、优先加法端点(可达时);⛔ 单读与 - 单次**即时**读回都不决断(compare-read-back 报 3 个,数分钟后再读只回 1 个,两个 auto 标签无写 - 入而消失)⇒ union-write 欠一次**延迟确认**;必需标签(如 `skip-changeset`)其后每次触碰重核。 -- **`list_issues` 永不返回 assignees**(`fields` 枚举无此成员,不传也没有)—— 已认领卡与空闲卡 - 响应逐字节相同,清单只是**候选名单**:认领前必须过完整 `issue_read`(它才返回 `assignees`)。 -- **MCP `issue_read` 的 body 实体转义是纯读侧伪影**(撇号/引号/尖括号成数字实体;comments - 原样),存储体是明文,**先解码实体再写回**往返实测安全 —— 腐蚀 body 的恰是把转义读数 - 原样回写;⚠️ 但读侧**并非一律可逆** —— 行内反引号里的尖括号片段被 MCP 读路径**整 - 个丢弃**(不是转义,无从解码回来),判据见「读数陷阱」判截断行。写侧剥除是**真实存储 - 损耗**,⛔ 两类不并成一条「API 会改 body」,写后回读必做;实体归属与 `&` 类未实测。 -- **`Blocked-by:` 行归 BODY(单通道反向索引)**:追加按上条「解码后写回」 - 执行;历史上寄放在评论里的行按同程序**增量**回填(⛔ 不搞批量突击 —— 限流压力); - 解锁扫描只 grep body,⛔ 不加常设评论读; - 旧「连评论一起扫(`in:comments`)」提示作废,扫描走直读(`list_issues` + `issue_read` 读 body)。⚠️ - 动手前先按「空的行内代码跨度」判本次 MCP 读可不可用(见读数陷阱判截断行):命中即改 - 从**原始体**取 —— 公开仓 payload 档或门开会话的 REST raw,⛔ 不拿有损读数回写。 -- **`list_issue_types` 对本集成 403,而 `issue_write type:` 正常**(读权限缺口): - 直接写已知好值(`Bug`/`Feature`/`Task`),写侧报错才是真信号,⛔ 不先探列表定可用性(列表 - 403 ≠「类型不可用」);非法值是响错还是静默丢弃未实测,写非已知值前先小样验证。 +- 配额按账户计,不跨席共享:各席位跑在不同 GitHub 账户下。 +- 所有 agent 共用一个身份只在席位内部成立,故认领必须在评论里写 session ID。 +- ⛔ 不据限流报文里的 user ID 推池子跨席共用;本席额度完全由本席做法决定。 +- 计费按查询复杂度、按节点数,不按调用次数 ⇒ 优化方向是每次少拿,不是少调用。 +- 读数:上限 5000/时;一次 `list_issues`(34 张卡、perPage=100)= 107 点。 +- 单个 dev 子代理 ~15 分钟烧 ~5658 点 ⇒ 最大消耗方是 dev 子代理,PM 巡检是噪声。 +- perPage 按预期 population 取,⛔ 不按习惯取 100:点数 ≈ 请求节点数除以 100。 +- 只要 `totalCount` 的健康指标取 perPage=1;只要最近 N 张就取 N。 +- 小时池之外还有分钟级二级限流:GraphQL 端点 2,000 点/分、并发 ≤100。 +- 官方指引:变更类请求间停 ~1 秒,mutation 按 5 倍计;批量写因此 ~1 秒一发。 +- 双载体清标、批量重分诊这类把写挤在同一秒的扫动,会在小时池仍绿时撞上分钟墙。 +- REST 可达性是会话属性(GitHub App 会话门),⛔ 不是端点或席位类型的属性。 +- 开轮探一次、按班存档;探针必须是一条真 repo-scoped 读。 +- 门关着时 repo-scoped 路径整类回 403 `GitHub access is not enabled for this session`。 +- 那不是限流,重试无用;403 对具体端点零分辨力。 +- `/rate_limit` 照答 200,兼任不了探针;403 后凭据形态判别见 `rest-channel.md`。 +- 门态逐会话变,同窗顶层席可分裂成两 403 一 200 ⇒ ⛔ 不据他席、他日读数推本席。 +- 门开会话实测通道宽于标签:issue POST 201、评论写、卡与评论读同通,加法 POST 200。 +- 门关着时的降级梯 ①:git 先行,走下方零成本等价物。 +- 降级梯 ②:公开仓 payload 档。③:MCP —— search 定向一击、单标签读全加求交。④:等重置。 +- CCR 容器的 GitHub 出口是代理加凭据的:无 header 的 REST 读回 200 带会话身份,core 上限 15000。 +- 调用方自带的 `Authorization` 头被代理覆盖;`HTTPS_PROXY` 端口打死也不切断网络。 +- ⇒ 容器内得出的 token 作用域结论 ⛔ 不迁移到出口未经代理的会话。 +- 同因:`check-clause2-carriers.mjs --pair` 在容器内带与不带 token 都 exit 0,不再是 403 退 3。 +- 两通道的信封在配额、权限、传输三样上都不同 ⇒ 任一侧的拒绝只是那一侧的读数。 +- 限流、403、传输失败都要试过另一侧才说得出我没手段。 +- 读数:`POST /actions/runs/{id}/rerun-failed-jobs` REST 回 403 而 MCP 回 201。 +- job 日志只有 MCP 取得回,REST 侧转 blob 存储 `http=000`;同分钟 MCP 限流而 REST core 满 15000。 +- ⇒ MCP 限流先探 REST 再定退避,⛔ 不据一侧限流把整个平台的写都停掉。 +- REST 档以本班 repo-scoped 探针绿为前提;403 会话改按降级梯读。 +- 容器 curl 的 REST 通道 = App installation token,core 15,000/时,与 GraphQL 池独立计。 +- GraphQL 池 5000/时,只留给没有 REST 对应物的几件。 +- 那几件 = draft 翻转、auto-merge 挂载、语义 `/search/*`、Projects field_values、`issue transfer`。 +- 逐操作通道归属、写侧配方与队列路由三读法见 `rest-channel.md`,⛔ 不在本表复述。 +- MCP list/search 家族整个走 GraphQL 稀缺池,`issue_write` 连查找半边都吃。 +- 配额红时认领类动作排队,评论走 REST 桶先行把结论发出去。 +- `gh` CLI 的动词按传输分两桶,池枯竭时只死一半。 +- porcelain 家族(`gh issue view` / `gh pr list`)与 `gh pr create` 走 GraphQL,当场回限流。 +- 同批事实改走 `gh api` 的 REST 路径照常返回,含开 draft PR;容器无 `gh`,本条只对本机席适用。 +- 红窗调度:守候只给上面那几件 GraphQL-only 的,⛔ 其余一切不为配额空等。 +- 走队列的仓落地必经 auto-merge ⇒ 红窗里无退路;直合仓有,合并本身有 REST 端点。 +- MCP 侧限流下,draft 翻转与 auto-merge 挂载整窗不可得。 +- 被挡住的翻转是在等窗口,不是关于该 PR 的信号 ⇒ ⛔ 不据它重挂、不据它改判状态。 +- 其余动作(评论、标签、请审、读、timeline)照常走 REST。 +- 报文里的 user ID 只是报文:据它推 MCP 池跨席共享与本节首条冲突,⛔ 未裁不写成事实。 +- `issue transfer` 因配额或权限拿不到 ⇒ 当轮改走多仓协调条款的在目的仓重建配方。 +- 该配方 = 出处头加裸 `#N` 改全名加关源单为 moved:纯 REST、配额免疫,⛔ 不为它空等重置。 +- 两个瘦身参数都不省池。`fields` 省载荷:MCP list/search 服务器端无条件抓 Project field_values。 +- ⇒ 池枯竭时最小字段请求同样全体失败,报错串是 failed to fetch issue field values。 +- ⛔ `minimal_output: true` 不裁 `list_issues` 的 `body`,⛔ 永不当省额度手段写进任何 skill。 +- 没有参数能关掉 `body`:要么整表 107 点,要么换窄接口(点数未测)。 +- 站得住的证据是直接观察 `body` 在,不是前后体积对比 —— 两次调用之间 population 已变。 +- git 先行:本地检出、`git log`、`ls-remote` 不花配额,断粮期分支存在性检查照常可用。 +- PR 文件读取同走 git:REST PR files 端点可瞬态 404。 +- 零成本等价物 ①:合并队列 `git ls-remote origin 'refs/heads/gh-readonly-queue/*'`。 +- ②:是否落地 `git log --format='%H %s' -40 origin/main` 按 PR 号 grep。 +- ③:squash 验证 `git rev-list --parents -n1` 数父提交。④:`git ls-remote origin 'refs/heads/**'`。 +- 开轮先读配额:`curl` 带 Bearer `$GH_TOKEN` 打 `/rate_limit`,免费。 +- 它答不了通道在不在,repo-scoped 探针另跑;graphql remaining < 1000 ⇒ 本轮走 git 加 REST。 +- 中途撞限流的 dev 完不成强制查重,只能把发现交回 PM 代为归档,⛔ 不盲目开卡。 +- 打满时待执行写排成有序清单挂进巡逻词,不靠记忆;恢复窗口按序连清。 +- 重试对齐整点(REST core 整点重置)优于指数退避,⛔ 绝不忙轮询。 +- 文档载明未实测:条件请求答 `304` 不计 core 池。 +- 公开仓零配额读法两档,payload 档优先 —— 只有 body 精确。 +- 单卡页 `/issues/N` 内嵌 JSON 载原始 body:取含 `bodyHTML` 的 `script[type="application/json"]` 块。 +- 读 `payload.preloadedQueries[0].result.data.repository.issue.body` 与 `frontTimelineItems`/`backTimelineItems`。 +- 评论表与标量字段都不可信:时间线只渲染前 15 项且 `hasNextPage: true`。 +- `assignees` 实测为陈旧空值而权威读非空;`labels`/`state` 由此存疑、未实测,⛔ 不写成已测。 +- ⇒ ⛔ 认领承载字段(`assignees`、`pm:*` 标签、`state`)永不从本档读。 +- ⛔ 本档的缺席不是读数:要么 `hasNextPage: false`,要么第二通道。 +- 自己刚写的按原写入通道回读;失效方向是空转与重发。 +- 成因:本档经 CDN 缓存,专对最新内容失效且绕不掉,cache-busting 查询串与 no-cache 头都无效。 +- 内容可滞后数分钟到数十分钟;它没有位置性对照 —— 更早内容全在,只有最新几条缺席。 +- ⇒ 前 15 项那条判别式在此不成立,唯一出路是第二通道。 +- 失效方向是据它对别人的工作下没有认领的判词。 +- 边界:⛔ 只因仓库公开成立;⛔ 覆盖单卡读、不覆盖 issue search,搜索页无 SSR 结果。 +- ⛔ 永不拿渲染列表定规模:静默只显一页。渲染层 WebFetch 仍在,~15 分缓存、有损。 +- 查重先 `search_issues`,并按它的契约拼:它是语义匹配器。 +- ⛔ `query` 里永不放 GitHub 限定符(`repo:` / `is:` / `label:` / `in:title`),范围走 `owner`/`repo` 参数。 +- `query` 写成描述缺陷的句子;限定符形回 `total_count: 0` 且 `incomplete_results: false`。 +- 同一意图换文档形则命中,首条即目标;body 文本匹配是 repo-scoped `list` 做不到的。 +- `list` 加本地扫描是确定性回退,⛔ 不是默认。 +- `search_issues` 可整会话静默归零,控制词一并归零 —— 故障是会话级,同刻别的会话正常。 +- ⛔ 空查重结果不是读数,除非本会话内一个已知必中的控制词答了命中。 +- ⛔ 不是可疑时才验:归零下空结果与真无重复逐字节同形,读作搜过了没有。 +- 后果是重复卡照开、空车道照停;控制词回 0 ⇒ 本会话 search 已坏,立刻换通道,⛔ 不重试。 +- 换道:探针绿走 REST 列表端点 `GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N`。 +- 它走 core 桶且 `labels` 是真 AND;⛔ 完整性自证靠 `&page=N` 加总数核对。 +- 翻页在偏移 ~9,900 硬拒:422 Pagination with the page parameter is not supported for large datasets。 +- 该拒绝与规模、`per_page` 无关:小结果集同样在 `page=100` 拒,`per_page=1` 拒在 `page=9000`。 +- ⇒ 总体超过它就按 `sort=created` 拆成 `asc` 加 `desc` 两趟、各 ≤99 页。 +- `created` 序承重:新卡只追加到尾,页不在脚下重排。 +- 以两趟的重叠证覆盖、对号码线闭合、缺号逐个直取核实。 +- 403 走降级梯 MCP 档:单标签读全加本地求交;⛔ 不是翻页手扫,不完整枚举比零结果更险。 +- 会话代理只服务 repo-scoped 路径,`/search/*` 的 403 体解析成净零。 +- 代理回 403 加体 sessions are bound to their configured repositories,而那是合法 JSON。 +- 读 `total_count` 得 None、打印成 total: None,与真空集只差一个字符,而请求根本没跑。 +- `/search` 类问题的仪器是 MCP search 工具,repo-scoped 枚举不受影响。 +- 推论:阳性对照先跑 —— 合乎预期的零是永不复检的那个。 +- `search_issues` 不可靠地返回分钟级新卡:同轮发现的查重另按创建时间列近期 issue。 +- 拼写 `list_issues` 加 `orderBy: CREATED_AT`;断言只到可能漏分钟级。 +- 自由文本的否定在 `search_pull_requests` 静默失效:引号短语前的减号被丢弃。 +- `-"Part of"` 与 `"Part of"` 回同一 `total_count`,而两者相加不等于未过滤总体,故不是任何分层。 +- 同查询的限定符半边照常精确(`linked:issue` 与其补集之和等于总体)。 +- ⇒ 一次调用里限定符半边算术正确、文本半边静默胡说;文本分层必跑补集与总体求和。 +- 会话中途轮换凭据把 GitHub MCP 服务器杀到不可恢复:其后 `mcp__github__*` 全回 invalid session。 +- 只有新会话重绑 ⇒ 轮换前提醒维护者:在飞席位丢整条 GitHub 通道。 +- 配额池按身份计,换身份即清零燃烧,共享身份结构不变。 +- 组织侧授权变更后仓库访问逐步传播,同一端点数分钟内 403 转 200。 +- 该 403 体解析成净零 ⇒ 空车道先对 `open_issues_count` 反查再信,零命中纪律覆盖 list 读。 +- 满页首页零命中是截断不是缺席:`GET /branches?per_page=100` 回满 100 行无目标 ⇒ 翻完再判。 +- `issue_write` 的 `labels` 是整组替换不是追加:同一动作内重读现值合并再写。 +- 隔轮旧读数是无效快照,按其回写静默剥别的标签;真追加走 REST `POST /issues/{n}/labels`。 +- 追加端点同样先过探针:403 会话没有真追加通道,只能整组替换。 +- 摘标签也没有加法端点:`finding` 定级这类只能整组写,carve-out 保留;写后照纪律回读。 +- PR 标签的三条读腿全盲、两条静默。 +- 腿 ①:`issue_read get_labels` 传 PR 号回 Could not resolve to an Issue。 +- REST 的 PR 也是 issue 惯例在此方法不成立;响亮失败即路由信号,改走腿 ③。 +- 腿 ②:`pull_request_read get` 的 `labels` 时缺时滞,可整字段缺席;连盲都不稳定,更险。 +- 腿 ③:payload 档 —— issue 页的 `href` 锚点 grep(`/labels/NAME`)在 PR 页命中零。 +- PR 侧拼写是 `data-name="NAME"`,片链到 `issues?q=…label%3A…`。 +- ⇒ ⛔ 读成功而标签空或缺席不读作没有标签:按 `data-name=` 确认,否则整集作 UNKNOWN。 +- 可达时优先加法端点;⛔ 单读与单次即时读回都不决断。 +- ⇒ union-write 欠一次延迟确认;必需标签(如 `skip-changeset`)其后每次触碰重核。 +- `list_issues` 永不返回 assignees:`fields` 枚举无此成员,不传也没有。 +- 已认领卡与空闲卡响应逐字节相同,清单只是候选名单 ⇒ 认领前必须过完整 `issue_read`。 +- MCP `issue_read` 的 body 实体转义是纯读侧伪影,撇号与引号与尖括号成数字实体,comments 原样。 +- 存储体是明文,先解码实体再写回往返安全;腐蚀 body 的恰是把转义读数原样回写。 +- 读侧并非一律可逆:行内反引号里的尖括号片段被 MCP 读路径整个丢弃,非转义,无从解码。 +- 写侧剥除是真实存储损耗,⛔ 两类不并成一条,写后回读必做;实体归属与 `&` 类未实测。 +- `Blocked-by:` 行归 BODY,是单通道反向索引:追加按解码后写回执行。 +- 历史上寄放在评论里的行按同程序增量回填,⛔ 不搞批量突击。 +- 解锁扫描只 grep body,⛔ 不加常设评论读;扫描走 `list_issues` 加 `issue_read` 直读。 +- 动手前按空的行内代码跨度判 MCP 读可用否;命中即改从原始体取,⛔ 不拿有损读数回写。 +- `list_issue_types` 对本集成 403 而 `issue_write type:` 正常,是读权限缺口。 +- ⇒ 直接写已知好值(`Bug`/`Feature`/`Task`),写侧报错才是真信号;列表 403 不等于类型不可用。 +- 非法值是响错还是静默丢弃未实测,写非已知值前先小样验证。 ## 读数陷阱 -- **被拦的下载不是缺席证明**:出口策略 403(如 `cdn.playwright.dev`)只说「取不来」 - 不说「没有」—— 先找产物再下结论(实测:Chromium 预装、`PLAYWRIGHT_BROWSERS_PATH` 已设)。 -- **读数五坑**:`cd X && cmd` 会短路(路径不存在时命令在当前仓继续执行, - 产出假读数)—— 跨仓一律 `git -C `; `git grep -c | wc -l` 数文件数不是命中数; - 裸名 grep 被幸存家族当子串命中 —— 退役核验带引号精确名,更硬判据是查声明式 - (`^(export )?(const|type|interface) \b`)而非查提及;浅检出上的历史读数不可信 - (`merge-base --is-ancestor` 假「非祖先」、`rev-list --count` 截断、`branch -r --contains` - 零输出)—— 先 `--deepen` 再判,或走 REST `compare`;**容器里没有 `gh`**,于是 `gh … || echo "none"` - 是个**不可证伪的否定** —— 127「命令不存在」与「grep 没命中」在输出上同值 - (实测五张 PR 跑五次「无重叠文件」全部打印安心结论、一次都没检查)。安全拼写:先 - `command -v ` 确认存在,或在 `||` 之前捕获状态;⛔ 一般规则:**任何可能不存在的命令上挂 - `|| 回退` 都是不可证伪的否定**,PR / 查重类核验改走 MCP GitHub 工具或 git。 -- **auto 档分类器的判定随命令形状变,不随能力变 ⇒ 被拒的复合命令先拆成裸核心动作重试 - 再报 blocked**(2026-08-22 同席同分钟:`git rev-parse … && git push origin <分支> 2>&1 | tail` 被拒,裸 - `git push origin <分支>` 放行并成功 —— 只差链接与管道,拒绝文案不点名违规元素;判定还跨 - 天翻面)⇒ ⛔ 一次拒绝不是能力边界,`permissions.allow` 条目才是仓库侧唯一确定性通道。 -- `rerun_failed_jobs` 复用原 run 的提交与合并 ref, - 不拿新 main 重算 —— 红因是基上缺一个已合修复时重跑无效, - 只能推提交(`git merge origin/main`);判别:修复的合并时间晚于 run 创建时间即是。 -- **同一 head 上轻量兄弟 workflow `success` + 重量级载体 `cancelled` 是普通取代的预期签名, - 不是选择性失败**(cancel-in-progress 窗口只罩得住跑得慢的载体): - 先比对 run `head_sha` 与 PR 当前 head(取代必有新 head),不开「为何只取消它」调查。 -- **CI 红了先取完整日志归档再下结论 —— 断言文本只在归档里, - 直读工具拿不到** (2026-08-18 实测):`get_check_run` 对本仓 CI job 回空 `output.text`, - `get_job_logs` 无论 `tail_lines` 只回占满日志尾部的 post-step service-container teardown - ⇒ 两者都答不了「到底挂在哪」;失败 step 名免下载即得(`actions_get method=get_workflow_job`), - 真实断言文本走 run 日志归档:`actions_get method=get_workflow_run_logs_url` → 下载解压,分步文件在 - `{Job name}/{step number}_{step name}.txt`。「completeness check 绿」只断言没有 worker 静默死 - ≠ 测试通过;并发输出的「相邻」≠「因果」(先查 `turbo.json` 依赖边),⛔ 不只看 tail; - 公开发出的诊断被推翻时,更正发在同样公开的位置,据它开的 PR 撤回 draft、解绑 `Fixes`。 -- **判「正文被截断」必须双读取**:`.body` 原文 + `Accept: application/vnd.github.full+json` 的 - `.body_html`,两者同一处断掉才算 issue 端截断。读侧实测有确定性触发:正文含字面 script 开 - 标记形状的 token(less-than 紧跟 script 字样;doctype 开标记、object 标签形状同触发)时,API/MCP 读 - 回在该 token 处静默截断而网页全文完好 —— 存储体无损,⛔ 不「修复」只在 API 读短的 - 卡。**同坑第三条读路径**:MCP `issue_read` / PR 读路径把**行内反引号里的尖括号片段整个吃 - 掉**,而 GitHub 存储字节完好(raw REST 取回一字不差)⇒ ⛔ **永不单凭 MCP 读判截断,先取 - raw REST 或 WebFetch 渲染页核对再判** —— 否则 repair-first 被**正确**地应用到完好的卡上, - 重写毁掉的是正确内容。判据 = 数**空的行内代码跨度**:一个空跨度恰是短尖括号片段被 - 吃掉的签名(判据是**尖括号**不是反引号:有的正文本来就把标识符不带尖括号写);数字实 - 体(如撇号成 `'`)是普通实体编码,**不是**截断证据(2026-08-23 实测)。 -- **写侧 sanitizer 作者规则**:规则住 AGENTS.md「GitHub mutates body BYTES」(围栏**不**防护、危险字 - 符用词拼出、写后回读),⛔ 不在本表复述;本表只补两条实测:要字面尖括号写实体 `<` / - `>`;裸标识符(无尖括号)存活 ⇒ SKILL 提取契约(字面文本 grep + 裸标识符回退)仍有效。 -- **写侧实测行为 · issue body(落库删字节,网页同显)**:sanitizer 按 **tag 形状**删、不按尖括号 - —— 行内反引号里的 tag 形状 token(未知标签形:注释标记、占位符、泛型)整个被删,HTML 注 - 释形状标记裸写被整删留空行;孤立 less-than / greater-than(行内)与非 tag 形状带尖括号正则(围 - 栏)**存活**。⛔ **围栏不防护**:照删、留空围栏(2026-08-18/20 四写实测)。**另一坑**:**感叹号 - 紧跟左方括号**即触发(TS 非空断言下标),**无需 less-than**(2026-08-29 PR 正文四处实测,MCP 与渲 - 染页双读一致、盘上未变 ⇒ 落库丢字符;围栏/行内代码四处全丢),幸存文本仍像代码但意 - 义已变;感叹号不接左方括号则存活。作者侧:运算符**用词拼出**,或占位词定义一次。 -- **写侧实测行为 · 评论(形状是「截断」 - 不是「删片段」)**:sanitizer 从**首个命名 HTML 元素的尖括号片段**起把评论体一路吃到结尾 - (2026-08-21 实测:一份用**字面文本**标记发出的 dev 报告,正文在 `this.error(` 处断掉、 - JSON 不可解析)⇒ ⛔ **字面文本标记只保住标记、保不住正文** —— 标记扫描照报成功, - 只有真去解析才发现;引信是普通 TS 形状(泛型一类)不是奇异语法。⚠️ 边界: - 姊妹仓一次受控探针测到的是**选择性删除**而非截断到尾 ⇒ **写侧按最坏的截断防护**。 -- **写侧实测行为 · PR 正文(尾部 `---` 与其后的署名页脚一并被吃)**:写调用照报成功;去掉横 - 线只写页脚则原样存活(2026-08-28 两仓同轮、两张 PR 全文回读)。**评论不受影响**(两种拼法 - 都活)⇒ 失效既**依拼写**又**依载体**:评论里验过页脚**对 PR 正文什么都没证明**。⇒ PR - 正文页脚**不带前置横线**、且**写后回读正文**(唯一检测手段);评论两形皆可。 -- **署名页脚的写侧变异按通道与输入双重定域,⛔ 不是一条定律**(作者侧处方住 AGENTS.md,本 - 条只定作用域):MCP `update_pull_request` 包装器**删掉** PR 正文的页脚块(2026-09-03 姊妹仓实测:带 - 与不带页脚两次送出,落库都是 12317 字节、零页脚);裸 REST `PATCH /pulls` **追加**一个裸页脚 - 并保留既有 session-URL 页脚(送 15726、落 15784、差恰 +58、前缀逐字节相同;2026-09-04 两仓两席 - 各一次独立观察,后一次全文比对 22,533 字符、两页脚并存)。⚠️ **同一 MCP 包装器上有反 - 例**:把**已带页脚**的正文整体重送,两条页脚均逐字节存活(2026-09-04 07:02Z,n=1),提出的机理 - 是「工具只为没有页脚的正文合成页脚」—— ⛔ **未实测**,⛔ 不把这些观察压成一条定 - 律、不为凑定律改写其中任一句。**第四种组合**:裸 REST `POST /pulls` 建 PR 时,在已带 - session-URL 页脚的正文后再追加一条 **session-URL** 页脚(前置 `---`、恰 +90 字节、送出体是存 - 储体的严格前缀;2026-09-04 实测)⇒ 追加的形态随通道**与动作(建 / 改)**变,⛔ 不由任一条推 - 其余。⇒ 写后必回读;评论创建两通道都追加同样 58 字节 ⇒ 严格解析 `os-dev-report` 评论必 - 须停在最后一个右花括号。 -- **并行 spec PR 同动 pin 计数断言**(被踢不是事故,按 os-regen 序再解一轮):解冲突两侧收据都 - 保留、按合并顺序堆叠,新计数**从合并后源码重数**(操作数是文件本身不是历史),⛔ 不从 - 两侧收据做算术;双方占同一编号是常态(各取当时 max+1),重编号后进侧。 -- **容器重启杀死在飞 dev,现场三态判读**:① 分支已推 + PR 已开 ⇒ 只欠验收(CI 重跑 + 复核, - 不动代码); ② 死在 regen 中途(未提交全是生成物、 - merge commit 已在)⇒ PM 直接续作 —— build → 整链 regen → 生成物门禁全绿 → 提交推送, - 恢复 commit 带 `Recovery commit:` 前缀留审计;⚠️ 有的现场 regen 一件没跑, - 推送前先跑生成物门禁别赌; ③ 死在源码编辑中途 ⇒ 先读 diff 判完整性 —— - docblock 写全动机/失效模式/判据的,PM 可代跑终验后提交,写一半意图不明的 ⛔ 不代提交、 - 记进交接;dev 临时目录(`.os-scratch/` 一类)是工作物不是交付物,清掉,⛔ 不进 feature PR。 -- **零提交的探针分支不是在飞工作**:容器发不出分支删除 refspec(实测 `git push origin --delete - ` 回 `send-pack: unexpected disconnect while reading sideband packet`,三次退避全败;**同会话普通 push - 正常** ⇒ 不是连通性问题),于是测量型派发留下的探针分支永久堆在 origin 上。读法规则: - `claude/issue-*` 分支**零提交领先 `origin/main` 且没有开着的 PR** = 不承载任何工作,⛔ - 不据 `ls-remote | grep issue-` 正命中回避该卡 —— 失效方向是**活卡被永久读成已被认领**, - 无红信号、只增不减。判据两读:`git rev-list --count origin/main..origin/` 为 0, - 且分支名下无 open PR。边界:一容器一会话三次,成因未诊断,存量未普查。 -- **会话从上下文检测不到自己的静默降档**(2026-08-20 实测:一次分诊 fire 两级静默降档,横幅 - 只在 UI 侧渲染、上下文零信号,子轮开场自述「跑在契约复审档」)——服役档的权威读数 - 是 `get_session`(claude-code-remote MCP,无参)的 `external_metadata.last_served_model`(最近一轮实 - 际服役者,降档链中途照真);`session_context.model` 是配置档不是服役档,⛔ 不作保险丝输入。 - ⚠️ 该读数**按宿主分叉**:有的 ccd 宿主装 session-mgmt MCP,其 `get_session` **按契约排除当前会 - 话** ⇒ 保险丝无输入(2026-08-24),另一台宿主省 `session_id` 正常回两键(2026-08-25)⇒ ⛔ 不据一 - 台宿主推全体;无它时的合法替代 = grep 本会话 transcript 里 harness 写的 `"model":`(逐请求写 - 入、非模型自述,用时在卡上申报)。 -- **档位额度终止是第三种死法**(2026-08-27 实测):子代理死在编辑中途、 - 宿主报本账户档位额度到顶 —— 有**宿主信号**故非普通子代理死亡,亦非维护者中止: - **派发已死、前提完好、卡在资源** ⇒ 死认领回收 + worktree 抢救,⛔ 不重核前提、 - 不升级;⚠️ 无前置探针(只在 dev 死在里面时可观测),缓解只在 dev 侧的早 WIP 提交。 -- **档位不可用时 ⛔ 不凭记忆宣告车道阻塞,逐文件面现推 mandate**:强制档不得因不可用而 - 降档(那正是降档保险丝要拒的替换),但「本车道 fable 强制」多是过宽的回忆 —— - `dispatch-gates.mjs --tier PATH` 逐路径现推(实测:`SKILL.md` 与 `.claude/agents/**` 强制,`scripts/pm/**` - 与 `references/**` 无 ⇒ 全阻塞的三卡 fold 拆成 1 阻 3 可跑);路径线是**下限不是放行**。⚠️ - 该脚本只答自己那棵树:objectui 路径回「absent from this tree」,姊妹仓的档位与 clause-② 只能 - 手推(`check-clause2-carriers.mjs --pair` 在 CCR 容器里读 GitHub 回 403 退 3,2026-09-02 实测)。 -- **required checks 的名单是每仓事实**(逐 job 读判定的规则住上面队列段):objectstack 六个 —— +- MCP `list_issues` 的 `labels` 数组是并集:多标签 `totalCount` 是析取的规模,恒 ≥ 各单标签。 +- ⛔ 永不读作交集;判据 = 结果比任一输入都宽:两标签的交集回 135 张而一道只有 132 张。 +- 正典解法:逐标签单独计数,按容斥推交集;负数或不合理的隐含交集 = 模型坏了。 +- 结果良构、失效全静默,混入别车道同状态卡与本车道全状态卡。 +- 正确读法 = 整车道单标签一次读全加本地对 labels 求交,或改走 REST。 +- 两个通道的 `labels` 语义相反:REST 列表端点的 `labels=a,b` 是真 AND ⇒ ⛔ 不无条件改走 REST。 +- 被拦的下载不是缺席证明:出口策略 403 只说取不来,不说没有,先找产物再下结论。 +- 读数:Chromium 预装、`PLAYWRIGHT_BROWSERS_PATH` 已设,而 `cdn.playwright.dev` 回 403。 +- 读数五坑 ①:`cd X && cmd` 短路 —— 路径不存在时命令在当前仓执行,跨仓恒 `git -C `。 +- ②:`git grep -c | wc -l` 数的是文件数不是命中数。 +- ③:裸名 grep 被幸存家族当子串命中 —— 退役核验带引号精确名。 +- 更硬判据是查声明式 `^(export )?(const|type|interface) \b` 而非查提及。 +- ④:浅检出上的历史读数不可信 —— `merge-base --is-ancestor` 假非祖先、`rev-list --count` 截断。 +- 同族 `branch -r --contains` 零输出;先 `--deepen` 再判,或走 REST `compare`。 +- ⑤:容器里没有 `gh`,于是 `gh … || echo "none"` 是不可证伪的否定。 +- 127 命令不存在与 grep 没命中输出同值 ⇒ 回退分支照打印安心结论而一次都没检查。 +- 安全拼写:先 `command -v ` 确认存在,或在 `||` 之前捕获状态。 +- ⛔ 一般规则:任何可能不存在的命令上挂回退都是不可证伪的否定。 +- PR 与查重类核验改走 MCP GitHub 工具或 git。 +- auto 档判定随命令形状变,不随能力变 ⇒ 被拒的复合命令拆成裸动作重试再报 blocked。 +- 读数:带链接与管道的 `git push` 被拒,裸 `git push origin <分支>` 放行,拒绝文案不点名元素。 +- 判定跨天翻面 ⇒ ⛔ 一次拒绝不是能力边界;`permissions.allow` 条目才是仓库侧确定性通道。 +- `rerun_failed_jobs` 复用原 run 的提交与合并 ref,不拿新 main 重算。 +- ⇒ 基上缺已合修复时重跑无效,只能 `git merge origin/main` 推提交;判别看修复合并时间。 +- 同一 head 上轻量兄弟 workflow `success` 加重量级载体 `cancelled` 是普通取代的预期签名。 +- cancel-in-progress 窗口只罩得住慢载体 ⇒ 先比对 run `head_sha` 与 PR 当前 head,不开调查。 +- CI 红了先取完整日志归档再下结论:断言文本只在归档里,直读工具拿不到。 +- `get_check_run` 对本仓 CI job 回空 `output.text`。 +- `get_job_logs` 无论 `tail_lines` 只回占满日志尾部的 post-step service-container teardown。 +- ⇒ 两者都答不了到底挂在哪;`GET /actions/jobs/{id}/logs` 被出口代理拒绝,CONNECT 403。 +- 失败 step 名免下载即得:`actions_get method=get_workflow_job`。 +- check-run annotations 端点带退出码与失败命令,是免归档的第二条便宜读。 +- 真实断言文本走 run 日志归档:`actions_get method=get_workflow_run_logs_url` 后下载解压。 +- 分步文件在 `{Job name}/{step number}_{step name}.txt`。 +- completeness check 绿只断言没有 worker 静默死,不等于测试通过。 +- 并发输出的相邻不等于因果:先查 `turbo.json` 依赖边,⛔ 不只看 tail。 +- 公开发出的诊断被推翻时,更正发在同样公开的位置,据它开的 PR 撤回 draft、解绑 `Fixes`。 +- 判正文被截断必须双读取:`.body` 原文,加 `Accept: application/vnd.github.full+json` 的 `.body_html`。 +- 两者同一处断掉才算 issue 端截断。 +- 读侧有确定性触发:正文含字面 script 开标记形状 token 时,API 与 MCP 读回在该处静默截断。 +- doctype 开标记与 object 标签形状同触发;网页全文完好,⛔ 不修复只在 API 读短的卡。 +- 同坑第三条读路径:MCP `issue_read` 与 PR 读路径把行内反引号里的尖括号片段整个吃掉。 +- GitHub 存储字节完好,raw REST 取回一字不差。 +- ⇒ ⛔ 永不单凭 MCP 读判截断,先取 raw REST 或 WebFetch 渲染页核对再判。 +- 否则 repair-first 被正确地应用到完好的卡上,重写毁掉的是正确内容。 +- 判据 = 数空的行内代码跨度:一个空跨度恰是短尖括号片段被吃掉的签名。 +- 判据是尖括号不是反引号:有的正文本来就把标识符不带尖括号写。 +- 数字实体(如撇号成 `'`)是普通实体编码,不是截断证据。 +- 写侧 sanitizer 作者规则住 AGENTS.md 的 GitHub mutates body BYTES 段,⛔ 不在本表复述。 +- 本表只补两条:要字面尖括号写实体 `<` / `>`。 +- 裸标识符(无尖括号)存活 ⇒ SKILL 提取契约(字面文本 grep 加裸标识符回退)仍有效。 +- 写侧 · issue body:落库删字节,网页同显;sanitizer 按 tag 形状删,不按尖括号。 +- 行内反引号里的 tag 形状 token 整个被删,含注释标记、占位符、泛型这些未知标签形。 +- HTML 注释形状标记裸写被整删留空行;孤立的行内尖括号与非 tag 形状带尖括号正则存活。 +- ⛔ 围栏不防护:照删、留空围栏。 +- 另一坑:感叹号紧跟左方括号即触发(TS 非空断言下标),无需尖括号。 +- 围栏与行内代码同样丢字符,幸存文本仍像代码但意义已变;感叹号不接左方括号则存活。 +- 作者侧:运算符用词拼出,或占位词定义一次。 +- 写侧 · 评论是截断不是删片段:sanitizer 从首个命名 HTML 元素的尖括号片段起吃到结尾。 +- JSON 因此不可解析 ⇒ ⛔ 字面文本标记只保住标记:标记扫描照报成功,真去解析才发现。 +- 引信是普通 TS 形状如泛型,不是奇异语法。 +- 边界:姊妹仓一次受控探针测到的是选择性删除而非截断到尾 ⇒ 写侧按最坏的截断防护。 +- 写侧 · PR 正文:尾部横线与其后的署名页脚一并被吃,而写调用照报成功。 +- 去掉横线只写页脚则原样存活;评论不受影响,两种拼法都活。 +- ⇒ 失效既依拼写又依载体:评论里验过页脚对 PR 正文什么都没证明。 +- ⇒ PR 正文页脚不带前置横线,且写后回读正文 —— 那是唯一检测手段;评论两形皆可。 +- 署名页脚的写侧变异按通道与输入双重定域,⛔ 不是一条定律。 +- MCP `update_pull_request` 包装器删掉 PR 正文的页脚块。 +- 裸 REST `PATCH /pulls` 追加一个裸页脚并保留既有 session-URL 页脚,差恰 58 字节。 +- 同一 MCP 包装器上有反例:把已带页脚的正文整体重送,两条页脚均逐字节存活。 +- 提出的机理是工具只为无页脚的正文合成页脚 —— ⛔ 未实测,⛔ 不把观察压成定律。 +- 第四形:裸 REST `POST /pulls` 建 PR 时,在已带 session-URL 页脚的正文后再追加一条同形页脚。 +- 该追加带前置横线、恰 90 字节,送出体是存储体的严格前缀。 +- ⇒ 追加形态随通道与动作(建 / 改)变,⛔ 不由任一条推其余;写后必回读。 +- 评论创建两通道都追加 58 字节 ⇒ 严格解析 `os-dev-report` 必须停在最后一个右花括号。 +- 并行 spec PR 同动 pin 计数断言:被踢不是事故,按 os-regen 序再解一轮。 +- 解冲突两侧收据都保留、按合并顺序堆叠;新计数从合并后源码重数,⛔ 不从收据做算术。 +- 操作数是文件本身不是历史;双方占同一编号是常态,重编号后进侧。 +- 容器重启杀死在飞 dev,三态 ①:分支已推加 PR 已开 ⇒ 只欠验收,CI 重跑加复核,不动代码。 +- ②:死在 regen 中途(未提交全是生成物、merge commit 已在)⇒ PM 直接续作。 +- 续作序:build,整链 regen,生成物门禁全绿,提交推送;恢复 commit 带 `Recovery commit:` 前缀。 +- 有的现场 regen 一件没跑,推送前先跑生成物门禁别赌。 +- ③:死在源码编辑中途 ⇒ 先读 diff 判完整性:docblock 写全动机与判据的可代跑终验后提交。 +- 写一半意图不明的 ⛔ 不代提交,记交接;dev 临时目录(`.os-scratch/` 一类)清掉,⛔ 不进 PR。 +- 零提交的探针分支不是在飞工作:容器发不出分支删除 refspec。 +- `git push origin --delete ` 回 send-pack: unexpected disconnect,三次退避全败,同会话普通 push 正常。 +- ⇒ 测量型派发留下的探针分支永久堆在 origin 上。 +- 判据两读:`git rev-list --count origin/main..origin/` 为 0,且分支名下无 open PR。 +- ⛔ 不据 `ls-remote | grep issue-` 正命中回避该卡:失效方向是活卡被读成已认领,无红信号。 +- 会话从上下文检测不到自己的静默降档:横幅只在 UI 侧渲染,上下文零信号。 +- 服役档的权威读数是 `get_session`(claude-code-remote MCP,无参)的 `external_metadata.last_served_model`。 +- 它是最近一轮服役者,降档链中途照真;`session_context.model` 是配置档,⛔ 不作保险丝输入。 +- 该读数按宿主分叉:有的宿主的 `get_session` 按契约排除当前会话 ⇒ 保险丝无输入。 +- ⛔ 不据一台宿主推全体;替代读数用时在卡上申报。 +- 无它时的合法替代 = grep 本会话 transcript 里 harness 写的 `"model":`,逐请求写入、非自述。 +- 档位额度终止是第三种死法:子代理死在编辑中途、宿主报本账户档位额度到顶。 +- 有宿主信号故非普通子代理死亡,亦非维护者中止 ⇒ 派发已死、前提完好、卡在资源。 +- 处置 = 死认领回收加 worktree 抢救,⛔ 不重核前提、不升级。 +- 无前置探针,只在 dev 死在里面时可观测;缓解只在 dev 侧的早 WIP 提交。 +- 档位不可用时 ⛔ 不凭记忆宣告车道阻塞,逐文件面现推 mandate。 +- 强制档不得因不可用而降档 —— 那正是降档保险丝要拒的替换。 +- 本车道强制多是过宽的回忆:`dispatch-gates.mjs --tier PATH` 逐路径现推,路径线是下限非放行。 +- 该脚本只答自己那棵树:姊妹仓路径回 absent from this tree,姊妹仓的档位与条款②只能手推。 +- required checks 的名单是每仓事实,objectstack 六个: `TypeScript Type Check` · `Lint & Repo Gates` · `Test Core` · `Dogfood Regression Gate` · - `Build Core` · `Temporal Conformance (live PG + MySQL)`;`in_progress` 不是过;advisory 门禁 - 红进 main 是共享损伤,照样止血立单。⛔ 聚合命令同样不作判定:`check:type-check-debt` 可在 - 包级 typecheck 绿时红;`check:i18n` 以「PREREQUISITE NOT MET — workspace CLI 未 build」退 3 不是漂移。 -- ⚠️ **计数不是机理读数(被当天推翻的推断的墓碑)**:「`GET .../actions/runs?event=merge_group` - 计数 0 ⇒ required 集为空」提出当天即被自身推翻 —— 同一姊妹仓 2026-08-24 首现 merge_group - run(0 → 8),同日再测 224(阳性对照 `event=pull_request` 全程非零)。计数答「至今发生过没有」, - 不答「机制在不在」:零计数只作**弱先验**,判 required 集为空要读 ruleset - 的 required 集本身、或看队列合并是否真在等检查;⛔ 别处写下的计数值一律先复测再用。 + `Build Core` · `Temporal Conformance (live PG + MySQL)`。 +- `in_progress` 不是过;advisory 门禁红进 main 是共享损伤,照样止血立单。 +- ⛔ 聚合命令同样不作判定:`check:type-check-debt` 可在包级 typecheck 绿时红。 +- `check:i18n` 以 PREREQUISITE NOT MET(workspace CLI 未 build)退 3,不是漂移。 +- 计数非机理读数:由 `GET .../actions/runs?event=merge_group` 计数 0 推 required 集为空,当天被推翻。 +- 计数答至今发生过没有,不答机制在不在:零计数只作弱先验。 +- 判 required 集为空要读 ruleset 的 required 集本身,或看队列合并是否真在等检查。 +- ⛔ 别处写下的计数值一律先复测再用。 ## 闭合关键词解析(PR 正文写侧) -- **PR 正文里「不修某卡」的否定句照样关卡**:闭合关键词解析器匹配 - `fix/fixes/fixed/close/closes/closed/resolve/resolves/resolved` + `#N`,**不理会前面的否定词** —— - 声明不修的那句话恰在合并时关卡;安全写法 = 号码不被关键词打头 (`#N is not addressed here` - / `out of scope: #N` / `#N remains open`)。实测边界三条:关键词只绑**同一行**的 `#N`; - 动名词(closing/fixing)不是关键词;行内反引号里的关键词不触发(code span 实测不建闭合链接; - 围栏块未独立实测,按同规则对待但留待复测)。 -- **PR body 与 squash commit message 是两个独立解析源**(commit 干净 ≠ body 干净,只查 commit 会 - 漏);误关的卡以 `completed` 状态对一切「只看 open」的过滤与巡检隐身,无任何机械守卫覆盖 - 这条路径 —— 消费侧检查 = 合并后读 `closed_by_pull_requests`(在复核清单)。 +- PR 正文里不修某卡的否定句照样关卡:解析器不理会前面的否定词。 +- 关键词集 = `fix/fixes/fixed/close/closes/closed/resolve/resolves/resolved` 加 `#N`。 +- 声明不修的那句话恰在合并时关卡;安全写法是号码不被关键词打头。 +- 三种安全拼法:`#N is not addressed here` / `out of scope: #N` / `#N remains open`。 +- 边界三条 ①:关键词只绑同一行的 `#N`。②:动名词 closing 与 fixing 不是关键词。 +- ③:行内反引号里的关键词不触发,code span 不建闭合链接;围栏块未实测,按同规则对待。 +- PR body 与 squash commit message 是两个独立解析源:commit 干净不等于 body 干净,只查 commit 会漏。 +- 误关的卡以 `completed` 状态对一切只看 open 的过滤与巡检隐身,无机械守卫覆盖这条路径。 +- 消费侧检查 = 合并后读 `closed_by_pull_requests`,在复核清单里。 -## 断粮检测与跨墙恢复细则(5 小时用量墙) +## 断粮检测与跨墙恢复(5 小时用量墙) -原则、定时器选型(⛔ 不用 send_later 链)与恢复 playbook 在主文件;事实补遗:`npx ccusage blocks` 容 -器内可用(读本地会话记录),报当前 5 小时窗口边界/剩余与燃烧率;盲区:窗口起点是本地推 -断的近似值;撞墙报文形如「limit reached, resets at HH:MM」(重置时刻只在此刻可得)。 -- **agent 建的 Routine 起的会话不带 `mcp__github__*` 工具**(2026-08-29 两次探针,决断的是第二次:显 - 式禁止自退休、唯一动作是跑一次 github 查询并发一条评论 —— 回 30s IDLE、评论从未出 - 现,判别读数是目标卡评论数与 `updated_at` 全程不动,它排除了「正确自退休」这个同形解 - 释)⇒ **对任何以 GitHub 读写为工作的席位不可用**。⚠️ 2026-09-04 复核本会话工具契约:创 - 建端现有 `connectors` 参数(声明起的会话可用哪些连接器)⇒ 当时的成因(不存连接器)有了参 - 数级解法,⛔ **未实测**,⛔ 不据参数在场推「现在能用了」。 -- **自绑唤醒的是已存在的会话、工具已加载 ⇒ 上条的传输问题不发生 —— 代价是拿新会 - 话可恢复性换工具可得性**(`persistent_session_id` 或绑自身):绑定的会话一死,定时器成孤儿、 - 每小时唤醒一个死会话且长期无人察觉(实测一例躺了 6 天)⇒ **绑定会话一死:先删旧 - Routine、再从新会话重建,⛔ 永不留孤儿**;自绑是性能优化(保住一条 prompt-cache 链),⛔ 不是 - 状态存储,删了重建零成本。 -- **创建端无 `sources`、无 `model` 参数**(2026-09-04 复核仍然如此)⇒ agent 建不出带仓库源或钉死 - 档位的 Routine,起的会话落**默认档**(2026-08-29 实测落在档位裁决之下,两个方向 agent 都改不 - 动);⚠️ 更新端**今日带** `model`,但只有「每次起新会话」的 Routine 吃得到 —— 自绑的保 - 持所绑会话的档位直到绑定解除 ⇒ ⛔ 不据「更新端能改档」推「自绑的档位可改」;UI 建 - 的 Routine agent 改不动(更新端只受理自己建的)。 +- 原则、定时器选型与恢复 playbook 在主文件;本节只放事实补遗。 +- `npx ccusage blocks` 容器内可用,读本地会话记录,报当前 5 小时窗口边界、剩余与燃烧率。 +- 盲区:窗口起点是本地推断的近似值。 +- 撞墙报文形如 `limit reached, resets at HH:MM`,重置时刻只在此刻可得。 +- agent 建的 Routine 起的会话不带 `mcp__github__*` 工具 ⇒ 对以 GitHub 读写为工作的席位不可用。 +- 创建端现有 `connectors` 参数,声明起的会话可用哪些连接器 ⇒ 成因有了参数级解法。 +- ⛔ 未实测,⛔ 不据参数在场推现在能用了。 +- 自绑唤醒的是已存在的会话、工具已加载 ⇒ 上条的传输问题不发生。 +- 代价是拿可恢复性换工具可得性:绑定会话一死,定时器成孤儿、每小时唤醒死会话。 +- ⇒ 绑定会话一死:先删旧 Routine、再从新会话重建,⛔ 永不留孤儿。 +- 自绑是性能优化,保住一条 prompt-cache 链,⛔ 不是状态存储;删了重建零成本。 +- 创建端无 `sources`、无 `model` 参数 ⇒ 建不出带源或钉死档位的 Routine,起的会话落默认档。 +- 更新端带 `model`,但只有每次起新会话的 Routine 吃得到。 +- 自绑的保持所绑会话的档位直到绑定解除 ⇒ ⛔ 不据更新端能改档推自绑的档位可改。 +- UI 建的 Routine agent 改不动:更新端只受理自己建的。 diff --git a/.claude/skills/pm-dispatch/references/release-aftercare.md b/.claude/skills/pm-dispatch/references/release-aftercare.md index b757de2565..a3a0b4590d 100644 --- a/.claude/skills/pm-dispatch/references/release-aftercare.md +++ b/.claude/skills/pm-dispatch/references/release-aftercare.md @@ -1,58 +1,50 @@ -# 发版后义务(references —— 按需加载) +# 发版后义务 -出处:落地窗口止于 MERGED, -而 MERGED 不是用户拿到东西的时刻。本表是 tagged 发版滚上生产**之后**车道 PM 仍欠的动作, -发版窗口查阅;⛔ 不引用 issue 编号。实测底账:2026-08-21/23 云侧连续两日的发版运维记录。 +见 `landing-operations.md` 的 MERGED 不是终点;本文是 tagged 发版滚上生产后车道 PM 仍欠的动作。 ## A. 每次 fleet roll 重掷容器落位 —— 先读落位,再读延迟 -tagged 发版滚容器,滚容器就在区域约束内**重掷**落位;区域约束只定边界、 -不定城市(实测同一 ENAM 内 Ashburn ~4ms / Atlanta ~17ms / Houston ~35ms 每 leg,9 倍差)。 -折算用实测形状 `server ≈ 33 + 23 × RTT`:35ms/leg ≈ ~870ms/请求, -在 ≤200ms 的性能门禁**外**;~4ms 一档 ≈ ~120ms,门禁内有余量。**所以发版后必须重读落位, -⛔ 不得假设它没变** —— 上一版读到的好数字不是这一版的读数。 - -重掷有两条反直觉物理,顺序错了读数就是废的: - -- **落位跟随唤醒者(WAKER), - 不跟随 `locationHint`** —— 从运维者自己的机器唤醒就掷到运维者附近。 - 实测:加州机器重掷反复落 Houston;改用 us-east CI runner 唤醒,第一次就落 Ashburn。 -- **测量本身污染下一次掷点** —— 换实例中途发出的探针,自己就成了新实例的唤醒者。 -- **协议(顺序不可换)**:rollout → 运维侧**零 HTTP** → us-east runner 唤醒 - (`gh workflow run keep-warm`)→ 读 CF instances API 拿到城市 → **才**开始测量。 -- 坏掷点就重掷(每次约 15s 空窗),⛔ 不为迁就一次坏掷点去动门禁阈值。 +- tagged 发版滚容器,滚容器就在区域约束内重掷落位;区域约束只定边界,不定城市。 +- 同一区域内各城市每 leg 相差近 9 倍:~4ms、~17ms、~35ms 都在同一个 ENAM 内。 +- 折算用实测形状 `server ≈ 33 + 23 × RTT`。 +- 35ms/leg ≈ ~870ms/请求,落在 ≤200ms 的性能门禁外;~4ms 一档 ≈ ~120ms,门禁内有余量。 +- ⇒ 发版后必须重读落位,⛔ 不得假设它没变:上一版读到的好数字不是这一版的读数。 +- 重掷有两条反直觉物理,顺序错了读数就是废的。 +- 一、落位跟随唤醒者(WAKER)而非 `locationHint`:从运维者自己的机器唤醒就掷到它附近。 +- 二、测量本身污染下一次掷点:换实例中途发出的探针,自己就成了新实例的唤醒者。 +- 协议顺序不可换:rollout,运维侧零 HTTP,us-east runner 唤醒(`gh workflow run keep-warm`)。 +- 然后读 CF instances API 拿到城市,才开始测量。 +- 坏掷点就重掷,每次约 15s 空窗;⛔ 不为迁就一次坏掷点去动门禁阈值。 ## B. 一次真实用户路径探针 —— health 绿证明不了用户能进来 -发版后至少跑**一条真实用户走的完整链路**(登录 → SSO 跳转 → 落地页有数据), -⛔ 不以 `/health` 200、部署 job 绿或合成 E2E 绿代替。 -实测失效模式:平台 SSO 跳转对每个真实用户失败了**五周**(2026-07-17 最后一次成功换 -token,2026-08-22 才被发现),期间健康检查全绿、E2E 也全绿 —— E2E 用邮箱密码直登, -从不跑那段交换。**合成路径绕开的那一段,正是只有真实用户才会走的那一段。** +- 发版后至少跑一条真实用户走的完整链路:登录、SSO 跳转、落地页有数据。 +- ⛔ 不以 `/health` 200、部署 job 绿或合成 E2E 绿代替。 +- 失效模式:平台 SSO 跳转对每个真实用户失败了五周,期间健康检查与 E2E 全绿。 +- 成因是 E2E 用邮箱密码直登,从不跑那段 token 交换。 +- 合成路径绕开的那一段,正是只有真实用户才会走的那一段。 ## C. 手改线上状态 = 止血带 —— 先点名谁重放它、什么时候重放 -改任何**由重放层拥有**的线上状态(库里的行、配置行、绑定)之前,先答两个问题并写进卡: -**谁**重放这份状态(seed / reseed / migration / boot binder),**什么时候**重放。 - -- 手改是止血带,**重放层的修复才是真卡** —— 不立卡,修复就只活在一个人的记忆里。 -- **修好的代码必须赶在下一次重放事件之前发出去**, - 否则事故原样重开。实测:一次 SSO 补救手翻了库里的认证方法行, - 一次跑在修复之前的 reseed 把它整批翻了回去,直到修复落进 seed 本身才止住。 -- 手改**同刻**记录:改了哪张表哪些行、多少行、谁重放、真卡在哪。 +- 改任何由重放层拥有的线上状态(库里的行、配置行、绑定)之前,先答两个问题并写进卡。 +- 两问:谁重放这份状态(seed、reseed、migration、boot binder),什么时候重放。 +- 手改是止血带,重放层的修复才是真卡 —— 不立卡,修复就只活在一个人的记忆里。 +- 修好的代码必须赶在下一次重放事件之前发出去,否则事故原样重开。 +- 失效模式:一次手翻库里的认证方法行,被一次跑在修复之前的 reseed 整批翻了回去。 +- 直到修复落进 seed 本身才止住。 +- 手改同刻记录:改了哪张表哪些行、多少行、谁重放、真卡在哪。 ## D. 被打断的长循环 —— 恢复的第一个动作是重读现实 -后台长跑循环(重掷、恢复轮询、灰度推进)被会话重启打断时,**它最后记下的「意图」 -不是线上此刻的状态**。恢复的第一个动作恒为**重读线上真实状态**, -⛔ 永不从循环的最后已知意图往下接;⛔ 也不把长循环留在无人认领的后台。 -实测:一个被孤儿化的重掷循环,把生产控制面停在它自己掷出的**最差**一档上数小时, -而循环留下的最后一行写着「继续重掷」。 +- 后台长跑循环(重掷、恢复轮询、灰度推进)被重启打断时,它记下的意图不是此刻的状态。 +- 恢复的第一个动作恒为重读线上真实状态,⛔ 永不从循环的最后已知意图往下接。 +- ⛔ 也不把长循环留在无人认领的后台。 +- 失效模式:一个被孤儿化的重掷循环把生产控制面停在自己掷出的最差一档上数小时。 +- 而循环留下的最后一行写着继续重掷。 ## E. 诚实条款 —— 后来的测量推翻已合并 PR 的断言,更正公开落到卡上 -已合并 PR 正文里的事实断言被后来的测量证伪时,**更正公开发到卡上**, -⛔ 不只是自己知道、也不只在下一份报告里顺带带过。实测:一张卡的正文断言 -「SQL DEFAULT 会回填已有行」,后续实测是已有行仍为 NULL(add-column 并不把默认值带进 DDL); -更正当场发到卡上,回填那一半因此留在原卡等人做,而不是被当成已交付。 -**已合并 ≠ 已证实** —— PR 正文是当时的最好理解,卡才是事实的现居地。 +- 已合并 PR 正文里的事实断言被后来的测量证伪时,更正公开发到卡上。 +- ⛔ 不只是自己知道,也 ⛔ 不只在下一份报告里顺带带过。 +- 已合并不等于已证实:PR 正文是当时的最好理解,卡才是事实的现居地。 +- 更正当场发到卡上,未做完的那一半因此留在原卡等人做,而不是被当成已交付。 diff --git a/.claude/skills/pm-dispatch/references/rest-channel.md b/.claude/skills/pm-dispatch/references/rest-channel.md index b42a9cdad2..64af55ce30 100644 --- a/.claude/skills/pm-dispatch/references/rest-channel.md +++ b/.claude/skills/pm-dispatch/references/rest-channel.md @@ -1,88 +1,82 @@ -# REST 通道操作对照表(references —— 按需加载) +# REST 通道操作对照表 -出处:`platform-readings.md` API 配额段(**默认读序 git → -payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通道归属)。做一件事之前查一行: -它有没有 REST 对应物。⛔ 不引用 issue 编号 —— 每行自含边界与日期。 +见 `platform-readings.md` 配额段;本表是逐操作的通道归属,动手前查一行:它有没有 REST 对应物。 -**通道边界**:容器 curl = App installation token,REST core 15,000/时、与 GraphQL 池独立计;出口代理按设 -计只放 **repo-scoped 路径**(`/repos/{o}/{r}/...`)加 `/rate_limit`,org 级端点未实测。⚠️ **✓ 按席位 -类别限定,不是全局事实**:下文每条 ✓ = **2026-08-23 在一个会话门开着的席位实调通过**(未另 -标日期者同此日);2026-08-25 实测 os-dev 子代理席与部分顶层席被会话门整类拒 —— repo-scoped -读**写**全 403 `GitHub access is not enabled…`、`gh` 缺席,MCP 与 git push 正常 —— 那类席位本表读 -写两侧**整表不可达**:先跑一条 repo-scoped 探针再选通道,403 后 `/rate_limit` 单调用判凭据形 -态(15000/时 = 凭据活、被 repo-scoping 拒;60/时或 auth 错 = 无凭据);按班矩阵与降级梯住 -`platform-readings.md`。⛔ 未带 ✓ 的形状不当已验证事实复述。 +## 通道边界 -## 读侧 —— 全部可迁移(MCP list/search 家族才是 GraphQL 燃烧源) +- 出口代理按设计只放 repo-scoped 路径(`/repos/{o}/{r}/...`)加 `/rate_limit`;org 级端点未实测。 +- ✓ 按席位类别限定,不是全局事实:每个 ✓ = 在一个会话门开着的席位实调通过。 +- 会话门关着的席位本表两侧整表不可达:repo-scoped 读写全 403、`gh` 缺席,而 MCP 与 git 正常。 +- ⇒ 先跑一条 repo-scoped 探针再选通道。 +- 403 后 `/rate_limit` 判凭据形态:15000/时 = 凭据活被 repo-scoping 拒;60/时或 auth 错 = 无凭据。 +- 按班矩阵与降级梯住 `platform-readings.md`,⛔ 不在本表复述。 +- ⛔ 未带 ✓ 的形状不当已验证事实复述。 -- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真 - AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。 -- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走 - 法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的 - `open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub - 游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️ - 关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。 -- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前 - 刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重 - 是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。 -- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP - `list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。 -- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。 -- ✓ Timeline 事件:`GET .../issues/{n}/timeline`(cross-ref、`added_to_merge_queue`、ready_for_review)。 -- ✓ PR diff / 文件清单:`GET .../pulls/{n}` 带 Accept - `application/vnd.github.diff` · `.../pulls/{n}/files`(后者实测可瞬态 404 ⇒ PR 文件读取优先走 git)。 -- ✓ 取某 ref 上的文件:`GET .../contents/{path}?ref=...`(raw accept)。 -- ✓ 祖先 / 对比:`GET .../compare/{base}...{head}` —— 浅检出上本地祖先判据不可信时的正解。 -- ✓ 门禁 / workflow:`GET .../commits/{sha}/check-runs` · `GET .../actions/runs`。 -- ✓ 配额自读:`GET /rate_limit`(端点自身零计费,开轮先读的就是它)。 +## 读侧 —— 全部可迁移 + +- ✓ 按标签/状态列卡 `GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N`,`labels=` 是真 AND。 +- ⛔ 完整性自证不跟 `Link: rel="next"`:游标枯竭停在 102,而页号走法得 287 与 448 且与总数符。 +- ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的 `open_issues_count` 减开放 PR 核总数。 +- ⛔ 未核总数的枚举不是读数;成因未知,处方不依赖该头,⛔ 不把已修写成已解释。 +- 关键词阳性对照结构上看不见本类:必中卡落在首页照样绿,只有计数核对逮得住。 +- ⛔ 查重必须含 closed:卡刚关闭时最易被重开,开域查重漏掉刚关闭的同题卡即重复派发。 +- 开域查重是要申报的例外,不是默认;状态与标签列卡仍 `state=open`,那是状态读不是查重。 +- ✓ 卡与 PR 元数据 `GET .../issues/{n}` · `GET .../pulls/{n}`,assignees、labels、body 齐全。 +- MCP `list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由。 +- ✓ 整条评论线 `GET .../issues/{n}/comments?per_page=100`。 +- ✓ Timeline 事件 `GET .../issues/{n}/timeline`:cross-ref、`added_to_merge_queue`、ready_for_review。 +- ✓ PR diff `GET .../pulls/{n}` 带 Accept `application/vnd.github.diff`;文件清单 `.../pulls/{n}/files`。 +- 后者可瞬态 404 ⇒ PR 文件读取优先走 git。 +- ✓ 取某 ref 上的文件 `GET .../contents/{path}?ref=...`,raw accept。 +- ✓ 祖先与对比 `GET .../compare/{base}...{head}` —— 浅检出上本地祖先判据不可信时的正解。 +- ✓ 门禁与 workflow `GET .../commits/{sha}/check-runs` · `GET .../actions/runs`。 +- ✓ 配额自读 `GET /rate_limit`,端点自身零计费。 ## 写侧 —— 全部可迁移 -- ✓ 评论:`POST .../issues/{n}/comments`;改评论 `PATCH .../issues/comments/{id}`。 -- ✓ 标签:**加法** `POST .../issues/{n}/labels` + **定向删** `DELETE .../issues/{n}/labels/{name}` —— 比 - MCP `issue_write` 的整组替换安全:加法写剥不掉并发席位刚挂的标签(整组替换按隔轮旧读数 - 回写会静默剥标,纪律住 `platform-readings.md`)。会话门关着的席位无此端点(2026-08-25 多席实 - 测 403)—— 回退 = MCP 读现值→并集→整组写→**必做读回**,读回是回退安全的全部理由。 -- ✓ 建卡带标签 `POST .../issues` · 改正文/状态 `PATCH .../issues/{n}` · 认领 - `POST .../issues/{n}/assignees`。 -- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0 - 的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。 +- ✓ 评论 `POST .../issues/{n}/comments`;改评论 `PATCH .../issues/comments/{id}`。 +- ✓ 标签加法 `POST .../issues/{n}/labels`,定向删 `DELETE .../issues/{n}/labels/{name}`。 +- 加法写剥不掉并发席位刚挂的标签,比 MCP `issue_write` 的整组替换安全。 +- 门关席位无此端点 ⇒ 回退 = MCP 读现值、并集、整组写、读回;读回是它安全的全部理由。 +- ✓ 建卡带标签 `POST .../issues` · 改正文 `PATCH .../issues/{n}` · 认领 `POST .../issues/{n}/assignees`。 +- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls` 带 `draft=true`。 +- GraphQL 池为 0 的同一分钟里开得出 draft PR ⇒ 交付不必等重置。 +- ✓ 把 `origin/main` 合进 PR head:`PUT .../pulls/{n}/update-branch`,PM 席位可用。 +- 它是零文件写的合 main 手段,产出真合并提交、不重写历史。 +- `expected_head_sha` 必须是完整 40 字符 SHA,短 SHA 回 422。 +- base 未动回 422 no new commits on the base branch = 无事可做,不是失败。 + +## 不可迁移 —— 只有这几件,围着它们排计划 -## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段) +红窗守候规则住 `platform-readings.md` 配额段。 -1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。 - 判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`** - (2 与 5 同批:2026-08-24 核对官方文档,未逐个实调)。断粮出路:等 MCP 恢复,或人工点一下。 -2. **auto-merge / 入队挂载**:GraphQL mutation(MCP `enable_pr_auto_merge`)。走合并队列的仓落地必经它 ⇒ - 配额红窗**无退路**;直合仓有退路(合并本身有 REST 端点 `PUT .../pulls/{n}/merge`)。 -3. **语义搜索**:`/search/*` 被出口代理按设计拒绝。退路 = REST 列表端点 + - 本地 grep(既有纪律);REST 也被会话门关掉的席位 = 一次定向 MCP `search_issues`,⛔ 不宽表扫。 -4. **Projects field_values**:GraphQL-only —— 舰队并不需要它;MCP 服务器端**无条件**抓它才是漏点, - 不是需求。 -5. **`issue transfer`**(2026-08-24 官方文档核对补入):issues 端点表无 transfer 路由 ⇒ 同为 - GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住 - `platform-readings.md`。 +1. draft 转 ready 翻转:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集。 + 判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,无 `draft` + (与第 5 条同批核对官方文档,未逐个实调)。断粮出路:等 MCP 恢复,或人工点一下。 +2. auto-merge 与入队挂载:GraphQL mutation,即 MCP `enable_pr_auto_merge`。 + 走合并队列的仓落地必经它 ⇒ 配额红窗无退路;直合仓有退路 `PUT .../pulls/{n}/merge`。 +3. 语义搜索:`/search/*` 被出口代理按设计拒绝。退路 = REST 列表端点加本地 grep。 + REST 也被会话门关掉的席位 = 一次定向 MCP `search_issues`,⛔ 不宽表扫。 +4. Projects field_values:GraphQL-only —— 舰队并不需要它;MCP 服务器端无条件抓它才是漏点。 +5. `issue transfer`:issues 端点表无 transfer 路由 ⇒ 同为 GraphQL-only。 + 拿不到时当轮改走在目的仓重建配方,配方住 `platform-readings.md`。 -## 第三桶 —— git 零配额等价物(先问 git,再问 REST) +## 第三桶 —— git 零配额等价物 -分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自 -的失效边界是 `platform-readings.md` 的既有正典行,本表只指路 —— ⛔ 不在两处各存一份。 +- 分支存在性、队列分支、判落地、squash 验证四条的拼写与边界住 `platform-readings.md`。 +- 本表只指路,⛔ 不在两处各存一份;先问 git,再问 REST。 -## 队列路由的读法(2026-08-24 实测) +## 队列路由的读法 -- **`merged_by` 是入队者,⛔ 不是绕队证据**:队列合并归属给**入队的那个账户**,对「队列 vs 直 - 合」零分辨力(一周内三席据人形 `merged_by` 误判「绕队」,三次全假 —— 都是队列合并)。 -- **问「本仓 auto-merge 是否经队列」,答案来自尝试动作,不来自属性字段**:① 直接合并 - `PUT .../pulls/{n}/merge`,强制队列 ruleset 下回 **405 `Changes must be made through the merge queue`**;② PR - 上的 `added_to_merge_queue` timeline 事件;③ 对已入队 PR 调 update-branch 回「已入队分支不能更新, - 要改先出队」。①② 拼写与边界是 `platform-readings.md` 队列段既有行,本条只归拢判据。 -- **required job 名与分片矩阵的改名耦合(现行,自 2026-08-24)**: - 队列 required 集按 **job / check-run 名**匹配,**workflow 名从不作为 check context 出现**(所以拿 - workflow 名在选择器里搜什么也搜不到);改其中任一 job 名**或 test 分片矩阵的形状**, - 必须**同一笔**更新队列的 required 集,否则队列静默挂起。 - 姊妹仓 objectui 当日配置为 **9 个**:`Lint` · `Type Check` ·`Test (shard 1/4 … 4/4)` · `Build & E2E` - · `Build Docs` · `Changeset Declaration`。⛔ required 选择只 gate**等待**、不 gate**触发** —— - 未列入的检查照跑、算力相同,红了不再挡队列(维护者当日裁定,原话:「我觉得够了」)。 -- **配 required 集时先排掉 push-only job**: - `if: github.event_name == 'push'` 的 job 在 `merge_group` 构建上永不报到,列为 required 即挂死队列; - 未展开的矩阵名(带字面 `${{ }}` 的串)是被跳过的占位符,不是真 context。 +- `merged_by` 是入队者,⛔ 不是绕队证据:队列合并归属给入队的账户,对队列与直合零分辨力。 +- 问本仓 auto-merge 是否经队列,答案来自尝试动作,不来自属性字段。 +- 判据 ①:直接合并 `PUT .../pulls/{n}/merge` 在强制队列 ruleset 下回 405。 +- ②:PR 上的 `added_to_merge_queue` timeline 事件。③:对已入队 PR 调 update-branch 回不能更新。 +- ①② 的拼写与边界住 `platform-readings.md` 队列段,本条只归拢判据。 +- 队列 required 集按 job 与 check-run 名匹配,workflow 名从不作为 check context 出现,搜也搜不到。 +- 改任一 job 名或 test 分片矩阵的形状,必须同一笔更新队列 required 集,否则队列静默挂起。 +- 姊妹仓 objectui 配置为 9 个:`Lint` · `Type Check` · `Test (shard 1/4 … 4/4)`。 +- 其余三个:`Build & E2E` · `Build Docs` · `Changeset Declaration`。 +- ⛔ required 选择只 gate 等待、不 gate 触发:未列入的检查照跑、算力相同,红了不再挡队列。 +- 配 required 集先排掉 push-only job:`if: github.event_name == 'push'` 的 job 在 `merge_group` 上不报到。 +- 列为 required 即挂死队列;未展开的矩阵名(带字面 `${{ }}` 的串)是占位符,不是真 context。 diff --git a/.claude/skills/pm-dispatch/references/true-green.md b/.claude/skills/pm-dispatch/references/true-green.md index e89bcfc5e3..465ffdfe3b 100644 --- a/.claude/skills/pm-dispatch/references/true-green.md +++ b/.claude/skills/pm-dispatch/references/true-green.md @@ -1,33 +1,32 @@ -# 各仓「真绿」跑法索引(references —— 按需加载) +# 各仓真绿跑法索引 -出处:主文件「复核 / 入队与落地」的入队资格条款(全 check 绿,非 required 子集)。 -每仓一节:正典测试跑法、CI 日志 grep 看不见的门禁、本地 preflight —— 一行一事实。 -与编译面清单同一维护纪律:**这张表由 PR 维护**,踩到新形态的那个 PR 顺手改这里; -⛔ 不引用 issue 编号。 +见 SKILL.md 〈复核〉的入队资格条款(全 check 绿,非 required 子集);每仓一节,一行一事实。 +每节放正典测试跑法、CI 日志 grep 看不见的门禁、本地 preflight。 +与编译面清单同一维护纪律:这张表由 PR 维护,踩到新形态的那个 PR 顺手改这里。 ## objectstack(后端主仓) -- 重活(build/test)一律走共享验证锁入口 `bash scripts/pm/os-verify-lock.sh -c ''` - —— 结论读它印的 VERDICT 行,⛔ 不读裸 `$?`(排队语义与预算见 os-dev 定义)。 -- 该锁 **Linux-only**:宿主无可用 `flock` 时入口点不拒绝,改跑声明式 unlocked 模式 —— - 降级写进 VERDICT 行,并印出 PR 正文该照抄的申报原文(⛔ 别另写一套措辞)。 -- 门禁族派生:`node scripts/pm/dispatch-gates.mjs` **不传路径**,脚本自己从 merge-base - 取变更集;⛔ 不自己 `git diff` 喂清单 —— 两点差按此刻的 `origin/main` 求值,姊妹 - PR 的文件会被算进来,而退出码照样 0。 -- 该脚本只住本仓,答案只关于它所在的树:喂姊妹仓路径得到的是**本仓**的门禁族 —— - 形态完整、退出码 0、全错;`--repo /` 申报归属可机械拒错。 +- 重活(build 与 test)一律走共享验证锁入口 `bash scripts/pm/os-verify-lock.sh -c ''`。 +- 结论读它印的 VERDICT 行,⛔ 不读裸 `$?`;排队语义与预算见 os-dev 定义。 +- 该锁 Linux-only:宿主无可用 `flock` 时入口点不拒绝,改跑声明式 unlocked 模式。 +- 降级写进 VERDICT 行,并印出 PR 正文该照抄的申报原文,⛔ 别另写一套措辞。 +- 门禁族派生:`node scripts/pm/dispatch-gates.mjs` 不传路径,脚本自己从 merge-base 取变更集。 +- ⛔ 不自己 `git diff` 喂清单:两点差按此刻的 `origin/main` 求值,姊妹 PR 的文件会被算进来。 +- 而那种误用退出码照样 0;该脚本只住本仓,喂姊妹仓路径得到的仍是本仓的门禁族。 +- 那种答案形态完整、退出码 0、全错;`--repo /` 申报归属可机械拒错。 ## objectui(前端) -- 正典跑法:**仅仓根 `pnpm test`**。vitest 守卫拒绝 package 目录内的运行 —— 那种跑法曾假绿 - (无关 console 文件通过、目标用例 0 个在跑,被计为通过);守卫的拒绝是保护,⛔ 不绕。 -- typecheck 脚本拼作 `type-check`(连字符);拼错脚本名的 `pnpm --filter` 匹配零脚本、 - **退出码 0**、静默假绿 —— 核对输出确实回显了脚本名再信绿。 +- 正典跑法:仅仓根 `pnpm test`。 +- vitest 守卫拒绝 package 目录内的运行:那种跑法曾假绿,无关文件通过而目标用例 0 个在跑。 +- 守卫的拒绝是保护,⛔ 不绕。 +- typecheck 脚本拼作 `type-check`(连字符);拼错脚本名的 `pnpm --filter` 匹配零脚本、退出码 0。 +- 那是静默假绿:核对输出确实回显了脚本名再信绿。 ## cloud -- 本地 preflight:`preflight-workspace-dist`(workspace 依赖的 dist 新鲜度守卫)—— - 按其自身输出的提示跑,先建再测。 -- 严格区 `check-test-typecheck` 的失败**不以 `error TS` 行出现在 CI 日志**:turbo - 汇总只写 `#typecheck` failed —— 要看到台账消息必须本地跑该包自己的 `typecheck` 脚本; - 对 CI 日志 grep `error TS` 的阴性读数在这一族上不成立。 +- 本地 preflight `preflight-workspace-dist` 是 workspace 依赖的 dist 新鲜度守卫。 +- 按其自身输出的提示跑:先建再测。 +- 严格区 `check-test-typecheck` 的失败不以 `error TS` 行进 CI 日志,turbo 汇总只写 `#typecheck` failed。 +- ⇒ 要看到台账消息必须本地跑该包自己的 `typecheck` 脚本。 +- 对 CI 日志 grep `error TS` 的阴性读数在这一族上不成立。 diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index 9d6499fc89..b99cef7536 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -549,7 +549,11 @@ export const CEILINGS = new Map([ // `ruledRaises` records quoting their own rulings, which is what keeps that // declaration's `was` at this file's literal pre-move 314 while the move's own // raise still reads +10 against the sources' −11. - ['.claude/skills/pm-dispatch/references/platform-readings.md', 397], + // Lowered 397 → 359 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/platform-readings.md', 359], // Per-operation REST/GraphQL/git channel mapping — which fleet operation has // a REST twin (each row executed in a real session, provenance date carried // per row), the handful that are GraphQL-only, and the queue-routing @@ -585,7 +589,11 @@ export const CEILINGS = new Map([ // file's own header already routes the queue-section readings there and // refuses to keep a second copy, so nothing is left behind but the rows that // are channel mappings. Landed count, headroom 0, same convention. - ['.claude/skills/pm-dispatch/references/rest-channel.md', 88], + // Lowered 88 → 82 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/rest-channel.md', 82], // Lowered 84 → 77 by the rules-only rewrite of the seven core references // (maintainer ruling: provenance narratives, incident post-mortems and rationale // tails leave the corpus; one rule per ≤120-byte line, no rule already stated in @@ -608,7 +616,11 @@ export const CEILINGS = new Map([ // deliberately not restated here: a live number copied into a neighbour's // comment goes stale the next time that file moves — which is what happened to // the arithmetic this sentence replaces. - ['.claude/skills/pm-dispatch/references/release-aftercare.md', 58], + // Lowered 58 → 50 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/release-aftercare.md', 50], // Lowered 105 → 91 by the rules-only rewrite of the seven core references // (maintainer ruling: provenance narratives, incident post-mortems and rationale // tails leave the corpus; one rule per ≤120-byte line, no rule already stated in @@ -625,7 +637,11 @@ export const CEILINGS = new Map([ // (that one is the published `skills/` catalog, and only it). Set at the landed // line count read from this ratchet's own run — headroom 0, same convention as // the entries above. - ['.claude/skills/pm-dispatch/references/true-green.md', 34], + // Lowered 34 → 32 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/true-green.md', 32], // Per-surface compile/typecheck coverage index — which surfaces a repo-wide // typecheck actually reaches, which are compiled only by their own package's // script, and the frozen ones. #12098: after true-green.md above it was the @@ -637,7 +653,11 @@ export const CEILINGS = new Map([ // from this ratchet's own run — headroom 0, same convention. ⚠️ Its seven // over-120B lines are all `table` rows, structurally exempt and NOT // re-wrappable; they are metered instead by MAX_TABLE_ROW_BYTES below. - ['.claude/skills/pm-dispatch/references/compile-surfaces.md', 26], + // Lowered 26 → 24 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/compile-surfaces.md', 24], // Plain-language digest of the corpus's binding rules, one rule per line, added // under the 2026-09-04 rules-only ruling so the maintainer reviews the rules // instead of the corpus. Set at the landed line count (headroom 0, same @@ -651,23 +671,51 @@ export const CEILINGS = new Map([ // 2026-08-23) — the patrol-anchor sentence was carried verbatim by all seven // lanes and now lives once in SKILL.md 执行座位职责, so every lane drops it. // cli.md pays −2 because it was carrying the map's last line of headroom. - ['.claude/skills/pm-dispatch/references/lanes/engine.md', 40], + // Lowered 40 → 32 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/lanes/engine.md', 32], // Lowered 30 → 28 and 35 → 31 as the other two SOURCES of the cross-file // move recorded on platform-readings.md above. A per-repo gate reading in a // lane charter is read by one lane and missed by the other six, which is the // whole defect the move repairs: services.md gave up the two aggregate- // reading boundaries, cli.md the required-check set with its `in_progress` // and advisory clauses. Landed counts, headroom 0, same convention. - ['.claude/skills/pm-dispatch/references/lanes/services.md', 28], - ['.claude/skills/pm-dispatch/references/lanes/cli.md', 31], - ['.claude/skills/pm-dispatch/references/lanes/devx.md', 39], - ['.claude/skills/pm-dispatch/references/lanes/skills.md', 35], - ['.claude/skills/pm-dispatch/references/lanes/spec.md', 46], + // Lowered 28 → 27 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/lanes/services.md', 27], + // Lowered 31 → 29 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/lanes/cli.md', 29], + // Lowered 39 → 38 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/lanes/devx.md', 38], + // Lowered 35 → 33 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/lanes/skills.md', 33], + // Lowered 46 → 43 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/lanes/spec.md', 43], // repo:hotcrm lane charter (maintainer rulings 2026-08-20: exemplar-app repo — // platform capabilities implemented upstream, 展现平台能力, 不扩散需求, runs on // community edition). Set at landed line count (headroom 0, same convention). // 45 → 44: same patrol-anchor hoist deletion as the six lanes above. - ['.claude/skills/pm-dispatch/references/lanes/hotcrm.md', 57], + // Lowered 57 → 53 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/lanes/hotcrm.md', 53], // Project Director seat charter (maintainer ruling 2026-08-27, verbatim in the // file: 「项目总监 由人工定期指挥,负责处理 contract-review 类别的和需要决裁的。」) — a // human-invoked seat owning the contract-review chain, the adjudication duty and @@ -679,7 +727,11 @@ export const CEILINGS = new Map([ // directive; the file sat at headroom 0 with no losslessly compressible slack in // the touched sections (arithmetic in the raising PR), so the directive is the // ruling that pays for exactly the two lines it dictates. - ['.claude/skills/pm-dispatch/references/lanes/director.md', 77], + // Lowered 77 → 72 by the rules-only rewrite (maintainer 2026-09-04: + // 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates, + // ruling citations and incident narrative left; every rule stayed. Landed count, + // headroom 0, same convention (lowering is always legitimate). + ['.claude/skills/pm-dispatch/references/lanes/director.md', 72], // 399 → 405 (#11126): maintainer-ruled (2026-08-23, option B, quoted in that // PR) — the +6-line cross-repo dispatch-gates caveat, sized so the queued // #11137 (395→399 on main) and this PR's +6 compose to exactly 405. @@ -869,22 +921,22 @@ export const CROSS_FILE_MOVES = new Map([ date: '2026-09-04', delta: 34, }, - { - // The third increment, ruled the same day as the one above and in the - // same way. Quoted beside this entry's ceiling too, where the +39 is - // accounted for member by member. Copied from there, not paraphrased. - ruling: - 'the third-increment raise on `.claude/skills/pm-dispatch/references/platform-readings.md`' - + ' — maintainer, decision batch #34, 2026-09-04, verbatim and untranslated:' - + ' 「决裁批 #34 同意」 on the presented recommendation, item 1 = A; and the director' - + ' record\'s own sentence for that item: "raise the ceiling by the measured +39,' - + ' 358 → 397". Measured per member rather than estimated: attribution-footer' - + ' scoping +12, the MCP-side rate refusal read as a window reading +6, the CDN' - + ' cause behind the payload channel\'s absence rule +5, and the Routine transport' - + ' family +16 = +39 exactly.', - date: '2026-09-04', - delta: 39, - }, + // RETIRED HERE, and retired rather than re-numbered, because the ceiling + // above no longer stands high enough to carry both records. The rules-only + // rewrite gave 38 of these 73 ruled lines back (397 → 359), so 35 of them + // still stand while the destination is only 45 above `was` — and a set of + // records claiming more than that reads as an over-claim, which is exactly + // what `crossFileMoveVerdict` refused. The header names the remedy: a ruled + // raise since given back is spent, so retire its record. The THIRD-INCREMENT + // record is the one retired (maintainer, decision batch #34, 2026-09-04, + // 「决裁批 #34 同意」, +39, quoted in full beside the ceiling above) rather + // than the intake-family record below it, and the choice is the conservative + // direction rather than a preference: 34 declared against 35 actually + // standing prices this move at +11 for a raise that took +10, while keeping + // the +39 instead would price it at +6 — under-pricing the move is the + // failure the header warns about. Neither ruling is reopened by this: both + // are still quoted beside the ceiling, which is where a reader gets back to + // them, and the lines they bought are the lines this rewrite handed back. ], sources: [ ['.claude/skills/pm-dispatch/references/lanes/cli.md', 35],