Repository navigation
Commit c61f75d
<!-- claude-projects-attribution: {"github_login":"os-tesla"} -->
_Requested by **Tesla** · [project
thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoEDFo5P2cDc4CEUUjCkLmP8)_
Part of #25697 (PR A2; the card stays open for PR B, the pin-gate
retirement in the cutover window).
Part of objectstack#25677.
Clause-②: no
Metadata-protocol: none
## What this is
The second inert objectstack-side patch of the `ui/` CI wiring (PR A was
#25710). On today's tree, with no `ui/` directory, every changed script
and the root `build` give byte-identical results (measured below). The
change only matters once objectui's tree sits under `ui/`. On the
verification PR #25718 (runs 1–5) four gates stayed red in the merged
layout because of objectstack's own tooling. This PR repairs those four.
Every exclusion is **by path** (a workspace member whose directory is
`ui` or under it), never by the `@object-ui/` scope. The ui root package
is named `object-ui-monorepo`, so a scope filter would have missed it.
| # | Gate | Red on the merged tree | Change |
|---|---|---|---|
| 1 | Test Core partitioner, `scripts/partition-test-shards.mjs` |
`turbo ls` lists 47 `ui/` members (46 `@object-ui/*` plus the ui root at
path `ui`), and every shard received some. Shard 1 got the ui root alone
(18783 s estimated, max/mean 2.17x). Under `OS_SKIP_DTS` that means
TS7016, and run 4 spent 38 min running the ui root's whole-suite `test`.
| `planRun()` drops items whose path is under `ui/` before weighing.
This is the one path `main()` runs. The drop happens only when such
items exist, and only then does it print one stderr line (`ui/ tree: N
member(s) not partitioned here -- Test UI runs them`). Test UI keeps its
own matrix. |
| 2 | Root `build` (`package.json`) | `turbo run build
--filter=!@objectstack/docs` includes `@object-ui/site#build` (`next
build`), which objectui's own root build excluded. | Adds
`--filter=!./ui*/apps/site`. Turbo's path form, with a glob. Why it is
spelled this way is under Acceptance notes. |
| 3 | `scripts/check-type-check-coverage.mjs` (Type Check · source
gates, and the debt ledger lane through `--re-measure`) | `JSON.parse`
throws on `ui/tsconfig.json`, which is JSONC with block comments. tsc
accepts it. Three more ui configs (`ui/apps/console/tsconfig.json`,
`ui/apps/console/tsconfig.node.json`,
`ui/packages/runner/tsconfig.json`) have the same shape. | **JSONC
reader, not the exclusion fallback.** A new `parseTsconfigText()` uses
TypeScript's own `parseConfigFileTextToJson` and replaces all three
tsconfig reads in the file (`readTsconfig`, `tsconfigChainFacts`,
`measureTestDebt`). The reason is that what tsc compiles is what this
gate claims to describe, and the fix also protects objectstack's own
future tsconfigs. The refusals are kept. A syntax error, a
merge-conflict marker, a non-object root and an empty or comment-only
document are still refused (`readTsconfig` still throws, so the
exit-code pin still sees it). |
| 4 | `scripts/check-published-readme-exports.mjs` (Type Check ·
consumer gates) | Exit 3 (PREREQUISITE NOT MET). The `@object-ui/*`
built type entries are not in the closure this lane builds, so no
objectstack README was judged. | `run()` drops members under `ui/`, and
the documents they publish, from the population (`outsideUiTree()`). The
scan now covers the members outside `ui/`. Objectui judges its own
README claims with `ui/scripts/check-readme-exports.mjs` (see Acceptance
notes for where that runs today). |
Rulings followed: path, not scope. Nothing under `.github/workflows/**`.
The dispatch-gates `maxBuffer` item is not redone (#25732).
## Verification record
Measured on base `origin/main` f3fea0a with the fix commit 0263a19.
The head 898990e then merges `origin/main` 4cc17db. Those 4 commits
touch none of the four files, and the derived command list is identical
after the merge. The scoped re-check on the head was the three touched
self-tests plus `pnpm check:type-check-coverage`,
`check-ci-filter-parity` and `check:turbo-task-graph`, all exit 0.
Verification tree: #25718 head `cfa1676afc` with this diff applied (`git
diff f3fea0a..HEAD | git apply`), after `pnpm install
--frozen-lockfile`. Exit codes were captured before any pipe.
**Inert on `main` (no `ui/`):**
- Partitioner. `turbo ls --output=json` on the full list, then `--shard
N/6 --exclude @objectstack/dogfood` for N = 1..6, base script against
new script. stdout and stderr are **byte-identical on all six shards**
(exit 0/0; 12/13/14/14/21/11 items).
- Root build. `turbo run build --filter=!@objectstack/docs --dry=json`
before, and `pnpm build --dry=json` after. Both give the **same 83 task
ids**, and the task hashes are the same too, compared with the filter
passed by hand. With `!./ui/apps/site` or `!@object-ui/site` instead,
turbo exits 1 on this tree (see notes).
- `node scripts/check-type-check-coverage.mjs`, base against new: exit
0/0, **byte-identical output**.
- `node scripts/check-published-readme-exports.mjs` on a built closure,
base against new: exit 0/0, **byte-identical output**. Both report 105
documents, 84 members and 225/225 own-scope specifiers.
**Effect on the verification tree (`cfa1676afc` + this diff):**
| Reproduction | Before | After |
|---|---|---|
| partitioner, 6 shards | 47 `ui/` items placed (shard 1 =
`object-ui-monorepo`) | **0 `ui/` items**. All 83 non-ui members placed
exactly once. Max/mean 1.00x, and the CLI is sliced x3 as on `main`. |
| `node scripts/check-type-check-coverage.mjs` | exit 1, uncaught
`Error: ui/tsconfig.json is not parseable` | **reads
`ui/tsconfig.json`**. Exit 1 with 489 findings, all of them on `ui/`
members (see notes). |
| `node scripts/check-published-readme-exports.mjs` (objectstack closure
built: `turbo run build --filter='./packages/*'
--filter='./packages/*/*'`, the lane's step) | **exit 3**, 33
`@object-ui/*` entries unbuilt | **exit 0**, a verdict. 105 documents,
84 members, 225/225 own-scope specifiers, 366 symbols checked. |
| `turbo run build` dry-run of the root filter | 130 tasks incl.
`@object-ui/site#build` | 129 tasks. The only one removed is
`@object-ui/site#build`. |
**Self-tests with the `ui/` case** (each one green on `main` and on the
verification tree):
- `node scripts/partition-test-shards.mjs --self-test`, exit 0. New
battery "the `ui/` tree is Test UI's, not Test Core's" (6 cases). It
runs `planRun()` on a merged document with the ui root at path `ui`, an
`@object-ui` member, and a member given an absolute path. None reaches a
bin. The bins equal the split of the same document without them. A
package at `packages/ui` is kept, and an entry with no path is kept so
that `weighItems()` refuses it. The roster floor goes from 14 to 15.
- `node scripts/check-type-check-coverage.mjs --self-test`, exit 0. New
battery "JSONC tsconfig reader" (8 cases). Four shapes tsc accepts are
read: a block comment between keys (objectui's root config), trailing
commas, a whole-line comment, and a `//` inside a string. Four shapes
stay refused: a truncated file, a merge-conflict marker, a non-object
root, and a comment-only file. The roster floor goes from 65 to 66.
- `node scripts/check-published-readme-exports.mjs --self-test`, exit 0.
New battery "THE `ui/` TREE IS OUT OF THIS POPULATION, BY PATH" (5
cases). It runs the production `run()` on a scratch workspace. An
unbuilt member under `ui/` gives exit 0 and is not named in the output.
The **control** puts the same unbuilt member outside `ui/`, which still
gives exit 3 and names it. The roster floor goes from 26 to 27.
**Derived gates.** `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives 46 commands. **All 46 exit 0** on
the head, including `check:type-check-coverage`,
`check:type-check-debt`, `check:published-readme-exports`,
`check:pm-dispatch-gates` (fast tier), `check:parse-guard`,
`check:entry-guard`, `check:ci-filter-parity` and
`check:turbo-task-graph`. Reconciled with `--ran` (each line `command ::
exit N`): `46 derived, 46 run, 0 NOT-MEASURED (a DERIVED zero)`. `pnpm
exec eslint --no-inline-config` on the three scripts: exit 0.
`node scripts/pm/check-governed-merges.mjs --branch HEAD`: **NOT
governed**, 344 changed lines.
No changeset: the root package is private and `scripts/**` ships in no
package's `files[]`. The PR carries `skip-changeset`.
## Acceptance notes (for the cutover card)
1. **The coverage gate is still red on the merged tree, now with
findings instead of a crash.** With the JSONC reader it reads every ui
config and judges the 47 ui members: **489 findings, 0 of them outside
`ui/`**. They break down as 47 "no `typecheck` script and no ledger
entry" (objectui spells the script `type-check`), 392 `@ts-expect-error`
pins in files no `typecheck` program compiles (a consequence of the
first class), 40 hidden test layers and 10 unread source directories. So
Type Check · source gates and Type Check · debt ledger go from exit 1 by
an uncaught throw to exit 1 with a verdict. Turning them green is a
coverage-semantics decision for the cutover. One option is to give ui
packages the `typecheck` spelling or ledger rows. The other is the path
exclusion this PR did not take. Either is a follow-up for the cutover
card, not part of this patch.
2. **The order says objectui's README gate runs in the Type Check UI
job. Measured, it does not.** `pnpm check:readme-exports` is in
objectui's `repo-gates.yml` (README Export Check), which the roster
routes to sub-issue 4. In the merged tree, `ui/` README export claims
are checked by neither gate until that workflow is ported, or until Type
Check UI gains the step.
3. **Why the root build filter is a glob.** On a tree without `ui/`,
turbo 2.11.5 exits 1 on `--filter=!./ui/apps/site` ("Directory …
specified in filter does not exist"), on `!./ui/apps/[s]ite`, and on
`!@object-ui/site` ("No package found with name"). `!./ui*/apps/site` is
accepted because turbo walks the glob from the repo root. Measured: it
removes exactly `@object-ui/site#build` on the verification tree and
nothing on `main`. Once `ui/` exists the spelling can be tightened to
`!./ui/apps/site`. That is optional.
4. **The ui root's own `test` script** (objectui's whole-suite `vitest
run`) is untouched here. Its drop stays on the cutover adaptation bill.
After this PR, Test Core never schedules it.
5. The root build dry-run on the verification tree still lists
`object-ui-monorepo#build` with command NONEXISTENT, because the
adaptation commit already dropped the script. Turbo skips it. Nothing to
do.
6. The readme gate refused 33 unbuilt `@object-ui` entries locally
against 19 in run 4's lane. The lane builds part of the ui closure
through its dependency edges. Both refuse without this diff. With it,
the local run exits 0. The lane's own reading comes from this PR's CI
and from the next verification run.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Y9KdeUcccMQ3ReF85Xyf5o)_
Co-authored-by: Claude <noreply@anthropic.com>
1 parent f871670 commit c61f75d
4 files changed
Lines changed: 324 additions & 20 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2217 | 2217 | | |
2218 | 2218 | | |
2219 | 2219 | | |
| 2220 | + | |
| 2221 | + | |
| 2222 | + | |
| 2223 | + | |
| 2224 | + | |
| 2225 | + | |
| 2226 | + | |
| 2227 | + | |
| 2228 | + | |
| 2229 | + | |
| 2230 | + | |
| 2231 | + | |
| 2232 | + | |
| 2233 | + | |
| 2234 | + | |
| 2235 | + | |
| 2236 | + | |
| 2237 | + | |
| 2238 | + | |
| 2239 | + | |
| 2240 | + | |
| 2241 | + | |
| 2242 | + | |
| 2243 | + | |
| 2244 | + | |
| 2245 | + | |
| 2246 | + | |
| 2247 | + | |
| 2248 | + | |
| 2249 | + | |
| 2250 | + | |
| 2251 | + | |
| 2252 | + | |
| 2253 | + | |
| 2254 | + | |
| 2255 | + | |
2220 | 2256 | | |
2221 | | - | |
| 2257 | + | |
2222 | 2258 | | |
2223 | 2259 | | |
2224 | 2260 | | |
| |||
2497 | 2533 | | |
2498 | 2534 | | |
2499 | 2535 | | |
| 2536 | + | |
2500 | 2537 | | |
2501 | 2538 | | |
2502 | 2539 | | |
2503 | 2540 | | |
2504 | | - | |
| 2541 | + | |
2505 | 2542 | | |
2506 | 2543 | | |
2507 | 2544 | | |
| |||
4298 | 4335 | | |
4299 | 4336 | | |
4300 | 4337 | | |
| 4338 | + | |
| 4339 | + | |
| 4340 | + | |
| 4341 | + | |
| 4342 | + | |
| 4343 | + | |
| 4344 | + | |
| 4345 | + | |
| 4346 | + | |
| 4347 | + | |
| 4348 | + | |
| 4349 | + | |
| 4350 | + | |
| 4351 | + | |
| 4352 | + | |
| 4353 | + | |
| 4354 | + | |
| 4355 | + | |
| 4356 | + | |
| 4357 | + | |
| 4358 | + | |
| 4359 | + | |
| 4360 | + | |
| 4361 | + | |
| 4362 | + | |
| 4363 | + | |
| 4364 | + | |
| 4365 | + | |
| 4366 | + | |
| 4367 | + | |
| 4368 | + | |
| 4369 | + | |
| 4370 | + | |
| 4371 | + | |
| 4372 | + | |
| 4373 | + | |
| 4374 | + | |
| 4375 | + | |
| 4376 | + | |
| 4377 | + | |
| 4378 | + | |
| 4379 | + | |
| 4380 | + | |
| 4381 | + | |
| 4382 | + | |
| 4383 | + | |
| 4384 | + | |
| 4385 | + | |
| 4386 | + | |
| 4387 | + | |
| 4388 | + | |
| 4389 | + | |
| 4390 | + | |
| 4391 | + | |
| 4392 | + | |
| 4393 | + | |
| 4394 | + | |
| 4395 | + | |
| 4396 | + | |
| 4397 | + | |
| 4398 | + | |
| 4399 | + | |
| 4400 | + | |
| 4401 | + | |
| 4402 | + | |
| 4403 | + | |
| 4404 | + | |
| 4405 | + | |
| 4406 | + | |
| 4407 | + | |
| 4408 | + | |
| 4409 | + | |
| 4410 | + | |
| 4411 | + | |
| 4412 | + | |
| 4413 | + | |
| 4414 | + | |
| 4415 | + | |
| 4416 | + | |
| 4417 | + | |
| 4418 | + | |
| 4419 | + | |
| 4420 | + | |
| 4421 | + | |
| 4422 | + | |
4301 | 4423 | | |
4302 | 4424 | | |
4303 | 4425 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
528 | 528 | | |
529 | 529 | | |
530 | 530 | | |
| 531 | + | |
531 | 532 | | |
| 533 | + | |
532 | 534 | | |
533 | 535 | | |
534 | 536 | | |
| |||
1623 | 1625 | | |
1624 | 1626 | | |
1625 | 1627 | | |
| 1628 | + | |
| 1629 | + | |
| 1630 | + | |
| 1631 | + | |
| 1632 | + | |
| 1633 | + | |
| 1634 | + | |
| 1635 | + | |
| 1636 | + | |
| 1637 | + | |
| 1638 | + | |
| 1639 | + | |
| 1640 | + | |
| 1641 | + | |
| 1642 | + | |
| 1643 | + | |
| 1644 | + | |
| 1645 | + | |
| 1646 | + | |
| 1647 | + | |
| 1648 | + | |
| 1649 | + | |
| 1650 | + | |
| 1651 | + | |
| 1652 | + | |
| 1653 | + | |
1626 | 1654 | | |
1627 | | - | |
1628 | | - | |
1629 | | - | |
1630 | | - | |
1631 | | - | |
1632 | | - | |
| 1655 | + | |
| 1656 | + | |
| 1657 | + | |
1633 | 1658 | | |
| 1659 | + | |
1634 | 1660 | | |
1635 | 1661 | | |
1636 | 1662 | | |
| |||
4169 | 4195 | | |
4170 | 4196 | | |
4171 | 4197 | | |
4172 | | - | |
| 4198 | + | |
4173 | 4199 | | |
4174 | | - | |
| 4200 | + | |
4175 | 4201 | | |
4176 | 4202 | | |
4177 | 4203 | | |
| 4204 | + | |
| 4205 | + | |
| 4206 | + | |
4178 | 4207 | | |
4179 | 4208 | | |
4180 | 4209 | | |
| |||
4348 | 4377 | | |
4349 | 4378 | | |
4350 | 4379 | | |
4351 | | - | |
4352 | | - | |
4353 | | - | |
| 4380 | + | |
4354 | 4381 | | |
| 4382 | + | |
| 4383 | + | |
| 4384 | + | |
| 4385 | + | |
4355 | 4386 | | |
4356 | 4387 | | |
4357 | 4388 | | |
| |||
5051 | 5082 | | |
5052 | 5083 | | |
5053 | 5084 | | |
| 5085 | + | |
| 5086 | + | |
5054 | 5087 | | |
5055 | 5088 | | |
5056 | 5089 | | |
| |||
5059 | 5092 | | |
5060 | 5093 | | |
5061 | 5094 | | |
5062 | | - | |
| 5095 | + | |
5063 | 5096 | | |
5064 | 5097 | | |
5065 | 5098 | | |
| |||
7695 | 7728 | | |
7696 | 7729 | | |
7697 | 7730 | | |
| 7731 | + | |
| 7732 | + | |
| 7733 | + | |
| 7734 | + | |
| 7735 | + | |
| 7736 | + | |
| 7737 | + | |
| 7738 | + | |
| 7739 | + | |
| 7740 | + | |
| 7741 | + | |
| 7742 | + | |
| 7743 | + | |
| 7744 | + | |
| 7745 | + | |
| 7746 | + | |
| 7747 | + | |
| 7748 | + | |
| 7749 | + | |
| 7750 | + | |
| 7751 | + | |
| 7752 | + | |
| 7753 | + | |
| 7754 | + | |
| 7755 | + | |
| 7756 | + | |
| 7757 | + | |
| 7758 | + | |
| 7759 | + | |
| 7760 | + | |
| 7761 | + | |
| 7762 | + | |
| 7763 | + | |
| 7764 | + | |
| 7765 | + | |
| 7766 | + | |
| 7767 | + | |
| 7768 | + | |
| 7769 | + | |
| 7770 | + | |
| 7771 | + | |
| 7772 | + | |
| 7773 | + | |
| 7774 | + | |
| 7775 | + | |
| 7776 | + | |
| 7777 | + | |
| 7778 | + | |
| 7779 | + | |
| 7780 | + | |
| 7781 | + | |
7698 | 7782 | | |
7699 | 7783 | | |
7700 | 7784 | | |
| |||
0 commit comments