docs(pm-dispatch): 补六条实测规程 —— 阻塞解除后重新定价、带前提的裁决、收益穿过下游边界、多面组件测试落点、跨仓 pin 滞后、死代码删除复核 (#5513) - #5645
Merged
Merged
Conversation
…in 滞后、死代码删除复核 (#5513) 2026-08-05 跑完一整条 filter 缺陷链(#5363 / #5366 / #5368 / #5375 / #5431 / #5445, cloud#1117)后回看,六处在那一轮真实咬过人或真实救过场的规程,SKILL 里没有对应条目。 六条各落在 issue 指定的节内,**纯增补**:111 行插入、0 行删除,既有条目(#5501 的接力 模式、#5522 的座位模型、#5630 的 assertEngineDeleteDispatch 条款)一字未动。 落点与要点: 1. **Multi-repo,rule 2 之后**「pin 滞后」——`Blocked-by:` 只保证上游已合并,姊妹仓还有 第二个读数:本仓 pin 是否覆盖那个 commit。cloud#1116 的裁决落于 framework #5368 (`9c5abf4e9`),而 cloud 的 `.objectstack-sha` 未覆盖它,于是 `TursoDriver` 有一个 方向反了的分叉窗口(fail-closed 一侧先到)。规程:派发前核祖先关系;未覆盖则 dev 在 PR 正文留档窗口与方向,⛔ pin bump 不做 rider。 2. **step 3** 末「阻塞解除后重新定价」—— 前一单合入会改变后一单的成本模型,方向不止一个 (本轮变便宜、没变、成本估计过期各有实例)。两个动作配对:派发前一单时带必答项 「你的改动是否让 #X 变简单 / 变难 / 不必要 / 无影响」,派发被延后那单前用该回答重读 其选项与成本估计。 3. **step 5** 派发令「多面组件的测试落点」—— 同一契约 ≥2 实现面时,新用例进共享一致性 覆盖而非独立文件(原话照录)。附 #5375 / #5431 / #5445 三条正交轴共用一条不变量。 4. **step 7 清单**「收益穿过它必经的那道边界之后还在吗」—— 判据是价值主张是否依赖下游 如实转发;实例即 #5423(4xx 直通曾整条替换 ≥500 字符正文,`code` 到了正文没到)。 5. **step 7 清单**「死代码删除的复核」——「这是死代码」是断言而非能从 diff 读出的事实, PM 在 origin/main 独立核一次引用面再 ACCEPT(查法用 Operational notes 6:notes 6 说 怎么查不假阴性,本条说什么时候必须查)。 6. **step 8** 升级门槛之后「带前提的裁决」—— 分歧关键是可被代码证伪的事实时,第三档 = 裁决 + 前提验证要求 + 「前提不成立报 fork,不许硬做也不许悄悄改选」禁令,三件缺一 不可;缺第 3 条即退化为无人裁决且无读数显示。 实施时两处核实结果与 issue 正文不同,成文按核实后的事实写: - issue 的附带论断「没有任何闸门在量这个 pin 滞后」**不成立** —— cloud 的 `scripts/check-pin-staleness.sh`(test.yml 以 `continue-on-error` 跑)每次 CI 都报两个 pin 各落后 main 多少 commit,advisory 是**有意设计**(`--max-behind` 需显式传)。它答 的是「落后多少」,不是「是否覆盖我这条裁决 commit」;成文因此指向该脚本,并只把后一个 问题留给派发前的祖先判断。据此**未**另立「无闸门」的发现单。 - 第 4 条的 rest-server 缺陷本身已由 #5423 按「截断而非替换」修掉,成文改用过去时并注明, 以免后来的读者去找一个已不存在的活 bug;该条要补的是**复核清单的缺口**,与代码是否已修 无关。 第 1 / 3 条按 issue「未验证的部分」的克制写入适用判据(前后单共用同一契约或数据表示; 组件对同一契约有 ≥2 实现面),形态迥异的批次(纯 UI、纯文档)明确不强加。 验证:`node scripts/check-nul-bytes.mjs --self-test` + 全仓扫描绿(48 断言 / 5537 文件); 改动文件自扫 `grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'` 零命中,并用邻近词反查证伪 「扫描器坏了」;`check:docs-audit-scope` 绿;markdown 结构核对(强调标记成对、代码围栏 16 个偶数、嵌套围栏缩进对齐)。 Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE Co-authored-by: os-zhuang <hr@objectstack.ai> Co-authored-by: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
os-zhuang
marked this pull request as ready for review
August 5, 2026 21:49
This was referenced Aug 5, 2026
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Aug 6, 2026
…tstack-ai#5650) * docs(os-dev): PR 收尾清单增补 `skip-changeset` 硬步骤,以回读 PR labels 为闭环 (objectstack-ai#5559) 测试-only / 工作流-only / `.claude/`-only 的 PR 不写 changeset,靠 `skip-changeset` 标签豁免 Check Changeset。此前收尾清单对这一步只字未提,dev 在 PR 正文「声明」了 标签却没有真正挂上,objectstack-ai#5533/objectstack-ai#5538 两例各烧一轮门禁红并由 PM 手工兜底 —— 「声明了 ≠ 执行了」正是 declared ≠ enforced 的 agent 版。 新增条目把它写成与「PR 正文以 Fixes 开头」同级的硬步骤,并按实测校正了三处认知: - 没有任何自动化会替你挂:`.github/labeler.yml` 九条规则里没有 `skip-changeset`, 2026-08-05 六例(objectstack-ai#5533/objectstack-ai#5538/objectstack-ai#5542/objectstack-ai#5624/objectstack-ai#5642/objectstack-ai#5645)的该标签全部来自 agent, `github-actions[bot]` 一次都没挂过 —— 它只负责 `size/*`、`documentation`、 `tests`、`ci/cd`。 - 只「加一个标签」,不要整集写入:整集写入会把 bot 刚挂的 `size/*` / `documentation` / `tests` 抹掉(objectstack-ai#5533/objectstack-ai#5538/objectstack-ai#5642/objectstack-ai#5645 的 agent `unlabeled` 事件即此),反向也成立 —— objectstack-ai#5533 的标签 15:46:44 落、15:46:45 就被 `github-actions[bot]` 的写入抹掉,只活了一秒。 - 闭环是回读而不是 POST:Check Changeset 在 PR 打开后数秒就实时读一次标签 (objectstack-ai#5580),`opened` run 通常早于标签落地 —— objectstack-ai#5542 的 dev 做对了全套,仍留下 一条红 `opened` run,之后每一次 run 才被标签豁免。所以要在 bot 平息后回读 标签、并把读到的列表写进报告。 * docs(os-dev): 首 run 颜色按实测改成双向竞态,不再预设为红 (objectstack-ai#5559) 本 PR(objectstack-ai#5650)自己按新硬步骤执行时,实测结果与原措辞相反:标签 22:03:54 落地, `opened` run(workflow run 31051251795,创建于 22:03:38)的 Check Changeset job 直到 22:04:35 才启动并做实时标签回读 —— 早于回读 41 秒落地的标签被读到,该 run 直接 **success**,并非预设的红。 于是这一句改为如实描述竞态:首 run 的颜色取决于 runner 启动耗时与 POST 落地 的先后,两个方向都有实例(objectstack-ai#5542 红、objectstack-ai#5650 绿)。指导语随之从「预期会红」改为 「尽快落标签,把首 run 的颜色当信息而不是自己的判决」。 预设方向被自己的实测证伪时如实记录,而不是让措辞压着实测走。 --------- Co-authored-by: os-zhuang <hr@objectstack.ai>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #5513
.claude/skills/pm-dispatch/SKILL.md增补六条实测规程,来自 2026-08-05 那条 filter 缺陷链(#5363 / #5366 / #5368 / #5375 / #5431 / #5445,cloud#1117)里真实咬过人或真实救过场的六处。
纯增补:111 行插入、0 行删除。 既有条目一字未动 —— #5501 的接力模式、#5522 的座位模型、
#5630 刚加的
assertEngineDeleteDispatch条款均原样保留(git diff的删除行计数为 0 可核)。六条的落点
issue 正文的行号锚点(:426/:508/:576/:692/:785/:191/:145)基于 908 行旧版,今日已被三次改动
顶掉;实施按节名/内容定位,并在当前
origin/main上逐条重核六条确实仍缺(六个概念的关键词 grep 全部零命中,唯一的「一致性表」命中是串行接力段里的一处举例,不是条款)。
Blocked-by:只保证上游已合并,姊妹仓还有第二个读数 —— 本仓 pin 是否覆盖那个 commitorigin/main独立核一次引用面再 ACCEPT两处与 issue 正文不同的核实结果(成文按核实后的事实写)
a. 「没有任何闸门在量这个 pin 滞后」不成立。 issue 第 5 条的附带论断被证伪:cloud 的
scripts/check-pin-staleness.sh(pnpm check:pin-staleness,test.yml 里以continue-on-error跑)每次 CI 都报两个 pin 各落后 main 多少 commit,脚本头明确写了 advisory 是有意设计
(「pin bumps are deliberate」,阈值需显式传
--max-behind N)。它答的是「落后多少」,不是「是否覆盖我这条裁决 commit」—— 成文因此指向该脚本,只把后一个问题留给派发前的祖先判断。
据此未另立「无闸门」发现单:那条发现按 issue 原措辞立出来会是一条事实错误的单。
顺带一个方法学读数,已写进条款:核祖先关系要用 REST compare 接口(取
status/ahead_by),因为本仓检出是 shallow,pin 的 commit 解不出来,本地
merge-base --is-ancestor会以fatal:退出 —— 而它在
&&/||链里会被读成「不是祖先」,正是 Operational notes 6 那类假读数。我自己第一次就踩了这个,改用 API 后得到:裁决 commit
9c5abf4e9比 pin 领先 69 个 commit(即 pin 未覆盖它,结构性结论与 issue 一致;issue 写的 87 是立单时的读数,现在到 main 是 165
—— 数字随时间涨,所以条款里只保留「立单时 87」作历史读数,判据写成祖先关系而非数字)。
b. 第 4 条的 rest-server 缺陷本身已修。 #5423 已按「截断而非替换」落地(
origin/main的CLIENT_MESSAGE_MAX = 500与truncateClientMessage),所以成文改用过去时并注明已修,免得后来的读者去找一个已不存在的活 bug。这不削弱该条:它要补的是复核清单的缺口(四个 PR
合入、没有任何人在复核里查过收益能不能穿过信封,直到一个 dev 做别的单时顺手撞上),与那段
代码是否已修无关。
克制照 issue「未验证的部分」写入
两处都明写形态迥异的批次(纯 UI、纯文档、单面脚本)不强加 —— 样本集中在「一个组件的多个
实现面逐层收口」这一类工作上。
验证
node scripts/check-nul-bytes.mjs --self-test+ 全仓扫描:绿(48 断言 / 5537 文件,无裸控制字节)。\x00-\x08、\x0b、\x0c、\x0e-\x1f、\x7f):零命中;并用一个确定存在的邻近词反查(30 命中),证伪「扫描器坏了 / 路径错了」。
check:docs-audit-scope:绿。嵌套围栏缩进与列表项对齐、标题层级未动。
.claude/diff,无源码/测试面改动。changeset
.claude/文档-only,不面向用户 → 走skip-changeset标签路线,未写空 frontmatterchangeset。需要挂
skip-changeset标签(CI 的 Auto Label 可能已自动挂上)。Generated by Claude Code