Skip to content

Commit 5193634

Browse files
docs(ui): retire the CI/CD guide page and repoint its readers at the root workflows (#27071)
Fixes #26944 Clause-②: no Metadata-protocol: none ## 维护者速读 - 改了什么:删除 `ui/content/docs/guide/ci-cd-pipeline.md`(3,243 行,描述 objectui 已删除的 28 个 workflow)及其导航条目;`deployment.md` 与根 `CONTRIBUTING.md` 的 UI 节改为指向根 `.github/workflows/`;读这一页的测试、台账行与注释指针逐一改指向或随页删除。 - 为什么改:这一页的作业名、触发条件和必需检查在 monorepo 下全部不成立,贡献者照它理解 `ui/` 的 PR 检查会得到错误答案;维护者选定 F14 走「整页退役」(shape A)。 - 风险与回滚:只动文档、测试与注释,不动产品代码、不动 `.github/**`;变更行数 4,023 主要来自删页,超过 3,000 行人合线。回滚即整 PR revert。 - 先看:`ui/scripts/markdown-test-inputs.mjs`(台账删 11 行)、`ui/scripts/__tests__/doc-version-claims.test.ts`(删两条清单项、两个下限 3→2)、`ui/scripts/__tests__/merge-queue-reporting.test.ts`(整文件删除,理由见下)。 - 两分钟验证:`git grep -n ci-cd-pipeline` 只剩 `packages/console/CHANGELOG.md` 的两行历史;`node ui/scripts/markdown-test-inputs.mjs --audit` 退出 0。 - 需要你做的:变更行数超 3,000,需要你合并或入队(也可由授权批准后席位落地)。 ## What changes Shape A, as the seat picked it on the claim: the page is retired, not rewritten. - **Deleted** `ui/content/docs/guide/ci-cd-pipeline.md` and its `ui/content/docs/guide/meta.json` entry. - **Pointers.** `ui/content/docs/guide/deployment.md`'s Next Steps link now points at the root `.github/workflows/` on GitHub. The root `CONTRIBUTING.md` UI Workspace section (where #27001 folded `ui/CONTRIBUTING.md`) gains a short `### UI CI` subsection: GitHub runs only the root workflows, and `ci.yml`'s `Lint UI`, `Type Check UI`, `Test UI` and `Build & E2E UI` jobs check a `ui/` change. No CI doc was written. - **Readers.** 31 files named `ci-cd-pipeline` on `origin/main` `cb8988ee1`. Each one, classified: | File | Class | Disposition | | --- | --- | --- | | `ui/content/docs/guide/ci-cd-pipeline.md` | the page | deleted | | `ui/content/docs/guide/meta.json` | reader (nav) | entry dropped | | `ui/content/docs/guide/deployment.md` | reader (link) | repointed to the root workflows | | `check-control-bytes.test.ts`, `check-doc-fence-languages.test.ts`, `check-docs-route-eager-closure.test.ts` | pin, path used as a glob PROBE (does a docs-only change under `ui/` start Lint UI?) | **retargeted** to the live `content/docs/guide/deployment.md`; the pin still guards the `ui` filter globs | | `check-doc-example-shared-reader.test.ts`, `check-handler-key-read-sites.test.ts`, `check-doc-json-fences.test.ts` | pin, page half of a mixed `it` | page half **removed**; the `package.json` / root `ci.yml` halves stay | | `check-doc-example-types.test.ts`, `check-doc-expression-carriage.test.ts`, `check-doc-snippet-emitted-census.test.ts`, `check-skill-eval-tokens.test.ts`, `check-skill-examples.test.ts` | pin asserting the page's content | `it` **removed** with the page, a one-line retirement note left in place | | `check-new-cross-file-line-citations.test.ts` | two pins asserting the page's content | both `it`s **removed**; the classifier pin stays | | `check-required-check-set.test.ts` | the page as one of the `REPAIRED` carriers | page **dropped** from `REPAIRED`; `scripts/dependabot-merge-gate.mjs` stays and is still asserted | | `lint-workflow.test.ts` | the page as one of three `SURFACES` | page surface **removed** with its markdown-section helper; the root `lint-ui` job and `check-lint-coverage.mjs` surfaces stay | | `merge-queue-reporting.test.ts` | its last `describe` asserted the page's `## Merge Queue` section | **whole file removed**, see Acceptance notes | | `doc-version-claims.test.ts` | two `KNOWN_CLAIMS` entries on the page, plus header history | entries **removed** (the ratchet's stale-entry test requires it); two vacuity floors 3 → 2; history re-worded | | `ui/scripts/markdown-test-inputs.mjs` | ledger rows | three `notRead` rows retargeted with their probes; ten rows **removed** because `--audit` reports those tests as no longer candidates; the `merge-queue-reporting` row removed with its file | | `markdown-test-inputs.test.ts` | vacuity floors fed by the removed rows | 35 → 27 and 4 → 3, each with its reason | | `backend.env`, `saved-view-filter.spec.ts`, `reserved-auth-features.test.ts`, `ci-setup-pnpm-wiring.test.ts`, `coverage-shard-reporter-readability.test.ts`, `check-lockfile-integrity.mjs`, `check-new-cross-file-line-citations.mjs`, `check-required-check-set.mjs`, `cross-file-line-citation-census.mjs`, `dependabot-merge-gate.mjs` | comment pointer | re-worded to name the page or its pin test as retired (#26058 deleted the pin test, this PR the page) | | `packages/console/CHANGELOG.md` | history | untouched | Comment pointers to `merge-queue-reporting.test.ts` (seven, in `check-governed-queue-guard.test.ts`, `check-shell-escape-residue.test.ts`, `check-skill-examples.test.ts`, `check-changeset-presence.mjs`, `dependabot-merge-gate.mjs`, `select-affected-tests.mjs`, `select-type-check-scope.mjs`) now say it is retired, so none points at a live file that is not there. No `.github/**`, `.claude/**` or product code is touched. No published file changes: the one file under a public package, `ui/packages/auth/src/__tests__/reserved-auth-features.test.ts`, is excluded from that package's emitting `tsc` program (`tsc --listFilesOnly`: 0 hits for it, control `src/index` 1 hit), so this carries `skip-changeset`. ## Tests Head `11fce5c7e`. - The 24 touched or affected suites, under `scripts/pm/os-verify-lock.sh`: `Test Files 24 passed (24)`, `Tests 842 passed (842)`, VERDICT command-exit 0 (at `7b575a165`; the last commit rewraps two comments, and those two files re-ran green: 2/2, 14/14). - `pnpm --dir ui exec vitest run scripts/` (the card's acceptance command): `173 passed | 2 failed | 2 skipped` of 177 files. Neither failure is in a touched file, and both are local build state, not this diff: - `date-only-zone-pins-10183.test.ts` failed with "ran no case at all". It passed after `pnpm --filter '@objectstack/formula...' build` (re-run: 1 of 2 files passed). - `unit-registry-absence-collision.test.ts` failed because 30 workspace modules could not be imported (`Failed to resolve entry for package "@objectstack/client"`, an unbuilt dist). It is NOT MEASURED locally; CI builds the closure. - `node ui/scripts/markdown-test-inputs.mjs --audit`: exit 0. Output: `96 candidate test files, all adjudicated; 70 declared entries, all present.` ## Acceptance notes - **`merge-queue-reporting.test.ts` was deleted as a whole.** After #25712, its only assertions were the four in `ci-cd-pipeline.md does not keep its own copy of the subscriber list`. Each one read the page's `## Merge Queue` section, or (`keeps the dated exemption honest`) a list that exists only to exempt one paragraph of that page. Its `MUST_SUBSCRIBE_MERGE_GROUP` map names objectui's workflows, which run nowhere, and no other assertion reads it. With the page gone, the file had nothing live to pin, and an empty suite fails vitest. The root gates its header names (`check:required-contexts`, `check:workflow-status-functions`) still carry both #3523 holes. - **The floors were lowered, not removed.** `doc-version-claims` keeps `>= 2` workflow-anchored lines (`building-crud-app.md`, `quick-start.md`). `markdown-test-inputs` keeps `>= 27` scripts candidates and `>= 3` `AGENTS.md` readers. Each new number is the measured count after the page left, recorded beside the floor. - **Ledger rows removed, not set to `reads: []`.** `--audit` fails on a ledger row whose test is no longer a scanner candidate (`stale-test`). The ten tests named the page as their only candidate literal, so their rows had to go. `check-doc-json-fences` and `check-doc-snippet-emitted-census` still walk markdown through imported helpers. The ledger's header says that route is invisible to the scanner. - **Size.** 4,023 changed lines (+138 / −3,886), almost all of it the page deletion. That is over the 3,000-line human-merge threshold, so this lands by the maintainer's merge or enqueue. ## Verification <details><summary>dispatch-gates --commands (26 families) + --ran reconciliation</summary> Derived at `7b575a165` against merge base `cb8988ee1`. Exit codes were captured before any pipe. - `node scripts/check-adr-links.mjs` :: exit 0 - `node scripts/check-adr-links.mjs --self-test` :: exit 0 - `node scripts/check-closing-keyword-parity.mjs` :: exit 0 - `node scripts/check-closing-keyword-parity.mjs --self-test` :: exit 0 - `node scripts/check-comment-mask-corpus.mjs` :: exit 0 - `node scripts/check-sdui-manifest.mjs` :: exit 0 - `node scripts/check-sdui-manifest.mjs --self-test` :: exit 0 - `pnpm --filter @objectstack/spec run check:duration-unit-keys` :: exit 0 - `pnpm check:cross-package-test-inputs` :: exit 0 - `pnpm check:dispatcher-error-vocabulary` :: exit 0 - `pnpm check:driver-memory-census` :: exit 0 - `pnpm check:engine-double-contract` :: exit 0 - `pnpm check:gitlink-declared` :: exit 0 - `pnpm check:nul-bytes` :: exit 0 - `pnpm check:published-files` :: exit 0 - `pnpm check:query-options-erasure` :: exit 0 - `pnpm check:refd-timer-probe` :: exit 0 - `pnpm check:skill-identifier-liveness` :: exit 0 - `pnpm check:test-source-alias` :: exit 0 - `pnpm check:tier-file-adoption` :: exit 0 - `pnpm check:type-check-coverage` :: exit 0 - `pnpm check:type-check-debt` :: exit 0 (re-measure: 0 raw tsc errors, none above the recorded number) - `pnpm check:undeclared-dep-imports` :: exit 0 - `pnpm check:watch-hint-literal` :: exit 0 - `pnpm check:where-matcher` :: exit 0 - `pnpm --dir ui exec vitest run scripts/` :: exit 1 (the two build-state failures above) `--ran` result: `26 derived, 26 run, 0 NOT-MEASURED, 0 UNRUN`. </details> <details><summary>Other local checks</summary> - `cd ui && pnpm run docs:check-links`: exit 0, output `Links are valid across 13 scan roots.` - `cd ui && pnpm run check:new-line-citations`: `VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0`. - `eslint --no-inline-config` over the 31 touched `ui/` `.ts`/`.mjs` files: exit 0, 0 warnings. - `git grep -n 'ci-cd-pipeline'` on the head: only two history lines in `packages/console/CHANGELOG.md`. </details> 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01QSeKYoVqdPtw3tbJG1vCDH --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 53e0663 commit 5193634

37 files changed

Lines changed: 138 additions & 3886 deletions

‎CONTRIBUTING.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,14 @@ vitest 调用被拒绝:从包目录跑 vitest 会静默跑错测试集 (objectui
267267

268268
Its "repository root" is `ui/`. The guard is `ui/scripts/vitest-invocation-guard.mjs`.
269269

270+
### UI CI
271+
272+
GitHub runs only the workflows in the repository root's
273+
[workflow directory](./.github/workflows/), so a `ui/` change is checked by the same
274+
`ci.yml` as the rest of the repository: its `Lint UI`, `Type Check UI`, `Test UI` and
275+
`Build & E2E UI` jobs run when a pull request changes `ui/`. Read those jobs for what each one
276+
runs; `ui/` keeps no CI guide of its own.
277+
270278
### UI examples
271279

272280
No directory under `ui/examples/` is a dev server: `hello-world` is a snippet to paste into

‎ui/content/docs/guide/ci-cd-pipeline.md‎

Lines changed: 0 additions & 3246 deletions
This file was deleted.

‎ui/content/docs/guide/deployment.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ For platforms that expect an HTTP 200 on `/`, the SPA `index.html` fallback alre
289289

290290
## Next Steps
291291

292-
- [CI/CD Pipeline](/docs/guide/ci-cd-pipeline) — Understand the automated build and release workflows
292+
- [CI workflows](https://github.com/objectstack-ai/objectstack/tree/main/.github/workflows) — The repository-root workflows that build, test and release ObjectUI
293293
- [Architecture Overview](/docs/guide/architecture) — How ObjectUI packages fit together
294294
- [Quick Start](/docs/guide/quick-start) — Set up a new ObjectUI project from scratch
295295
- [Theming](/docs/guide/theming) — Customize the look-and-feel before deploying

‎ui/content/docs/guide/meta.json‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
"user-state-persistence",
3434
"objectos-integration",
3535
"troubleshooting",
36-
"ci-cd-pipeline",
3736
"deployment",
3837
"release-notes"
3938
]

‎ui/e2e/live/ci/backend.env‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
# OBJECTSTACK_VERSION — the published @objectstack/* npm version the backend
55
# runs on. Until objectui moved into the objectstack repository it had to
66
# match the @objectstack/spec version this repo's pnpm-lock.yaml resolved,
7-
# and ci-cd-pipeline-doc.test.ts required the two equal (objectui#7689).
7+
# and objectui's CI-guide pin test (deleted by objectstack#26058) required the two equal
8+
# (objectui#7689).
89
# Since the import (objectstack#25803) the console builds against the
910
# workspace's own @objectstack/spec, a lockfile link with no version, so
1011
# that comparison is retired and this value is the published backend the

‎ui/e2e/live/saved-view-filter.spec.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { test, expect } from '@playwright/test';
88
* only the server can answer the question the issue asked: does it accept a
99
* rule array in `$filter`? It does not. Measured against the published backend
1010
* backend this lane pins — `OBJECTSTACK_VERSION` in `e2e/live/ci/backend.env`,
11-
* held to the lockfile by `scripts/__tests__/ci-cd-pipeline-doc.test.ts`
12-
* (objectui#7689), with the showcase-app commit derived from it at boot from
11+
* once held to the lockfile by objectui's CI-guide pin test (objectui#7689; deleted by
12+
* objectstack#26058), with the showcase-app commit derived from it at boot from
1313
* the matching `@objectstack/cli` release tag (objectui#7964). That pin has
1414
* moved since this measurement was first taken, which is why it is named by
1515
* FILE and not by value: a version literal written here goes stale behind the

‎ui/packages/auth/src/__tests__/reserved-auth-features.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
*
4646
* ## Why the consumer sweep is a blunt string match
4747
*
48-
* It follows the `scripts/__tests__/ci-cd-pipeline-doc.test.ts` pattern (#4170):
48+
* It follows the pattern objectui's CI-guide pin test set (#4170; deleted by objectstack#26058):
4949
* read the real files, compare them, pin the inverse direction too. A type-aware
5050
* "is this identifier read anywhere" analysis would be more precise and much more
5151
* fragile, and it would still miss the reachable path that has no static reference

‎ui/scripts/__tests__/check-control-bytes.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ describe('wiring — the gate is actually reachable and actually runs', () => {
505505
// a markdown-only change anywhere under `ui/`.
506506
expect(withoutComments(triggerBlock(ci))).not.toMatch(/^\s+paths(-ignore)?:/m);
507507
const globs = uiFilterGlobs(ci);
508-
const missed = ['README.md', 'content/docs/guide/ci-cd-pipeline.md', 'packages/core/README.md']
508+
const missed = ['README.md', 'content/docs/guide/deployment.md', 'packages/core/README.md']
509509
.map(repoPath)
510510
.filter((file) => !globs.some((glob) => globMatches(glob, file)));
511511
expect(missed, 'a markdown-only change under ui/ would skip Lint UI').toEqual([]);

‎ui/scripts/__tests__/check-doc-example-shared-reader.test.ts‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -490,12 +490,6 @@ describe('check-doc-example-shared-reader — this repository', () => {
490490
jobBlock(rootCi(), UI_JOBS.typeCheck),
491491
'the gate must run in CI, next to the other source-parsing gates',
492492
).toContain(`run: ${uiRun('check:doc-example-readers')}`);
493-
494-
// The page that inventories the gates is pinned by command (objectui#3653), so
495-
// this would fail there too — asserted here as well because a reader looking
496-
// for this gate looks at this file first.
497-
const page = fs.readFileSync(path.join(repoRoot, 'content/docs/guide/ci-cd-pipeline.md'), 'utf8');
498-
expect(page).toContain('check:doc-example-readers');
499493
});
500494
});
501495

‎ui/scripts/__tests__/check-doc-example-types.test.ts‎

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -546,31 +546,9 @@ describe('wiring — the gate is reachable by name, and documented by command',
546546
// case at the bottom keeps its `package.json` half and drops the workflow
547547
// half for the same reason.
548548

549-
/**
550-
* objectui#3653's discipline, applied by hand here: the page that inventories
551-
* this repository's gates must name the command a contributor can be stopped
552-
* by. `doc-snippet-types.yml` carries no `commandParity` unit in
553-
* `ci-cd-pipeline-doc.test.ts` — verified when this landed — so this stands in
554-
* for one rather than relying on a pin that does not cover the section.
555-
*/
556-
it('is documented on the page that inventories the gates, by command', () => {
557-
const page = fs.readFileSync(
558-
path.join(repoRoot, 'content/docs/guide/ci-cd-pipeline.md'),
559-
'utf8',
560-
);
561-
expect(page, 'a contributor stopped by this gate must be able to find it').toContain(
562-
'pnpm check:doc-examples',
563-
);
564-
expect(page).toContain(GATE);
565-
// The by-command row, asserted as the whole row rather than by a regex that
566-
// could drift onto the prose mentions elsewhere in the same section.
567-
const row = page
568-
.split('\n')
569-
.filter((line) => line.startsWith('|') && line.includes('`pnpm check:doc-examples`'));
570-
expect(row, 'exactly one by-command table row must name this gate').toHaveLength(1);
571-
expect(row[0], 'the page must say the gate BLOCKS, not merely that it exists').toContain('**Yes**');
572-
expect(row[0]).toContain(GATE);
573-
});
549+
// `is documented on the page that inventories the gates, by command` retired
550+
// with objectstack#26944, which deleted that page (objectui's CI guide, which
551+
// described workflows that run nowhere under the monorepo).
574552

575553
it('the root package.json alias invokes the gate', () => {
576554
const pkg = JSON.parse(fs.readFileSync(path.join(repoRoot, 'package.json'), 'utf8')) as {

0 commit comments

Comments
 (0)