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:
@@ -12,6 +12,7 @@ with the machines you drop files from. (hyperguild#205, #208, #209)
|
||||
| a note whose text matches the client-content pattern, with no folder | parked in `raw/needs-review/`, not extracted |
|
||||
| a folder or `wing:` naming an unknown, reserved or non-ASCII wing, or two disagreeing signals | parked in `raw/needs-review/` |
|
||||
| a note over the size cap, or one that cannot be archived | stays in `raw/`, reported once, not retried until it changes |
|
||||
| a note the model returned nothing usable for (no source page could be written) | fails: the note is kept in `raw/failed/` and the reason is in `log.md`; it is never archived as processed |
|
||||
|
||||
Concepts and entities are shared across wings because their slug is the graph's
|
||||
identity. A source whose slug is taken gets a wing-qualified one (`notes-homelab`).
|
||||
@@ -39,6 +40,13 @@ server runs is usable without a restart.
|
||||
|
||||
## Known limits
|
||||
|
||||
- The client filter works on 1 MiB chunks that overlap by 4 KiB. A match that can
|
||||
span more than 4 KiB (crafted padding between two words of a multi-word
|
||||
pattern, exactly at a chunk edge) is not guaranteed to be found; this affects
|
||||
notes over 1 MiB only. On a 64 MiB note the check takes about ten seconds.
|
||||
- A pattern that matches the empty string (`.*`, `x*`) parks every unsignalled
|
||||
note. That fails closed and only the operator's own configuration can do it.
|
||||
|
||||
- A deliberate folder into a sensitive wing places the note there, and the shared
|
||||
concept/entity pages then cite that source by title. Client material does not
|
||||
belong in the brain at all; the pattern only guards the unsignalled lane.
|
||||
|
||||
Reference in New Issue
Block a user