You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
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
⏸ PARKED — Clause-②, 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
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 serialises — convertFiltersToAST / filterGroupToMongo / ValueDataSource / FilterConditionField. #8513 landed, #8748 is in PR #8791; remaining #8568 · #8567 are different defect shapes ⇒ ⛔ not foldable.
⛔⛔ Cards whose pm:queue label is NOT trustworthy — measured this shift
#4695 and #3988 were released pm:on-hold → pm: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).
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 box — hidden 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-design — success 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.
Seat registration post for the
domain:uilane — the objectui execution seat (maintainer ruling 2026-08-21, the three-way split of objectui cards intodomain: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
session_01611D6ZaRaMmwTNQmSbk8MH, GitHub identityos-zhuang(id 277994282, measured withget_me). Seat taken 2026-09-09T04:19Z⛔⛔ TIER MAPPING — read from source, ⛔ never from memory
From
objectstack:scripts/pm/dispatch-gates.mjs(:10345,:10348,:10176):⛔⛔⚠️ 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.
CONTRACT_REVIEW_TIERis 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).⛔ 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.mdline 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:How to run it when the tier returns: launch a review subagent with an explicit
modelatCONTRACT_REVIEW_TIER, then verify by grepping the harness-stampedmodelfield 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 andopen_questionsentry 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: 「标签在复核完成前原样留置,卡在队列外等待是安全态」.
2. Ledger
R1 — 4 dispatched · 3 MERGED, 1 closed duplicate
f84760f—object-calendarreads theallDayFieldit resolvesc03d03b—max_lengthhonoured on every rich-content fieldfb3a101—$and/$orexecuted;$notdeliberately still refusingduplicate_of #8451; the work had landed 19.9h before the card was filedR2 — 3 dispatched · 3 MERGED
6fae5e2— desktop viewport stated in 15 files5591f03b— a windowed lane header says77+, not77. Needed a patch round: the refactor moved the literal objectui#7322's source-text pin greps for; spelling restored inline, ⛔ pin never weakened6cc48c4— licence prompt, default MIT, writes the textR3 — 5 dispatched · 3 MERGED, 1 landing, 2 parked on the tier
793af39da— a 200 carrying no key stops reportingRequest failed (200)bc444b347— a markeduserMessageoutranks the localized 409/403 copyb6d07df4b— one horizontal axis for a swimlane boardClause-②, awaiting an in-seat contract reviewClause-②, 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 (readEnvelopeFailureTextcollapsesuserMessage || messagewith no provenance) and had to carry it across the throw. #8448's refuted my "one shared scrolling ancestor" route mechanically — a wrapper becomesregion.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-shellpublic entry → PR #8792.Filter dialect is ONE region and serialises —
convertFiltersToAST/filterGroupToMongo/ValueDataSource/FilterConditionField. #8513 landed, #8748 is in PR #8791; remaining #8568 · #8567 are different defect shapes ⇒ ⛔ not foldable.4. ⛔ Fences
Clause-②on both limbs (addsapprovalto a published authoring type; narrows thestateunion — breaking, shipping asminor).(aiInitialMessages as any)is LIVE — it hides a real TS2322 from a parts builder that emitsRecord, notUIMessagePart#8426 —pm:blocked,Blocked-by: #8442. Ruled option A (batch Migrate to Tailwind CSS v4 PostCSS architecture #86).Blocked-by: #8449. Dispatchable the moment PR fix(plugin-kanban): the swimlane region owns the vertical scroll, and the column header sticks (objectui#8449) #8798 merges.groupByin the kanban config OVERRIDES the lane ListView just resolved — measured active, and now unfed #8365pm:retriage· finding(plugin-calendar):object-calendarhonours a SECOND, off-spec spelling ofdata— the{ provider, items }record-source config the contract refuses by kind #8348 ⛔ two directions a dev may not choose · filter-builder declares one operator vocabulary and renders another: the mirror refuses every dropdown id but three, and every id it accepts but three draws a blank trigger #7561 ⛔ pre-ruling · finding(data-objectstack): the object-schema SERVE path runs no parse, so FieldSchema strictness is not evidence that a refused key cannot reach a consumer #7650 ungraded · finding(data-objectstack): aggregate()'s spec-shape branch never readsfilter/field/function, so an arraygroupByon the LEGACY shape silently drops both the filter and the measure #6864 held on finding(data-objectstack): aggregate()'s spec-shape branch sendswhereunlowered, so one chart's filter is lowered or not depending on which aggregation shape it uses #6825 ·createIdentityImportDataSourcespreads a class instance, solistImportMappings(a prototype method) is dropped and the saved-mapping selector is hidden onsys_userby accident rather than by the design the file states #7740needs-user-decision· When the @objectstack/spec pin moves to 17.3: PR #7510 / #7520's comment "repairs" become FALSE —rowsandoptions[].descriptionare now declared keys #7635 dead claim.content.typeisactivity-timeline, which nothing registers — a reader gets the OBJUI-001 panel #8114 — suspected-abandoned claim, no remote branch. ⛔ Do not recycle before 2026-09-10T02:10Z.descriptionis served but never rendered — ObjectView's relay drops it on the way to ListView #7199 / [finding] The object-view relay'sviewDefis an untyped record, so a MISSING key rung is invisible to tsc — the same defect has now been fixed twice (description,rowColor) with a third half still open #7559 are NOT the same defect as Object-bound actions are hidden by the ADR-0066 D4 capability gate with nothing anywhere saying so — the relay carriesactionsand the button IS drawn (premise falsified); decide therequiredPermissionsobservability contract #7234 — ⛔ do not close them against PR test(app-shell): pin that object-declared toolbar actions reach the DOM (objectui#7234) #8123.⛔⛔ Cards whose
pm:queuelabel is NOT trustworthy — measured this shift#4695 and #3988 were released
pm:on-hold→pm:queueby the #8773 hold audit (2026-09-09T05:2xZ) on the claim «noBlocked-by:, noRestart-when:, no pending ruling». In both, that is false against comments in the card's own thread — each has a writtenRestart-when:(neither trigger fired, re-measured) and each has an unmade contract ruling. Releasing topm:queueis 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.⛔ 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.mjsexists; 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 = NandscrollIntoView()both succeed on anoverflow: hiddenbox —hiddenrefuses 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: trueagain 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 thedraftflag 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/mainwith a lit control. That discipline stopped #6830 before a dev was spent and cleared #7980 for dispatch, in the same round.⭐⭐ The
pm:queuelabel 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_sessionnot-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:⚠️ This seat first ran the guard against
docs/adr/**·.claude/**·skills/**·AGENTS.md·CLAUDE.md. Approversos-zhuang,hotlong.packages/types/**as a "control", got NOT GOVERNED, and only a real control (AGENTS.md) revealed the set. ⇒ always runnode scripts/check-governed-queue-guard.mjs --test AGENTS.mdas 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-design —successon 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=2dies (CACError: Unknown option --concurrency); correct ispnpm --workspace-concurrency=2 --filter PKG build, flag BEFORE--filter(hit independently by two devs) · ⛔pnpm --filter PKG exec vitestis 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.mjsdoes NOT exist in objectui — derive gate families by hand and say so in the claim · ⛔@objectstack/specis NOT resolvable from the primary checkout (nonode_modulesthere), so spec-version and case-count claims can only be checked from a built worktree ·check-governed-merges.mjsdoes not exist here — objectui enforces atmerge_groupwithgoverned-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_issueswith two labels returns the UNION (#7582) ·get_job_logsreturns only the TAIL ·enable_pr_auto_mergeechoes an emptymethodeven when it applied — verify by queue ref and parent-count = 1 · theskip-changesetlabel is inert here · this repo forbidsmajor, so a deliberately breaking change shipsminor· an empty-frontmatter changeset is the accepted form for a test-only PR · REST/search/issuesis 403 by policy in dev containers, and this repo'ssearch_issuesreturns false zeros — ⇒ quote a lit dedup reading (a positive control), never an absence.