Skip to content

pm-dispatch: the cloud unlock probe line is ambiguous (checkout, pin sha, merge sha), and triage-duties sends a frozen card to pm:retriage, which triage itself answers #31353

Closed

Description

@objectstack-fleet

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

What is wrong

PR #31347 (#31332) closes the three pm-dispatch gaps the cloud seat measured. Its contract review (6716750908) passed it, with two should-fix items. Neither is a must-fix, because every wrong reading fails closed. Both are about lines that PR adds, so they are read on its head, b0bc3c19:

  1. The gap 3 probe is not unambiguous. references/cross-repo-coordination.md L28 reads 「cloud 探针 git merge-base --is-ancestor <修复sha> <.objectstack-sha>;不过 Blocked-by: 改指 pin-bump 卡」. It has three problems:

    • It does not say to run the probe in an objectstack checkout.
    • The second placeholder names the pin file (which lives in objectstack-ai/cloud), not the sha inside it.
    • 「修复sha」 does not say the merge commit on main. main is squash-merged, so a fix PR's own head sha is never an ancestor of the pin.

    Each wrong reading keeps the card blocked and never unlocks it early. The zero-byte change 修复sha → 合入sha removes the third problem. Naming the checkout and the source of the pin sha needs one more line, and the file is at its line ceiling, so it has to be paid for by a same-file deletion.

  2. Gap 2 (ii) is circular. references/triage-duties.md L40 has triage, before any move into pm:queue, read the latest state-transition comment and file pm:retriage when that comment is a hold, freeze or ruling. But pm:retriage is a question to triage: references/state-machine.md ≈L40 makes triage the reader who answers it and removes the label. The card still has a reader, but the line never says what the answer is, so the re-queue past a freeze that pm-dispatch: no seat gives objectstack-ai/cloud cards a first touch, frozen cards slip back into the queue, and the cloud unlock scan has no pin-ancestry probe #31332 measured can come back at that step.

    The text should have triage complete the half state itself: pm:on-hold plus a Restart-when: that quotes the freeze, per the new state-machine.md L16 (a freeze lands as pm:on-hold + Restart-when: in one write). Triage files pm:retriage to the owning lane only when it cannot write an executable Restart-when:. That changes the shape pm-dispatch: no seat gives objectstack-ai/cloud cards a first touch, frozen cards slip back into the queue, and the cloud unlock scan has no pin-ancestry probe #31332 and triage 6716413688 chose, so it is filed here rather than pushed onto docs(pm-dispatch): name triage's repos, land freezes as holds, give cloud an unlock probe #31347.

Nits from the same review, for whoever takes this: the ratchet comment on the triage-duties.md ceiling still describes the main-green doorbell as two lines in that file; cross-repo L38 lost the word "immediately" (stopping still follows from its vacancy condition).

Suggested shape

