What: a mesh directory outside every home was given its mode and owner by path, so a parent swapped for a link between two applies carried root's chmod and chown to the link's target.
Why: hq issue 358 (fixed by mesh-host#87, merge commit 36704b5471cb7b4e585847a08e4fd7fd64aea357) is a core incident and needs its replay here (to-be 45 Phase 5). The fix's own commit carries the test, internal/apply/replay358_test.go, written only with what applyDirectory had before the fix, so the prover lays it over the commit before.
How it was tested:
gofmt -l . clean, go vet ./... clean, in replays/.
go test -run '^(TestEveryReplayIsWhole|TestTheBedProvesWhatTheChangeTouches)$' . passes.
go run ./cmd/prove R358 (by hand, per replays/merge-check.sh, against mesh-host cloned beside the lab): PROVED — before its fix fails ("the directory reached through a link was not refused"), on its fix passes.
Fixes issue 358.
What: a mesh directory outside every home was given its mode and owner by path, so a parent swapped for a link between two applies carried root's chmod and chown to the link's target.
Why: hq issue 358 (fixed by mesh-host#87, merge commit 36704b5471cb7b4e585847a08e4fd7fd64aea357) is a core incident and needs its replay here (to-be 45 Phase 5). The fix's own commit carries the test, internal/apply/replay358_test.go, written only with what applyDirectory had before the fix, so the prover lays it over the commit before.
How it was tested:
- gofmt -l . clean, go vet ./... clean, in replays/.
- go test -run '^(TestEveryReplayIsWhole|TestTheBedProvesWhatTheChangeTouches)$' . passes.
- go run ./cmd/prove R358 (by hand, per replays/merge-check.sh, against mesh-host cloned beside the lab): PROVED — before its fix fails ("the directory reached through a link was not refused"), on its fix passes.
Fixes issue 358.
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript), replays/merge-check.sh (go), asks/merge-check.sh …
Deliverynovox/mesh-lab@26a0f4526901 — delivered since 2026-10-12T13:46:48Z
Delivery plan — builds nothing: the change touches no module of the mesh's graph
Transitions
2026-10-12 13:23 (new) → proposed (announced): novox/mesh-lab#80's head announced
2026-10-12 13:34 proposed → checked (checked): the verdict names this commit
2026-10-12 13:34 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-12 13:46 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-12 13:46 published → delivered (done): nothing for a walk to move
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-lab@26a0f4526901` — **delivered** since 2026-10-12T13:46:48Z
**Delivery plan** — builds nothing: the change touches no module of the mesh's graph
**Transitions**
- 2026-10-12 13:23 (new) → proposed (announced): novox/mesh-lab#80's head announced
- 2026-10-12 13:34 proposed → checked (checked): the verdict names this commit
- 2026-10-12 13:34 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-12 13:46 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-12 13:46 published → delivered (done): nothing for a walk to move
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Independent review from a fresh clone at the PR head (26a0f45269), with mesh-host cloned beside mesh-lab as the prover expects.
Shape: the R358 entry matches the other InRepository entries' field order and comment style exactly (compared against R294, R331) — a prefatory comment on what the incident was, how it was found, and where the fix is, then ID, Issue, Kind, Repository, Fix, What, Asserts, Package, Test, Files. No Home/HomeRef is needed, same as R294, because the test file (internal/apply/replay358_test.go) is already part of the Fix merge commit.
Only replays/register.go changes in this PR (confirmed via the PR's file list) — no scope creep.
replays/merge-check.sh steps all pass: gofmt clean, go vet ./... clean, go test -run '^(TestEveryReplayIsWhole|TestTheBedProvesWhatTheChangeTouches)$' . passes.
go run ./cmd/prove R358 (from replays/, mesh-host cloned beside the lab) says: R358 (issue 358): PROVED — before its fix fails, on its fix passes, with the before-failure line the directory reached through a link was not refused: <nil> — matching the PR body's own test-plan claim.
Verified independently in a fresh clone of mesh-host: commit 36704b5471cb7b4e585847a08e4fd7fd64aea357 is on mesh-host's main, is the merge of mesh-host #87 ("Give a mesh directory its mode and owner only through a descriptor"), and its diff includes exactly internal/apply/replay358_test.go among its seven changed files, matching Package: "./internal/apply" and Test: "TestAParentSwappedForALinkLeavesItsTargetUntouched".
Read the test itself in mesh-host: it swaps the directory's parent for a symlink between two applies, asserts the second apply is refused via PlacementRefusedError naming the link and who could replace it, and asserts the link's target mode is left untouched — this matches the entry's What and Asserts text precisely.
Checks at the time of this review: mesh/merge-gate is still pending (building on novox since 15:28) and mesh/repo-check has not yet posted (shows "missing"), so main's branch protection does not yet consider this mergeable. That's a CI-timing note, not a finding against the change — re-check both before merging.
Verdict: approve at 26a0f45
Independent review from a fresh clone at the PR head (26a0f45269012e5fb528356d7c1d4600a98841ce), with mesh-host cloned beside mesh-lab as the prover expects.
- Shape: the R358 entry matches the other `InRepository` entries' field order and comment style exactly (compared against R294, R331) — a prefatory comment on what the incident was, how it was found, and where the fix is, then `ID`, `Issue`, `Kind`, `Repository`, `Fix`, `What`, `Asserts`, `Package`, `Test`, `Files`. No `Home`/`HomeRef` is needed, same as R294, because the test file (`internal/apply/replay358_test.go`) is already part of the Fix merge commit.
- Only `replays/register.go` changes in this PR (confirmed via the PR's file list) — no scope creep.
- `replays/merge-check.sh` steps all pass: gofmt clean, `go vet ./...` clean, `go test -run '^(TestEveryReplayIsWhole|TestTheBedProvesWhatTheChangeTouches)$' .` passes.
- `go run ./cmd/prove R358` (from `replays/`, mesh-host cloned beside the lab) says: `R358 (issue 358): PROVED — before its fix fails, on its fix passes`, with the before-failure line `the directory reached through a link was not refused: <nil>` — matching the PR body's own test-plan claim.
- Verified independently in a fresh clone of mesh-host: commit 36704b5471cb7b4e585847a08e4fd7fd64aea357 is on mesh-host's main, is the merge of mesh-host #87 ("Give a mesh directory its mode and owner only through a descriptor"), and its diff includes exactly `internal/apply/replay358_test.go` among its seven changed files, matching `Package: "./internal/apply"` and `Test: "TestAParentSwappedForALinkLeavesItsTargetUntouched"`.
- Read the test itself in mesh-host: it swaps the directory's parent for a symlink between two applies, asserts the second apply is refused via `PlacementRefusedError` naming the link and who could replace it, and asserts the link's target mode is left untouched — this matches the entry's `What` and `Asserts` text precisely.
Checks at the time of this review: `mesh/merge-gate` is still pending (building on novox since 15:28) and `mesh/repo-check` has not yet posted (shows "missing"), so main's branch protection does not yet consider this mergeable. That's a CI-timing note, not a finding against the change — re-check both before merging.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What: a mesh directory outside every home was given its mode and owner by path, so a parent swapped for a link between two applies carried root's chmod and chown to the link's target.
Why: hq issue 358 (fixed by mesh-host#87, merge commit 36704b5471cb7b4e585847a08e4fd7fd64aea357) is a core incident and needs its replay here (to-be 45 Phase 5). The fix's own commit carries the test, internal/apply/replay358_test.go, written only with what applyDirectory had before the fix, so the prover lays it over the commit before.
How it was tested:
Fixes issue 358.
Delivery
novox/mesh-lab@26a0f4526901— delivered since 2026-10-12T13:46:48ZDelivery plan — builds nothing: the change touches no module of the mesh's graph
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Verdict: approve at
26a0f45Independent review from a fresh clone at the PR head (
26a0f45269), with mesh-host cloned beside mesh-lab as the prover expects.InRepositoryentries' field order and comment style exactly (compared against R294, R331) — a prefatory comment on what the incident was, how it was found, and where the fix is, thenID,Issue,Kind,Repository,Fix,What,Asserts,Package,Test,Files. NoHome/HomeRefis needed, same as R294, because the test file (internal/apply/replay358_test.go) is already part of the Fix merge commit.replays/register.gochanges in this PR (confirmed via the PR's file list) — no scope creep.replays/merge-check.shsteps all pass: gofmt clean,go vet ./...clean,go test -run '^(TestEveryReplayIsWhole|TestTheBedProvesWhatTheChangeTouches)$' .passes.go run ./cmd/prove R358(fromreplays/, mesh-host cloned beside the lab) says:R358 (issue 358): PROVED — before its fix fails, on its fix passes, with the before-failure linethe directory reached through a link was not refused: <nil>— matching the PR body's own test-plan claim.internal/apply/replay358_test.goamong its seven changed files, matchingPackage: "./internal/apply"andTest: "TestAParentSwappedForALinkLeavesItsTargetUntouched".PlacementRefusedErrornaming the link and who could replace it, and asserts the link's target mode is left untouched — this matches the entry'sWhatandAssertstext precisely.Checks at the time of this review:
mesh/merge-gateis still pending (building on novox since 15:28) andmesh/repo-checkhas not yet posted (shows "missing"), so main's branch protection does not yet consider this mergeable. That's a CI-timing note, not a finding against the change — re-check both before merging.