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:
@@ -97,6 +97,16 @@ func listNotes(root *os.Root, queue string) ([]PendingNote, error) {
|
||||
}
|
||||
raw, info, readErr := readRawNote(root, e.Name())
|
||||
if readErr != nil {
|
||||
// Not skipped: a note that cannot be read (over the cap, say) must
|
||||
// not silently vanish from the queue it is waiting in.
|
||||
fi, ierr := root.Lstat(e.Name())
|
||||
if ierr != nil {
|
||||
continue
|
||||
}
|
||||
out = append(out, PendingNote{
|
||||
Filename: e.Name(), CreatedAt: fi.ModTime().UTC().Format(time.RFC3339), SizeBytes: fi.Size(),
|
||||
Excerpt: "(cannot be read: " + readErr.Error() + ")", Queue: queue,
|
||||
})
|
||||
continue
|
||||
}
|
||||
fm, body := parseFrontmatter(string(raw))
|
||||
|
||||
Reference in New Issue
Block a user