Found by the whole-tree --filter-plus-run-level-passthrough sweep #16886's triage asked for. It is outside #16886's fence (that card's surface is the dogfood: job in ci.yml), so it is filed rather than fixed there.
The sites
.github/workflows/test-nightly-tiers.yml, both legs of the Run this shard's nightly tiers step (job tiers), located by content — line numbers are a reading of c88fa2ccd and this file moves:
:276 set -- pnpm turbo run test $FILTERS --concurrency=4 --summarize --log-order=stream -- $REPORTER
:281 set -- pnpm turbo run test "--filter=$PKG" --concurrency=4 --summarize --log-order=stream -- "--shard=$SLICE" $REPORTER
where REPORTER="--reporter=default --reporter=json --outputFile.json=.nightly-tiers/vitest-report.json".
Neither leg carries --only, and no passthrough-free turbo run build precedes the step. Both halves of the fix that landed for the test job (PR #16868) and for the dogfood job are absent.
Why it is the same defect
A run-level passthrough — everything after the bare -- — folds into the hash of every task in the run, not only the tasks that receive it. turbo.json has test and build both dependsOn: ["^build"], so a filtered turbo run test pulls the whole upstream build closure into the run and hashes all of it under the passthrough.
Measured here, turbo 2.10.10, --filter=@objectstack/cli (the one tier-owning package nightly-tiers.mjs --packages reports today), turbo run test ... --dry=json, 60 tasks (59 build + 1 test):
plain vs plain 60 identical, 0 changed <- control, fires
plain vs -- REPORTER 0 identical, 60 changed
-- shard=1/2 +REPORTER vs 2/2 +REPORTER 0 identical, 60 changed
The half that is NOT just a copy of #16395
The slice leg (:281) is the shape already fixed twice. The whole-package leg (:276) is a case neither ci.yml job has: ci.yml's corresponding whole leg carries no passthrough at all, while this one appends -- $REPORTER unconditionally. So on this workflow even the non-sliced leg re-hashes its entire build closure and cannot reach the shared, passthrough-free build cache — a constant scatter rather than a per-shard one, but a scatter.
That is why this is a card and not a rider on #16886: fixing :281 is mechanical (the pinned shape), but :276 needs a decision the pinned shape does not answer — the reporter args are wanted on every leg, so --only there requires a passthrough-free build for a whole multi-package filter set, which is a derivation, not an application.
Not claimed
- No wall-clock cost measured. This is a static reading plus the dry-run hash evidence above; the size of the win is not part of the claim.
- Nothing here is verifiable on a PR's own CI: this is a
schedule-triggered workflow outside the required set, so any fix lands unexercised until a nightly run. Whoever takes it should say how they intend to read the result.
Filed unassigned and unlabelled — triage owns domain:* and priority.
Found by the whole-tree
--filter-plus-run-level-passthrough sweep #16886's triage asked for. It is outside #16886's fence (that card's surface is thedogfood:job inci.yml), so it is filed rather than fixed there.The sites
.github/workflows/test-nightly-tiers.yml, both legs of theRun this shard's nightly tiersstep (jobtiers), located by content — line numbers are a reading ofc88fa2ccdand this file moves:where
REPORTER="--reporter=default --reporter=json --outputFile.json=.nightly-tiers/vitest-report.json".Neither leg carries
--only, and no passthrough-freeturbo run buildprecedes the step. Both halves of the fix that landed for thetestjob (PR #16868) and for thedogfoodjob are absent.Why it is the same defect
A run-level passthrough — everything after the bare
--— folds into the hash of every task in the run, not only the tasks that receive it.turbo.jsonhastestandbuildbothdependsOn: ["^build"], so a filteredturbo run testpulls the whole upstreambuildclosure into the run and hashes all of it under the passthrough.Measured here, turbo 2.10.10,
--filter=@objectstack/cli(the one tier-owning packagenightly-tiers.mjs --packagesreports today),turbo run test ... --dry=json, 60 tasks (59build+ 1test):The half that is NOT just a copy of #16395
The slice leg (
:281) is the shape already fixed twice. The whole-package leg (:276) is a case neitherci.ymljob has:ci.yml's corresponding whole leg carries no passthrough at all, while this one appends-- $REPORTERunconditionally. So on this workflow even the non-sliced leg re-hashes its entire build closure and cannot reach the shared, passthrough-freebuildcache — a constant scatter rather than a per-shard one, but a scatter.That is why this is a card and not a rider on #16886: fixing
:281is mechanical (the pinned shape), but:276needs a decision the pinned shape does not answer — the reporter args are wanted on every leg, so--onlythere requires a passthrough-free build for a whole multi-package filter set, which is a derivation, not an application.Not claimed
schedule-triggered workflow outside the required set, so any fix lands unexercised until a nightly run. Whoever takes it should say how they intend to read the result.Filed unassigned and unlabelled — triage owns
domain:*and priority.