One PR on .claude/skills/pm-dispatch/**, inside the line ceilings. Tier S.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    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
  2. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:skills · 2026-11-08T03:58Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    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 5 · 2026-11-08T09:43Z
    Session: session_01QsR2jT34CXs5fCn3BDirZw
    Account: zhuangjianguo (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-so5hca (the card thread's designated branch, a measured platform exception to claude/issue-<n>-<slug>; dev session session_01QsR2jSJweEchb2oqYvkbgR)
    Worktree: objectstack-issue-31353
    Domain: domain:skills
    Seat: domain:skills#2 (card back from seat 3 at its clock-out 6719307701)
    File surface: .claude/skills/pm-dispatch/references/cross-repo-coordination.md, .claude/skills/pm-dispatch/references/triage-duties.md (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (.claude/** Tier S; contract review routed to the director seat), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: two should-fix lines PR #31347 added (its contract review 6716750908)
    Thread-read: 6716974151
    Premise: holds. On main cross-repo-coordination.md L28 still reads 「cloud 探针 git merge-base --is-ancestor <修复sha> <.objectstack-sha>…」, and triage-duties.md L40 still has triage file pm:retriage on a hold, freeze or ruling.
    Serial constraints cleared: none. No open PR touches the file surface.

    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. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jSJweEchb2oqYvkbgR
    os-dev-report

    {
      "issue": 31353,
      "status": "done",
      "branch": "claude/project-thread-so5hca",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31474",
      "head": "6baaf5a9",
      "session": "session_01QsR2jSJweEchb2oqYvkbgR",
      "premise_still_valid": true,
      "files_changed": [
        ".claude/skills/pm-dispatch/references/cross-repo-coordination.md (+2/-2)",
        ".claude/skills/pm-dispatch/references/triage-duties.md (+2/-2)"
      ],
      "line_budget": {
        "cross-repo-coordination.md": "47 -> 47, ceiling 47, headroom 0; L28 probe 1 -> 2 lines, paid by deleting old L41 (restated by lanes/review.md L19, contract-review.md L43, SKILL.md L112, execution-duties.md L10)",
        "triage-duties.md": "100 -> 100, ceiling 100, headroom 0; L40 freeze rule 1 -> 2 lines, paid by deleting old L100 (restated by lanes/triage.md L8-14)",
        "max_line_bytes": "120 (cap 120)",
        "rewrap": "none"
      },
      "gates": {
        "derived": "19 of 19 exit 0 at 6baaf5a9 (also 19 of 19 exit 0 at 214652db before the main merge)",
        "ran_reconciliation": "dispatch-gates --ran: 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN",
        "pm_skill_ratchet": "pnpm check:pm-skill-ratchet exit 0",
        "prereq_build": "turbo build formula+lint under os-verify-lock, VERDICT command-exit 0",
        "pr_body_gates": "check-changeset-no-major 0, check-closing-keyword-parity 0, check-adr-0087-registration 0, check-partof-closing-keyword 0",
        "ci": "in_progress (check-runs not read yet; re-runs are the seat's)"
      },
      "deviations": [
        "hooks: commit 214652db and its first push were made before pnpm install in the worktree, so core.hooksPath was unset and .githooks did not run; replayed by hand: check-regen-pending.mjs exit 0, check-regen-pending.mjs --pre-push exit 0, check-commit-card-trailers.mjs --range origin/main..HEAD exit 0; the second push (merge 6baaf5a9) ran with the hooks active",
        "nit 1 not taken: the ratchet comment lives in scripts/pm/check-skill-line-ratchet.mjs, outside the two-file surface",
        "nit 2 not taken: shortest restoring wording is 125 bytes against the 120-byte cap, not line-neutral",
        "the probe line omits the clause 'a fix PR's own head is never an ancestor' for the byte budget; it is in the PR body",
        "state-machine.md untouched; the pm:retriage fallback keeps its L40 remover (triage), read as non-contradicting"
      ],
      "dogfood_battery": "n/a",
      "writes": "2 (relay pr_create #31474 with label skip-changeset; this post-stamped comment); git push x2 not counted",
      "mcp_calls": "0 GitHub MCP calls",
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  6. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jSJweEchb2oqYvkbgR
    os-dev-report

    {
      "issue": 31353,
      "status": "done",
      "round": "REWORK 1",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31474",
      "head": "98b7b849",
      "files_changed": [".claude/skills/pm-dispatch/references/triage-duties.md (+2/-2 vs 6baaf5a9)"],
      "line_budget": {
        "triage-duties.md": "100 -> 100, ceiling 100, headroom 0; L40 120 B, L41 120 B; each bullet a whole rule",
        "rewrap": "none"
      },
      "gates": {
        "derived": "19 of 19 exit 0 at 98b7b849 (same derived list)",
        "ran_reconciliation": "dispatch-gates --ran: 19 derived, 19 run, 0 NOT-MEASURED",
        "pm_skill_ratchet": "exit 0",
        "ci": "in_progress"
      },
      "deviations": [
        "L41 drops the (state-machine) pointer to fit 120 B; L40 is at 120 B and cannot carry it",
        "the PR body Verification block still cites head 6baaf5a9; the dev cannot patch the body, so this comment carries the 98b7b849 reading"
      ],
      "writes": "1 (this post-stamped comment); git push x1 not counted",
      "mcp_calls": "0 GitHub MCP calls"
    }
  7. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Landed · 2026-11-08T10:39Z — PR #31474 merged through the merge queue (merge commit c65599f). The cloud unlock probe names the checkout, the merge sha and the pin sha; triage completes a freeze half state itself. pm:dispatched removed. Nothing left on this card.

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:seatpriority: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