merge: land #195 (watcher/pipeline writes through the brain root, #158 part B) on top of inbox zero and the wing resolver
Reconciled with v0.25.0 semantics: - markers are only the fallback when the original cannot be removed, and are now written through the brain root; the refused set (size+mtime keyed) replaces the path-only 'stuck' set - #195's tests updated for inbox zero (archive written, original retired, no marker), and the planted-marker-link test keeps its point: nothing is ever written through the link, and the note is processed once - the 'cannot retire' test now counts archive copies; it counted LLM calls, which pipeline.Run's source-hash check hides (mutation: removing the remember step left it green) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -165,3 +165,53 @@ func TestBackfillRefsDoesNotCopyAPageSwappedInBehindASymlink(t *testing.T) {
|
||||
require.Contains(t, read(), "[[s|S]]", "positive control: the regular page gets the source ref")
|
||||
brainfstest.AssertNoLeakFrom(t, page, inside, target, 3*time.Second, read)
|
||||
}
|
||||
|
||||
// hyperguild#158: BackfillRefs read a regular concept page, a symlink could
|
||||
// be swapped in, and os.WriteFile then followed it and overwrote the link's
|
||||
// target. The target is not restored between rounds here, so any
|
||||
// write-through shows.
|
||||
func TestBackfillRefsNeverWritesThroughAPageSwappedForASymlink(t *testing.T) {
|
||||
brain := t.TempDir()
|
||||
mkdirs(t, brain, "wiki/sources", "wiki/concepts", "raw")
|
||||
require.NoError(t, os.WriteFile(filepath.Join(brain, "wiki", "sources", "s.md"), []byte("---\ntitle: S\n---\n[[c|C]]\n"), 0o644))
|
||||
page := filepath.Join(brain, "wiki", "concepts", "c.md")
|
||||
target := filepath.Join(brain, "raw", "secret.md")
|
||||
require.NoError(t, os.WriteFile(target, []byte("untouched"), 0o644))
|
||||
inside := "---\ntitle: C\n---\nbody\n"
|
||||
require.NoError(t, os.WriteFile(page, []byte(inside), 0o644))
|
||||
brainfstest.StartSwap(t, page, inside, target, false)
|
||||
ok := 0
|
||||
for deadline := time.Now().Add(2 * time.Second); time.Now().Before(deadline); {
|
||||
if _, err := BackfillRefs(context.Background(), brain); err == nil {
|
||||
ok++
|
||||
}
|
||||
}
|
||||
got, _ := os.ReadFile(target)
|
||||
assert.Equal(t, "untouched", string(got), "BackfillRefs wrote through a swapped-in symlink")
|
||||
assert.Positive(t, ok, "positive control: some backfills ran")
|
||||
}
|
||||
|
||||
// hyperguild#158: buildAndWrite wrote each page with os.WriteFile by path, so
|
||||
// a page read as regular and swapped for a symlink before the write was
|
||||
// written through. The target is not restored between rounds, so any
|
||||
// write-through shows.
|
||||
func TestBuildAndWriteNeverWritesThroughAPageSwappedForASymlink(t *testing.T) {
|
||||
brain := t.TempDir()
|
||||
mkdirs(t, brain, "wiki/sources", "wiki/concepts", "wiki/entities", "raw")
|
||||
page := filepath.Join(brain, "wiki", "concepts", "zq-concept.md")
|
||||
target := filepath.Join(brain, "raw", "secret.md")
|
||||
require.NoError(t, os.WriteFile(target, []byte("untouched"), 0o644))
|
||||
inside := "---\ntitle: Zq Concept\n---\nbody\n"
|
||||
require.NoError(t, os.WriteFile(page, []byte(inside), 0o644))
|
||||
pages := []RawPage{{Title: "Zq Concept", Type: "concept", Content: "## About\n\nmore\n"}}
|
||||
brainfstest.StartSwap(t, page, inside, target, false)
|
||||
ok := 0
|
||||
for deadline := time.Now().Add(2 * time.Second); time.Now().Before(deadline); {
|
||||
if _, err := RunRaw(context.Background(), brain, "zq source", pages, false); err == nil {
|
||||
ok++
|
||||
}
|
||||
}
|
||||
got, _ := os.ReadFile(target)
|
||||
assert.Equal(t, "untouched", string(got), "buildAndWrite wrote through a swapped-in symlink")
|
||||
assert.Positive(t, ok, "positive control: some runs returned without error")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user