Skip to content

Commit 3fca599

Browse files
ci(ui-merge): register Lint UI and Build & E2E UI in REQUIRED_CONTEXTS (#25857)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} --> _Requested by **Tesla** · [project thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoVor7wZeUGoT2cwA6ZNospy)_ Fixes #25853 Clause-②: no Metadata-protocol: none Part of #25752 (cutover step 6, the repo half). Part of #25677. **Tier H.** The registry's own exclusivity rule (`statesTheSet`) forces the AGENTS.md merge-queue sentence to name the registry exactly, so this PR touches `AGENTS.md` and `.claude/**`. `check-governed-merges --test` reads GOVERNED, landing tier H(人合). Draft; the seat lands. ## What changed - `scripts/check-required-contexts.mjs`: two `REQUIRED_CONTEXTS` rows in the shape of the existing five. - `ci.yml` job `lint-ui` publishes `Lint UI`; `carries`: the ESLint + repo-gate family of the `ui/` workspace. - `ci.yml` job `build-e2e-ui` publishes `Build & E2E UI`; `carries`: the Console build from `ui/apps/console` and its Playwright e2e. - `authorized` on both: #25752 step 6, the maintainer's ruling of 2026-10-26T00:25Z in the director thread, verbatim 「加上了」. - The two `statesTheSet` surfaces' `mustName` arrays (AGENTS.md, `platform-readings.md`) gain the same two literals; the history comments read 5→7 by #25853. - `AGENTS.md` merge-queue sentence: "five contexts block" becomes "seven", naming `Lint UI` and `Build & E2E UI`, with "those five" → "those seven" twice. Line-neutral at headroom 0: the five lines are re-filled in place, no clause dropped, no ceiling raised. 1117 lines before and after; the widest touched line is 102 bytes. - `.claude/skills/pm-dispatch/references/platform-readings.md`: the objectstack required-checks reading goes 五个 → 七个 with the two names. Line-neutral: 460 lines before and after, widest touched line 82 bytes, under the 120-byte cap. Both new contexts' jobs keep the same `if:` the cutover gave them; when a PR does not touch `ui/` they conclude `skipped`, which satisfies a required check. Assertions 1–9 hold for both rows (same workflow as `Test Core` / `Build Core`, no matrix, no `continue-on-error`, `merge_group:` present, unfiltered `pull_request:`). Not added, per the card: `Type Check UI` (waits for bill item 49) and `Test UI` (ruled out at the sitting, item 30 B). ## Verification (head aaf6226) - `node scripts/check-required-contexts.mjs` → exit 0: `7 required context name(s) pinned across 3 workflow(s); 6 instruction surface(s) scanned`. - `node scripts/check-required-contexts.mjs --self-test` → exit 0, 174 assertions. - `NODE_OPTIONS=--use-env-proxy node scripts/check-required-contexts.mjs --verify-required-set` on the branch: ```text required-set sweep: 7 live required context(s) on main, 0 registered-but-not-required, 0 required-but-unpinned. read 1 ruleset(s); 1 active and covering the default branch; strict_required_status_checks_policy: false • ruleset main (id 12119582, Repository-sourced — objectstack-ai/objectstack) required: TypeScript Type Check required: Test Core required: Build Core required: Lint & Repo Gates required: Governed Surface Queue Guard required: Lint UI required: Build & E2E UI ✅ the live required set and this registry agree in both directions. ``` - Derived gates (`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`): 44 commands, all exit 0 on aaf6226 after `pnpm install --frozen-lockfile` and `pnpm --filter '@objectstack/lint...' build`; `--ran` reconciles 44 derived, 44 run, 0 NOT-MEASURED, 0 UNRUN. - Other registry readers checked: `check-aggregator-roster.mjs` keeps its own aggregator subset and neither new job aggregates (`needs: filter` only), so no roster row is owed. `check-governed-merges`, `check-governed-queue-guard` and `ci-failure.mjs` mention the registry in prose only; their self-tests are in the derived list above. - Changeset: none. Every path is repo-root tooling or instruction text and ships in no package (`skip-changeset` declared with the PR). ## 维护者速读(草稿) **改了什么:** 把你在割接当晚加进 `main` 规则集的两个必过检查 `Lint UI`、`Build & E2E UI`,登记进仓库里的必过检查注册表;同时把 AGENTS.md 和 pm-dispatch 读数表里“五个必过检查”的那句话改成七个,名单逐字对上。 **为什么改:** 注册表的作用是:有人改了 CI 里这两个 job 的名字,门禁会立刻变红,而不是让所有 PR 永远卡在“等待检查”。没登记之前,这两个检查只在设置里存在、仓库里没有任何东西守着它们的名字。 **风险与代价(含回滚):** 只改登记和说明文字,不改任何 CI job 本身,不影响构建结果。回滚即 revert 本 PR;不需要动规则集设置。 **席位意见:** **你要做的:** 审阅后批准合并(os-zhuang 审批即可)。规则集那一半你已经做完,无需再动设置。 --- _Generated by [Claude Code](https://claude.ai/code/session_012CB8WDTpTbuW2XrEyjKHVo)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent fc2aaae commit 3fca599

3 files changed

Lines changed: 33 additions & 10 deletions

File tree

‎.claude/skills/pm-dispatch/references/platform-readings.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,9 +387,9 @@
387387
- 本车道强制多是过宽的回忆:`dispatch-gates.mjs --tier PATH` 逐路径现推,路径线是下限非放行。
388388
- 该脚本只答自己那棵树:姊妹仓路径回 absent from this tree,姊妹仓的档位与条款②只能手推。
389389
- `os-verify-lock.sh` 只住 objectstack:objectui 无它,跑本仓副本读的是容器级锁,非该仓深度。
390-
- required checks 的名单是每仓事实,objectstack 五个:
391-
`TypeScript Type Check` · `Lint & Repo Gates` · `Test Core` ·
392-
`Build Core` · `Governed Surface Queue Guard`。
390+
- required checks 的名单是每仓事实,objectstack 七个:
391+
`TypeScript Type Check` · `Lint & Repo Gates` · `Test Core` · `Build Core` ·
392+
`Governed Surface Queue Guard` · `Lint UI` · `Build & E2E UI`。
393393
- ⭐ 本表的 `mustName` 声明 `statesTheSet` ⇒ 必须逐字等于注册表,加注册行不跟改本表即红。
394394
- ⇒ 门绿即名单逐字齐全的读数;⛔ 但数量词未钉:实测 七→六 照绿,只能手跟改。
395395
- ⛔ 聚合命令同样不作判定:`check:type-check-debt` 可在包级 typecheck 绿时红。

‎AGENTS.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -523,11 +523,11 @@ Even inside your own worktree, operate defensively:
523523
yet"; `in_progress` is not a pass. Arming a red PR does not queue it, it hides it:
524524
every poll then misreads "not on `main` yet" as "queued". Always read *two* things:
525525
the queue branch **and** `origin/main`. And **the queue enforces only the required
526-
set** — five contexts block: `Lint & Repo Gates` (all `check:*` gates),
527-
`TypeScript Type Check`, `Test Core`, `Build Core` and `Governed Surface Queue Guard`. A
528-
check outside those five is advisory and rides through, and an advisory red that lands rides
526+
set** — seven contexts block: `Lint & Repo Gates` (all `check:*` gates), `TypeScript Type Check`,
527+
`Test Core`, `Build Core`, `Governed Surface Queue Guard`, `Lint UI` and `Build & E2E UI`. A
528+
check outside those seven is advisory and rides through, and an advisory red that lands rides
529529
`main`'s merge ref into every later PR until stanched. A required context is matched by
530-
check-run name, so a rename detaches its gate silently — treat those five names as contract.
530+
check-run name, so a rename detaches its gate silently — treat those seven names as contract.
531531
**Two speeds** (ruling record 6120820653): PR and queue runs carry the fast set, 10 minutes of
532532
wall per queue entry; `main`'s hourly and push runs carry the full battery — dogfood, e2e,
533533
`Temporal Conformance (live PG + MySQL)` — read by the publish lane before

‎scripts/check-required-contexts.mjs‎

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,24 @@ export const REQUIRED_CONTEXTS = [
443443
'read back live in the ruleset sweep of 2026-09-10 that carries the director ruling enrolling this row (#15233)',
444444
carries: 'the governed-surface refusal — the `merge_group` leg that refuses a governed diff carrying no ruled approval',
445445
},
446+
{
447+
workflow: 'ci.yml',
448+
job: 'lint-ui',
449+
context: 'Lint UI',
450+
authorized:
451+
'#25752 step 6, maintainer ruling 2026-10-26T00:25Z in the director thread, verbatim 「加上了」 — ' +
452+
'added to the `main` ruleset the same minute; this row is the repo half (#25853)',
453+
carries: 'the ESLint + repo-gate family of the `ui/` workspace',
454+
},
455+
{
456+
workflow: 'ci.yml',
457+
job: 'build-e2e-ui',
458+
context: 'Build & E2E UI',
459+
authorized:
460+
'#25752 step 6, maintainer ruling 2026-10-26T00:25Z in the director thread, verbatim 「加上了」 — ' +
461+
'added to the `main` ruleset the same minute; this row is the repo half (#25853)',
462+
carries: 'the Console build from `ui/apps/console` and its Playwright e2e',
463+
},
446464
];
447465

