From e87d22796d7894fdc952537944e11276c5a0b936 Mon Sep 17 00:00:00 2001 From: Levi Neuwirth Date: Mon, 31 Aug 2026 10:37:23 +0200 Subject: [PATCH] docs(ci-reds): U16 --- a git invocation with a deleted working directory The sweep step redded on `cache_survives_across_fetcher_instances` with `fatal: Unable to read current working directory`. Not a budget test, and not a load story. It is the only row in this file that arrives with a named candidate mechanism inside the test suite. `src/file_io.rs:434` calls `std::env::set_current_dir` --- process-global state --- inside a test running in one of libtest's parallel threads, points it at a `TempDir`, and lets that `TempDir` drop. Every other test in the binary shares that cwd for the window, and after the drop it is a deleted directory, which is exactly what git reported. Recorded as a candidate with a citation, not a demonstrated chain: 8 full parallel `--lib` runs did not reproduce it, which says the window is narrow rather than absent. The row names the two controls that would settle it and runs neither --- the structural fix is `file_io`'s, not a CRDT invariant lane's. --- docs/active-work.md | 11 ++++++++ docs/ci-red-signatures.md | 53 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/docs/active-work.md b/docs/active-work.md index 1be6709..082f64d 100644 --- a/docs/active-work.md +++ b/docs/active-work.md @@ -394,6 +394,17 @@ crdt-gated code does not rediscover it at CI. of 34 "explains it without any help", the other that U6 and U7 had both wanted a number since August. Both are corrected in place. +- **U16, new** — a `git` invocation in `packages::fetcher` found its + working directory **deleted**. Not a budget: the only row in the + registry that arrives with a **named candidate mechanism inside the + test suite**. `src/file_io.rs:434` mutates process-global cwd inside a + parallel test and points it at a `TempDir` that then drops, and + libtest runs tests in threads of one process. Candidate, not a + demonstrated chain — 8 full parallel `--lib` runs did not reproduce + it. Two controls that would settle it are written into the row and + **neither is run here**; the structural fix belongs to whoever owns + `file_io`, not to a CRDT invariant lane. + U14 and U15 are two rows rather than one because the second run's selector set had **rotated**, and this registry matches on the exact set — recording it as a second U14 occurrence was a matching-rule diff --git a/docs/ci-red-signatures.md b/docs/ci-red-signatures.md index f9742fb..843fc80 100644 --- a/docs/ci-red-signatures.md +++ b/docs/ci-red-signatures.md @@ -1356,6 +1356,59 @@ measurement design nobody has defended. and the `dired_acceptance` selector had already been shown green in isolation by U7. Intermittence only, per the rerun rule. +### U16 — a git invocation finds its working directory deleted + +Recorded on the CRDT identity-undo lane, 2026-08-31, local (Linux), +`scripts/gate` log `20260831T083021Z-272257`, step `07-sweep`. **Not a +budget row** — nothing here is a clock. It is the only row in this file +that arrives with a **named candidate mechanism inside the test suite**, +which is why it is worth more than its one occurrence. + +| field | value | +|---|---| +| **selector** | `--lib packages::fetcher::tests::cache_survives_across_fetcher_instances` | +| **job / flavor** | local (Linux), `scripts/gate` step `07-sweep` (`cargo test --workspace --no-fail-fast`) | +| **required fragments** | `Unable to read current working directory: No such file or directory` + `remote did not send all necessary objects` | +| **status** | **new incident, one occurrence, not reproduced** | +| **what IS established** | the fragments, captured from the durable stage log at `src/packages/fetcher.rs:929`. `1989 passed; 1 failed`. The test spawns `git` against a `file://` remote in a temp dir | +| **what is NOT** | that the mechanism below is what happened. It is a candidate with a citation, not a demonstrated chain | +| **the observing tree** | the lane's docs-only commit. It touches `src/packages/` not at all | + +**The candidate mechanism, and it is specific.** +`src/file_io.rs:434` — `bare_filename_saves_in_cwd` — calls +`std::env::set_current_dir(dir.path())`, which mutates **process-global** +state, points it at a `TempDir`, and lets that `TempDir` drop at end of +test. The libtest harness runs tests **in parallel threads within one +process**, so during that window every other test in the binary shares +the mutated cwd, and after the drop that cwd is a **deleted directory**. +`fatal: Unable to read current working directory` is exactly what a +process with a deleted cwd gets from `git`. + +The test restores the cwd before its assertions, deliberately and with a +comment saying so — **the hazard is not the restore, it is that the +window exists at all**, and no amount of care inside one test closes a +window that is process-wide. + +**What would settle it**, and neither has been run: + +* run the two selectors concurrently in a tight loop until the failure + reproduces, which converts the candidate into a demonstration; +* or make the hazard structural rather than probabilistic — a serial + guard around every `set_current_dir` test, or removing the + process-global mutation from `bare_filename_saves_in_cwd` entirely + (`save_atomic` could take the directory rather than inheriting it). + +**Reruns: green in three isolated runs of the selector, and in EIGHT +full parallel `cargo test --lib` runs** (1990 passed each). Per this +file's rerun rule that establishes **intermittence only** — and here it +also says the window is narrow, not that it is absent. + +**Not folded into U14 or U15.** Different selector, different fragments, +different step, and a different kind of failure: those are wall-clock +budgets under load, this is a race over process-global state. U14's +`acc34_purge` readiness failure is the nearest relative in kind, and even +that is a different mechanism. + ### U13 — gate prune-reporting row receives empty child stdout in `sweep` Recorded during PR #244 review, 2026-08-29, on signed head `756c2b8`.