Skip to content

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

Closed

Description

@objectstack-fleet

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:

  1. 「你应该使用 pm-dispatch 技能处理 issue」
  2. 「对于测试中遇到的安全问题,不适合提交issue 的,只是使用pm-dispatch技能派发」
  3. 「这些都应该写到 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:

  1. 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.
  2. 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 a FAIL. The reproduction stays in the runner session.
  3. The fix is dispatched at once through pm-dispatch: an in-seat mode:subagent os-dev whose 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-dev agent is defined for exactly ONE GitHub issue. Here there is no issue, so the dispatch prompt stands in for the card. State how os-dev reports in that case: no Fixes # 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.
  4. 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.
  5. 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

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

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 真挡得住的权限 | none | P③

    Triage: p1 · domain:devx · area:devpath · security boundary · 2026-10-29T04:54Z

    ⛔ Not a claim.

    • Read fresh. Maintainer-directed: 「对于测试中遇到的安全问题,不适合提交issue 的,只是使用pm-dispatch技能派发」 · 「这些都应该写到 checklist skills 中」. A security hole a QA run meets gets no public card at all, only a fix dispatch. Today's detail withheld card still announces the hole on a named item.
    • p1: it is a security boundary, and the next QA wave reads only the skill text.
    • ⚠️ One seam for the PR: the fix dispatch also lands somewhere on GitHub (an order comment on a lane card). That text must not describe the hole either: the item, the clause and "see the maintainer" only, the same discipline as triage's ⛔ on auth-hole repros.
    • priority:p1, domain:devx, area:devpath, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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 the os-dev spawn. 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

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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:

    1. A runner session only tests. It files its record, its defect cards and its comments through the pm-dispatch doors. ⛔ It never spawns os-dev and never drives a PR.
    2. A security finding is reported privately to the session that dispatched the runner. The runner sends the reproduction in a session-to-session message (send_message to the dispatching session's id). ⛔ The reproduction appears nowhere on GitHub. The record row reads security finding — detail withheld, reported to PM.
      • Measured in wave 3: runner W3-C3b's message reached the dispatching session, so the channel works.
    3. The dispatching PM session decides and dispatches the fix through pm-dispatch: an in-seat os-dev subagent at xhigh, 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.
    4. The PM session owns every PR a fix produces: review, contract review where it is owed, readiness and landing. This also covers PRs a runner opened before this ruling (wave 3: fix(app-showcase): enforce the invoice ownership check on create as well as update #27416, feat(service-storage): sys_attachment verifies the caller may open the referenced file #27424, fix(platform-objects): withhold the sign-in phone fields from org peers in the user directory #27431, feat(plugin-auth): a forced password change requires a password different from the current one #27440), which pass to the dispatching session.

    It also settles the wave-3 problem recorded above, where the runners' own permission checks refused the os-dev spawn: runners no longer need that permission at all.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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 session session_01LKHDniRQSWjRJyDtacwpEd)
    Account: os-elon-musk
    Branch: 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-27382
    Domain: domain:devx
    Seat: domain:devx#1
    File 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.md rule 2, and .claude/agents/os-dev.md only for the no-issue report path (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default, effort: xhigh
    Clause-②: 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.md is 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.md rule 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

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxpriority:p1High: required for production / M2tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions