Repository navigation
Description
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, comment5651909056) 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 reportneeds_decision」) because every arm edits the spec's jsdoc /.describeprose. 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 groupsnumber/currency/percent(MEASURE_FIELD_TYPES), and AGENTS.md Post-Task Checklist step 4 gives the same-PRui/shape. The maintainer confirmed the letter (6648655128). - Timeline: dev
needs_decision01: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)
references/execution-duties.mdL12 (「维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决」): "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) forruling,Ruling-ref,maintainerand⛔, 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.- SKILL.md 〈升级与决策〉 L217 / L223 and the dev's stop rule (
.claude/agents/os-dev.mdL77, 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 namespackages/spec/src/**prose as in scope for that case instead of a blanket ⛔. (Thedomain:speclane 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 deploymentplatformGlobalObjectsexemption is invisible to the engine, so the p0 fix can MISLABEL a cross-org batch #15706 / objectql: thevalidatepreview (import dry run) runs no tenant write wall, so after PR #25048 it reportsorganization_idas 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-ratchetandcheck-governed-prosegreen;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
#30178order 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
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 kept ·
domain:skillskept · 2026-11-05T05:00Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk
Claim: PM loop round 1 · 2026-11-05T23:41Z
Session:
session_016WV4d1mkgEris4MHHLjtnkAccount:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-lzqxu2(the card thread's designated branch; dev sessionsession_016WV4cwJoqq6N33vzn39HTP, amended by the seat)Worktree:
objectstack-issue-30273Domain:
domain:skillsSeat:
domain:skills#1File 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.mjsand 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: highClause-②: 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.mdL12 still reads 「维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决」 and SKILL.md L217 still files every 「产品行为或契约」 touch as a fork, onorigin/mainab44ec94Serial 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 ofpm-dispatch/SKILL.md: whichever lands second mergesmainTier S (
.claude/**): the seat lands it on an at-tier contract-review PASS with every check green.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
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": [] }objectstack-fleet commentedon Nov 6, 2026
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.