Skip to content

test(ui-merge): the ui tests stop reading objectui's nested workflows — Lint UI and Repo Gates readers pin the root lint-ui job, governance pins retire with their roster rows - #26013

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/project-thread-6qe56u
Oct 26, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/project-thread-6qe56u

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Part of #25712 (4b PR 2d-3b: the ui tests that read a nested workflow whose root carrier is on main).
Part of objectstack#25677.

Clause-②: no
Metadata-protocol: none

维护者速读(草稿)

席位核对

(left for the dispatch seat)

Why

GitHub runs only the repository root's .github/workflows/. Since the cutover (#25825), objectui's own workflows sit at ui/.github/workflows/ and run nowhere, so a pin on one of them asserts nothing GitHub does. 2d-3c deletes that directory. Before it can, every test that reads it has to stop. This PR handles the readers whose root carrier is already on main:

What changes

  • The Lint UI readers retarget to the root lint-ui job, by path (roster row 16, ported in PR A):
    • bash32-floor-wiring and entry-guard-wiring read the job's steps through helpers/root-ci.ts and pin the one step that runs both legs of the alias.
    • check-test-path-roots and check-vi-mock-override-shape pin the job's pnpm --dir ui run step.
      • The vi.mock sibling case now asserts that the gate is not among the steps any workflow runs before an install, read through the pre-install scan.
      • The skip-switch case now asserts that the ui filter matches the files the gate reads.
    • lint-workflow changes three things:
      • The ratchet-prose surface is the lint-ui job: its text for the rule-name check, its comments for the count check.
      • The trigger claims read the root on: block. It must still subscribe pull_request and filter no paths, and the job's if: must not read the event name.
      • The ignore-list claim becomes "the ui filter still matches a ui .ts/.tsx source, and the job excludes no path".
  • The Repo Gates readers retarget to the same job (objectui's repo-gates.yml, carried by 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's "objectui's Repo Gates" block):
    • check-control-bytes and check-docs-route-eager-closure: the alias is a package script, the root Lint UI job runs it, the root trigger gates pull requests (and, for the eager closure, the queue) with no paths filter, and the ui filter matches the files the gate reads.
    • check-doc-snippet-emitted-census: the census leg runs after ui-gate-build and before the gate, in the root job. A new case pins that the alias the job runs is this script.
    • check-doc-fence-languages: one step runs both legs; no other ci.yml job and no other root workflow runs the guard; nothing before it in the job installs; the job's header comments state no count.
  • The governance-workflow pins retire with their roster rows. Each retired case is named, by its title, in a comment where it stood, with its row and the port that brings it back. The verdict, fixture, config and package.json cases in the same files are unchanged.
  • ui/scripts/check-governed-queue-guard.mjs. Its --self-test asserted ten facts about governed-surface-guard.yml, and its test file's collection failure hid them. They retire against row 11. The required-context register pin stays. The self-test now passes 183 cases.
  • markdown-test-inputs.test.ts ran the "Decide whether this change needs a full run" step out of objectui's ci.yml. The root test-ui (row 7) was ported without that step, so the step-driven legs retire, named in the header.
  • ui/scripts/markdown-test-inputs.mjs. --audit is clean. The ledger changes in five places:
    • Dropped: check-changeset-presence's workflow walker, and check-links-workflow's entry, which no longer reads markdown.
    • check-control-bytes and check-docs-route-eager-closure gain reads: [] entries. Their new markdown literals probe the ui filter's globs and open no document, so they are recorded as notRead.
    • check-doc-fence-languages records its probe as notRead and drops its walker, since its only walk was of the nested workflows directory.

Disposition table

Roster = the #25697 workflow audit (comment 6388182608).

