Skip to content

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

Merged
os-zhuang merged 4 commits into
mainfrom
claude/project-thread-2dttv4
Oct 26, 2026
Merged

os-zhuang merged 4 commits into
mainfrom
claude/project-thread-2dttv4

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

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

维护者速读(草稿)

  • 改了什么: 把 objectui 原来每个 PR 都跑的 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 秒)。回滚 = 回退这一个提交。
  • 席位意见:
  • 你要做的: 以 os-zhuang 或 hotlong 账号审批(Tier H:.github/workflows/ci.yml)。必需检查集合不变,无需改 ruleset。

What changed

.github/workflows/ci.yml, lint-ui job only (+180 / −2), and the ceiling pin in ui/scripts/__tests__/turbo-cache-save-bound.test.ts (+1 / −1):

  • 15 install-free steps (14 gates), placed before Install dependencies in repo-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.
  • 9 steps after the job's last build (5 gates): the two --build-filter derive steps (status captured before the output is written, as the nested workflow does), one turbo 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.
  • Every step keeps its nested CHECK — STEP name, so 2d-2 / 2d-3 can retarget the ui step-collector pins to the root job by path.
  • Every new step runs if: !cancelled(), or on steps.install / steps.ui-gate-build succeeding, so one red gate does not hide another and a red lint step above hides none of the built-type gates. Install dependencies gains id: install and if: !cancelled() for that reason. The job's existing steps are unchanged and keep their implicit success(), so a red install-free gate still skips them, just as a red lint:coverage does today.
  • Commands are spelled pnpm --dir ui run ALIAS, the convention the header above type-check-ui sets. Every script already had an alias in ui/package.json.
  • Dropped in the port: the .objectstack-pin restore / 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).
  • Ceiling: timeout-minutes 30 → 40, by the F13 rule in the comment above lint-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.ts pins UI_JOBS.lint at the new value.

Paths these gates read now: check:prompt-keys reads the root .github/prompts/ (3 files) and check:pre-install-import-graph reads the root workflows, both since #25957. check:action-ref-convention still scans ui/.github/workflows/ (131 references in 26 files at the first head), so #25712 2d-3 retargets it when it deletes that directory.

The REQUIRED_CONTEXTS set is untouched: everything lands inside the already-required Lint UI.

Verification

Local. The table was measured on the first head 5d06398c (base c475b45b). The install-free gates and the pre-install graph were re-run on head 7a6678f0 (merged with main 963e504c), and every one exited 0.

The ported gates, each run as the step spells it (pnpm --dir ui run ...):

step exit verdict line (abridged)
check:control-bytes 0 OK, 9151 tracked text files
check:action-ref-convention 0 131 refs in 26 workflow files, 0 off-convention
check:shell-escape-residue 0 OK, 5/5 roots resolved
check:vi-mock-specifiers 0 OK, 3158 relative specifiers resolved
check:vi-mock-inherit 0 OK, 1966 call sites
docs:check-links 0 links valid across 17 scan roots
check:doc-fences --self-test / run 0 / 0 26 cases; 227 documents
check:doc-example-ids 0 414 references resolve
check:doc-types 0 every documented component type is registered
check:prompt-keys 0 OK
check:skills-paths 0 resolve
check:skill-eval-tokens --self-test / run 0 / 0 29 cases; every token taught
check:docs-route-closure 0 weighed
check:skill-examples --build-filter, check:doc-snippets --build-filter 0 / 0 12 and 34 --filter= words
turbo build, ./ui/packages/* plus both derived filters 0 75 tasks, 0 cached, 11m27s at --concurrency=2 on a shared box
check:skill-examples --self-test / run 0 / 0 60 cases (71 s); every marked example holds
check:doc-snippets --emit-census / run 0 / 0 report-only census; every covered snippet compiles
check:doc-examples 0 every covered @example compiles or fails as its ledger row declares
check:doc-json 0 every judged JSON node document passes
check:readme-exports 0 OK, 43 READMEs, 604 self-imports judged
check:pre-install-import-graph --self-test / run (head 7a6678f0) 0 / 0 20 cases; OK, 18 pre-install steps in 2 jobs run 17 gates

On head 7a6678f0:

  • Root gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack names 63. --ran reconciliation: 63 run, 0 NOT MEASURED, every one exit 0. check:pm-dispatch-gates is recorded from the push battery, which runs it.
  • Push battery: GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push node scripts/pm/check-dispatch-gates.mjs printed dispatch-gates self-test: 2182 cases pass. It exited 0 in 1685 s with 0 failed.
  • ui tests that read the root ci.yml: 35 files, 1233 tests passed. They include turbo-cache-save-bound, check-pre-install-import-graph, report-turbo-cache and check-prompt-component-keys.
  • CI (run 40283902834): 61 check runs, 55 success, 6 skipped, 0 failed.

Lint UI before this PR, read from CI: 88 s (push run 40256110081), 111 s (PR run 40260334608) and 95 s (PR run 40254707398). After: 286 s on 5d06398c (run 40262814083) and 290 s on 7a6678f0 (run 40283902834). In the second run the gate build took 121 s and the skill-example self-test 39 s.

Acceptance notes

  • What the build replays. The gate build took 121 s on both PR runs. A cold local build took 11m27s at --concurrency=2, so most of the CI build replays from the restored cache. After landing, main pushes save the pruned lint-ui seed, and it includes these tasks.
  • The ceiling of 40 is an estimate built from one measured PR run of the added work. Re-derive it once main has a population of runs with these gates.

Generated by Claude Code

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
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 26, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 26, 2026 03:21
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Decision needed — Tier H approval for this PR, plus one choice on Lint UI's duration

2026-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 ui/.github/workflows/repo-gates.yml into the root ci.yml Lint UI job (card #25880). Those gates have not run since the cutover, because GitHub reads only this repository's .github/workflows/. The 19th, check:pre-install-import-graph, joins when 2d-3 (#25712) retires ui/.github/.

State. Head 5d06398. All 7 required contexts green on run 40262814083, including the new Lint UI. The only red is Test UI (11/16): ui/scripts/__tests__/check-pre-install-import-graph.test.ts:297, main's own row since the cutover (unresolved: scripts/objectstack-pin.mjs), retired by 2d-3; not required. Reviewers requested: os-zhuang, hotlong.

The choice. Lint UI is a required check. On this head it took 4m46s; before this PR it took 88–111 s (runs 40256110081, 40260334608, 40254707398). It likely becomes the longest fast-lane job by about a minute (Test UI shards and Build & E2E UI run 3–3.5 min).

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 条并入根 ci.yml 的 Lint UI(切换后这些门禁一直没在跑)。7 项必需检查全绿,唯一红项是 main 自身那一行(2d-3 会去掉)。代价:Lint UI 从约 1.5 分钟增至约 4.8 分钟,可能成为 PR 快车道最长的作业(多约 1 分钟)。

选项: 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
@github-actions github-actions Bot added the tests label Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

3 participants