From e233f196b56ae8f8793eba587cd9fc5f0b1575d6 Mon Sep 17 00:00:00 2001 From: mos-dt-0 Date: Fri, 31 Jul 2026 18:40:53 -0500 Subject: [PATCH] =?UTF-8?q?docs(remediation):=20bank=20D-16=20=E2=80=94=20?= =?UTF-8?q?local=20and=20CI=20test=20gates=20disagree=20by=20environment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ran down Mos's flag. Both hypotheses were wrong: CI runs exactly 'pnpm test' (same command, path IS exercised) and is green, while this host exits 97 on an environment-dependent BASH_LINENO guard (#973) that aborts on bash 5.2.15 and not in CI's container. PR #1027 touches zero files under packages/mosaic, so the guard is genuinely pre-existing — f10-coder's report was accurate in every particular, and main is equally affected here. Not 'merges step around a red' but something worse in one respect: the local gate and the CI gate disagree about what passing means. No agent on this host can get a green pnpm test on any branch. A gate only CI can run cannot be a pre-push gate. Second defect found while establishing this: in the main checkout the same package fails differently (exit 1) because a test scans the working tree and picks up apps/coordinator/venv third-party site-packages. A test whose verdict depends on untracked files is not hermetic — same contamination source that broke format:check, one foreign tree breaking two independent gates. Coordinate with #1007/#1024 rather than opening a third lane. Co-Authored-By: Claude Opus 5 (1M context) --- docs/remediation/TASKS.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/remediation/TASKS.md b/docs/remediation/TASKS.md index e03c3414..20a65983 100644 --- a/docs/remediation/TASKS.md +++ b/docs/remediation/TASKS.md @@ -93,6 +93,44 @@ and must not be cited as merge evidence. Rely on reviewer clearance + real CI. Three independent live instances in a single session — format gate, agent context reset, queue guard — is the class confirmed, not anecdote. +### D-16 — the local test gate and the CI test gate disagree by environment + +Mos flagged a shape worth chasing: if `pnpm test` exits non-zero on a _pre-existing_ guard, then either +`main` is red and merges step around it (the #868 shape again), or CI does not run that path. **Both +branches turned out wrong, and the truth is a third thing.** Established by running it, not by asking: + +CI runs **exactly** `pnpm test` (`.woodpecker/ci.yml`, `test` step) — the same command. So the path _is_ +exercised. Yet: + +| environment | result | +| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CI container | `test` step **green** (#2158, #2167) | +| this host, clean worktree | **exit 97** — `WAKE-ASSERT INIT ABORT: BASH_LINENO convention violated on bash 5.2.15(1)-release … expected [3 4], probe reported [3 5] (#973)`, after `PASS=18 FAIL=0` | +| this host, main checkout | **exit 1** — a _different_, second defect (below) | + +The guard is **environment-dependent**: it aborts on this host's bash and not in CI's container. `git +diff origin/main...` confirms PR #1027 touches **zero** files under `packages/mosaic`, so the guard is +genuinely pre-existing and unrelated — **f10-coder's report was accurate in every particular**, and +`main` is equally affected on this host. + +**So it is not "merges step around a red" — it is worse in one specific way: the local gate and the CI +gate do not agree about what passing means.** No agent on this host can obtain a green `pnpm test` at +all, on any branch, including `main`. A gate an operator cannot run is a gate that only CI enforces, +and a gate only CI enforces cannot be a pre-push gate. This is the hermeticity/portability class +already live as #1007 (PR #1024). + +**Second, independent defect found while establishing the above.** In the main checkout the same +package fails differently — exit 1 — because a test **scans the working tree** and asserts on files it +finds, picking up `apps/coordinator/venv/**` (third-party `site-packages`: `pi = math.pi` in `rich`, +`setuptools`, `mypy`). **A test whose result depends on untracked files present in the tree is not +hermetic.** This is the _same_ contamination source that made `pnpm format:check` unpassable (D-1/D-7 +hygiene) — one untracked foreign tree silently breaking two independent gates. + +**Requirements.** RM-01/RM-04: a gate must produce the same verdict on a developer host and in CI, or +declare loudly that it cannot run here — never diverge silently. RM-02 registers both as cases: the +environment-divergence guard, and a hermeticity control asserting a suite's verdict is unchanged by the +presence of untracked directories. Coordinate with #1007/#1024 rather than opening a third lane. + ### D-15 — token scope is not repository permission (a THIRD capability layer) `f10-coder` was provisioned with `gitea-mosaicstack-f10-coder.token`, scopes `write:repository` +