# Test file Cases before → after Retired Retargeted Carried by now
1 bash32-floor-wiring 9 → 9 (none) the lint.yml step → lint-ui's check:bash32-floor step, both legs root ci.yml lint-ui (row 16)
2 entry-guard-wiring 7 → 7 (none) same, check:entry-guard row 16
3 check-test-path-roots 23 → 23 (none) lint-ui runs check:test-path-roots row 16
4 check-vi-mock-override-shape 28 → 28 (none) lint-ui step after the install; pre-install scan; ui filter row 16, plus the root filter job
5 lint-workflow 5 → 5 lint.yml's header prose, with lint.yml workflow surface → lint-ui job; trigger claims → root on: plus the ui filter rows 7 and 16
6 check-control-bytes 38 → 38 (none) repo-gates.yml → lint-ui; trigger and paths claims → root on: plus the ui filter lint-ui's Repo Gates block (#25902)
7 check-docs-route-eager-closure 22 → 22 (none) same #25902
8 check-doc-snippet-emitted-census 39 → 40 (none) census order → lint-ui (ui-gate-build < census < gate); new: the alias runs this script #25902
9 check-doc-fence-languages 33 → 33 (none) one step, one home, needs-no-install, no-count header → lint-ui; paths → root on: plus the ui filter #25902
10 check-changeset-overwrite 21 → 17 4 changeset-guard.yml pins (none) row 3 (→ sub-issue 4)
11 check-changeset-no-major 26 → 24 2 changeset-guard.yml pins (none) row 3; the repo-state cases run in Test UI
12 check-changeset-claims 111 → 99 3 reachability, 6 delivery, 3 comment-count pins (none) row 4 (one read row 22)
13 check-changeset-presence 53 → 46 7 reachability pins (none) rows 4 and 3; root counterpart is pr-automation.yml Check Changeset
14 render-changeset-claims-comment 28 → 27 the marker-spelled-once pin (none) row 4
15 check-eager-closure-budget 154 → 148 4 workflow contract pins, the workflow's must-hit control, the merge_group absence pin; the workflow leaves both prose populations (none) row 22, "kept, follow-up port" into Build & E2E UI
16 render-budget-comment 36 → 23 the 13-case performance-budget.yml contract (none) row 22
17 check-governed-queue-guard (+ the .mjs self-test) 16 → 9 8 workflow pins (one only partly), plus 10 self-test assertions (none) row 11: root governed-surface-guard.yml, whose register governs ui/.github/workflows/**
18 check-merge-queue-head 40 → 32 11 workflow pins (two only partly) (none) row 20; root counterpart is merge-queue-triage.yml
19 check-new-cross-file-line-citations 37 → 33 4 workflow pins (none) row 15
20 shadcn-check-report 28 → 23 6 workflow pins (one only partly) (none) row 26, "kept, follow-up port"
21 check-links-workflow 9 → 4 5 workflow pins and the workflow surface of the count pin (none) row 6; the root check-links.yml sweeps the root's trees, not ui/
22 check-required-check-set 27 → 22 5 patrol pins; dependabot-auto-merge.yml leaves REPAIRED (none) rows 25 and 9; root counterpart is required-set-patrol.yml
23 markdown-test-inputs 25 → 17 4 + 5 decision-step cases, the #9142 FIRES case, the real-step half of its depth-1 case new: the ui filter matches the three shapes' documents; test-ui reads the filter row 7 (test-ui), plus the affected-test selector

When a test file shows "(one only partly)", the case kept its non-workflow half under a new title.

Untouched here, and listed for 2d-3c (the PM files its decision card):

  • check-governed-queue-guard's every declared surface exists in this tree goes red once ui/.github/workflows/ is gone. The register's .github/workflows/** row was a maintainer ruling (objectui#12255), so this PR does not decide it.
  • ui/.github/labeler.yml stays, pending sub-issue 4 (F12 = B).

Follow-up rows (not folded here)

  • F18. After this PR the markdown-test-inputs ledger has no root CI consumer. Its audit runs in Test UI, and the root test-ui job decides from the ui filter and the selector, never from the ledger. Sub-issue 4 decides whether the ledger stays as an audit or retires.
  • F19. ui/scripts/__tests__/workflow-checks.ts's parser (readWorkflows, triggerBlock, producedCheckNames) has no caller after this PR. Its repoRoot export still has two, check-lockfile-integrity and check-lockfile-dedupe. It can be trimmed with 2d-3c or sub-issue 4.
  • F20. ui/scripts/check-cross-repo-closer-outcome.mjs takes objectui's ui/.github/workflows/cross-repo-issue-closer.yml as its subject, and only objectui's lint.yml ran it. Nothing runs it now, and after 2d-3c its subject is gone. It goes with the cross-repo-issue-closer roster row in sub-issue 4.

Verification

Head 249928d5, on main 3518664c. 25 files, +606 / −1544.

Test runs are from ui/, per ui/AGENTS.md.

Run Result
The 23 modified test files, after the rebase onto 3518664c 23 files, 766 tests passed
Whole scripts/__tests__ suite (at 45026511, before the rebase; main brought one ui/scripts change since, check-i18n-dead-keys.mjs, which no touched file reads) 183 files passed, 2 skipped; 5323 tests passed, 2 skipped
Whole suite in the 2d-3c layout (ui/.github/workflows/ and ui/.github/dependabot.yml moved aside) 4 files red, exactly the set 2d-3c owns: check-action-ref-convention (12 cases; 2d-3c retires it), check-governed-queue-guard (1 case, the open question above), check-pre-install-import-graph (sections 4 and 5; collection), ci-cd-pipeline-doc (2d-3c deletes it; collection). No hidden reader is left.
node scripts/check-governed-queue-guard.mjs --self-test 183 cases pass
pnpm type-check:scripts the one error is packages/components/src/renderers/action/resolve-icon.ts(265,69) TS2339, identical on unmodified main; none in a touched file
pnpm exec eslint --max-warnings=0 (all 25 touched files), markdown-test-inputs --audit both exit 0; the audit reads "115 candidate test files, all adjudicated"

Gate sweep: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derives 18 families for this diff, unchanged after the rebase. All 18 ran and exited 0. --ran reconciliation: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.

Push-environment battery (GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push node scripts/pm/check-dispatch-gates.mjs): ✓ 2182 cases pass, 0 failed (fast tier 1917 in 442.3 s, slow tier 265 in 1234.8 s), exit 0. The rebase brought no scripts/pm/ change.

🤖 Generated with Claude Code

https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS

GitHub runs only the repository root's .github/workflows/. objectui's
lint.yml, which five ui tests read, runs nowhere since the monorepo merge;
the root ci.yml ported its Lint job as lint-ui (roster row 16 of the
#25697 audit), and spells every gate through its ui alias.

The bash 3.2 floor and entry-guard wiring pins, the test-path-roots and
vi.mock override-shape pins, and lint-workflow's ratchet prose and trigger
claims now read that job by path: its steps, its comments, the root `on:`
block (which filters no paths) and the filter job's ui globs, which must
still match a ui TypeScript source.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…th their roster rows

Thirteen ui tests, and check-governed-queue-guard's own --self-test, pinned
how a workflow under ui/.github/workflows/ runs a gate: changeset-guard,
changeset-presence, performance-budget, governed-surface-guard,
merge-queue-head-patrol, line-citation-gate, shadcn-check, check-links,
required-check-set-patrol and dependabot-auto-merge. None of them runs
under the monorepo, and no root workflow runs these gates, so those pins
assert nothing GitHub does.

Each retired case is named where it stood, with the row of the #25697
workflow roster that carries the workflow (rows 3, 4, 6, 9, 11, 15, 20,
22, 25, 26), and the port that brings the pins back against a root
workflow, by path. Every case that reads a script, a fixture, a config or
package.json stays.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…tead of objectui's decision step

The firing control for objectui#8861 ran the "Decide whether this change
needs a full run" step out of objectui's ci.yml. That workflow runs nowhere
since the monorepo merge, and the root test-ui job (roster row 7 of the
#25697 audit) was ported without the step. The step-driven legs retire,
named in the header. What carries the property now is pinned in their
place: the filter job's ui globs match the documents the objectui#8857,
#9096 and #9142 shapes changed, and test-ui reads that filter. The
affected-test selector picks the readers, as its own test pins. The
ledger's audit and derivation cases stay.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
objectui's `repo-gates.yml` sits under `ui/.github/workflows/`, where GitHub
never runs it. The root `ci.yml`'s `lint-ui` job now runs the same gates
through `pnpm --dir ui run <alias>`, so the four tests that pinned the nested
workflow read the root job by path instead:

- check-control-bytes and check-docs-route-eager-closure: the alias is a
  package script, the root Lint UI job runs it, the root trigger gates pull
  requests with no paths filter, and the `ui` filter matches the files the
  gate reads.
- check-doc-snippet-emitted-census: the census leg runs after the gate build
  and before the gate, in the root job, and the alias runs this script.
- check-doc-fence-languages: one step runs both legs, no other job or root
  workflow runs the guard, the job's install comes after it, and its header
  comments state no count.

The markdown-test-inputs ledger records the new markdown path literals as
`notRead`: they probe the `ui` filter's globs and open no document. The
fence-languages entry drops its `walker`, since its only walk was of the
nested workflows directory.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
@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 09:06
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 26, 2026 09:06
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit 39ca587 Oct 26, 2026
59 of 60 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-6qe56u branch October 26, 2026 09:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants