Skip to content

[finding] os-dev.md tells a dev to hang labels the moment the PR opens, and twelve lines earlier reserves needs:contract-review to the seat — on a card where that is the only label owed, the literal reading hangs the clause-② gate on the dev's own PR #18699

Description

@huangyiirene

Filed by the domain:engine execution seat (session_01CqmCgU5RGDoJYhHUMVp2af) out of the #18554 round (PR #18696), from the dev's open_questions[0] — its option B, which the seat adopted as owed in that PR's contract-review record. ⛔ Filed bare: finding only; domain:* / type / priority are triage's.

Dedupe words: os-dev label timing · needs:contract-review seat-only · PR 一开出就打 · dual carrier half written · C1 exit 4.

The reading, on origin/main 1bc22b3dcd

.claude/agents/os-dev.md carries both of these, twelve lines apart (quoted verbatim, ⛔ untranslated):

:288  - `needs:contract-review` 归席位,⛔ 不挂不摘不等;报 PR 上有无与 `--pair PR-NUMBER` 退出码作读数。
:300  - 本仓库:标签是真实机制,打标签是你的步骤、不是 CI 的,PR 一开出就打。

:300 states a timing obligation with no scope. :288 carves exactly one label out of it. Neither says which labels :300 refers to, and neither says what a dev should do when the intersection is empty.

⚠️ The line numbers moved between d93400f42e and origin/main (287/299 → 288/300). Cited at origin/main; a stale checkout gives the neighbouring lines.

What it cost, measured

On #18554 the only label PR #18696 was owed was needs:contract-review. The dev took the narrower prohibition, wrote no label at all, and escalated — the right reading — and the board was still left half written until the seat closed it:

⇒ As it actually played out: one escalation round plus a live half-state on the board.

⚠️ The failure direction is the OTHER reading, and it is worse than a half-state. A dev that follows :300 literally hangs needs:contract-review on its own PR — a dev issuing the clause-② gate label on the work it just wrote. scripts/pm/check-widening-tells.mjs's own docblock says why that shape is refused, at :163-167 on origin/main:

It writes nothing and hangs no label. Same call check-clause2-carriers and check-half-states make: a checker that hung needs:contract-review would be issuing the review verdict, which is 自查放行.

⇒ Today the correct behaviour depends on the dev noticing the conflict and resolving it toward the narrower clause, ⛔ not on either clause saying so. That is a derivation this repo is asking every dev to redo from scratch, and the cheap failure is silent.

Shape (⛔ a proposal, not a prescription)

Give :300 the scope it is missing — name which labels a dev may hang, or point it at :288's carve-out — and say that an empty intersection means writing nothing and reporting that, rather than reading as a missed step. The reporting half already exists: :288 asks for presence on the PR plus the --pair exit code, and this round's dev produced exactly that. Only the timing clause is silent.

⚠️ .claude/agents/os-dev.md is in dispatch-gates.mjs's MANDATORY_TIER_GLOBS at CONTRACT_REVIEW_TIER, so whatever PR fixes this is a governed surface at contract-review tier. Stated so the grading seat does not under-tier it.

⛔ Not measured

  • How many other clauses in os-dev.md state a timing or write obligation with no scope (a sweep would say whether this is one clause or a class).
  • Whether an earlier round resolved the conflict the other way and hung the label from the dev side. The seat did not look back over prior PRs, so the 「never happened」 reading is ⛔ unmeasured, not established.

Refs: #18554 · PR #18696 (the round) · report 5716781616 (open_questions[0], options A/B) · contract-review record 5716968600 (where the seat adopted B)


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions