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.
This commit is contained in:
Levi Neuwirth 2026-08-31 10:37:23 +02:00
parent 169ea1892c
commit e87d22796d
No known key found for this signature in database
2 changed files with 64 additions and 0 deletions

View File

@ -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 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. 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 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 selector set had **rotated**, and this registry matches on the exact
set — recording it as a second U14 occurrence was a matching-rule set — recording it as a second U14 occurrence was a matching-rule

View File

@ -1356,6 +1356,59 @@ measurement design nobody has defended.
and the `dired_acceptance` selector had already been shown green in and the `dired_acceptance` selector had already been shown green in
isolation by U7. Intermittence only, per the rerun rule. 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` ### U13 — gate prune-reporting row receives empty child stdout in `sweep`
Recorded during PR #244 review, 2026-08-29, on signed head `756c2b8`. Recorded during PR #244 review, 2026-08-29, on signed head `756c2b8`.