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:
parent
169ea1892c
commit
e87d22796d
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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`.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue