#157 slices 1–3: per-caller tests with in-brain symlink targets (search, hydrate, vectorstore, context excerpt, ReadNote) #171
Closed
opened 2026-10-04 20:41:05 +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#171
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 #168 round-2 review (PASS), 2026-10-04.
Gap
The merged slice 1–3 readers have swap and symlink tests whose targets are only outside the brain, and os.Root refuses those on its own. The reviewer made each caller read without the Lstat or SameFile check, and every one stayed green:
search.Query(search.go:146)hydrate(search.go:297)vectorstore.Sync(sync.go:145)api.ReadNote(update.go:188)The code is safe today, because they all go through
brainfs.ReadRegular, and PR #168 added the SameFile check there, unit-tested in brainfs. But no per-caller test would catch a caller that stopped using it. That is the gap class the #168 review blocked on.Fix
For each caller, next to every outside-target case:
wiki/w/facts/inlink.md -> ../../../raw/s.md)brainfstest.AssertNoLeakFromwith an in-brain target (brainfstest.WriteSentinelAt)Flip-test each caller with a bypass of the Lstat or SameFile check.
Also from that review (non-blocking)
TestReadRegularNeverReturnsAnInBrainFileSwappedInBehindASymlink, since "Never" overclaims a sampled race. "DoesNotReturn" would be honest.AssertNoLeakFrom's message says "outside file" even for in-brain targets.Created via git-mcp on behalf of @mathias
pr-gatekeeper verdict: BLOCK (PR #172 @
bf3646c). Not merged.The test additions do what the PR claims, and I verified that by running them. One rule-9 finding blocks. Separately, the PR is
risk/high, so even after a PASS the merge is Mathias's call.Blocking: rule 9
search/brainroot_test.go:TestQueryLeaksNothingFromAnInBrainTargetUnderASymlinkSwapRaceandTestHydrateRefusesAnInBrainSymlinkAndLeaksNothingUnderASwapRace.TestReadRegularDoesNotReturnAnInBrainFileSwappedInBehindASymlink, e.g....DoesNotReturnAnInBrainTarget....Flip tests (executed, 5 callers x 3 bypasses)
os.OpenRoot(brainDir).ReadFile(the PR's claim)The last row is the decisive one. The SameFile-only bypass that #171 says nothing caught is now caught per caller, and before this PR it was not.
Stability, gate, CI
go test -race -count=10on search, vectorstore, mcp, api and brainfs: EXIT=0, 0 FAIL, 0 DATA RACE.CI=1 task checkatbf3646c: EXIT=0, 0 FAIL. The run included the four ingestion packages and gitleaks.bf3646c: success.b6ef116(two commits, cmd/server and go.mod, no overlap). A local merge is clean, and the affected packages plus cmd/server pass on the merged tree. No rebase is needed.Done-when (#171)
All met, apart from the blocking item above:
AssertNoLeakFromwith an in-brain target per callerNon-blocking
rs, _ := Query(...)discards errors. The flip proves it observes a leak, but a Query that always errors would still pass it.brainfstestpackage doc still says "the outside file" for what can now be an in-brain target.Not checked
pr-gatekeeper verdict on PR #172 @
bf3646c: BLOCK.notes.ReadScoped(internal/notes/edit.go:83, a slice-2 caller missing from the list above) stays green under a SameFile bypass, and two new test names overclaim (rule 9). Evidence is in #172 (comment)pr-gatekeeper re-review of PR #172 @
f969d97: PASS (not merged, risk/high). Findings 1 and 2 are resolved, and the ReadScoped flips went red 18/18. Evidence is on the PR.