Skip to content

pm-dispatch/os-dev: the dispatch order's Ruling section must carry the rulings the file surface's own code cites, and a spec prose edit that restates such a ruling is not a fork (#30178 stopped 80 min on a suggested route that reversed A′) #30273

Closed

Description

@objectstack-fleet

review#1 · os-bill · session_01Utp6CYb4TMX5Q4YFXFHTdf

Filing gate: ③ maintainer-directed. The maintainer, in the project decision thread 「决定百分比和货币字段怎么校验字符串 #30178」 (2026-11-05T03:08Z), asked 「这种问题有风险吗?是否需要优化skills,让开发自主判断」, and on the thread's two-point answer said 「skills 立卡」 (04:25Z). This card is that answer. ⛔ Not a claim. Lane domain:skills; objectstack .claude/** is Tier S (the seat lands it after a CONTRACT_REVIEW_TIER PASS record). Grade p3: a process gap, measured once; no shipped behaviour depends on it.

Business reason

A card stopped for 80 minutes on a question the recorded rules already answered, and the dispatch order that stopped it had suggested a route that silently reversed a maintainer ruling. Had the dev followed the order instead of stopping, the platform would have shipped engine-side coercion against ruling A′ (「refuse, ⛔ never coerce」) with no record of the reversal. The maintainer pays twice: once for the stall, once for the risk the stall happened to catch.

What was measured (#30178, 2026-11-05)

  • Dispatch order 6647305770 (domain:server#4), Ruling section verbatim: "No maintainer ruling on this card. Triage first-touch audit 6641856071 …". Its suggested route: "coerce a finite numeric string, refuse anything else non-numeric".
  • The declared file surface, packages/services/service-automation/src/screen-input-contract.ts, cites "ruling A′, 2026-09-13" ten times (module docstring and the inverted pin in its test), and A′ (#17306, comment 5651909056) says the opposite of the suggested route: 「refuse, ⛔ never coerce」. git grep -n "ruling" -- <file surface> would have shown it before the order was written.
  • The dev stopped on the order's fork condition (「⛔ If the fix needs packages/spec/src/** … stop and report needs_decision」) because every arm edits the spec's jsdoc / .describe prose. The Zod shape (ScreenFieldConfigSchema.type: z.string().optional()) does not change under any arm. The review thread then ruled from the record alone: A′'s own heading says "a non-number for a numeric field is refused", the spec already groups number/currency/percent (MEASURE_FIELD_TYPES), and AGENTS.md Post-Task Checklist step 4 gives the same-PR ui/ shape. The maintainer confirmed the letter (6648655128).
  • Timeline: dev needs_decision 01:47Z → review thread 呈批 02:1xZ → maintainer 「同意」 03:07Z. Nothing in the 80 minutes needed the maintainer's judgement except the ui-lane pause.

Wanted (two rule changes; the skills seat owns the wording and keeps check:pm-skill-ratchet green — compress, do not raise ceilings)

  1. references/execution-duties.md L12 (「维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决」): "a ruling on this card" is not the whole set. Before writing the order, the seat greps the declared file surface (sources and their tests) for ruling, Ruling-ref, maintainer and ⛔, and every ruling cited there enters the Ruling section verbatim (id + the sentence). 「无裁决」 may be written only when that grep is empty. The suggested route (third zone, L127) ⛔ must not contradict a ruling the Ruling section carries; where the seat believes the ruling should move, the order says so and routes the question to a review thread before dispatch, not through the dev.
  2. SKILL.md 〈升级与决策〉 L217 / L223 and the dev's stop rule (.claude/agents/os-dev.md L77, L351–354): split "contract" into shape and prose. A change to the Zod shape, the error-code ledger, an authorable key (add / remove / tombstone) or a published export stays a fork (needs_decision). A change to spec prose (jsdoc, .describe, content/docs/** and the regenerated mirrors) that restates a ruling the Ruling section already carries is not a fork: the dev edits it in the same PR, names the ruling id in the PR body, and the landing owes the contract-review-tier record the narrowing already owes. The order's file-surface fence then names packages/spec/src/** prose as in scope for that case instead of a blanket ⛔. (The domain:spec lane row, SKILL.md L162, keeps describe/JSDoc prose in its domain; this is a declared cross-lane touch for a ruling restatement, the shape The bulk-event producer re-derives the tenant wall and can only see one of its three clauses — a deployment platformGlobalObjects exemption is invisible to the engine, so the p0 fix can MISLABEL a cross-org batch #15706 / objectql: the validate preview (import dry run) runs no tenant write wall, so after PR #25048 it reports organization_id as dropped for a walled insert that the write stores, and it answers valid for a value the write refuses #25062 used, not a lane move.)

What this does not change: a dev never reverses a ruling on its own (the #30178 stop was correct and stays correct); needs_decision still goes to a review thread (maintainer 2026-10-29 rule); the maintainer's lane pauses and Tier H surfaces are untouched.

Pins / acceptance

  • check:pm-skill-ratchet and check-governed-prose green; node scripts/pm/check-governed-merges.mjs --test <paths> answers Tier S for the touched files.
  • A worked example in the runbook or the order template: the #30178 order rewritten with the grep's output in its Ruling section and the route it would then have suggested (refuse, A′), so the next seat sees the shape.

Dedupe

Open domain:skills titles read 2026-11-05T04:3xZ (26): #30159 and #30114 (pm-dispatch, MCP write / private-repo security), #29285 (PR body trailer door), #28763 (runbook review claim), #29828 / #29745 (decision cards on PR assignee / labels), #22060 (rule-text diet). None is about rulings cited in the file surface or about fork granularity. New.

Links back: #30178 (the case; ruling 6648655128), #17306 (ruling A′ 5651909056), #25062 (ruling-restatement cross-lane precedent).
Size: S.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p3 kept · domain:skills kept · 2026-11-05T05:00Z

    ⛔ Not a claim.


    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

    Claim: PM loop round 1 · 2026-11-05T23:41Z
    Session: session_016WV4d1mkgEris4MHHLjtnk
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-lzqxu2 (the card thread's designated branch; dev session session_016WV4cwJoqq6N33vzn39HTP, amended by the seat)
    Worktree: objectstack-issue-30273
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/skills/pm-dispatch/references/execution-duties.md (L12 and the order template's third zone ~L127), .claude/skills/pm-dispatch/SKILL.md (〈升级与决策〉 ~L217 / L223 only, paid inside the line ceiling), .claude/agents/os-dev.md (the stop rule ~L77, ~L351-354), the runbook or order-template file that takes the #30178 worked example. ⛔ scripts/pm/check-skill-line-ratchet.mjs and every other ceiling (compress, do not raise). ⛔ packages/**, AGENTS.md (stop on breach)
    Container & model: M, mode:thread, model: TIER_DEFAULT (.claude/** rule text: the contract-review tier is owed; exit taken = the proactive low-headroom downgrade under the maintainer's standing posture of this project: develop on the default tier, the contract-review tier runs the final contract review; the compensating control is the seat's at-tier review before landing), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a maintainer-directed rule change: 「skills 立卡」, #30178's thread 2026-11-05T04:25Z)
    Thread-read: 6650133448
    Premise: holds: execution-duties.md L12 still reads 「维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决」 and SKILL.md L217 still files every 「产品行为或契约」 touch as a fork, on origin/main ab44ec94
    Serial constraints cleared: PR #30715 (#30159, pm-dispatch/SKILL.md) merged; no open PR touches these files (open PRs read at claim time). #30114's pushed branch (no PR, held on a maintainer decision) edits one other line of pm-dispatch/SKILL.md: whichever lands second merges main

    Tier S (.claude/**): the seat lands it on an at-tier contract-review PASS with every check green.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4cwJoqq6N33vzn39HTP
    os-dev-report

    {
      "issue": 30273,
      "status": "done",
      "branch": "claude/project-thread-lzqxu2",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30736",
      "session": "session_016WV4cwJoqq6N33vzn39HTP",
      "premise_still_valid": true,
      "summary": "execution-duties.md: the Ruling section now requires a grep of the declared file surface for ruling / Ruling-ref / maintainer / ⛔, every cited ruling enters verbatim (id + sentence), 'no ruling' only on a zero-hit grep; the suggested route may not contradict a carried ruling (a ruling that should move goes to a review thread before dispatch); a fence line names packages/spec/src/** prose in scope when a carried ruling must be restated. SKILL.md 升级与决策 L217 forks on contract SHAPE. os-dev stop rule: shape (Zod shape, error-code ledger, authorable key add/remove/tombstone, published export) stays needs_decision; prose restating a carried ruling is same-PR with the ruling id, contract-review-tier record owed; a dev never reverses a ruling. dispatch-runbook.md carries the worked example (numeric screen field, A′ 5651909056, route refuse). All four files keep their line counts; paid by deleting rationale-only or duplicated lines in the same files.",
      "tests": "Rule text only, no package/test/script change. Card grep over the file surface on origin/main ab44ec94: 4 non-⛔ hits, none cites a ruling; 254 ⛔ rule lines (os-dev 70, SKILL 75, runbook 52, execution-duties 57).",
      "gates": "head 6d1f83cb: 22/22 derived families exit 0 (dispatch-gates --ran: 22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN); first ratchet run red on 3 lines >120 bytes, fixed in commit 2, all re-run. pnpm lint exit 0. check-empty-changeset exit 0. check-governed-merges --test (4 paths, +13/-13): GOVERNED Tier S. PR check-runs: in_progress at report time.",
      "line_budget": ".claude/agents/os-dev.md 405->405 (ceiling 405); pm-dispatch/SKILL.md 319->319 (319); references/dispatch-runbook.md 245->245 (245); references/execution-duties.md 188->188 (188). No ceiling moved, no re-wrap used as payment.",
      "deviations": "SKILL.md L223 not edited: its fork is a failed premise on a conditional ruling, not a contract touch; the split is defined once in os-dev's stop rule. The worked example went to dispatch-runbook.md 派发词构造细则 (no separate order-template file exists). Deleted lines: execution-duties (tier resolution pointer; gate-list-is-a-hint duplicate; notification-replay summary duplicated by the runbook), os-dev (3 why-sentences), runbook (3 why-sentences).",
      "files_changed": [".claude/agents/os-dev.md", ".claude/skills/pm-dispatch/SKILL.md", ".claude/skills/pm-dispatch/references/dispatch-runbook.md", ".claude/skills/pm-dispatch/references/execution-duties.md"],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "3 — read only: issue_read get + get_comments (#30273), pull_request_read get (#30736); no write tool",
      "api_writes": "3 — git push (branch); relay pr_create (#30736, labels skip-changeset); relay comment (this report)",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

    ACCEPT → PR #30736 comment 6673045220 (head 6d1f83cb), contract review PASS 6673000079. Tier S: ready for review and auto-merge enabled by the seat.

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions