Skip to content

label-write --release sends its comment without the signature check #31585

Open

Description

@objectstack-fleet

domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

Finding

scripts/pm/label-write.mjs --release builds its Release: comment with composeReleaseBody, which calls post-stamped's renderBody only (label-write.mjs L712–722 at 3e24b822, the head of PR #31583). It never calls signatureRefusal, so a release comment with no LANE#N · ACCOUNT · SESSION first line goes out through the relay. Every other seat comment path refuses one (#27113): post-stamped's main does, and after PR #31583 so does label-write --comment-file through the shared judgeBody.

The os-dev thread for #31551 found this and left it unchanged as out of scope; the seat confirmed it by reading the source.

Wanted

  1. --release judges its composed body through judgeBody(…, { mode: 'comment' }, nowMs, 'label-write') instead of renderBody alone, and refuses with exit 2 and zero writes when the body is unsigned.
  2. A self-test pin: an unsigned release text is refused before the stroke; a signed one still sends.

Scope

scripts/pm/label-write.mjs only. No relay op, no procedure text. Land after PR #31583 (it adds judgeBody).

Clause-②: no
Metadata-protocol: none

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 8, 2026
  2. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: domain:skills · p2 · pm:queue · 2026-11-08T16:57Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 8, 2026
  4. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Claim: PM loop round 13 · 2026-11-08T17:47Z
    Session: session_01QsR2jT34CXs5fCn3BDirZw
    Account: zhuangjianguo (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-r4tqdc (the card thread's designated branch, a measured platform exception to claude/issue-<n>-<slug>; dev session session_01QsR2jR91pcCzC1k9n3p5ah)
    Worktree: objectstack-issue-31585
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: scripts/pm/label-write.mjs (and its self-test, if separate) (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (ungoverned scripts/pm; lane seat lands on ACCEPT), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the seat-comment signature contract (#27113) | --release is the one seat comment path left that sends without the signature check (PR #31583 review 6723957070, ③)
    Thread-read: 6724348809
    Premise: holds. On main 69244406 composeReleaseBody renders through renderBody only; judgeBody exists since PR #31583 and --comment-file already uses it.
    Serial constraints cleared: no open PR edits label-write.mjs.

    Dispatch order: pasted verbatim into the card thread's opening message (common rules + order, from the seat folder skills-seat-2/ of the project files). Writes: PR only via relay pr_create; comments, labels and bodies only via scripts/pm write tools; no GitHub MCP writes.

  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 8, 2026
  6. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Claim: PM loop round 13 · 2026-11-08T17:48Z
    Session: session_01QsR2jT34CXs5fCn3BDirZw
    Account: zhuangjianguo (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-r4tqdc (the card thread's designated branch, a measured platform exception to claude/issue-<n>-<slug>; dev session session_01QsR2jR91pcCzC1k9n3p5ah)
    Worktree: objectstack-issue-31585
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: scripts/pm/label-write.mjs (and its self-test, if separate) (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (ungoverned scripts/pm; lane seat lands on ACCEPT), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the seat-comment signature contract (#27113) | --release is the one seat comment path left that sends without the signature check (PR #31583 review 6723957070, ③)
    Thread-read: 6724348809
    Premise: holds. On main 69244406 composeReleaseBody renders through renderBody only; judgeBody exists since PR #31583 and --comment-file already uses it.
    Serial constraints cleared: no open PR edits label-write.mjs.

    Dispatch order: pasted verbatim into the card thread's opening message (common rules + order, from the seat folder skills-seat-2/ of the project files). Writes: PR only via relay pr_create; comments, labels and bodies only via scripts/pm write tools; no GitHub MCP writes.

  7. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Claim amendment · 2026-11-08T17:50Z · amends Claim 6724928886 (same session, same branch claude/project-thread-r4tqdc). Claim 6724916818 above is the same claim, posted twice by the defect below; the newer one governs.

    Scope, widened inside the same file: label-write.mjs --comment-file (landed in PR #31583) hangs after a successful relay run. Measured on main 69244406 by this seat's own claim on this card:

    • The relay run succeeded (42506817643), and the comment and labels are on the board.
    • The process printed no ④ line and exited 13: Node's "Detected unsettled top-level await" at label-write.mjs:2541 (await main(...)).
    • The read-back promise in foldStroke never settles under the real transport. The self-test fake transport passes, so no pin covers it.

    A seat that re-runs the stroke after the hang posts the comment twice, as happened here. Wanted 3: find the unsettled await in the fold's read-back under the real call/send, fix it, and pin it with a test that drives the real transport shape (not the fake) far enough to catch a never-settling read. Same file, same tier.

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

Metadata

Metadata

Assignees

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions