Repository navigation
Commit 05f7758
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)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} -->
_Requested by **Tesla** · [project
thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoSni6fCTRjRwzwXVWBfNomr)_
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.
Clause-②: no
Metadata-protocol: none
## 维护者速读(草稿)
- **改了什么:** 把 objectui 原来每个 PR 都跑的 `Repo Gates`
门禁(文档链接、文档里的组件类型、技能指南路径、文档代码片段编译、README 导出等)搬进根 `ci.yml` 的 `Lint UI`
作业。19 个门禁先落 18 个;第 19 个(pre-install import graph)今天在 main 上因已删除的 pin
脚本必红,等 2d-3 删掉 `ui/.github/` 后再加。只改 `lint-ui` 这一段,不改别的作业。
- **为什么改:** 合并到 `ui/` 之后 GitHub 只读根目录的 workflow,这批门禁从 10-25 22:51Z 起没有任何
PR 在跑。文档写错组件类型、技能指南引用死路径、提示词教了不渲染的组件键,都会悄悄合进 main。
- **风险与代价(含回滚):** `Lint UI` 是必需检查。本地这 18 个门禁在 main 上全绿。代价是多一次
`ui/packages/*` 的过滤构建:完全冷构建时本地 2 并发要 11.5 分钟(CI 4 并发,作业上限 30
分钟未改);作业的缓存回退键能读到 Build Core 的 turbo 缓存(它的 `pnpm build` 覆盖
`ui/packages/*`),预计多数任务可回放,实际耗时以本 PR 首次 CI 为准。回滚 = 回退这一个提交。
- **席位意见:**
- **你要做的:** 以 os-zhuang 或 hotlong 账号审批(Tier
H:`.github/workflows/ci.yml`)。必需检查集合不变,无需改 ruleset。
## What changed
`.github/workflows/ci.yml`, `lint-ui` job only, +173 / −0 lines:
- **14 install-free steps** (13 gates), placed before `Install
dependencies` in `repo-gates.yml`'s order: Control Byte Scan, Action Ref
Convention, 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 (the job's own
`.turbo/cache` restore and main-only save already serve the build).
**Held back, the nineteenth:** `Pre-Install Import Graph Check`
(`check:pre-install-import-graph`). Its self-test passes (16 cases), but
its scan exits 1 on `main` `c475b45b` with exactly one finding:
`scripts/objectstack-pin.mjs` does not exist. Ten nested
`ui/.github/workflows/` files still call that script, which is 2c's
known leftover row. Porting the step now would red the required `Lint
UI` on every ui PR. A comment at its slot names the condition: it joins
this list when `ui/.github/` is retired (#25712 2d-3), retargeted to
this job. The epic PM agreed.
**Paths these gates read at landing time** (2d-3 owns the moves):
- `check:prompt-keys` reads `ui/.github/prompts/*.prompt.md` (3 files):
`PROMPT_DIR = '.github/prompts'` at
`ui/scripts/check-prompt-component-keys.mjs:140`, joined onto its
`--root` (default `ui/`). `--root` also feeds the registry derivation,
so it cannot be the switch. When 2d-3 moves the prompts to root
`.github/prompts/`, it gives the gate a separate prompts root together
with the fixtures in `check-prompt-component-keys.test.ts`. This step
needs no change.
- `check:action-ref-convention` scans `ui/.github/workflows/` (today 131
references in 26 files). `check:pre-install-import-graph` derives its
population from the same directory. Both lose their input when 2d-3
deletes it, so 2d-3 retargets both to the root workflows. The PM has
passed this on as 2d-3 rows.
The `REQUIRED_CONTEXTS` set is untouched: everything lands inside the
already-required `Lint UI`.
## Verification
Local, worktree on `c475b45b` + this branch, head `5d06398c`.
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 (held back) | 0 / 1 |
the one `scripts/objectstack-pin.mjs` finding above |
Root gates derived for this diff: `node scripts/pm/dispatch-gates.mjs
--commands --repo objectstack-ai/objectstack` named 56. On head
`5d06398c`, 52 exit 0. `pnpm check:dual-build-cjs-loads` exits 3
(PREREQUISITE NOT MET: it needs every package's `dist/`, so nothing was
measured locally; CI's `Lint & Repo Gates` runs it). The three slow ones
(`check:pm-dispatch-gates`, `check:type-check-debt`,
`check-comment-mask-corpus`) are reported in the card comment.
`Lint UI` before this PR, measured from CI: 88 s (push run 40256110081),
111 s (PR run 40260334608), 95 s (PR run 40254707398). The after number
and the run id come from this PR's own CI and go on the card.
## Acceptance notes
- **What the build replays.** The job's turbo restore keys fall back to
`build-core`'s. Build Core runs `pnpm build`, which covers
`ui/packages/*`, so a PR run should replay most of the new build from
that entry. That is a hash-match expectation and has not been measured.
This PR's first run gives the number. After landing, `main` pushes save
the `lint-ui` entry with these outputs too.
- `timeout-minutes: 30` is kept. The local cold build is the worst case,
and it fits.
---
_Generated by [Claude
Code](https://claude.ai/code/session_015MoCPtpv6AtTo899tF8Ktq)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent e12d3f3 commit 05f7758
2 files changed
Lines changed: 181 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3707 | 3707 | | |
3708 | 3708 | | |
3709 | 3709 | | |
3710 | | - | |
| 3710 | + | |
| 3711 | + | |
| 3712 | + | |
| 3713 | + | |
3711 | 3714 | | |
3712 | 3715 | | |
3713 | 3716 | | |
| |||
3718 | 3721 | | |
3719 | 3722 | | |
3720 | 3723 | | |
3721 | | - | |
| 3724 | + | |
3722 | 3725 | | |
3723 | 3726 | | |
3724 | 3727 | | |
| |||
3787 | 3790 | | |
3788 | 3791 | | |
3789 | 3792 | | |
| 3793 | + | |
| 3794 | + | |
| 3795 | + | |
| 3796 | + | |
| 3797 | + | |
| 3798 | + | |
| 3799 | + | |
| 3800 | + | |
| 3801 | + | |
| 3802 | + | |
| 3803 | + | |
| 3804 | + | |
| 3805 | + | |
| 3806 | + | |
| 3807 | + | |
| 3808 | + | |
| 3809 | + | |
| 3810 | + | |
| 3811 | + | |
| 3812 | + | |
| 3813 | + | |
| 3814 | + | |
| 3815 | + | |
| 3816 | + | |
| 3817 | + | |
| 3818 | + | |
| 3819 | + | |
| 3820 | + | |
| 3821 | + | |
| 3822 | + | |
| 3823 | + | |
| 3824 | + | |
| 3825 | + | |
| 3826 | + | |
| 3827 | + | |
| 3828 | + | |
| 3829 | + | |
| 3830 | + | |
| 3831 | + | |
| 3832 | + | |
| 3833 | + | |
| 3834 | + | |
| 3835 | + | |
| 3836 | + | |
| 3837 | + | |
| 3838 | + | |
| 3839 | + | |
| 3840 | + | |
| 3841 | + | |
| 3842 | + | |
| 3843 | + | |
| 3844 | + | |
| 3845 | + | |
| 3846 | + | |
| 3847 | + | |
| 3848 | + | |
| 3849 | + | |
| 3850 | + | |
| 3851 | + | |
| 3852 | + | |
| 3853 | + | |
| 3854 | + | |
| 3855 | + | |
| 3856 | + | |
| 3857 | + | |
| 3858 | + | |
| 3859 | + | |
| 3860 | + | |
| 3861 | + | |
| 3862 | + | |
| 3863 | + | |
| 3864 | + | |
| 3865 | + | |
| 3866 | + | |
| 3867 | + | |
| 3868 | + | |
| 3869 | + | |
| 3870 | + | |
| 3871 | + | |
| 3872 | + | |
| 3873 | + | |
| 3874 | + | |
| 3875 | + | |
| 3876 | + | |
| 3877 | + | |
| 3878 | + | |
3790 | 3879 | | |
| 3880 | + | |
| 3881 | + | |
3791 | 3882 | | |
3792 | 3883 | | |
3793 | 3884 | | |
| |||
3825 | 3916 | | |
3826 | 3917 | | |
3827 | 3918 | | |
| 3919 | + | |
| 3920 | + | |
| 3921 | + | |
| 3922 | + | |
| 3923 | + | |
| 3924 | + | |
| 3925 | + | |
| 3926 | + | |
| 3927 | + | |
| 3928 | + | |
| 3929 | + | |
| 3930 | + | |
| 3931 | + | |
| 3932 | + | |
| 3933 | + | |
| 3934 | + | |
| 3935 | + | |
| 3936 | + | |
| 3937 | + | |
| 3938 | + | |
| 3939 | + | |
| 3940 | + | |
| 3941 | + | |
| 3942 | + | |
| 3943 | + | |
| 3944 | + | |
| 3945 | + | |
| 3946 | + | |
| 3947 | + | |
| 3948 | + | |
| 3949 | + | |
| 3950 | + | |
| 3951 | + | |
| 3952 | + | |
| 3953 | + | |
| 3954 | + | |
| 3955 | + | |
| 3956 | + | |
| 3957 | + | |
| 3958 | + | |
| 3959 | + | |
| 3960 | + | |
| 3961 | + | |
| 3962 | + | |
| 3963 | + | |
| 3964 | + | |
| 3965 | + | |
| 3966 | + | |
| 3967 | + | |
| 3968 | + | |
| 3969 | + | |
| 3970 | + | |
| 3971 | + | |
| 3972 | + | |
| 3973 | + | |
| 3974 | + | |
| 3975 | + | |
| 3976 | + | |
| 3977 | + | |
| 3978 | + | |
| 3979 | + | |
| 3980 | + | |
| 3981 | + | |
| 3982 | + | |
| 3983 | + | |
| 3984 | + | |
| 3985 | + | |
| 3986 | + | |
| 3987 | + | |
| 3988 | + | |
| 3989 | + | |
| 3990 | + | |
| 3991 | + | |
| 3992 | + | |
| 3993 | + | |
| 3994 | + | |
| 3995 | + | |
| 3996 | + | |
| 3997 | + | |
| 3998 | + | |
| 3999 | + | |
| 4000 | + | |
| 4001 | + | |
| 4002 | + | |
| 4003 | + | |
| 4004 | + | |
| 4005 | + | |
3828 | 4006 | | |
3829 | 4007 | | |
3830 | 4008 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
76 | | - | |
| 76 | + | |
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
| |||
0 commit comments