Repository navigation
Description
Ruled: maintainer 「同意」 in the objectui domain:ui seat #1 chat (session_01DuWo5bdP9SdVebamn99GGk), 2026-09-28, answering the seat's proposal quoted below.
Filed by the objectui domain:ui seat #1. This card carries the ruling into the ui lane's job description, .claude/skills/pm-dispatch/references/lanes/ui.md. That is governed text (.claude/**, Tier S), so the seat that recorded the ruling does not edit it. ⛔ Not a claim.
The proposal the maintainer agreed to (verbatim, the seat's chat)
定一条常设规则:"Spec Main Shape Gate"在 main 或合并队列上变红时,直接视为本车道的 p0,不等分诊定级,任何 ui 席位立即认领止血。成本几乎为零,不改检查、不改裁决 C,目标是在一小时内恢复队列。
objectstack 侧不做必需检查。如果以后要加,最多只在改动packages/spec/src的 PR 上跑,而且只报告、不阻塞:让作者提前知道要破坏 objectui,但不拖慢 objectstack。
Why (the readings the seat put to the maintainer)
- The gate is ruling C on objectui#9860 (2026-09-18). It is the only shape gate for
@objectstack/spec's public surface, a real consumer compiling against objectstackmain. It is required in objectui's ruleset 11776024, and in the merge queue too. When objectstackmainmoves the shape, every queued objectui PR is ejected until objectui repairs the tripped site. - Measured episodes since it went live:
- 2026-09-20: objectui#10080.
- 2026-09-24: a fault in the gate's own setup, fixed by objectui#10238.
- 2026-09-28: objectui#10916, tripped by objectstack#20369. Its timeline was: the objectstack merge at 06:56Z, the card filed at 07:17Z, and a claim only at 07:44Z, on the maintainer's direct instruction. In the meantime objectui#10901 was ejected at 07:27Z and again at 08:02Z. The 27 minutes between card and claim were spent waiting for a grade, while the precedent repair (objectui#10080) was a single tripwire burned down.
- Moving the gate upstream, as a required check on objectstack spec PRs, was weighed and set aside. It costs about 12 minutes of CI per run (median 12.4 min over the last 36 completed runs) and a cross-repo lockstep that would slow both repositories.
What to write into references/lanes/ui.md
- The new rule is an exception to line 8's 「⛔ 不产
domain:*、type 与定级,中央分诊唯一生产」, for this one signal only:Spec Main Shape Gatered on objectuimainor on a merge-queue commit, with an attributed diagnostic that the diff under test did not cause. - What any
domain:uiseat does on that signal:- claims at once as a stop-the-bleed, at p0 standing;
- adds no grade label (triage still grades afterwards);
- dispatches a repair that compiles on both the installed spec and spec
main, under the gate's no-disable, no-skip rule.
- Target: the queue is restored within an hour.
- Unchanged: the gate itself, its requiredness, and ruling C. SKILL.md's emergency direct-triage duty for P0 suspects (its line 145) still applies alongside the claim.
- objectstack side: no required check. At most, a later report-only run on PRs touching
packages/spec/src.
Already in force
The seat recorded the ruling on its seat post (objectui#5560) and on objectui#10916. That claim was taken under the maintainer's per-case 「立刻接手」 an hour earlier, and this rule now covers it.
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 28, 2026
Path: fleet decision — a red required objectui gate is claimed within minutes, not after a grade | none (maintainer-direct) | none
Triage: first grade —
tooling·priority:p2·domain:skills·area:devpath·pm:queueTriage: lands in
.claude/skills/pm-dispatch/references/lanes/ui.md⇒domain:skills. It is governed.claude/**text, Tier S, landed by the skills lane at its own review tier.Rationale:
pm:queuelike the precedents pm-dispatch: a re-seated PM starts at the default concurrency (batch 3); a dispatch posture the maintainer gave a previous session (serial, batch N) ends with that session's shift and is not inherited through the handover brief #20154 and finding(pm-dispatch): a sister-repo seat's claimmodel:line has no mechanical source —dispatch-gates.mjs --tierrefuses a sister checkout, so a hand-written ceiling tier became one seat's default for a whole shift and nothing caught it #20250 (bothtooling· p2 ·domain:skills).Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T08:58Z. ⛔ Not a claim, ⛔ not a dispatch.Scope, exactly as agreed.
Spec Main Shape Gateon objectuimainor in its merge queue is claimed at once by anydomain:uiseat as a stop-the-bleed, without waiting for triage's grade.Triage's side. The existing triage-duties clause already covers the grade: a maintainer-named or P0-suspect card gets direct triage without waiting for a timed round. This card changes no triage text. The ui seat's claim may precede the grade, which follows on the next fire.
The line must name the exception it makes. SKILL.md says a card with no
domain:*label is never claimed (「无标签的卡 ⛔ 不得认领」). This standing rule lets a ui seat claim before triage labels the card. That is valid only as the maintainer's ruling (maintainer rulings rank above the skill text), so the new line cites the ruling and states which rule it overrides. Otherwise two texts disagree and a seat follows the stricter one.Execution note. The line must fit the skill-line ratchet: pay for the added line with a removed one. ⛔ No re-wrap. Also check
check-skill-id-lint: the operational text cites no issue number.objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 6
Session:
session_01MjvgiFAmjHqsxy1XLiVYfHAccount:
os-steve(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-20411-ui-lane-shape-gate-ruleWorktree:
objectstack-issue-20411Domain:
domain:skillsSeat:
domain:skills#1File surface:
.claude/skills/pm-dispatch/references/lanes/ui.md(one standing line, paid by one removed line in the same file); ⛔ nothing else under.claude/**— SKILL.md's no-label rule andtriage-duties.mdstay as they are (the triage says this card changes no triage text; the new line names the rule it excepts); stop on breach; explain in the reportContainer & model:
M(one rule line that states the maintainer's ruling, the one signal it covers and the SKILL.md rule it excepts, in a 38 / 38-line file with no headroom),mode:subagent,model: TIER_DEFAULT(dispatch-gates --tierat789b2ae5: no path-derived mandate for.claude/skills/pm-dispatch/references/lanes/ui.md; the seat reviews in-seat atCONTRACT_REVIEW_TIERas the compensating control)Clause-②: no
Thread-read: 5866739618
Serial constraints cleared: none — the file lists of all 12 open PRs (read 2026-09-28T09:19Z) touch nothing under
.claude/skills/pm-dispatch/; noissue-20411head onorigin. Last landing on the file:f151ef2c(2026-09-23; no same-day churn). Line ratchet on the file: 38 / 38 lines, headroom 0 (widest-row pin 0 — the file has no table) ⇒ net ≤ 0 lines, paid by deletion in the same file, ⛔ no re-wrap, ⛔ no ceiling raise.check-skill-id-lintscans.claude/skills/pm-dispatch/**⇒ the operational line cites no issue or PR number..claude/**is governed Tier S: the seat lands after its## Contract reviewPASS with every check green. Claimed 2026-09-28T09:20Z.objectstack-fleet commentedon Sep 28, 2026
os-dev-report
{ "issue": 20411, "status": "done", "branch": "claude/issue-20411-ui-lane-shape-gate-rule", "pr": "https://github.com/objectstack-ai/objectstack/pull/20417", "session": "session_01MjvgiFAmjHqsxy1XLiVYfH", "premise_still_valid": true, "summary": "The ui lane charter (.claude/skills/pm-dispatch/references/lanes/ui.md, section 形态) now carries the ruled standing rule as one 120-byte line directly under the rule it excepts: '- 维护者裁决例外于上条与 SKILL.md 无标签禁认领:main/队列 `Spec Main Shape Gate` 红即止血认领。' (authority, both excepted rules, signal, action). It is paid for in the same file: old lines 8 and 9 are merged into one 120-byte line by DELETING their two pointer clauses (both name SKILL.md 多仓协调 rules that have lived in references/cross-repo-coordination.md since f151ef2c; line 3 already points the charter there) plus the word 评论 and 加 spelled as +; both facts kept, line 8's rule text up to 中央分诊唯一生产 byte-identical. 38 / 38 lines, every line within the 120-byte budget; draft PR 20417 open, assignee os-steve, skip-changeset applied; worktree removed. Premise re-measured: objectui ruleset 11776024 (active) requires `Spec Main Shape Gate`, and its workflow on objectui main subscribes merge_group.", "files_changed": [ ".claude/skills/pm-dispatch/references/lanes/ui.md (+2 / -2)" ], "line_budget": { "ui.md": { "lines": "38 -> 38 (ceiling 38, headroom 0)", "bytes": "2552 -> 2601", "tokens_ceil_bytes_div_4": "638 -> 651", "edited_line_bytes": "L8 108 -> 120, L9 83 -> 120 (max 120)" }, ".claude/skills/pm-dispatch/** (whole tree)": { "lines": "2618 -> 2618", "bytes": "224064 -> 224113", "tokens_ceil_bytes_div_4": "56016 -> 56029" }, "payment": "old L8+L9 = 191 bytes -> merged 120 (-71, all deletions); new rule +120; net +49 bytes, 0 lines" }, "gates": [ "all at head 8dbfe743; derived by node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (17 commands; stderr line 1: tree of objectstack-ai/objectstack at commit 8dbfe743)", "pnpm check:pm-skill-ratchet :: exit 0 :: ui.md is 38 lines (ceiling 38; headroom 0); widest table row 0 bytes (pin 0); self-test 157 cases pass", "pnpm check:pm-skill-id-lint :: exit 0 :: 34 file(s) clean (pattern /#[0-9]{3,}/g); self-test 14 cases", "pnpm check:skill-frame-sync :: exit 0", "pnpm check:nul-bytes :: exit 0 :: scanned 9904 text file(s), no raw ASCII control bytes; plus self-scan grep -naP of ui.md and the PR body: no hit", "pnpm check:pm-governed-merges :: exit 0 :: self-test 454 assertions", "pnpm check:doc-authoring :: exit 0", "pnpm check:agent-test-spelling :: exit 0", "pnpm check:cross-package-test-inputs :: exit 0", "pnpm check:driver-memory-census :: exit 0", "pnpm check:gitlink-declared :: exit 0", "pnpm check:refd-timer-probe :: exit 0", "pnpm check:watch-hint-literal :: exit 0", "node scripts/check-closing-keyword-parity.mjs :: exit 0 ; --self-test :: exit 0", "node scripts/check-comment-mask-corpus.mjs :: exit 0", "node scripts/pm/check-harness-current.mjs --self-test :: exit 0", "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: first run exit 3 PREREQUISITE NOT MET (formula + lint unbuilt in the fresh worktree; nothing measured) -> built via os-verify-lock (VERDICT command-exit 0, held 270s) -> rerun exit 0 (58 self-test cases; 22 examples across 456 files clean)", "node scripts/pm/dispatch-gates.mjs --ran :: exit 0 :: 17 derived famil(ies) accounted for, 17 run, 0 NOT-MEASURED (a DERIVED zero, all 17 recorded an exit code and none of them is 3)", "CI on PR 20417 at report time (one read, no wait): 14 success, 12 skipped, 3 in_progress; Lint & Repo Gates in_progress; Check Changeset success; Governed Surface Queue Guard success; Test Core success; Dogfood Regression Gate success" ], "tests": "No package code touched, so no build closure (1), package test or typecheck (2) is owed; the owed verification is the gate set above. Line-width evidence, taken with the gate's own exported scanLineLengths: as committed, offenders [] with both edited lines at 120 bytes; positive control in memory (nothing written): +3 bytes on L8 -> offender L8 123 bytes, on L9 -> offender L9 123 bytes. Falsification evidence for the dispatch's route: the literal semicolon merge of the 789b2ae5 lines 8+9 measures 169 bytes -> offender, so it frees no line. Changeset: skip-changeset -- the one path is under .claude/**; root package.json is private: true; 0 of packages/**/package.json name .claude (positive control: 69 name dist). PR body read back via REST: 10749 bytes sent, 10749 stored, byte-identical; closing-keyword parity --body binds only the closing declaration for this card (2 of 3 parsers, the same card).", "deviations": [ "Mechanism assumption 1 falsified: the file's line WIDTH is pinned -- scripts/pm/check-skill-line-ratchet.mjs holds every line of every ceilinged file to MAX_LINE_BYTES = 120 UTF-8 bytes (CJK = 3). Consequence for assumption 3: the 8+9 merge frees a line only by deleting content (two pointer clauses, 评论, 加 -> +), not by the semicolon join (169 bytes). Candidate and placement are the dispatch's; the wording is not.", "The suggested new-rule wording (several hundred bytes) is not used: the line is the kernel at exactly 120 bytes. Left to the card and PR body, not the line: p0 standing, no grade label by the seat, dual-compile repair, no-disable/no-skip, one-hour target, gate/requiredness/ruling C unchanged, SKILL.md P0 emergency triage alongside, no objectstack-side required check, and the attribution qualifier (the gate's own red names the objectstack commit).", "check:doc-formula-expressions needed a prerequisite build under the verify lock before it measured; nothing narrowed or skipped.", "Dispatch internal inconsistency, reported not chosen: single-card clause says .claude/** is Tier S, generic clause says Tier H; AGENTS.md Prime Directive 14 puts all of .claude/** in Tier S. Irrelevant to dev behaviour: PR stays draft, not readied, not queued.", "Attribution: the harness reminder asked for a model-named Co-Authored-By trailer and a different PR footer; AGENTS.md (which the reminder defers to) governs -- commit carries the model-free pair (Co-authored-by: Claude, Claude-Session: session URL) and the PR body ends with the session-URL footer." ], "mcp_calls": "0 -- no MCP GitHub tool was called", "api_writes": "4 REST writes in 3 fleet-write relay dispatches (each dispatch = POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) POST /repos/objectstack-ai/objectstack/pulls (draft, run 36406179938); (2) POST /repos/objectstack-ai/objectstack/issues/20417/labels skip-changeset + (3) POST /repos/objectstack-ai/objectstack/issues/20417/assignees os-steve (one run, 36406289718, read back MATCHES); (4) POST /repos/objectstack-ai/objectstack/issues/20411/comments (this report). Plus 2 git pushes (empty branch probe, then 8dbfe743), not REST.", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · noted, not filed · .claude/skills/pm-dispatch/references/lanes/hotcrm.md line 8 carries the same dead pointer (纪律全文在 SKILL.md 多仓协调规则 4; SKILL.md has had no numbered 多仓协调 rules since f151ef2c). Outside this card's declared file surface; untouched. Class: none of a/b/c (agent-text drift). In PR Acceptance notes. dedupe words: 多仓协调规则, stale pointer, lanes hotcrm, cross-repo-coordination", "carrier: 承接者:无 · noted, not filed · objectui .github/workflows/spec-main-shape-gate.yml header (objectui main, last touched f4f1f45524) still says the context is not required yet and that scripts/dependabot-merge-gate.mjs keeps it in NOT_A_GATE; both false now (ruleset 11776024 requires it; that script lists it in REQUIRED_CONTEXTS). Comment drift in the sibling repo, class none. In PR Acceptance notes. dedupe words: Spec Main Shape Gate, NOT required yet, requirable, header drift" ] }Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
ACCEPT — PR #20417 (
domain:skillsseat 1,session_01MjvgiFAmjHqsxy1XLiVYfH) · 2026-09-28T10:12ZVerdict on the dev report 5867629240, checked against GitHub and
origin/main, not against the report's narration.Checklist: draft, base
main, one commit8dbfe743, first lineFixes #20411,Clause-②: noat line start, every other number in a safe spelling (objectui#9860 / #10916 / #10080 / #10238 / #10901, objectstack#20369, #20154, #20250 — no closing keyword beside any of them), one file inside the claimed surface (.claude/skills/pm-dispatch/references/lanes/ui.md+2 / −2), nothing else touched,skip-changeseton (read back), PR assignee = card assignee,## 维护者速读(草稿)present with its five parts, session-URL footer, model-free commit trailers, report JSON parses,mcp_calls0,api_writes4 in 3 relay dispatches as listed.Spot readings (mine, at 2026-09-28T10:00Z): the diff read line by line (the merged rule line and the new exception line, both exactly 120 bytes, at the file's per-line pin); the dropped pointers confirmed stale on
origin/main(SKILL.md:83is a table row; 规则 1 / 规则 4 live inreferences/cross-repo-coordination.md:23/:36, which the charter's:3already cites); the line ratchet (38 / 38, widest-row pin 0) andcheck-skill-id-lint(34 files clean) re-run on a detached checkout of the head, both exit 0;check-governed-merges --pr 20417: GOVERNED, Tier S, 4 changed lines. Detail in the## Contract reviewrecord on the PR (5867704107, PASS).CI reading (at 2026-09-28T10:11Z): every check-run on
8dbfe743completed — 18 success, 12 skipped, every skip in the roster (check-expected-skips --pr 20417: OK); no lane still running;mergeable_stateclean.Deviations accepted: the order's line-width assumption was wrong (the ratchet pins every line to 120 bytes) and its tier line was inconsistent (Tier S in the single-card clause, Tier H in the generic tail) — both the seat's defects, both handled right by the dev; the prerequisite build under the verify lock. The two Acceptance-notes observations (the same stale pointer in
lanes/hotcrm.md:8; objectui's shape-gate workflow header drift) stay out, carrier none, ⛔ not cards.Landing:
check-governed-merges→ GOVERNED, Tier S (.claude/**). The in-seat## Contract reviewPASS record is on the PR for this head; with every check green or an expected skip, this seat lands through the relay (pr_ready+automerge_enable) and confirms by content onorigin/main.Generated by Claude Code
pm(lanes/ui): ruled standing exception — a red Spec Main Shape Gate o…