@@ -859,9 +859,12 @@ export function gateCouldNotRun(output, exitCode, fromDir, gate = null) {
859859 return null ;
860860}
861861
862+ // `--silent`, never `-s`: a global pnpm 11+/12 `@pnpm/exe` frontend parses the argv
863+ // before handing off to the pinned pnpm and rejects `-s` with exit 2 — every artifact
864+ // would read as stale and every commit would be refused.
862865function runCheck ( script , cwd ) {
863866 try {
864- execSync ( `pnpm -s ${ script } ` , { cwd, stdio : [ 'ignore' , 'pipe' , 'pipe' ] } ) ;
867+ execSync ( `pnpm --silent ${ script } ` , { cwd, stdio : [ 'ignore' , 'pipe' , 'pipe' ] } ) ;
865868 return { ok : true , output : '' , code : 0 } ;
866869 } catch ( err ) {
867870 return {
@@ -1396,7 +1399,7 @@ function fixtureSelfTest() {
13961399 /**
13971400 * The pnpm the fixture's stub gate runs under, pinned to the repository's own.
13981401 *
1399- * `runCheck` spawns every gate with `pnpm -s `, and CI reaches pnpm through
1402+ * `runCheck` spawns every gate with `pnpm --silent `, and CI reaches pnpm through
14001403 * Corepack (`.github/actions/setup-pnpm`). Corepack resolves the version from
14011404 * the project it is invoked IN, so a fixture carrying no `packageManager` field
14021405 * does not inherit this repo's pin and does not get "whatever the machine has"
@@ -1405,8 +1408,10 @@ function fixtureSelfTest() {
14051408 * published that morning: the day `latest` moved to a major whose CLI rejects
14061409 * `-s`, the "clean" stub exited 2 without ever running, and every case that
14071410 * reads the stub's own exit code went red on a tree nobody had touched. It is
1408- * the FIXTURE that was unpinned, never production — the real hook runs `pnpm -s`
1409- * in this repository, which is pinned.
1411+ * the FIXTURE that was unpinned, never production — the real hook runs in this
1412+ * repository, which is pinned. A pin does not reach the argv parser of a global
1413+ * pnpm 11+ `@pnpm/exe` frontend, though, which is why the spawn is spelled
1414+ * `--silent` rather than `-s`.
14101415 *
14111416 * Read off the ROOT manifest rather than written as a literal, so the fixture
14121417 * cannot drift from the pnpm this repo pins. The case below asserts both halves,
@@ -1508,7 +1513,7 @@ function fixtureSelfTest() {
15081513 const merge = runHook ( 'stale' ) ;
15091514
15101515 // The fixture's OWN prerequisite, asserted before any verdict is read out of a
1511- // gate's exit code: every case below spawns `pnpm -s ` inside this directory, so
1516+ // gate's exit code: every case below spawns `pnpm --silent ` inside this directory, so
15121517 // an unpinned fixture grades the registry's `latest` pnpm instead of the one
15131518 // this repository pins, and the failure lands on cases that have nothing to do
15141519 // with pnpm. ⛔ Not `=== rootPackageManager` on its own: were the root manifest
0 commit comments