Skip to content

qa(checklist-test): writes through the pm-dispatch doors, every defect filed in the run, auth/authz fixes dispatched at once - #26567

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/sweet-fermat-jrcd80
Oct 27, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/sweet-fermat-jrcd80

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Refs #25807

维护者速读

  • 改了什么: checklist-test 技能和它的协议孪生 RUNNER.md 写进了你在 18.2.0 第二轮测试里定的四条:QA 运行不走车道认领;GitHub 写入只走 pm-dispatch 写入门;测试中遇到的每个产品问题同一轮立 issue;认证/授权类问题立不含细节的卡并立即派 os-dev 修复、不等维护者。另外把清单项 records-forms.record-discussion-mentions 补成 fix(plugin-audit): a mention notification reaches a mentioned user only when they may read the comment it previews #26497 修复后的口径(被 @ 的人要能读评论本身)。
  • 为什么改: 这一轮 5 个云卡跑完后写入被拦、安全问题等裁决,规则不写进技能下一轮还会重演;清单项不改,下一轮跑这一项会按旧口径误判。
  • 风险与回滚: 只改内部技能文本、QA 协议文档和一条清单项,不改任何产品代码或发布包;回滚即 revert 本 PR。
  • 先看: .claude/skills/checklist-test/SKILL.md 的 §2 新 bullet、§4 写入门段、Guardrails 两条;RUNNER.md 规则 2 的 carve-out 段。
  • 两分钟验证: node scripts/check-platform-checklist.mjs 绿;node scripts/check-doc-authoring.mjs、node scripts/pm/check-skill-id-lint.mjs 绿。
  • 需要你做的: .claude/** 是受管面(Tier S),这是 PM 自己的工具 PR,按约定留给你审阅合并。

What changes

  • .claude/skills/checklist-test/SKILL.md
    • §2: a QA run is not a lane card; runners (subagents, or one cloud session per card) are dispatched directly by the session that starts the round.
    • §4: every GitHub write of a run goes through the scripts/pm/ doors (issue-create, post-stamped, close-cards, behind write-pace; the fleet relay in a cloud container); a refused write is not worked around — the texts go to files and are posted in order once cleared.
    • Guardrails: every product defect a run meets is filed in the same run; an auth/authz finding gets a withheld-detail card and its fix is dispatched at once through pm-dispatch (in-seat os-dev, reproduction only in the dispatch prompt).
  • docs/qa/platform-checklist/RUNNER.md: rule 2's carve-out and the extraction clause carry the same rule (one rule, both places).
  • docs/qa/platform-checklist/areas/records-forms.json: records-forms.record-discussion-mentions rev 7 → 8 — the mention target must read sys_comment as well as the record (the gate fixed in fix(plugin-audit): a mention notification reaches a mentioned user only when they may read the comment it previews #26497); acceptance[9] and negative[6] name both reads.

Why

Maintainer rulings in the 18.2.0 wave-2 session, recorded verbatim on #25807 (comment 6433562861): 「你是跑测试啊,和车道有什么关系」, 「你应该使用 pm-dispatch 技能写入」, 「测试结果怎样,测试中遇到的问题应该创建 issue」, 「如果有安全问题不能写issue的,直接派卡修复」, 「以上应该写入你的 checklist skills」. The ledger edit to records-forms.record-discussion-mentions needs no ruling (checklist-test §3: a run's checklist edit is an ordinary edit; #26453's Landed comment 6435471336 names it as the follow-up owed after #26497); the maintainer agreed to it in this session (「同意」), which is not recorded on the card.

Verification

  • node scripts/check-platform-checklist.mjs → OK (16 areas, 329 items).
  • node scripts/check-doc-authoring.mjs → exit 0.
  • node scripts/check-skill-identifier-liveness.mjs → OK; node scripts/pm/check-skill-id-lint.mjs → clean.

Line ratchet

.claude/skills/checklist-test/SKILL.md grows 238 → 246 lines (+8, measured), and its CEILINGS row in scripts/pm/check-skill-line-ratchet.mjs moves by exactly that delta. Ruling of record that orders the text: comment 6433562861 on #25807 (the maintainer's 「以上应该写入你的 checklist skills」, with the four rulings it orders quoted verbatim). Every new line is under the 120-byte budget.

Clause-②: no
Metadata-protocol: none

No package publishes from this diff (internal skill, QA docs, ledger), so it carries skip-changeset.

🤖 Generated with Claude Code

https://claude.ai/code/session_012YjcDon6BvR9MN93ZsFq3U

…fect a run meets is filed, an auth/authz fix is dispatched at once

- §4: every GitHub write of a run (record, defect cards, comments, closes)
  goes through scripts/pm/ issue-create · post-stamped · close-cards behind
  write-pace; in a cloud container they ride the fleet relay. A write the
  session refuses is not worked around: the texts go to files and are
  posted in order once the maintainer clears it.
- §2: a QA run is not a lane card; its runners (subagents or one cloud
  session per card) are dispatched by the session that starts the round,
  with no lane claim or seat-post act.
- Guardrails + RUNNER rule 2 (one rule, both places): every product defect
  the run meets, clause fail or off-clause probe alike, is filed in the same
  run; an authentication/authorization finding gets a withheld-detail card
  and its fix is dispatched at once through pm-dispatch (in-seat os-dev,
  reproduction only in the dispatch prompt), never waiting on the
  maintainer.

Maintainer rulings, 18.2.0 wave-2 session, recorded on #25807.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YjcDon6BvR9MN93ZsFq3U
…n gate now asks

The mention recipient gate admits a mentioned user only when they may read
the comment as well as its record (#26497). personas[1] says the @mention
target must hold read on sys_comment; acceptance[9] and negative[6] name
both reads; revision 7 → 8 with a history row.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YjcDon6BvR9MN93ZsFq3U
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 27, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Oct 27, 2026
Compress the new checklist-test text to +8 net lines with every line under
the 120-byte budget, and raise the file's CEILINGS row 238 → 246 by that
measured delta, on the ruling of record that orders the text (comment
6433562861: 「以上应该写入你的 checklist skills」).

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YjcDon6BvR9MN93ZsFq3U
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 1717dffd0e3abf7b48cca30ad073428ecd11f134
Local-runs: none
Scope: .claude/skills/checklist-test/SKILL.md + docs/qa/platform-checklist/RUNNER.md (rule 2 and the extraction clause, the declared twin), scripts/pm/check-skill-line-ratchet.mjs (the CEILINGS row and its header's raise rule), scripts/pm/issue-create.mjs, scripts/pm/post-stamped.mjs, scripts/pm/close-cards.mjs, scripts/pm/write-pace.mjs (the write doors the SKILL names), .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/rest-channel.md, execution-duties.md, dispatch-runbook.md, contract-review.md, .claude/agents/os-dev.md and AGENTS.md (the rules the SKILL's dispatch and write rules lean on); card #25807 body and all 18 comments. The remainder of the diff, docs/qa/platform-checklist/areas/records-forms.json, is the lane seat's ACCEPT at TIER_DEFAULT and was read only to judge the hits.

Inputs: the card and every comment, the PR body, file list and net diff against main, the check-runs on the head, and the head's files read with git show. Nothing built, run or re-run.

① Derived judgments

  • Accept-set change: none. Four files; none under a published package. .claude/skills/checklist-test/SKILL.md carries metadata.internal: true and ships to no customer project; docs/qa/** and scripts/pm/** are repo tooling; the ledger JSON is read by scripts/check-platform-checklist.mjs and scripts/checklist-select.mjs only. No packages/* path, no exports map, no Zod schema, no error code. Judged right.
  • Public-surface change: none published. Judged right.
  • Governed-surface change: one Tier S path, .claude/skills/checklist-test/SKILL.md (the .claude/** register row). No Tier H path. Head repo equals base repo (not a fork). The PR is draft and nothing is armed. Judged right.
  • Gate change: the CEILINGS row for the SKILL moves 238 to 246 in scripts/pm/check-skill-line-ratchet.mjs. Measured on the trees: the SKILL is 238 lines on origin/main (ce9bc10) and at the merge-base (1c63231), 246 at the head; delta +8, row moved by exactly 8, no other CEILINGS row touched (the diff is one row plus its comment). Not a CROSS_FILE_MOVES destination, so no ruledRaises record is owed. Longest line the diff adds is 118 bytes against the 120-byte MAX_LINE_BYTES budget. The gate itself ran green inside the required Lint & Repo Gates (lint.yml step id pm-skill-line-ratchet). Judged right.
  • Check-runs on the head: Lint & Repo Gates, TypeScript Type Check, Test Core (and 4 shards), Governed Surface Queue Guard, Lint · PM dispatch-gates, Check Documentation Links, Check PR Size, Dogfood Regression Gate, the three branch-claim guards and Auto Label all success. Build Core, Lint UI, Type Check UI, Test UI, Build & E2E UI, Check Changeset are skipped by paths filter or label, the expected reading for a docs-and-skill diff. Three cancelled runs (single-writer path, Part-of PR, card-claims-branch) are each superseded by a same-name success on the same head. No red.

② Semver level

  • skip-changeset label present; no .changeset/*.md; no released package moves. Correct: the label is for a diff that publishes nothing from any released package, and this is one.
  • Clause-②: no. Metadata-protocol: none. Both match the diff: nothing an author can write changes, no accept set widens or narrows.
  • Served tier is CONTRACT_REVIEW_TIER on the rules face (one governed path), not on any narrowing declaration.

③ Boundary flags

  • PR author login: objectstack-fleet[bot] (relay write; no off-relay author to name). Implementing session and adopting seat are the same session, session_012YjcDon6BvR9MN93ZsFq3U; per contract-review.md the ④ pass is run by an isolated subagent other than the drafter, fed only the card, the PR and the head, which is how this record was produced.
  • Body flag 「.claude/** 是受管面(Tier S),这是 PM 自己的工具 PR,按约定留给你审阅合并」: answered. This record is the Tier S record of record for head 1717dff; it arms nothing. pm-dispatch SKILL.md line 208 (「PM 自己的工具 PR 留维护者」) keeps the landing with the maintainer regardless, so the body's handoff is the correct one.
  • PM red line (pm-dispatch 红线: 「PM 永不写代码、不写文件;唯一例外是维护者逐 PR 明示授权的 .claude/ 内部工具 PR。该例外的 PR 授权原话引在正文」): the body quotes the authorizing word, 「以上应该写入你的 checklist skills」, and the card carries it verbatim in comment 6433562861. Satisfied for the SKILL, its RUNNER twin and the ratchet row, which are one change.
  • Line-ratchet flag: the body quotes ruling comment id 6433562861 and delta +8. Verified against the card: that comment records, verbatim and in order, the four maintainer rulings (「你是跑测试啊,和车道有什么关系」, 「你应该使用 pm-dispatch 技能写入」, 「测试结果怎样,测试中遇到的问题应该创建 issue」, 「如果有安全问题不能写issue的,直接派卡修复」 / 「使用 pm-dispatch 技能 派卡修复」) and the order that writes them into this file (「以上应该写入你的 checklist skills」). The eight added lines are exactly those four rules (2 + 3 + 2 + 1 lines); no line the ruling did not order rides the raise. Verified.
  • Body claim that 「同意」 to the ledger edit is recorded in comment 6433562861: not so. That comment predates fix(plugin-audit): a mention notification reaches a mentioned user only when they may read the comment it previews #26497 and carries no 「同意」; the only two 「同意」 lines on the card are for the wave-2 plan (6433473244) and the per-area pin-upgrade cards (6437424356). The ledger edit needs no ruling (SKILL §3: a run's checklist edit is an ordinary edit; records-forms.record-discussion-mentions: authorization-class finding (18.2.0 wave-2 sweep) — detail withheld pending maintainer #26453's Landed comment names it as the follow-up owed after fix(plugin-audit): a mention notification reaches a mentioned user only when they may read the comment it previews #26497), so the edit stands, but the attribution is wrong. should-fix: correct the PR body's provenance line (quote where the word was given, or drop the attribution). Body only, no tree change.
  • Local verification lines in the body (check-platform-checklist, check-doc-authoring, check-skill-id-lint): not relied on; the head's check-runs are the verdicts and they agree.
  • Open questions: none declared in the body; none raised by a dev report (this is a seat-authored PR, no os-dev-report).

④ Design judgment

.claude/skills/checklist-test/SKILL.md, hunk by hunk, against the code and rules it cites:

  • §2 「QA 运行不是车道卡」 — runners dispatched directly by the session that starts the round, no lane claim or seat post; pm-dispatch governs only the write doors and the security fix dispatch. Holds. A run record is qa-run, excluded from the backlog sweep and 「不是可派发单元」 (SKILL §4 label rule, RUNNER extraction clause, unchanged); pm-dispatch's claim protocol, batch cap and os-verify-lock depth all key on dispatched dev cards, which a runner is not. Wave 2 ran exactly this way (one create_session per card, comment 6433473244). AGENTS.md's claim-before-code rule is not touched: a runner writes no card code; a §3 ledger edit rides a PR that Refs the anchor, as this one does. No contradiction found.
  • §4 write-door paragraph — scripts/pm/issue-create.mjs, post-stamped.mjs, close-cards.mjs, write-pace.mjs --announce-batch N, run from the repo root, fleet relay inside a cloud container; never MCP issue_write or bare curl; a refused write is not worked around. Every named door exists and takes what the text says: issue-create.mjs --repo --title-file --body-file [--label] (header line 7; --label carries qa-run), post-stamped.mjs --comment=N --file= (line 7), close-cards.mjs --repo --plan (line 13; a qa-run record carries no pm-state, so a close takes --stateless, a detail the SKILL correctly leaves to the door's header), write-pace.mjs --announce-batch N --kind (line 10, KNOWN_FLAGS). 「仓根直调」 is close-cards' own usage rule; 「云容器内自走 fleet relay」 is OS_FLEET_TRANSPORT=auto (issue-create header) and rest-channel.md's three-condition dispatch rule; 「锁 1 已拒」 is the same refusal rest-channel.md line 43 records. The replaced line (「经 REST 代理 POST .../issues 立单」) contradicted AGENTS.md's 「Every GitHub write leaves through scripts/pm/」; the new text removes that contradiction. Holds.
  • Guardrail 「每个产品问题同一轮经 §4 立 issue」 — holds against §5's four-way disposition: only the 产品缺陷 quadrant is a product defect; assertion defects, stale specs and invalid pairings keep their own exits, and checklist-accuracy findings still close out on the anchor. RUNNER's extraction clause says the same in English (「Every product defect the run meets, a clause fail or an off-clause probe finding alike, is extracted in the same run」). Same rule, both places.
  • Guardrail auth/authz — compared line by line with RUNNER.md rule 2 at the head: never publish the reproduction anywhere on GitHub; the card carries only item id, clause and detail withheld pending maintainer; the reproduction stays in the runner session; the fix is dispatched directly through pm-dispatch as an in-seat mode:subagent os-dev whose prompt alone carries the reproduction; never waiting on the maintainer; a one-shot runner with no dispatch channel hands it to the session that dispatched it. The two texts say the same thing; RUNNER adds the provenance (disclosure ruling on skills: five principle gaps the #9296 wave exposed in checklist-test / checklist-author / dogfood-verification #9387, fix-dispatch ruling on [sweep] v18.2.0 release test sweep #25807) and the term 「disclosure-discipline card」, which is pm-dispatch's own (dispatch-runbook.md line 133: 「披露纪律卡(私密细节不得离开席位会话)也留席内,认领写明」) and is the explicit exception to the project-thread rule that would otherwise send a security card to mode:thread (SKILL.md line 61, runbook line 131). Consistent.
  • Ratchet row — read as one change with the rule: the header's raise discipline (ruling of record quoted by id, measured delta in the body, row moved by at most the delta, in the same PR) is met on every count, as measured in ①. The row's comment names the ruling and the four rules it orders, which is the declaration the header asks of a raise.
  • Out of this diff, recorded for a separate card and carrying no weight here: SKILL §1 (lines 68 to 69) and §4 (line 140) still name .objectui-sha and pnpm objectui:build; on origin/main the pin file is absent and the script is console:build (comment 6433473244 already records that the Console is built in-repo). Pre-existing text, untouched by this PR.

docs/qa/platform-checklist/RUNNER.md (widened in): rule 2 and the extraction clause carry the same rule as the SKILL, checked above; the new provenance line names the comment on #25807 that exists. Holds.

No must-fix. Three should-fixes, none a tree defect in the hits: one PR-body provenance correction, two one-line clarifications that belong to pm-dispatch's own text and the dispatch order, not to this diff.

Implemented-by: claude/sweet-fermat-jrcd80
Reviewed-by: session_012YjcDon6BvR9MN93ZsFq3U

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · session_012YjcDon6BvR9MN93ZsFq3U · 2026-10-27T10:56Z

Pinned head: 1717dffd0e3abf7b48cca30ad073428ecd11f134.

  • Contract review: PASS at CONTRACT_REVIEW_TIER on this head, comment 6440122681 (isolated reviewer; Served-tier, Head-sha, Scope, Implemented-by / Reviewed-by in record shape). No must-fix.
  • Should-fixes, receipted: (1) the PR body's provenance line for the ledger edit is corrected in this same act (no head move); (2) the pm-dispatch wording that an auth/authz fix card enters dispatch as a maintainer-directed card, and (3) a standing disclosure line for the dispatch order of such cards, are pm-dispatch's own text, outside this diff — carried to the follow-up PR that also writes the bare-command write shape into the QA skill (proposed to the maintainer in this session).
  • Shape: draft → main, Refs #25807 only, no closing keyword. Scope: 4 files — the checklist-test SKILL (Tier S), RUNNER.md rule 2 twin, the ratchet CEILINGS row (+8, ruling 6433562861 quoted in the body), and one ledger item (records-forms.record-discussion-mentions rev 8). skip-changeset: nothing publishes.
  • Gates: check-runs on the pinned head all success or path-skipped; the three cancelled claim guards are superseded by same-name success runs on the same head. mergeable_state: clean. check-governed-merges.mjs --pr 26567 → Tier S, 58 changed lines.
  • Landing authority: pm-dispatch keeps a PM's own tooling PR for the maintainer; the maintainer ordered this one landed, verbatim, in this session (2026-10-27): 「26567 你应该按照 pm-dispatch 流程审核并合并」. Tier S with the at-tier PASS on record ⇒ ready → queue.

Landing: pr_ready + automerge_enable via the relay.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants