fix(pipeline,api,wing): never archive a note as processed when nothing was ingested; titles do not merge sources; ties prefer the page on disk (review of #211, pass 3)
- in a wing, an ingest that writes no source page is an error: the note goes to
raw/failed with the warnings in log.md instead of leaving the inbox as
'processed' (model returned [], only invalid types, only clashing entities)
- the wing's source path is deterministic, so Resolve no longer redirects a
source onto another note's page because the model gave both the same title
('Home'); that overwrote the hash and the text
- a batch tie between concept and entity prefers the page already on disk, so
its update is not lost; the wing's own source page keeps its slug even when a
foreign page shares it
- brain_pending lists an unreadable (over-cap) note with the reason instead of
dropping it; the client filter's 4 KiB match-span limit is documented
Each has a test that fails without it (mutation-checked).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -339,3 +339,20 @@ func TestFrontmatterWing(t *testing.T) {
|
||||
func TestFrontmatterWing_ABOMDoesNotHideTheKey(t *testing.T) {
|
||||
assert.Equal(t, "homelab", frontmatterWing("\ufeff---\nwing: homelab\n---\nbody"))
|
||||
}
|
||||
|
||||
// A note that produced nothing must not leave the inbox as "processed".
|
||||
func TestProcessDir_AWingIngestThatWritesNothingFailsTheNoteVisibly(t *testing.T) {
|
||||
var llmCalls atomic.Int32
|
||||
cfg, brainDir := wingTestCfg(t, router, &llmCalls)
|
||||
cfg.Pipeline.Complete = func(context.Context, string, string) (string, error) { return "[]", nil }
|
||||
put(t, brainDir, "empty-result.md", "A note the model returned nothing for.")
|
||||
|
||||
require.Empty(t, processDir(context.Background(), cfg, "2026-10-20"))
|
||||
|
||||
assert.True(t, has(brainDir, "raw/failed/empty-result.md"), "kept where a human looks")
|
||||
processed, _ := filepath.Glob(filepath.Join(brainDir, "raw", "processed", "*", "*"))
|
||||
assert.Empty(t, processed, "never archived as processed")
|
||||
logb, err := os.ReadFile(filepath.Join(brainDir, "log.md"))
|
||||
require.NoError(t, err)
|
||||
assert.Contains(t, string(logb), "no source page")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user