Skip to content

[pm:seat] domain:ui @ objectui — 🟢 os-zhuang · session_01611D6ZaRaMmwTNQmSbk8MH · R1 seated 2026-09-09T04:19Z · refreshed at the R3 boundary 09:1xZ #5560

Description

@os-sales

Seat registration post for the domain:ui lane — the objectui execution seat (maintainer ruling 2026-08-21, the three-way split of objectui cards into domain:devx / domain:spec / domain:ui).

Body is authoritative; title and assignee are derived views. Single writer: the sitting seat PM. Comments are audit only and never carry state.

1. 当前 PM

status 🟢 seated. session_01611D6ZaRaMmwTNQmSbk8MH, GitHub identity os-zhuang (id 277994282, measured with get_me). Seat taken 2026-09-09T04:19Z
how Maintainer-ordered FORCED takeover of a live seat — 「强制接管 domain:ui」. All four mutex readings said stand down; the override is arbitration. Readings table in the 04:19Z takeover comment
batch 3, set by the maintainer verbatim: 「任务很多,并发保持3」 (2026-09-09 ~05:4xZ)
refreshed R3 round boundary, 2026-09-09T09:1xZ

⛔⛔ TIER MAPPING — read from source, ⛔ never from memory

From objectstack:scripts/pm/dispatch-gates.mjs (:10345, :10348, :10176):

TIER_FLOOR           = 'sonnet'            ← mechanical cards ONLY
TIER_DEFAULT         = 'opus'              ← M/L, rulings, ANY design judgement
CONTRACT_REVIEW_TIER = 'claude-fable-5-1'  ← clause ①/② work

⛔⛔ CONTRACT_REVIEW_TIER is MEASURED UNAVAILABLE — four readings on 2026-09-09, each by sending a request at that tier: req_011CesHk4obaXbWbyLv7N2N9 (05:1xZ) · req_011CesRvRDtifao1i75vuaXb (06:57Z) · req_011CesUrRmcy9cg6bJBcUXWo (07:34Z) · req_011CesaQjLmdhQoXPVgd31e7 (08:48Z). ⚠️ The message is "You've reached your Fable limit … manage usage credits" — that is an account quota, not transient overload, so it will not clear on its own until the usage window resets or credits are added.

Re-test only by sending a request at that tier. ⛔ Not by reading a session object, ⛔ not by inheriting any seat's note — including this one.

⛔⛔⛔ THE CORRECTION THAT MATTERS MOST — the previous revision of this post was WRONG

The 05:5xZ revision said: "Quota-exhaustion exemption is live: Clause-② review falls back to TIER_DEFAULT." That is false and it is now withdrawn.

references/contract-review.md line 60, verbatim:

契约复核 ⛔ 不适用额度耗尽豁免降档:豁免对象是派发,复核正为补偿低档派发而存在。

The quota-exhaustion exemption covers CONSTRUCTION ONLY. The review is the compensating control for downgraded construction, so downgrading the review dissolves the very thing the exemption leans on. ⛔ A downgraded contract review is never available, never a maintainer question, and ⛔ must not be offered as an option. This seat offered it to the maintainer at 08:4xZ before reading the rule; the maintainer answered 「等项目总监评审」, which matched the written rule while the recommendation did not.

And the gate is not who you'd think. references/contract-review.md:

  • line 27 — 归属该卡派发席,交付后收集复核当轮席内完成 ⇒ the review is owned by the dispatching seat, in-round after delivery.
  • line 46 — 外部评审链是可选事后审计:分诊定时轮与总监席召唤 ⛔ 不是放行必要条件 ⇒ the 总监席 summon is an optional post-hoc audit, NOT a release condition.
  • 落地前检 ① — the gate is 席内契约档 PASS, a 达档裁决评论 on the card.

How to run it when the tier returns: launch a review subagent with an explicit model at CONTRACT_REVIEW_TIER, then verify by grepping the harness-stamped model field in its transcript — ⛔ 自述档位不是读数, ⛔ 传参只是配置不作达档读数. Feed it only the card, existing rulings and the PR; ⛔ never the dispatch brief or this seat's conclusions; brief it adversarially. Checklist is three items, per-item on the card or PR, ⛔ not prose: ① derived judgments named one by one; ② semver vs the changeset declaration; ③ every boundary flag and open_questions entry answered or escalated. Record the independence pair — Implemented-by: the branch, Reviewed-by: the ruling seat; same session ⇒ SELF-REVIEW, ⛔ does not count. On PASS: strip both carriers in one stroke with a provenance comment, then 落地前检 ②/③ (node scripts/pm/check-clause2-carriers.mjs --pair PR-NUMBER; 0 = clean, 4 = fail, ⛔ 3 is NOT clean) before ready/auto-merge.

Until then a Clause-② PR stays a draft with carriers hung. That is the named SAFE state, not a stall: 「标签在复核完成前原样留置,卡在队列外等待是安全态」.

⚠️ The exemption HAS been spent twice, on construction: PR #8768 (additive export) and PR #8779 (scaffolder behaviour). Both recorded.

2. Ledger

R1 — 4 dispatched · 3 MERGED, 1 closed duplicate

card PR merge
#8026 #8765 f84760fobject-calendar reads the allDayField it resolves
#8438 #8768 c03d03bmax_length honoured on every rich-content field
#8513 #8771 fb3a101$and/$or executed; $not deliberately still refusing
#8670 CLOSED duplicate_of #8451; the work had landed 19.9h before the card was filed

R2 — 3 dispatched · 3 MERGED

card PR merge
#8444 #8781 6fae5e2 — desktop viewport stated in 15 files
#8307 #8780 5591f03b — a windowed lane header says 77+, not 77. Needed a patch round: the refactor moved the literal objectui#7322's source-text pin greps for; spelling restored inline, ⛔ pin never weakened
#8041 #8779 6cc48c4 — licence prompt, default MIT, writes the text

R3 — 5 dispatched · 3 MERGED, 1 landing, 2 parked on the tier

card PR state
#8782 #8787 MERGED 793af39da — a 200 carrying no key stops reporting Request failed (200)
#8051 #8789 MERGED bc444b347 — a marked userMessage outranks the localized 409/403 copy
#8448 #8790 MERGED b6d07df4b — one horizontal axis for a swimlane board
#8449 #8798 ready + auto-merge armed — region owns the vertical scroll, header sticks
#8748 #8791 PARKEDClause-②, awaiting an in-seat contract review
#7980 #8792 PARKEDClause-②, awaiting an in-seat contract review

Every R3 dev either falsified a PM assumption or caught a false green. #8782's found the mint route cannot emit a keyless success (only 201, always with a key) — the arm is reachable through the consumer's .catch(() => ({})) instead, which is why its sentence quotes no status. #8051's found the mark is not readable at the arms (readEnvelopeFailureText collapses userMessage || message with no provenance) and had to carry it across the throw. #8448's refuted my "one shared scrolling ancestor" route mechanically — a wrapper becomes region.firstElementChild, so objectui#7303's pin fails either way. #8449's caught that its own first measurement pass was blind to the bug (see §5).

Cards filed this shift

#8782 (split out of #7980 per its own ruling) · #8797 (header-row scroll range 10px short of the lane rows') · objectstack#17054 · #8769 · #8770

3. 热文件串行队

Free: plugin-calendar · fields · plugin-form · plugin-detail · create-plugin · apps/console.

Held: plugin-kanban → PR #8798 landing, then #8797 (⛔ Blocked-by: #8449, edits the same header-row class list) · core/adapters + fields/widgets → PR #8791 · app-shell public entry → PR #8792.

Filter dialect is ONE region and serialisesconvertFiltersToAST / filterGroupToMongo / ValueDataSource / FilterConditionField. #8513 landed, #8748 is in PR #8791; remaining #8568 · #8567 are different defect shapes ⇒ ⛔ not foldable.

4. ⛔ Fences

⛔⛔ Cards whose pm:queue label is NOT trustworthy — measured this shift

#4695 and #3988 were released pm:on-holdpm:queue by the #8773 hold audit (2026-09-09T05:2xZ) on the claim «no Blocked-by:, no Restart-when:, no pending ruling». In both, that is false against comments in the card's own thread — each has a written Restart-when: (neither trigger fired, re-measured) and each has an unmade contract ruling. Releasing to pm:queue is also not one of the two actions #8773 authorises, and its scope says 「substance is not in scope」. ⛔ Neither is dispatchable. Recorded on both cards; escalated on #8773 (comment 5598111706) — 2 of 2 sampled, ratio unknown, whole batch worth re-checking.

⚠️ #6830 is not dispatchable either — this seat's ruling on it was withdrawn (comment 5597978179): arm A was already ruled 2026-09-04, its boolean half already merged (PR #8473), its field list carried facts the card's own dev had corrected, and its "#6620 is on hold" fence had been dead for 14h. The real remaining work is #8488 (the select half — a shared primitive, call-site count disputed 45 vs 61, ⛔ re-derive).

⛔ Owed to the maintainer

#8791 / #8792 contract reviews (blocked on the tier) · objectstack#16349 · #7188 / #7087 / #7712 (tier-blocked) · #7205 · #8044 · #7750 · decision box: #7621 · #6121 · #7479 · #7945 · #7946 · #7926 · #7499 · #7486.

⛔ The half-state patrol is DEAD here

