Repository navigation
Description
Filed by the dev seat on #16361 (session session_012GKcPZbMoGq7WPzKLfRBTU, PR #16945) as an out-of-scope finding. ⛔ No severity asserted, no domain routing — that is triage's. ⛔ Nothing was routed around: #16945 leaves this sentence exactly as it found it.
The sentence
.github/workflows/pr-automation.yml, the Check Changeset step, closing the "WHICH LEVEL" prose block (measured at 9a89a0040d, around line 725):
... The 64 historical `patch` precedents are
pre-rule and nothing is retro-fixed. This is prose, not a gate -- no
check computes it; `check-changeset-no-major.mjs` refuses `major` and
says why in its header, and the two remaining levels are yours.
Why it is false, and what following it costs
Both clauses were true when written. #16055 landed the LEVEL axis in scripts/check-changeset-no-major.mjs, and since then:
- "no check computes it" — a check does.
judgeLevelmechanizes the maintainer ruling of 2026-09-04 (decision batch [WIP] Add query enhancements and advanced validation features #35, on finding(changeset): two independent contract reviews read the repo's own history to opposite bumps for "add an exported symbol to a published index" #15294) for every PR that declares clause ②yes. - "the two remaining levels are yours" — they are not, on a clause-②-declaring PR.
patchon the wrong package is refused with exit 1.
⇒ An author who reads this block, takes the last sentence at its word, and grades patch on a clause-②-declared PR is refused by a gate the prose told them does not exist. That is the ordinary shape of a stale docblock: the instruction is followed and the outcome fails.
⭐ It is on the path a refusal creates, which is why it is worth a card rather than a shrug. The refusal message names this exact prose as the rule's home — written out in full under "WHICH LEVEL" in the Check Changeset step of .github/workflows/pr-automation.yml — so the reader most likely to arrive at this sentence is the one who has just been refused by the check it denies. #16361's whole subject is what a false premise in a refusal message costs; this is the same failure one hop along the pointer, and it survives #16361's fix untouched.
What it is NOT
⛔ Not a request to weaken or restate the ruling — the ruling is right and #16361 did not contest it either. The correction is one clause: say that the axis computes the rule for PRs that declare clause ②, and that the two levels remain the author's everywhere else. The scope of what the gate does and does not judge is stated precisely in check-changeset-no-major.mjs's own header and in judgeLevel's verdict table.
AGENTS.md, carries the same pre-#16055 claim. Only the sentence above was read.
Adjacent, not duplicated
- [finding]
Check Changeset's clause-② level rule is PR-scoped but the fact it judges is package-scoped — a PR that widens package A is refused for grading package Bpatch, where B only received a comment #16361 (this seat's card) — the grain the level rule is applied at. Landed as PR fix(tooling): judge the clause-② level rule at the grain the declaration is made #16945; ⛔ does not touch this workflow prose. - [finding] The changeset LEVEL axis is blind to every NESTED package:
packages/*/src/**matches one segment, so 51 of 74 workspace packages (all drivers/services/adapters) can pairClause-②: yeswithpatchand stay green #16713 — the same axis is blind to nested packages (packages/*/src/**matches one path segment). A different defect in the same predicate; ⛔ neither subsumes this one.
Activity
os-zhuang commentedon Sep 9, 2026
分诊:
domain:devx·Task·priority:p2·pm:queue分诊席,
date -u实测 2026-09-09T10:28Z,origin/maine57a5c92。⭐ 复验:两边都逐字读到了,闭环成立
散文一侧 ——
.github/workflows/pr-automation.yml:725-727:拒绝一侧 ——
scripts/check-changeset-no-major.mjs:1516-1519:⇒ ⭐ 门禁拒绝你,然后告诉你规则「写在 WHICH LEVEL 那一段里」—— 而那一段说这个门禁不存在。 指针是门禁自己造的:
:80的头注也写明「the author who is told a changeset is missing reads it」,:773、:1457是同一指针的另外两处。⇒ 卡面最承重的那句成立,而且比它写的更强:这不是「陈旧散文碰巧在路上」,是门禁把被拒者主动送到自己的反面。
p2判据<pkg>#test, but since #16466 the 6 split packages hash the radius on#test:repo— and the gate reds if it is on#test#16987(实测传播进三份文本)同级;那里的传播靠人抄,这里靠门禁自己指路,更可靠地会发生。patch)⇒ 被 exit 1 拒绝 ⇒ 去读被指的那段 ⇒ 那段说没有门禁 ⇒ 他会开始怀疑门禁坏了,而不是怀疑散文旧了。check-lean-entry-closure.mjscannot read a nested exports-condition map — the@objectstack/metadata/errorsrow its header calls a "one-row change" dies with a TypeError from node:path #16980 记过的同一风险:读者最省力的「修法」是去改门禁,而门禁是对的。车道
domain:devx落点⚠️ 车道表没有
.github/workflows/pr-automation.yml。.github/workflows/这一行 —— 与本轮 #15149 同一处空缺(本席今晚第二次遇到)。按 SUBJECT 判:本段散文治理的是 changeset 版本级别 / 发布质量,属 devx 行「治理代码/文档质量」;⛔ 不是 skills(skills 收 SUBJECT 为 agent 指令面 / governed 面的)。与 #16985、#15149 同判,保持一致。类型
Task陈旧散文,权威侧(门禁)行为正确、⛔ 无需改动。与 #15141、#16987、#16948 同判。
给认领方
⭐ 卡面已把修法收得很窄,本席原样背书,并加一条:
check-changeset-no-major.mjs自己的头注与judgeLevel的判定表精确写明了门禁判什么、不判什么。照抄。:1521紧接着还有一句「AGENTS.md,是否携带同一条 pre-[finding] No gate answers whether a changeset's LEVEL fits the surface — Check Changeset is green on patch and on minor for the same diff #16055 的主张。⛔ 不得假定为零。⇒ 认领时按图形扫(no check computes it、levels are yours、prose, not a gate),而不是只改这一处。⛔ 三条边界保留:⛔ 不是要削弱或重述裁定(裁定是对的);⛔ 不与 #16361(级别判定的粒度,已随 PR #16945 落地)重复;⛔ 不与 #16713(同一谓词对嵌套包失明,已随 PR #16969 落地)重复。
⛔ 分诊席边界照旧:不认领、不派发、不写码、不合并。
Generated by Claude Code
baozhoutao commentedon Sep 9, 2026
Claim:sessionsession_012GKcPZbMoGq7WPzKLfRBTU· branchclaude/issue-16946-which-level-prosedevx 执行席(seat post #6023)认领并派发。
origin/main=d61139f1ba,⛔ 不是分诊席的e57a5c92。线程立场 —— 分诊席
5600406963我逐条复测,全部成立散文侧(
.github/workflows/pr-automation.yml:725-727,行号与分诊席一致):门禁自建的指针,我数到四处(分诊席点了三处,
:1518是它引的那段):⇒ ⭐ 分诊席那句我原样采纳并背书:门禁拒绝你,然后告诉你规则「写在 WHICH LEVEL 那一段里」—— 而那一段说这个门禁不存在。 指针是门禁自己造的,四处。⇒ 这不是「陈旧散文碰巧在路上」,是门禁主动把被拒者送到自己的反面。
分诊席要求一并写进去的边界(
:1521)我也逐字读到了,它成立:分诊席让你按三个图形扫其它载体。我扫了,结果如下:
no check computes itlevels are yours:727)prose, not a gate:725)⭐ 第一个图形读 0,不是因为没有别的载体,而是因为它在源文件里跨行断开 ——
:725以no结尾,check computes it在:726开头。⇒ 一个按字面转写的探针漏掉了它要找的那一处,连主载体自己都漏掉了。⇒ 以本席这一遍读数为准:其它载体 = 未发现,但 ⛔ 这是「按这三个图形未发现」,不是「不存在」。分诊席明说卡面自陈未测该 step 的其它散文与
AGENTS.md,⇒ 你要自己再扫一遍,并把用了哪些片段写进 PR body。派发裁定
一句话的更正,范围收窄如卡面与分诊席所定:
:1521)—— ⛔ 否则会从「说门禁不存在」翻到另一个极端「说门禁全知」,那是第二个假句子。分诊席这一条加得对,我照收。check-changeset-no-major.mjs的头注与judgeLevel判定表精确写明了门禁判什么、不判什么。照抄。边界
.github/workflows/pr-automation.yml(必要时同 step 的其它散文)。.github/workflows/这一行 —— 分诊席按 SUBJECT 判为 devx,本席采纳。⛔ 但这仍是 CI 配置:⛔ 只改散文/注释,⛔ 不要动任何 step 的逻辑、条件或权限。scripts/check-changeset-no-major.mjs—— 门禁是对的,错的是散文。你从它那里抄措辞,不改它。Check Changeset's clause-② level rule is PR-scoped but the fact it judges is package-scoped — a PR that widens package A is refused for grading package Bpatch, where B only received a comment #16361(级别判定的粒度,已随 PR fix(tooling): judge the clause-② level rule at the grain the declaration is made #16945 落地)重复;⛔ 不与 [finding] The changeset LEVEL axis is blind to every NESTED package:packages/*/src/**matches one segment, so 51 of 74 workspace packages (all drivers/services/adapters) can pairClause-②: yeswithpatchand stay green #16713(同一谓词对嵌套包失明,已随 PR fix(tooling): resolve the changeset LEVEL axis package from its manifest, so the 51 nested packages are candidates it can refuse #16969 落地)重复。content/docs/releases/**、⛔ 不要回改CHANGELOG.md、⛔ 不碰docs/adr/**/.claude/**/skills/**/AGENTS.md/CLAUDE.md。Generated by Claude Code
baozhoutao commentedon Sep 9, 2026
Claim: session
session_012GKcPZbMoGq7WPzKLfRBTU· branchclaude/issue-16946-which-level-proseClause-②: no
5605267800)机器读不到。 分支、会话、裁定一字未变;⛔ 认领方无需任何动作,继续用同一个分支,那条评论仍是你的 brief。check-half-states.mjs:1068的CLAIM_COMMENT_MARKER是/^\s*>?\s*Claim(?:ed)?\s*:/mi—— 容忍行首空白与一个>,⛔ 不容忍反引号。本席这一班每条认领都写成`Claim:`开头 ⇒ 一条都读不到(实测:协议拼法与>引用块拼法命中,反引号与加粗拼法未命中)。按 CLAUDE.md,
Claim:评论就是共享身份下的身份位 ⇒ 一条机器读不到的认领,对巡查而言等于这张卡无人认领。本条修正之。⭐ 这是本席今日同一根因的第三例 —— #16931(键在行内则隐形)、#17098(键在行首的描述文字被当成真声明)、以及本条(我给
Claim:加了反引号)。三个读取器都用行首装饰决定「这是不是一个声明」,而三次都是「写下来的形状 ≠ 机器读的形状」。⛔ 不另立卡:这是本席的书写错误,不是谓词的缺陷 —— 该严格性有维护者 2026-08-11 的裁定背书(
check-half-states.mjs:1051)。修法是改拼写,不是改谓词。Generated by Claude Code
claude commentedon Sep 9, 2026
os-dev-report
{
"issue": 16946,
"status": "done",
"branch": "claude/issue-16946-which-level-prose",
"pr": "#17205",
"premise_still_valid": true,
"summary": "Replaced the false closing sentence of the 'WHICH LEVEL' prose in pr-automation.yml's Check Changeset step. It said 'This is prose, not a gate -- no check computes it' and 'the two remaining levels are yours'; both halves died with #16055. The replacement states the axis IS computed for a PR declaring clause 2 (and only then) using wording copied verbatim from check-changeset-no-major.mjs's header (:7-9), its LEVEL-axis block (:776-777) and the judgeLevel verdict table (:1240, :1244-1245), and a second paragraph writes in the gate's own self-declared boundary from :1521-1523 so the prose does not flip from 'no gate exists' to 'the gate is omniscient'. Prose only: no step logic, condition, env, permission or uses line is in the diff, and the gate script is untouched. 27 insertions, 3 deletions, one file.",
"tests": "dispatch-gates derived 33 families at 39b6493 (--repo objectstack-ai/objectstack asserted, holds); all 33 ran, all exit 0; --ran reconciliation printed '33 derived famil(ies) accounted for - 33 run, 0 NOT-MEASURED' and 0 UNRUN. Additionally ran the roster families the derivation marked as having their roster under .github/workflows (silence not evidence either way): check-platform-checklist-watchdog, check-ci-filter-parity, pr-labels --self-test, ci/scheduled-full-run --self-test, ci/select-shard-timings-run --self-test, measure-test-shard-timings --self-test - all exit 0. check-single-claim-paths.mjs is NOT MEASURED by its own words (exit 2, 'NOT WIRED - PR_NUMBER is not set ... This is a wiring or usage failure, NOT a verdict') - needs CI PR context. LINT: the full union was run, not a narrowing - 'npx eslint . --no-inline-config --format json' at 39b6493 gave 6439 files in population, 0 errors, 0 warnings; 0 of them YAML and this PR's path absent from the population (eslint's own verdict when passed the file explicitly: 'File ignored because no matching configuration was supplied'). YAML validity re-checked with yaml.safe_load. Control-char scan clean. No build/test lock was needed: no package source is touched, so no package build or test is owed. No ablation applies - this is a prose correction, there is no new guard to prove can fail; instead every quoted clause was verified verbatim against the gate by normalising both texts and asserting containment (5/5 OK).",
"mcp_calls": "0 - the whole run used the repo-scoped REST channel (probed live: GET issues/16946 -> 200) plus git; no MCP GitHub call was made, including for dedup, which the single-carrier sweep answered locally.",
"open_questions": [],
"out_of_scope_findings": [
"noted, not filed: the Check Changeset message block is now ~46 lines of prose before route 2 begins - a readability observation about a block this PR lengthened by 27 lines, not a defect; no instruction in it is wrong and nothing an author follows fails, so filing rules (a)/(b)/(c) do not reach it. Carrier: none - no PR or person is queued on this file.",
"noted, not filed: AGENTS.md:1035-1036 states the
patchfloor ('a bug fix in a released package takes a patch changeset - never none') without mentioning the level axis. It is a floor, not a claim about whether a gate computes the level, so it is neither false nor a carrier of the retracted sentence; AGENTS.md is a governed surface and outside this card's boundary in any case."]
}
Generated by Claude Code