448466
/**
@@ -556,8 +574,9 @@ export const INSTRUCTION_SURFACES = [
556574
// 6→7 by #17798 — the same misclassification, one enrolment later and
557575
// with every gate green, which is what put the exclusivity rule below in
558576
// the judge. Then 7→5 by #22998 (two-speed CI: the dogfood and temporal
559-
// contexts moved to the full battery). The full set is pinned here so the
560-
// corrected sentence cannot rot back — a rename in ANY of the five
577+
// contexts moved to the full battery). Then 5→7 by #25853 (the `ui/`
578+
// import's `Lint UI` and `Build & E2E UI`). The full set is pinned here so
579+
// the corrected sentence cannot rot back — a rename in ANY of the seven
561580
// reddens this gate instead.
562581
file: 'AGENTS.md',
563582
statesTheSet: true,
@@ -567,6 +586,8 @@ export const INSTRUCTION_SURFACES = [
567586
'Test Core',
568587
'Build Core',
569588
'Governed Surface Queue Guard',
589+
'Lint UI',
590+
'Build & E2E UI',
570591
],
571592
},
572593
{
@@ -595,6 +616,8 @@ export const INSTRUCTION_SURFACES = [
595616
// equal to the registry by the exclusivity rule in
596617
// judgeInstructionSurfaces — that makes the seat's copy non-optional.
597618
'Governed Surface Queue Guard',
619+
'Lint UI',
620+
'Build & E2E UI',
598621
],
599622
},
600623
{
@@ -617,7 +640,7 @@ export const INSTRUCTION_SURFACES = [
617640
* of the six surfaces have one; `AGENTS.md` does not, because a repo-root FILE
618641
* has no separator to be found by — so an AGENTS.md card derived this gate not
619642
* at all, while that surface is the one carrying `mustName` for every
620-
* required context (widened 2→6 by #9677, 6→7 by #17798, 7→5 by #22998). Editing the merge-queue
643+
* required context (widened 2→6 by #9677, 6→7 by #17798, 7→5 by #22998, 5→7 by #25853). Editing the merge-queue
621644
* paragraph there is precisely how this gate goes red, and it was reachable
622645
* only by judgment.
623646
*

0 commit comments

Comments
 (0)