Repository navigation
qa(checklist-test, RUNNER rule 2): a security finding met in a QA run gets no GitHub card at all — only a pm-dispatch fix dispatch — and every issue write of a run goes through pm-dispatch (maintainer, 2026-10-29) #27382
Description
domain:devx#1 · sunhaolin · session_017xRBcVy4VXmkQjn2MGeaWk
Filing gate: ③ a maintainer-directed task. The maintainer, in session session_017xRBcVy4VXmkQjn2MGeaWk on 2026-10-29, while wave 3 of the 18.3.0 release sweep (#27377) was being dispatched, said, verbatim and in this order:
- 「你应该使用 pm-dispatch 技能处理 issue」
- 「对于测试中遇到的安全问题,不适合提交issue 的,只是使用pm-dispatch技能派发」
- 「这些都应该写到 checklist skills 中」
Business reason: an authentication or authorization hole found by a QA run is currently disclosed as a public card. That card carries only detail withheld pending maintainer, but it still announces in a public repository that a hole exists on a named item and clause, before the fix lands. The maintainer's ruling removes that card. Only the fix dispatch remains.
Reader: the runner sessions of every future checklist-test run. They read .claude/skills/checklist-test/SKILL.md and docs/qa/platform-checklist/RUNNER.md and nothing else of this conversation. The wave-3 runners already carry the ruling in their dispatch prompts; the next wave would not.
Dedupe (open AND closed): "checklist-test security finding no issue dispatch fix withheld card rule" returns 160 hits. None of them is this change. The nearest is #26567 / commit 03e898c1, which wrote the 2026-10-27 rulings (withheld card + immediate dispatch) into the same two places.
What changes
Today the rule is one text in two places: RUNNER.md rule 2's carve-out, around lines 81–97 at c4c515ad, and checklist-test SKILL.md, in the Guardrails line 「认证 / 授权漏洞的复现,永不发布到 GitHub 的任何地方」 and in §4's extraction line 152. It says to file a card carrying only the item id, the clause and detail withheld pending maintainer, then dispatch an in-seat os-dev whose prompt alone carries the reproduction.
After the change:
- No card at all. An authentication or authorization finding, or any finding whose reproduction is an exploit recipe, is ⛔ never filed as a GitHub issue. That includes the withheld-detail card. Its existence is not posted to a tracking card either.
- The run record carries only the row
area.item · clause · security finding — detail withheld, fix dispatched. That row still counts as a completed verdict, and the title counts it as aFAIL. The reproduction stays in the runner session. - The fix is dispatched at once through pm-dispatch: an in-seat
mode:subagentos-devwhose dispatch prompt alone carries the reproduction, with no waiting on the maintainer. Its PR, commit and changeset text describe the fix as a hardening, without the exploit steps.- The
os-devagent is defined for exactly ONE GitHub issue. Here there is no issue, so the dispatch prompt stands in for the card. State howos-devreports in that case: noFixes #line, and the report goes to the dispatching session. - A one-shot runner with no dispatch channel hands the reproduction to the session that dispatched it, as today.
- The
- Every GitHub write of a run goes through pm-dispatch (ruling 1): issue creation, comments, closes and any defect-card handling, through the
scripts/pm/doors. The skill already says this for writes (§4). Make the text say that it covers handling issues as well — extraction, dedupe and close-out — not only posting them. - Keep "one rule written in both places, not a precedence claim by either". Cite the new ruling beside the 2026-08-18 and 2026-10-27 rulings, and record its provenance as a comment on [sweep] v18.3.0 release test sweep #27377.
Gates to expect
pnpm check:pm-skill-ratchet/scripts/pm/check-skill-line-ratchet.mjs. qa(checklist-test): writes through the pm-dispatch doors, every defect filed in the run, auth/authz fixes dispatched at once #26567 had to touch it. A net line increase needs the ruling id in the PR body. The ruling is the maintainer's words in the dispatching session, and the seat will post them on [sweep] v18.3.0 release test sweep #27377 as a comment id before ACCEPT.node scripts/check-platform-checklist.mjsstays green.skip-changeset: no package publishes.
Out of scope
- The wave-3 runs themselves.
- The QA periodic-testing tooling. That is a separate card.
- Any change to how non-security failures carry their reproduction. That stays in full.
Tier: .claude/** is governed Tier S, and docs/qa/** is not governed. Clause-②: no. Metadata-protocol: none.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 真挡得住的权限 | none | P③
Triage: p1 ·
domain:devx·area:devpath· security boundary · 2026-10-29T04:54Z⛔ Not a claim.
detail withheldcard still announces the hole on a named item.priority:p1,domain:devx,area:devpath,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcVy4VXmkQjn2MGeaWk
Scope addition from the maintainer · 2026-10-29T10:13Z
The maintainer, in the dispatching session on 2026-10-29, verbatim: 「每个会话我都交代了:你应该使用 pm-dispatch 技能处理 issue 和 pr」. They had instructed each wave-3 runner session directly.
This widens ruling 1 on this card from issues to issues and PRs. The text this card writes should therefore also cover the PRs a run produces. In practice those are the security-hardening PRs a runner dispatches through
os-dev, for example #27416, #27424, #27431 and #27440 in wave 3. Their review, readiness and landing go through the pm-dispatch flow: ACCEPT, contract review where it is owed, and landing by the seat. ⛔ The runner does not drive a PR to merge on its own judgement.Wave-3 evidence the text should also answer. In three runner sessions (W3-C1, W3-C2b and W3-UX) the session's own permission check refused the pm-dispatch write doors (
scripts/pm/issue-create.mjs,post-stamped.mjs). In a fourth (W3-C3b) it refused theos-devspawn. Meanwhile W3-C2a and W3-C3a wrote through the same doors without trouble. The skill should say what a runner does when that happens. Today the answer is: stage the writes in a file, report the path, and hand the security reproductions to the dispatching session. It should also say what the dispatching session may do with those staged writes.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcVy4VXmkQjn2MGeaWk
Scope change: runners only test, the PM session dispatches every fix · 2026-10-29T10:15Z
The maintainer, in the dispatching session on 2026-10-29, verbatim: 「但是我建议开发任务是不是应该由你同意派,云agent 只负责测试,能做到吗?安全问题他可以私下报告给你吗」.
This replaces item 3 of this card's "What changes" list ("the runner dispatches the fix at once"). The text to write instead:
os-devand never drives a PR.send_messageto the dispatching session's id). ⛔ The reproduction appears nowhere on GitHub. The record row readssecurity finding — detail withheld, reported to PM.os-devsubagent atxhigh, with the reproduction only in its dispatch prompt and hardening-only wording. A finding that needs a contract decision first goes to the maintainer instead.It also settles the wave-3 problem recorded above, where the runners' own permission checks refused the
os-devspawn: runners no longer need that permission at all.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · os-elon-musk · session_01LKHDniRQSWjRJyDtacwpEd
Claim: PM loop round 2 · 2026-10-29T15:15Z
Session:
session_016WV4cxs6a1nUyBHTEo84qV(card thread, dispatched by seat sessionsession_01LKHDniRQSWjRJyDtacwpEd)Account:
os-elon-muskBranch:
claude/project-thread-cj0yt2(the harness-pinned branch for the card thread; it names no issue, so this claim is the identity record)Worktree:
objectstack-issue-27382Domain:
domain:devxSeat:
domain:devx#1File surface:
.claude/skills/checklist-test/SKILL.md(Guardrails line, §4 extraction line, any runner-role text the 10:15Z scope change needs),docs/qa/platform-checklist/RUNNER.mdrule 2, and.claude/agents/os-dev.mdonly for the no-issue report path (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default,effort: xhighClause-②: no
Metadata-protocol: none
Responsibility: a QA security finding is announced publicly by a withheld-detail card, and runners spawn fixes and drive PRs | the maintainer's 2026-10-29 rulings remove both | every future checklist-test run
Thread-read: 6493958591
Premise: maintainer-directed 2026-10-29, with the rulings quoted on the card; the dev re-reads the current skill text on origin/main first
Serial constraints cleared:
.claude/skills/checklist-test/SKILL.mdis also on this seat's #27383 (§5 cadence, a new short section). Regions are declared and disjoint: #27382 = the Guardrails line + the §4 extraction line +RUNNER.mdrule 2; #27390 = §2 effort. Whichever PR lands second merges main first. No other open PR touches these files (read at claim time).Fold head: one thread, one branch, one PR with #27390. Seat pick on the maintainer's word in this account's project: 「座位 2 没派发的你都可以处理啊」 (2026-10-29 15:14Z). Contract review: required.
.claude/**is governed Tier S. The build runs at the default tier, and a CONTRACT_REVIEW_TIER review of record gives a same-head PASS before the seat's hand-off.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
os-dev-report
{ "issue": 27382, "status": "done", "branch": "claude/project-thread-cj0yt2", "pr": "https://github.com/objectstack-ai/objectstack/pull/27642", "session": "session_016WV4cxs6a1nUyBHTEo84qV — this card thread (fold of #27382 + #27390, one PR)", "premise_still_valid": true, "summary": "RUNNER.md rule 2 and checklist-test SKILL.md now carry one rule in two places: a security finding gets no GitHub card at all, the run record keeps one row, the runner reports the reproduction privately to the dispatching PM session, which dispatches the fix and owns every PR; runners only test, every write and issue/PR handling step goes through the pm-dispatch doors, and a refused door stages the writes for the dispatching session. Skill §2 (#27390) states runner effort by card shape, per backend, and the spend line, after measuring how cloud sessions take effort. os-dev.md carries the no-card report path in two existing lines; the checklist-test ceiling rises 246 to 259 under ruling 6500750765.", "tests": "Rules-text change; no package code. Measured readings for #27390 are in the PR body (get_session effort_level on 8 sessions: project threads take their level at spawn, create_session cards carry no effort field).", "gates": "head 6b95c870: dispatch-gates --ran 43 derived / 43 run / 0 unrun, all exit 0 (check:doc-formula-expressions after the @objectstack/lint closure build; first run exit 3). pnpm check:pm-skill-ratchet exit 0; node scripts/check-platform-checklist.mjs exit 0; check:pm-skill-id-lint exit 0; check-commit-card-trailers --range origin/main..HEAD exit 0; eslint on the ratchet script exit 0. PR check-runs not yet read (just opened).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "GitHub MCP reads only: issue_read x6, pull_request_read x1; no write tool", "api_writes": "2 — fleet-write relay: pr_create (#27642, skip-changeset), this comment", "open_questions": [], "out_of_scope_findings": [ "carrier: seat · three checklist item strings (areas/access-security.json x1, areas/identity-auth.json x2) still quote the retired `detail withheld pending maintainer` wording as pointers to rule 2; they defer to rule 2 — noted, not filed", "carrier: seat · pm-dispatch dispatch-runbook 〈云卡五课〉五之 ② says a session that cannot take effort inherits the seat level; create_session card records carry no effort field, so that is unverified — noted, not filed", "carrier: seat · file surface widened inside RUNNER.md: the Run records paragraph and the Extraction obligation bullet repeated the retired card shape and were aligned; os-dev.md edit makes dispatch-gates --tier MANDATORY contract tier (one-line-class exit, compensated by the contract review)" ] }Generated by Claude Code