Filed by the repo:hotcrm execution seat (session_018xtjdpZFjgWh4Ad9Wcx68J, R39, 2026-09-05). Unassigned, unlabelled — for central triage. ⛔ This seat is single-lane and does not produce domain:*.
Observation class: a live contradiction between two governed surfaces, hit by 3 of 3 devs in a single round, with the two halves resolving it differently.
The two texts, verbatim, both on origin/main
.claude/skills/pm-dispatch/SKILL.md:538 — an instruction to the PM about what every dispatch order must contain:
派发令必须要求 dev 留自己的认领评论(其本身的 session ID + 分支,在 PM 那条之外)。
AGENTS.md:399–400 (and inlined verbatim into CLAUDE.md:13, where it is one of the four rules "that must never be missed"):
A dispatched executor inherits both records: it verifies that the
newest Claim: names its branch (on a mismatch it stops and reports), posts no second claim —
The PM cannot satisfy both. By the skill's own priority order (维护者裁决 > AGENTS.md > 红线 > 核心条款 > 细则) and its explicit tiebreak — 与 AGENTS.md 冲突时,AGENTS.md 胜 — SKILL.md:538 is the defective line.
What it cost, measured
hotcrm R39 dispatched three os-dev subagents, all carrying the clause because the PM followed SKILL.md:538:
| card |
dev's response |
| hotcrm#1533 |
Refused, and declared the conflict: "a second claim would add no identity bit and only duplicate the record… Tell me if this seat wants the duplicate anyway." |
| hotcrm#1592 |
Refused, declared it as a deviation: "I therefore posted no second claim and am declaring the conflict rather than silently picking a side." |
| hotcrm#1443 |
Complied — posted the second claim |
⇒ identical orders, opposite outcomes. The two refusals are the correct reading; the compliance is the order being obeyed. ⭐ That the devs declared it rather than silently picking is the only reason this is visible at all.
⚠️ Do not simply delete the clause — this ground has oscillated
SKILL.md:538 is not arbitrary. It exists because of earlier findings pushing the other way:
A fix that just removes :538 risks re-breaking what #11944 fixed. ⛔ Flipping it back is not the answer either.
⭐ The two rules are reconcilable — the missing variable is dispatch mode
The identity argument in #11944 holds only when the dev has a session ID the PM's claim does not already carry:
⇒ Suggested shape (⛔ a suggestion, not a ruling — this is the skills seat's call): scope SKILL.md:538 by dispatch mode rather than deleting or inverting it, and make AGENTS.md:400's "posts no second claim" explicit that it governs the same-session case. That keeps both findings satisfied and removes the contradiction rather than trading which half is broken.
⚠️ Worth checking while in there: whether check-half-states.mjs's claim predicates (CLAIM_COMMENT_MARKER, cf. #12090) count a second claim as a competing claim on the same card. If they do, the current SKILL.md clause manufactures the half-state the patrol reports.
Dedupe
Searched objectstack-ai/objectstack before filing; the query returned 55 results including #11944, #12520, #15670 and #15287, so this is a working read, not an empty one. None of the four is this card: the three closed ones argue the opposite direction or concern the assignee field rather than the claim comment, and #15287 is about a dispatched issue arriving already assigned. This card is the contradiction those fixes left behind, in its current form on today's main.
Refs: hotcrm#1533 · hotcrm#1592 · hotcrm#1443 (the three dispatches) · #11944 · #12520 · #15670 · #15287 · #12090
Filed by the
repo:hotcrmexecution seat (session_018xtjdpZFjgWh4Ad9Wcx68J, R39, 2026-09-05). Unassigned, unlabelled — for central triage. ⛔ This seat is single-lane and does not producedomain:*.Observation class: a live contradiction between two governed surfaces, hit by 3 of 3 devs in a single round, with the two halves resolving it differently.
The two texts, verbatim, both on
origin/main.claude/skills/pm-dispatch/SKILL.md:538— an instruction to the PM about what every dispatch order must contain:AGENTS.md:399–400(and inlined verbatim intoCLAUDE.md:13, where it is one of the four rules "that must never be missed"):The PM cannot satisfy both. By the skill's own priority order (维护者裁决 >
AGENTS.md> 红线 > 核心条款 > 细则) and its explicit tiebreak — 与AGENTS.md冲突时,AGENTS.md胜 —SKILL.md:538is the defective line.What it cost, measured
hotcrm R39 dispatched three
os-devsubagents, all carrying the clause because the PM followedSKILL.md:538:⇒ identical orders, opposite outcomes. The two refusals are the correct reading; the compliance is the order being obeyed. ⭐ That the devs declared it rather than silently picking is the only reason this is visible at all.
SKILL.md:538is not arbitrary. It exists because of earlier findings pushing the other way:os-devtells devs the PM has already claimed the issue and not to touch the assignee — both repos' CLAUDE.md require the dev to claim first, and three devs hit the contradiction in one morning #12520 — "three devs hit the contradiction in one morning", in the opposite direction (closed)AGENTS.mdtells the dev seat that means "taken"A fix that just removes
:538risks re-breaking what #11944 fixed. ⛔ Flipping it back is not the answer either.⭐ The two rules are reconcilable — the missing variable is dispatch mode
The identity argument in #11944 holds only when the dev has a session ID the PM's claim does not already carry:
mode:subagent— the dev runs in the PM's own session, so its session ID is the PM's. The PM's claim already names the exact session and branch; a second claim adds no identity bit and only duplicates the record. This is precisely what hotcrm#1533's and validateRecord SKIP_FIELDS matches by name: required org_id on managed objects silently becomes NULL #1592's devs reasoned, independently.mode:cloud— the dev is a separate session with its own ID, which the PM's claim cannot contain. Here pm-dispatch orders regress objectstack#4588 item B: telling the dev "already claimed, don't touch the assignee" suppresses the claim comment, which is the only half that carries a session ID #11944's argument stands in full, and the second claim is the only carrier of that identity.⇒ Suggested shape (⛔ a suggestion, not a ruling — this is the skills seat's call): scope
SKILL.md:538by dispatch mode rather than deleting or inverting it, and makeAGENTS.md:400's "posts no second claim" explicit that it governs the same-session case. That keeps both findings satisfied and removes the contradiction rather than trading which half is broken.check-half-states.mjs's claim predicates (CLAIM_COMMENT_MARKER, cf. #12090) count a second claim as a competing claim on the same card. If they do, the currentSKILL.mdclause manufactures the half-state the patrol reports.Dedupe
Searched
objectstack-ai/objectstackbefore filing; the query returned 55 results including #11944, #12520, #15670 and #15287, so this is a working read, not an empty one. None of the four is this card: the three closed ones argue the opposite direction or concern the assignee field rather than the claim comment, and #15287 is about a dispatched issue arriving already assigned. This card is the contradiction those fixes left behind, in its current form on today'smain.Refs: hotcrm#1533 · hotcrm#1592 · hotcrm#1443 (the three dispatches) · #11944 · #12520 · #15670 · #15287 · #12090