scripts/pm/check-half-states.mjs exists; the anchor issue does not (#5986; #7852 records 50 consecutive red runs; #8740 carries the degrade-gracefully fix). Every round runs with that leg unavailable, ⛔ not passed.

5. 说明 — lane facts

⭐⭐⭐ A scripted scroll is NOT a reachability measurement. element.scrollTop = N and scrollIntoView() both succeed on an overflow: hidden boxhidden refuses user input, not script. #8449's dev built a first pass on those and it reported "6/6 lanes reachable" on the broken build — the bug reported as fixed. Drive the real input pipeline (page.mouse.wheel) for any affordance claim.

⭐⭐⭐ A PM landing and a dev's finalisation RACE, and the dev's write wins silently. On PR #8789: dev opened draft → PM flipped ready + armed auto-merge → dev set draft: true again to match its brief. A draft conversion drops auto-merge and merge-queue membership, and GitHub does not restore either on the next ready-flip. No error, no failure-shaped event. ⇒ after arming auto-merge, re-read the PR state; and every dispatch now carries: ⛔ never write the draft flag again after opening (⛔ not even while editing the body), and ⛔ report PR state you did not set rather than correcting it.

⭐⭐ A card body is a SNAPSHOT, never state. Three cards opened this shift carried a ruling in their comment thread the body does not mention (#7980 → 5583988475; #8051 → 5595068828; #8069 → 5594065532, which corrected this seat's whole tier posture). This seat ruled against two of them on a body-only read and caught it only on the post-claim race re-read. ⇒ ⛔ NEVER rule or dispatch on a body-only read: read the full thread and re-measure the card's load-bearing claims against origin/main with a lit control. That discipline stopped #6830 before a dev was spent and cleared #7980 for dispatch, in the same round.

⭐⭐ The pm:queue label carries two incompatible meanings — "triaged" and "ready for a dev". Measured this shift: 9 of 9 cards opened for dispatch were not dispatchable as labelled. objectui#8680 is the standing card; cost evidence posted there (5597643647, 5597997972), including that a stale body previously cost a full dev round (#8670).

⭐⭐ get_session not-found is NOT a death leg across identities — it resolves only the calling account's sessions. ⛔ Use it only within one account.

⭐⭐ The governed surface is exactly five paths, and it is the ADR/agent-instruction tree — ⛔ not the published type surface: docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md. Approvers os-zhuang, hotlong. ⚠️ This seat first ran the guard against packages/types/** as a "control", got NOT GOVERNED, and only a real control (AGENTS.md) revealed the set. ⇒ always run node scripts/check-governed-queue-guard.mjs --test AGENTS.md as the lit control before believing a NOT GOVERNED reading. A governed PR is parked as a DRAFT for a human merge — ⛔ never flipped ready, enqueued or auto-merged.

Presence in a list is not a reading of effect — a control must fire through the mechanism under test.

A zero needs a lit control every single time.

A ruling that names a dependency has not created one until the card carries it machine-readably (Blocked-by: + label). See #8426.

Landing verification is by CONTENT with a control proven to fire BEFORE the merge, ⛔ never by sha. Confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only; ref-absent proves nothing.

Line numbers in a card are stale by default.

Live E2E (informational) is NO LONGER red-by-designsuccess on every R1–R3 PR. A red there is now that PR's until proven otherwise.

A workflow RUN's conclusion can assert the opposite of its JOB's. ⛔ Never read a run conclusion as evidence here.

Tooling traps — ⛔ pnpm --filter PKG build --concurrency=2 dies (CACError: Unknown option --concurrency); correct is pnpm --workspace-concurrency=2 --filter PKG build, flag BEFORE --filter (hit independently by two devs) · ⛔ pnpm --filter PKG exec vitest is rejected by the objectui#3378 guard, which names the false-green it prevents (vitest re-roots to the package dir and silently runs another project's files as a pass) — run from the repo ROOT · the shared verify lock is /home/user/objectstack/scripts/pm/os-verify-lock.sh; it does not exist in objectui — use the objectstack copy · ⛔ scripts/pm/dispatch-gates.mjs does NOT exist in objectui — derive gate families by hand and say so in the claim · ⛔ @objectstack/spec is NOT resolvable from the primary checkout (no node_modules there), so spec-version and case-count claims can only be checked from a built worktree · check-governed-merges.mjs does not exist here — objectui enforces at merge_group with governed-surface-guard.yml, which refuses rather than audits.

Platform traps — a PR body edited via REST PATCH gains a second platform footer (create does not) ⇒ read back after an edit · an MCP issue_write-created issue body comes back with its trailing footer stripped · list_issues with two labels returns the UNION (#7582) · get_job_logs returns only the TAIL · enable_pr_auto_merge echoes an empty method even when it applied — verify by queue ref and parent-count = 1 · the skip-changeset label is inert here · this repo forbids major, so a deliberately breaking change ships minor · an empty-frontmatter changeset is the accepted form for a test-only PR · REST /search/issues is 403 by policy in dev containers, and this repo's search_issues returns false zeros — ⇒ quote a lit dedup reading (a positive control), never an absence.

Activity

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions