Repository navigation
tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts drop objectui#, ui/AGENTS.md nests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712
Description
Filing gate ④: sub-issue 4b/6 of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677. ⛔ Not a claim. Item 4 of the parent is split in two at filing: 4a = #25711, release and publish (fixed group, Console build, pin scripts); 4b (this card) = everything that today encodes "objectui is another repository" in this repo's governance.
Blocked-by: #25685 (merging now) for anything that runs against the ui/ tree; the inert parts (pm scripts learning ui/**, the governed-surface register) can land before cutover like PR A of #25697. Input: the roster table on #25697 (comment 6388182608).
Who does it, where it lands: the epic PM dispatches it (os-dev, objectstack checkout). Two PRs to objectstack-ai/objectstack main: PR 1 inert (pm scripts, governed-surface register for ui/**, dispatch-gates — lands before cutover; Tier S/H as the paths decide); PR 2 cutover-window (liveness evidence, spec tests, sdui-parser merge, AGENTS.md + ui/AGENTS.md, workflow deletions under ui/.github/; Tier H: AGENTS.md, .github/workflows/**).
维护者速读
两仓并成一仓后,本仓里所有"objectui 在另一个仓"的记法都要改:liveness 账本里 185 条 evidenceScope: cross-repo 证据有一部分是「objectui @某提交 的某文件某行」(另一部分指 cloud 仓,不动),合并后直接写仓内路径 ui/...,不再钉提交、不再续日期;161 个 spec 测试文件提到 objectui,其中真的去读 objectui 克隆/钉的改读 ui/,只是文字提到的不动;sdui-parser 两边各一份加一个 lockstep 检查,合并后留一份、删检查;AGENTS.md 里 41 处 objectui# 跨仓约定、pm 脚本里按仓分表的 objectui 行、domain:ui 车道,都并入本仓;objectui 自己的 AGENTS.md 变成 ui/AGENTS.md(嵌套,只管 ui/ 下);objectui 28 个 workflow 里 18 个治理类的,按 #25697 的去向表逐个并入本仓同类 workflow 或删除(嵌套的 ui/.github/ GitHub 本来就不会执行)。AGENTS.md 和 workflow 是受管面,按 Tier H 由你批准。
Scope
- Liveness ledger.
packages/spec/liveness/*.json: of the 185"evidenceScope": "cross-repo"entries, those whose evidence names objectui (objectui @<sha>: path#symbol) are rewritten to in-repo evidence (ui/<path>#<symbol>, scope per the README's in-repo value); entries namingcloud @<sha>stay cross-repo. The reader (scripts/liveness-*.mjs, README §evidenceScope) stops treatingui/as a foreign realm and resolves the paths like any in-repo path (exist-or-fail). The dev reports the split (objectui rows / cloud rows / mixed) before rewriting. - Spec tests that read objectui. Of the 161
packages/spec/**/*.test.tsfiles mentioning objectui, classify: (a) read the objectui tree through a clone, the pin orobjectui-lockstep.json→ readui/directly; (b) textual mention in a comment or fixture name → unchanged.packages/sdui-parser/objectui-lockstep.jsonandscripts/check-sdui-lockstep.mjs/check-sdui-manifest.mjs/gen-sdui-manifest-node.mjs/sdui-manifest.record.jsongo with item 3. - One sdui-parser.
packages/sdui-parser(@objectstack/sdui-parser) andui/packages/sdui-parserare two copies kept in lockstep by a gate. Keep one (the dev proposes which, with the import graph on both sides; the published@objectstack/sdui-parsername is the default to keep), make the other a re-export or delete it, delete the lockstep gate and manifest record. Assessment item P5. AGENTS.md,ui/AGENTS.md, pm scripts.AGENTS.md: the 41objectui#mentions and every "sibling repo" instruction (the../objectuicheckout, the pin bump procedure, cross-repo card references) become in-repo instructions or are deleted;domain:uijoins this repo's lane table. objectui'sAGENTS.mdbecomesui/AGENTS.md, scoped toui/and pointing up for anything repo-wide (rules that duplicate the root file are deleted, not restated).scripts/pm/**:GOVERNED_REPOS/check-governed-merges.mjsregister learns whichui/**paths are governed (ui/.claude/**,ui/skills/**,ui/AGENTS.mdby the same two-tier rule); the fleet relay's per-repo rows forobjectuistay until the repo is archived (sub-issue 5) and are removed in sub-issue 6;dispatch-gates.mjsderivesui/gates.- The 18 governance workflows (roster rows 1–6, 8–15, 20, 24, 25, 28 on tooling(ui-wiring): objectstack-side inert wiring for the
ui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697): for each, one of — fold into the objectstack counterpart (board-snapshot, changelog, changeset-guard, changeset-presence, check-links, cross-repo-issue-closer, dependabot-auto-merge, governed-surface-guard, half-state-patrol, hook-selftests, labeler, merge-queue-head-patrol, required-check-set-patrol, test-shard-timings-refresh) widening it toui/**; or port as a new objectstack workflow (line-citation-gate, repo-gates' doc/skill gates if they have no counterpart); or delete (anything the merge makes meaningless).ui/.github/is deleted at the end of PR 2 — nested workflow files never run.ui/.claude/hooks(8 hooks) andui/.githooks: merge into the root hooks or delete, with the hook self-tests covering what remains.docs-deploy.ymlfor objectui's site: keep as a second deploy job in this repo'sdocs-deploy.yml(the site stays a separate Vercel project) — the project id/secrets are the maintainer's.
Verification (the dev's)
- PR 1 on
mainas it is: every derived gate green;check-governed-merges.mjs --self-testand the queue guard self-tests pin the newui/**rows. - PR 2 on the
DO NOT MERGEverification branch of tooling(ui-wiring): objectstack-side inert wiring for theui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697: liveness reader green with zero objectui-citing cross-repo rows; the reclassified spec tests pass readingui/; sdui-parser's consumers on both sides build and test against the kept copy;AGENTS.mdgates (check:agents-*, line citations) green; hook self-tests green over the merged hook set; no workflow underui/.github/remains. - A table on this card: each of the 18 workflows → its disposition and the PR hunk that implements it.
Done when
- PR 1 merged before cutover; PR 2 green on the verification branch, approved by
GOVERNED_APPROVERS, handed to sub-issue 5 and merged in the cutover window after the subtree PR. git grep -c 'objectui @' packages/spec/livenessis 0;git grep -l 'objectui#' AGENTS.mdis empty; one sdui-parser package;ui/.github/absent.
Size: XL — the PM may split PR 2 by item if the diff crosses 3000 lines (the human-merge line applies either way). Clause-②: no. Metadata-protocol: none.
风险
- Liveness semantics: rewriting evidence must not silently upgrade a stale cross-repo claim to a fresh in-repo one; the dev keeps
verifiedAtas it is and lets the ledger's own staleness worklist re-date them. AGENTS.mdis read by every seat: PR 2'sAGENTS.mdhunk is reviewed against the pm-dispatch skill for contradictions before the maintainer sees it.- Two hook trees with overlapping names: a merged pre-commit must not run objectui's root-assuming hooks against objectstack paths —
uiRoot()from tooling(objectui-readiness): make the objectui tree merge-ready in its own repo before cutover — one react line, one zod range, uiRoot() helper, tsc heap, workspace-aware Console chunk tests, typecheck alias (parent #25677, 2/6) #25685 is the guard.
Dedupe
Open issues list 2026-10-24 23:05Z (REST, state=open 100 most recent) filtered on liveness / sdui / AGENTS / governance / objectui: only this epic's own cards and #25556 (superseded at sub-issue 6). Assessment item P5 (sdui-parser lockstep) is carried here rather than filed on its own. New.
Activity
objectstack-fleet commentedon Oct 25, 2026
Claim: epic #25677 round 5 (card threads; Tesla 2026-10-25 「你应该使用 pm-dispatch 技能派发」「并发可以到6」)
Session:
session_01RSDL3SFtJaKzcymvCD8RsUAccount:
os-teslaBranch:
claude/project-thread-15baee(the card thread's designated branch in objectstack-ai/objectstack — the thread can push only this branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-25712Domain:
domain:devxSeat:
epic:#25677File surface:
scripts/pm/**(governed-surface register,check-governed-merges.mjs, queue guard,dispatch-gates.mjsrunGit maxBuffer) + their self-tests; nothing underpackages/,AGENTS.md,.github/**in PR 1Container & model: M (PR 1 of 2; the card is XL),
mode:thread(thread sessionsession_01JjL3Jp6KnsA4vDma1b4KDa; order:/mnt/project-files/d1-merge/dispatch/in the project, FRAME.md + the card's file),model: opus,effort: high(coordinator default)Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: #25711 (4a, branch
claude/project-thread-a0vh3h) touches release files, notscripts/pm/**; the dispatch-gates maxBuffer item moves from the PR A2 bill of #25697 to this PR (recorded there when PR 1 is up); PR A2 keeps the partitioner + root build filterGenerated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
os-dev-report
{ "issue": 25712, "status": "done", "branch": "claude/project-thread-15baee", "pr": "https://github.com/objectstack-ai/objectstack/pull/25732", "session": "session_01JjL3Jp6KnsA4vDma1b4KDa", "premise_still_valid": true, "summary": "PR 1 of 2, inert, head faaeaeb47d. dispatch-gates spawns git with a 64 MiB maxBuffer (runGit + check-ignore); a slow self-test stages a 16,000-path index, proves ENOBUFS at the default buffer (control) and that trackedFiles reads it whole. The register matchers (governedSurfacesFor/governedPathsIn/governedTierFor) and the queue guard's CODEOWNERS mirror take an optional register (default GOVERNED_SURFACES); self-tests drive the six nested ui/ rows through them in both directions. Per the epic PM's decision B, the six rows themselves, the AGENTS.md/SKILL.md spans and the CODEOWNERS lines are deferred to PR 2 (recorded in the PR body). The card stays open: the PR says Part of #25712.", "tests": "check-governed-merges --self-test exit 0, 527 assertions (512 before; new battery 15). check-governed-queue-guard --self-test exit 0, 339 cases (335 before). check-governed-prose --self-test + gate exit 0, 31 cases. dispatch-gates --self-test both tiers exit 0, 2178 cases (fast 1913 / slow 265), the 5 new maxBuffer cases included. No ablation: tooling/script change, the control leg is the ENOBUFS case.", "gates": "39 derived (dispatch-gates --commands --repo objectstack-ai/objectstack at faaeaeb), all 39 exit 0, exit captured before any pipe; --ran: 39 derived, 39 run, 0 NOT-MEASURED, exit 0. check-governed-merges --branch HEAD: exit 0, not governed, +136/-11 over 5 files. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "6 — read-only: issue_read x4 (card, card comments x2, #25697 comments), pull_request_read x1 (read-back), plus 0 write tools", "api_writes": "2 relay writes — fleet-write pr_create (PR #25732, labels skip-changeset, assignee os-tesla) and this post-stamped comment; plus 1 git push", "open_questions": [ { "question": "ui/.claude/** lands Tier H in PR 2 (fail-closed; Tier H in objectui today). Should it move to Tier S like the root .claude/**?", "options": [ "A keep Tier H", "B Tier S by maintainer ruling (one field)" ], "recommendation": "A, because Tier S would loosen that content's landing without a ruling" } ], "out_of_scope_findings": [ "carrier: #25712 PR 2 · the six ui/ register rows, AGENTS.md and SKILL.md spans, CODEOWNERS lines (deferred by the epic PM, recorded in PR #25732)", "carrier: none · noted, not filed: check-governed-prose header still says Containment covers all six entries while the register has seven" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
ACCEPT (PR 1 of 2) — dispatch seat. objectstack#25732 (head
faaeaeb47d, branchclaude/project-thread-15baee, +136/−11, 5 files, all underscripts/pm/**) is accepted as the inert half of this card. The card stays open for PR 2.Checked against the order (
/mnt/project-files/d1-merge/dispatch/4b-25712-objectstack-governance-pr1.md) and the PM ruling B (register code able to carry nested rows + self-tests + dispatch-gates maxBuffer; the sixui/**Tier-H rows, prose spans and CODEOWNERS lines deferred to PR 2):dispatch-gates.mjs: git children get a 64 MiB stdout ceiling inrunGitandignoreVerdicts; measured merged listing ≈ 1.36 MB vs spawnSync's 1 MiB default, which is the Lint · PM dispatch-gatesENOBUFSred on the verification run. Slow-tier self-test stages a 16,000-path index with anENOBUFScontrol. This also retires the dispatch-gates item of the PR A2 bill on tooling(ui-wiring): objectstack-side inert wiring for theui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697.governedSurfacesFor,governedPathsIn,governedTierFor, queue guardcodeownersMirrorVerdict) take an optional register defaulting toGOVERNED_SURFACES; no production caller passes one. New battery of 15 cases drives the six nestedui/rows through the real matchers (527 assertions, roster floor 35; queue guard 339 cases; prose gate 31 cases)./mnt/project-files/d1-merge/out/4b-25712-pr2-bill.md): six Tier-H rowsui-adr,ui-claude-tree,ui-skills-catalog,ui-agents-md,ui-claude-md,ui-workflows(repos: ['objectstack'];ui/.claude/**stays Tier H), the AGENTS.md §14 / SKILL.md spans (ratchet ceilings 1117/1117 and 319/319 are freed by PR 2's AGENTS.md rewrite, no ceiling raise), six CODEOWNERS lines, and the pin fliptoday-the-register-does-not-know-ui-…. Cutover window order: subtree PR → PR B → this card's PR 2 → 4a.ui/tree).check-governed-merges --pr objectstack-ai/objectstack#25732on the final file list: NOT governed (0 of 5 paths hit the register), 147 changed lines ≤ 3000 — ordinary queue landing.Landing: the seat flips #25732 ready and arms auto-merge via the relay now. PR 2 is dispatched as its own card thread against this card once the subtree PR window opens.
Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim: epic #25677 round 6 (card threads; Tesla 2026-10-25 「你应该使用 pm-dispatch 技能派发」「并发可以到6」)
Session:
session_01RSDL3SFtJaKzcymvCD8RsUAccount:
os-teslaBranch:
claude/project-thread-6qe56u(the card thread's designated branch in objectstack-ai/objectstack — the thread can push only this branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-25712Domain:
domain:devxSeat:
epic:#25677Scope: PR 2a of 2 —
scripts/check-sdui-lockstep.mjs,scripts/check-sdui-manifest.mjs,scripts/gen-sdui-manifest-node.mjslearn the in-treeui/oracle when.objectui-shais absent (pin mode unchanged),sdui.manifest.jsonregenerated; green onmainas it is. PR 2b (sixui/**governed rows, CODEOWNERS, AGENTS.md / SKILL.md spans, PR 1 pin flip) is prepared as a patch in the project folder and opened after 2a merges. Nothing else of PR 2 tonight.Why now: after 4a #25745 deletes
.objectui-sha, both gates exit 1 inlint-repo-tooling(required laneLint & Repo Gates); measured on the cutover headc326d2fdf1with the file absent.Container & model: M (PR 2a + 2b of the XL card),
mode:thread(thread sessionsession_01A6SEitNngAMugGbuJHWsDS; order:/mnt/project-files/d1-merge/dispatch/4b-25712-objectstack-governance-pr2a.mdin the project, FRAME.md applies),model: opus,effort: xhighClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: #25745 (4a,
claude/project-thread-a0vh3h) deletes the pin and touches none of the three scripts; #25825 (cutover) touches none of them; #25827 (PR B) touches none of themobjectstack-fleet commentedon Oct 25, 2026
ACCEPT (PR 2a of the PR 2 series) — dispatch seat. objectstack#25833 (head
a6ee32ec59, branchclaude/project-thread-6qe56u, 3 files underscripts/, +993/−136) merged 2026-10-25 20:58Z ase2aaaf1c07. The card stays open.Checked against the order (
/mnt/project-files/d1-merge/dispatch/4b-25712-objectstack-governance-pr2a.md):.objectui-shapresent the lockstep and manifest gates and the generator behave as before (golden harnesses byte-identical; existing self-test rows unchanged); without it they judge the in-treeui/copy. Measured on the sitting tree (cutoverc326d2fdf1+ 4a50bd417d30): lockstep 0 (no drift betweenpackages/sdui-parser/srcandui/packages/sdui-parser/src); manifest 1 until the regeneration, 0 after it.sdui.manifest.json(107 components) describes pinb41ed7f689; the frozen registry has 106 (objectui#13449 retiredhtml). One artefact cannot serve both, so PR 2a carries code only and the regeneration rides with the pin deletion in 4a release(ui-merge): one release lane for both scopes — @object-ui joins the fixed group, @objectstack/console builds from ui/apps/console, the objectui pin is deleted (#25711) #25745 as a ready patch (/mnt/project-files/d1-merge/out/4a-sdui-manifest-regen.patch, applied by the 4a thread during its sitting re-merge). Until then 4a'sLint & Repo Gatesreds withrecord is missing inTreeand prints the one remedy command.node scripts/gen-sdui-manifest-node.mjs(96 of objectui's last 200 commits would have). Follow-up: regenerate-and-compare inBuild & E2E UI(ci.yml), next 4b dispatch.--ranreconciled; CI 34 success / 17 skipped; no governed path, no CODEOWNERS path → Tier S, landed via the relay (ready + auto-merge), queue merge.PR 2b (six
ui/**governed rows, CODEOWNERS,AGENTS.md§14 and pm-dispatchSKILL.mdspans, PR 1 pin flip; 5 files +73/−60; both ceilings paid in place) is measured (54 derived gates exit 0; Tier H verdicts on the sitting tree) and is being opened as a draft PR for the 09:00Z sitting; Tier H (AGENTS.md), maintainers approve after 4a. The rest of PR 2 (ui/.github/deletion with the 18 workflow dispositions, liveness ledger, spec tests, parser unification,AGENTS.mdcross-repo rewrite,ui/AGENTS.md, the ci.yml regenerate-and-compare step) is the next dispatch after the cutover.Thread report:
/mnt/project-files/d1-merge/out/4b-25712-pr2-final-report.md. Relay writes by the thread: 1 (+1 for 2b); MCP write calls: 0.merge(ui): objectui becomes the ui/ workspace of this repository — su…
release(ui-merge): one release lane for both scopes — @object-ui join…
feat(pm): the governed register gains the six nested ui/ workspace ro…
objectstack-fleet commentedon Oct 26, 2026
Plan (card thread): #25712 PR 2c of the PR 2 series. Not a claim; the dispatch seat adds the PM claim line below.
Session:
session_01A6SEitNngAMugGbuJHWsDSBranch:
claude/project-thread-6qe56u, restarted frommaine167956e3f(its earlier history, #25833 and #25834, is merged)Worktree:
objectstack-issue-25712Domain:
domain:devxSeat:
epic:#25677Scope: PR 2c. Main's red Test UI 8/16 and 9/16 tests that read the two workflows #25745 deleted (
changeset-release.yml,spec-range-floors.yml) are made to read what the tree has. Nothing is skipped; rows whose subject is gone retire with the disposition quoted.File surface:
ui/content/docs/guide/ci-cd-pipeline.md,ui/scripts/__tests__/ci-cd-pipeline-doc.test.ts,ui/scripts/__tests__/workflow-cache-save-bound.test.ts. No governed path, so expected Tier S. Nothing underui/.github/**.Why now: on
main(90a34e20,e167956e) Test UI 8/16 has 9ci-cd-pipeline-docfailures and 9/16 has 2workflow-cache-save-boundfailures, all reproduced locally (12 failed / 121 passed over the three files; the twelfth is the row below).Container & model: M,
mode:threadClause-②: no
Metadata-protocol: none
Responsibility: n/a, not a defect card
Thread-read: none
Serial constraints checked: #25852 (
claude/project-thread-a0vh3h:ui/packages/cliapp-generator test,ui/scripts/check-test-path-roots.mjs, apackages/linttest) touches none of the three files. #25851 (dispatch-gates slow tier) isscripts/pm/**.Owned red that stays after 2c, first row of 2d. Test UI 8/16 keeps one failure:
ui/scripts/__tests__/check-pre-install-import-graph.test.ts>finds no pre-install gate reaching a package, withThis is a true finding on the tree, not a stale pin. #25745 deleted
ui/scripts/objectstack-pin.mjs, but ten nested workflows still runnode scripts/objectstack-pin.mjs buildbefore their install step:ci.yml,docs-deploy.yml,lint.yml,live-e2e.yml,lockfile-dedupe.yml,node-esm-load-gate.yml,performance-budget.yml,published-dist-gate.yml,repo-gates.yml,shadcn-check.ymlunderui/.github/workflows/(about 99 lines of cache and build steps). Those files are Tier H since #25834 and never run nested. PM ruling A: no throwaway edits to files 2d deletes. It clears when 2d deletesui/.github/workflows/**, and the test is then retired or retargeted with its subject.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: epic #25677 round 7 (cutover aftercare; Tesla 2026-10-25 「你应该使用 pm-dispatch 技能派发」「并发可以到6」) 2026-10-26T00:51Z
Session:
session_01RSDL3SFtJaKzcymvCD8RsUAccount:
os-teslaBranch:
claude/project-thread-6qe56u(the card thread's designated branch in objectstack-ai/objectstack, restarted frommaine167956e3f; the thread can push only this branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-25712Domain:
domain:devxSeat:
epic:#25677Scope: PR 2c of the remaining PR 2 series (2c → 2d → 2e/2f/2g → 2h → 2i, one PR each, per the seat's plan 6405777597):
ui/content/docs/guide/ci-cd-pipeline.md+ui/scripts/__tests__/ci-cd-pipeline-doc.test.ts+ui/scripts/__tests__/workflow-cache-save-bound.test.tsread the tree 4a left (changeset-release.yml / spec-range-floors.yml deleted). Tier S. Ruling A (00:49Z): Test UI 8/16 keeps its one red,check-pre-install-import-graph(ten nested workflows still run the deletedscripts/objectstack-pin.mjs), until 2d deletesui/.github/workflows/**(Tier H); the finding is 2d's first row.Why now: Test UI 8/16 and 9/16 are red on every hourly full run of
mainsince 4a (#25745); nothing else owns them (Test UI 3/16 + Test Core 5/8 are #25852's,Lint · PM dispatch-gatesis #25851's).Container & model: M (2c of the XL card),
mode:thread(thread sessionsession_01A6SEitNngAMugGbuJHWsDS; order: the PM's 00:42Z + 00:49Z messages, the seat's plan comment, FRAME.md applies),model: opus,effort: xhighClause-②: no
Metadata-protocol: none
Responsibility: n/a — epic step
Thread-read: none
Serial constraints cleared: #25852 (4a follow-up,
claude/project-thread-a0vh3h) touchesui/packages/cliandpackages/linttests only; #25851 (dispatch-gates) touchesscripts/pm/**; #25853 touchesscripts/check-required-contexts.mjs; #25855 touches the rootci.yml; none of them touch the three files aboveobjectstack-fleet commentedon Oct 26, 2026
决策卡:删掉
ui/.github/workflows/之后,objectui 自带的受管面登记里那一行怎么处理(#26058,2d-3c)2026-10-26T10:36Z · PM 立卡(维护者 2026-10-26 03:31Z 规则:需要决策的都要有决策卡)。本卡挂
needs-user-decision。PR #26058 是 Tier H(路径 + 体量 +140/−14224),本来就要 os-zhuang 批;批准 #26058 即视为选 (b),不需要另外回字母。一句话问题: objectui 的旧工作流目录已经不会被 GitHub 运行,2d-3c 要把它删掉;但 objectui 自带的「受管面清单」里还登记着这个目录,删掉之后这份清单的自检会因为「登记的目录不存在」而变红。要么删掉这行登记,要么保留登记并把它改成「这个目录必须不存在」。
Governing text: objectui#12255(已关闭):「
.github/workflows/**joins this repository's governed surfaces — the AGENTS.md 受管面 list (five → six)」。根仓scripts/pm/check-governed-merges.mjs:1213行ui-workflows:prefix: 'ui/.github/workflows/', tier: GOVERNED_TIER_H(git grep -n "ui-workflows" origin/main -- scripts/pm/check-governed-merges.mjs)。.github/CODEOWNERS:56:/ui/.github/workflows/ @os-zhuang @hotlong。协议声明: 不改协议;只动
ui/scripts/check-governed-queue-guard.mjs的登记与其测试。前提(带 re-check):
governed-surface-guard.yml运行的是scripts/pm/check-governed-queue-guard.mjs(第 125、212 行),不是ui/scripts/check-governed-queue-guard.mjs。re-check:git grep -n "check-governed-queue-guard" origin/main -- .github/workflows/。ui-workflows行按前缀判,不需要目录存在,删目录后ui/.github/workflows/ci.yml仍判 Tier H(席位在 ci(ui-merge): delete objectui's nested workflows and Dependabot config; retire the action-ref scan and the CI page pin test with them #26058 实测;check-governed-merges.mjs --self-test的 UI_SPECIMENS 用例覆盖)。ui/.github/workflows/governed-surface-guard.yml,cutover(merge(ui): objectui becomes the ui/ workspace of this repository — subtree import at the frozen tip 9e1fe03286 plus the adaptation series (objectstack#25752) #25825)后它不再运行。选项 × 真实代价 × 工作量:
.github/workflows/**行(6 → 5)ui/.github/workflows/,ui 这层不再报警(根仍判 Tier H)业务含义直译: (a) = 把门牌摘了;(b) = 门牌留着,改写成「此门已封,重开报警」;(c) = 两个保安合成一个,另找时间谈;(d) = 为了让检查通过,摆一扇假门。
os-decision-facets
Prior rulings read:
ui/.github/workflowsgoverned → objectui#12255, tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts dropobjectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712 2d-3 拆分裁定(05:10Z:3a/3b Tier S、3c Tier H + 决策卡)、F12 = B(labeler.yml 保持惰性待子卡 4)、裁定 31 = A(内容导入,objectui 历史只在归档仓); ADR none; thread: none。推荐:(b)。 只看①选 (b);②③④ 是否翻转:否。置信缺口:(c) 的终态取舍(是否保留 ui 自己的 guard)没有在本卡评估,留给子卡 4。不取 (a):去掉了重建时的报警,而代价只差几十行;不取 (d):用假文件掩盖检查。
裁后执行: (b) ⇒ 维护者批准 #26058,PM 开 automerge,合并后 PM 在本卡贴 main 推送运行读数并关闭 2d-3。(a) ⇒ 席位在 #26058 用一个提交替换 (b) 的提交,重跑 ui 套件与电池(2182/0)后再请批。(c) ⇒ #26058 先按 (b) 合入,(c) 记入子卡 4 第 11 行。
维护者速读
要做的: 2d-3c(#26058)删除不再运行的
ui/.github/workflows/(−14224 行)。objectui 自带的受管清单里还登记着这个目录,推荐保留登记并改成「此目录必须不存在」,已在 PR 里。你要做的: 批准 #26058(即选 (b));或在本卡回 (a)/(c)。
objectstack-fleet commentedon Oct 26, 2026
Ruling: 2d-3c decision card 6413952558 · letter (b) · recorded 2026-10-26T10:49Z
Maintainer 「b)保留这一行」 at 2026-10-26T10:47Z (project chat, relayed).
The ui register keeps its
.github/workflows/**row (objectui#12255 stands). Its existence case becomes "the directory must be absent, and the root predicate still judgesui/.github/workflows/**Tier H", which is the existing commit on #26058.needs-user-decisioncomes off this card.Execution: once CI is green on #26058 and the push battery (2182/0) is reported at its head, the PM flips it ready and the seat requests os-zhuang. Tier H, so a human approves and merges. (c) (retiring the ui guard in favour of the root one) stays a sub-issue 4 question (roster row 11).
objectstack-fleet commentedon Oct 26, 2026
PM ruling on 2e (liveness ledger), 2026-10-26T11:55Z: the done-when
git grep -c 'objectui @' packages/spec/liveness= 0 is read as pointers only (seat's option A). It becomes "0 objectui-attributed evidence or producer pointers", and the reader enforces it:uijoins REPO_ROOTS andobjectuistops being a foreign realm, so a leftoverobjectui:marker fails loudly.Note history such as "re-verified against objectui @c2fd1223" stays as written. It records what was checked at the time, and rewording it only to satisfy a grep would erase that record. The grep counts 270 hits today, almost all in notes and the README.
Seat's measurement on main aa2f8e3: 184 cross-repo rows, of which 110 carry an objectui pointer and 1 is mixed. 105 of the 108 rows with paths resolve once re-rooted under
ui/. 3 need a current reader found, or they go to the worklist. Full split:/mnt/project-files/d1-merge/out/4b-25712-2e-liveness-split.md(project files).