Repository navigation
ci(ui-merge): run objectui's Repo Gates in the root Lint UI job (18 of 19; the pre-install import graph waits for ui/.github to retire) - #25902
Conversation
The gates of ui/.github/workflows/repo-gates.yml stopped running when the tree moved under ui/, because GitHub reads only the root workflows. They judge the shipped docs, skill guides, READMEs and documented component types. Port them into lint-ui in the nested workflow's order: install-free gates before the install, built-type gates after one filtered build. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015MoCPtpv6AtTo899tF8Ktq
…ithub is retired It derives its population from ui/.github/workflows/, where ten workflows still run the deleted objectstack-pin script, so it is red on main for that reason alone and would red the required Lint UI job on every ui PR. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015MoCPtpv6AtTo899tF8Ktq
Decision needed — Tier H approval for this PR, plus one choice on Lint UI's duration2026-10-26T03:31Z · PM note. Tesla retired the director thread at 03:30Z; open decisions on this card are recorded here for the deciding agent. What the PR does. Ports 18 of the 19 gates of State. Head 5d06398. All 7 required contexts green on run 40262814083, including the new The choice.
Who acts. An approver with Tier H rights picks A, B or C in a comment here (one letter is enough) and, on A or B, approves and enables auto-merge. On B the PM files the #25869 row after the merge. 维护者速读 要决定的: 这个 PR 把 objectui 原来的 19 条仓库门禁中的 18 条并入根 选项: A(PM 建议)接受并批准合并;B 批准合并,并在 #25869 加一行后续把需要构建的那一半挪到 push 作业;C 先在本 PR 拆分再合并。 你要做的: 回一个字母;A 或 B 时批准并开启自动合并。 |
One lint-ui hunk: the Repo Gates' built-type block stays, followed by #25963's prune step and bounded save, unchanged. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015MoCPtpv6AtTo899tF8Ktq
…derives 30 to 40 #25957 retargeted check:pre-install-import-graph at the root workflows, and it is green on the merged tree, so the step held back for 2d-3 runs now. The F13 rule re-derived with the gates' ~174 s added (558 + 174 = 732 s) gives 40; turbo-cache-save-bound.test.ts pins the new value. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015MoCPtpv6AtTo899tF8Ktq
Requested by Tesla · project thread
Fixes #25880
Part of #25677 (ui/ merge aftercare; #25697 roster row 24). Part of #25712 (4b): #25712 remains open; its 2d-2 / 2d-3 retire the nested workflow after this lands.
Body updated 2026-10-26T07:44Z: head
7a6678f0(after #25963 and #25957 landed): all 19 gates, the Lint UI ceiling re-derived 30 → 40, counts and CI below re-read.Clause-②: no
Metadata-protocol: none
维护者速读(草稿)
Repo Gates门禁(文档链接、文档里的组件类型、技能指南路径、文档代码片段编译、README 导出等)搬进根ci.yml的Lint UI作业,19 个门禁全部搬齐(第 19 个 pre-install import graph 在 ci(ui-merge): the pre-install import graph reads the repository root's workflows; objectui's prompt files move to the root .github/prompts/ #25957 改读根目录 workflow 后已转绿)。只改lint-ui这一段,外加按 F13 规则把该作业时限从 30 分钟重算为 40 分钟。ui/之后 GitHub 只读根目录的 workflow,这批门禁从 10-25 22:51Z 起没有任何 PR 在跑。文档写错组件类型、技能指南引用死路径、提示词教了不渲染的组件键,都会悄悄合进 main。Lint UI是必需检查。19 个门禁在合并后的树上全绿,CI 0 失败。代价:每个 ui PR 的Lint UI从约 112 秒(中位数)变为约 290 秒(本 PR 实测,其中过滤构建 121 秒);作业时限按 F13 规则 30 → 40 分钟(最慢 558 秒 + 新增约 174 秒 = 732 秒)。回滚 = 回退这一个提交。.github/workflows/ci.yml)。必需检查集合不变,无需改 ruleset。What changed
.github/workflows/ci.yml,lint-uijob only (+180 / −2), and the ceiling pin inui/scripts/__tests__/turbo-cache-save-bound.test.ts(+1 / −1):Install dependenciesinrepo-gates.yml's order: Control Byte Scan, Action Ref Convention, Pre-Install Import Graph Check (self-test + run), Shell Escape Residue Scan, Inert vi.mock Specifier Check ×2, Internal Docs Link Check, Doc Fence Language Check (self-test + run), Doc Example Id Check, Doc Component Type Check ×2 (doc types, prompt keys), Skill Guide Path Check, Skill Eval Token Check ×2 (self-test, run), Docs Route Eager Closure Check.--build-filterderive steps (status captured before the output is written, as the nested workflow does), oneturbo run build --filter='./ui/packages/*' $SKILL_FILTER $SNIPPET_FILTER, then Skill Example Check (self-test, run), Doc Snippet Type Check (emit census report-only, snippets, JSDoc examples, JSON fences), README Export Check.CHECK — STEPname, so 2d-2 / 2d-3 can retarget the ui step-collector pins to the root job by path.if: !cancelled(), or onsteps.install/steps.ui-gate-buildsucceeding, so one red gate does not hide another and a red lint step above hides none of the built-type gates.Install dependenciesgainsid: installandif: !cancelled()for that reason. The job's existing steps are unchanged and keep their implicitsuccess(), so a red install-free gate still skips them, just as a redlint:coveragedoes today.pnpm --dir ui run ALIAS, the convention the header abovetype-check-uisets. Every script already had an alias inui/package.json..objectstack-pinrestore / build / save (the merged tree builds@objectstack/*from the workspace), and the nested turbo-cache report / prune / save bookkeeping (since ci(ui-merge): the seven @objectstack packages build once per run and the ui jobs replay them; every ui cache save is bounded #25963 the job's own restore, prune and bounded main-only save serve the build; its job-level run summaries put the gate build's tasks in the pruned seed).timeout-minutes30 → 40, by the F13 rule in the comment abovelint-ui: the old maximum of 558 s plus the ~174 s these gates add (first PR run 286 s less the 112 s median) gives 732 s, so max(3 × 12.2, 12.2 + 15) gives 40.turbo-cache-save-bound.test.tspinsUI_JOBS.lintat the new value.Paths these gates read now:
check:prompt-keysreads the root.github/prompts/(3 files) andcheck:pre-install-import-graphreads the root workflows, both since #25957.check:action-ref-conventionstill scansui/.github/workflows/(131 references in 26 files at the first head), so #25712 2d-3 retargets it when it deletes that directory.The
REQUIRED_CONTEXTSset is untouched: everything lands inside the already-requiredLint UI.Verification
Local. The table was measured on the first head
5d06398c(basec475b45b). The install-free gates and the pre-install graph were re-run on head7a6678f0(merged withmain963e504c), and every one exited 0.The ported gates, each run as the step spells it (
pnpm --dir ui run ...):--filter=words./ui/packages/*plus both derived filters--concurrency=2on a shared box@examplecompiles or fails as its ledger row declares7a6678f0)On head
7a6678f0:node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstacknames 63.--ranreconciliation: 63 run, 0 NOT MEASURED, every one exit 0.check:pm-dispatch-gatesis recorded from the push battery, which runs it.GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push node scripts/pm/check-dispatch-gates.mjsprinteddispatch-gates self-test: 2182 cases pass.It exited 0 in 1685 s with 0 failed.ci.yml: 35 files, 1233 tests passed. They includeturbo-cache-save-bound,check-pre-install-import-graph,report-turbo-cacheandcheck-prompt-component-keys.Lint UIbefore this PR, read from CI: 88 s (push run 40256110081), 111 s (PR run 40260334608) and 95 s (PR run 40254707398). After: 286 s on5d06398c(run 40262814083) and 290 s on7a6678f0(run 40283902834). In the second run the gate build took 121 s and the skill-example self-test 39 s.Acceptance notes
--concurrency=2, so most of the CI build replays from the restored cache. After landing,mainpushes save the prunedlint-uiseed, and it includes these tasks.mainhas a population of runs with these gates.Generated by Claude Code