brain_edit path I/O: snapshot read hangs on a FIFO, lock file and rollback write by path #192
Open
opened 2026-10-05 20:55:37 +00:00 by mathias
·
3 comments
No Branch/Tag Specified
main
fix/pipeline-writes-158
fix/edit-path-io-192
fix/create-regular-188
fix/guard-special-179
fix/linkcheck-keeps-write-178
fix/write-dir-redirect-173
fix/tunnel-detect-174
fix/pipeline-root-157
w3/154-mcp-auth-wiring
fix/tunnel-traversal
test/in-brain-targets-171
fix/brain-scan-root-157
fix/graph-wiki-root-157
fix/vectorstore-root-157
fix/notes-root-157
fix/search-root-157
fix/brainwide-root-157
fix/raw-symlinks-153
feat/symlink-tripwire-157
fix/rest-auth-149
fix/123-brain-edit-envelope-check
feat/106-page-aware-extraction
fix/105-source-drift-on-main
fix/104-surface-merge-conflicts-on-main
agent/b1-compile-on-ingest
agent/104-surface-merge-conflicts
agent/105-source-drift
agent/107-loud-unconfigured-alerting
feat/brain-read-edit
fix/capture-i1-refusal-names-target
renovate/configure
feat/consolidate-single-harness
icebox/cmd-routing
feat/brain-pending-promote
fix/close-session-classification-refresh
fix/capture-summarywriter
v0.24.0
v0.23.1
v0.23.0
v0.22.0
v0.21.1
v0.21.0
v0.20.1
v0.20.0
v0.19.1
v0.19.0
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.0
v0.16.1
v0.16.0
v0.15.0
v0.14.0
v0.13.2
v0.13.1
v0.13.0
v0.12.1
v0.12.0
v0.11.2
icebox/cmd-routing-2026-07-01
v0.11.1
v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.0
v0.4.1
v0.4.0
v0.3.0
v0.2.0
v0.1.0
Labels
Clear labels
agent/ready
blocked/client
blocked/supplier
blocked/upstream
risk/high
risk/low
risk/medium
size/l
size/m
size/s
size/xs
status:dispatch
status:dispatched
status:review
status:reviewing
type/chore
type/decision
type/docs
type/feat
type/fix
type/ops
type/research
type/test
Meets the agent-ready contract; authorizes unattended execution
Waiting on the client
Waiting on a supplier
Waiting on an upstream project or vendor
Irreversible, security-relevant, or control plane
Reversible, local, test-covered
Touches shared state, deploys or data
Too big - split it
Under two days
Under half a day
Under an hour
Maintenance, no behaviour change
Human decision required; never agent/ready
Documentation only
New capability
Corrects broken behaviour
Infrastructure, deploy, runtime
Investigate; output is a finding, not code
Test coverage only
No labels
risk/high
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mathias/hyperguild#192
Reference in New Issue
Block a user
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.
Source: PR #189 review (#188), 2026-10-05, verified through MCP
brain_edit. This was already the case on main and is not in #158's list.internal/mcp/tools_notes.go:121reads the note's prior bytes withos.ReadFile(target.Abs). It hangs on a FIFO held open by a writer.tools_notes.go:134restores the prior bytes withos.WriteFile(target.Abs), by path.internal/notes/edit.go:225opens<note>.lockwithO_CREATEby path. A planted dangling<note>.locksymlink made a successful brain_edit create an empty file outside the brain (verified).Fix
brainfs.ReadRegular, rollback throughbrainfs.WriteRegular.O_CREATE|O_NOFOLLOWplus a SameFile check, or keep the lock outside the Syncthing tree, keyed by note path. A lock file in a synced folder is odd anyway.Done when: tests with a writer-held FIFO note and a dangling
.locksymlink (in-brain and outside targets) show no hang and nothing created at the target, red before the fix.Created via git-mcp on behalf of @mathias
pr-gatekeeper on PR #194 (head
47354dc): BLOCKED. The full review is on the PR (review id 16).Blocking:
os.WriteFileand the suite stays green..lockagain creates a file at its target.OpenLock/RemoveLockhave no unit tests. Eight guard mutations survive.To file separately: flock plus unlink has never serialised processes. This predates the PR and is measured on main as well. The PR adds about 1% spurious lock failures under contention. The branch also conflicts with main in brainfs.go after #189.
Issue is
risk/high, so Mathias makes the merge call.pr-gatekeeper round 2 on PR #194 (head
07ea5b0): BLOCKED on one finding. The full review is on the PR (review id 18).The rollback-through-symlink test still passes when the test seam does not fire. With
beforeStampHook()turned into a no-op, the suite stays green. It needs an assertion that the swap happened and the rollback was refused.Everything else from round 1 is fixed and confirmed by execution. Locking across processes gives 0 overlaps with 2 and 4 processes.
Not blocking: the RollingUpdate that ships this change runs old and new code side by side, and that still overlaps. Exclusion holds from the next rollout.
Issue is
risk/high, so Mathias makes the merge call.pr-gatekeeper round 3 on PR #194 (head
cdcff12): PASS. The full review is on the PR.The round-2 blocker is fixed: turning the stamp hook into a no-op now fails the rollback test. Every earlier flip is still red.
go test -race -count=3andCI=1 task checkpass, CI run #608 is green, and the PR is mergeable.Follow-ups are tracked in #196 and #197. The issue is
risk/high: merging deploys ingestion, so Mathias decides the merge.