Follow-ups left open by the reviews of #206, #207, #210, #211 (inbox / wing routing) #212

Open
opened 2026-10-20 19:00:37 +00:00 by mathias · 0 comments
Owner

Filed so none of this lives only in PR comments (sprint #209). Each item names where it came from. None blocked a merge; all were stated in the PR threads.

Pipeline / data

  1. Legacy (flag-off) path archives a note as processed when the model returns [] (or invalid JSON / only invalid types). Pre-existing; #211 fixed it only in wing mode. Source: #211 pass 3 F1.
  2. Shared concept/entity pages lose the first wing's attribution on merge (origin and last_updated are re-stamped to the latest ingest; Sources back-references are bare slugs). Source: #211 pass 1 finding 10. Documented in docs/raw-inbox.md.
  3. [[Home]]-style links are ambiguous when two sources share a title: buildTitleMap lets the last inventory entry win and inventory is a map, so the winner can vary. Links always carry the right slug when written [[slug|Title]]; bare titles can pick either. Source: #211 pass 4 (2).
  4. Entity-only output: the entity page is written (orphan, no source backlink) before the note is failed. Idempotent on retry; cosmetic. Source: #211 pass 4 A2.
  5. A deliberate raw/<sensitive-wing>/ folder puts that source's title into shared entity/concept pages (visible to every search). The client filter guards only the unsignalled lane; the brain's own rule is that client material does not belong in it at all. Source: #211 PR description.
  6. brain_promote into a brand-new wing creates it (existing promote rule); the router's "never create a wing" does not extend to it. Source: #211 pass 1.

Watcher / write safety
7. Disk-full mid-write leaves a truncated file at an archive name (brainfs.createNew is not atomic; the original is kept, the next round writes name-2). Source: #210 pass 2 finding 3. Related: PutRegular/WriteRegular truncate in place (#158 comment).
8. EACCES on raw/processed repeats its error every poll (bounded, nothing lost). Source: #210 F5.
9. parkForReview reads a pdf with the default cap, not cfg.MaxNoteBytes. Source: #210 pass 2.
10. changedSince is size+mtime: a same-size rewrite with a restored mtime is not detected, and there is a check-then-act window before Remove. Source: #206 review.
11. The marker-fallback write in retire is not pinned by a test (forcing Remove to fail without failing the marker write needs a sticky-bit directory owned by another user). Source: #210 F4.
12. An over-cap note cannot be cleared through brain_promote/brain_reject (both read the file and fail at the cap); it is listed with instructions to delete or move it by hand. Reject could move it by rename. Source: #211 pass 4 B.
13. .TXT/.PDF upper-case parked files are not listed (case-sensitive suffix). Source: #211 pass 2.

Client filter
14. The lookalike table is deliberately small (Cyrillic/Greek); leetspeak, punctuation splits (a.c.m.e), encodings and other homoglyphs are not caught. A match spanning >4 KiB across a 1 MiB chunk edge may be missed. A 64 MiB note takes ~10 s to check. Source: #211 passes 2-3.

Process / tooling
15. The merge tool refuses risk/medium and above ("a human reviews and merges in the Gitea UI"); merges in this sprint (#206, #207, #210) went through the Gitea API with the owner token under Mathias's explicit approval. If that is the intended lane, the tool's message should say how; if not, the API token is a bypass worth a decision.
16. #210 was merged as risk/medium though the PR it superseded (#195) was labelled risk/high by its author. Disclosed on the PR. Rule of thumb adopted: inherit the highest label of anything you land.
17. #158 stays open for the still path-based writers listed in its latest comment (frontmatter lint --fix, brain_edit rollback + snapshot, notes/edit.go atomics, session MkdirAll).

Related, already tracked: #203 (brain_query ranking is substring counting), #192/#196/#197/#167 (write-path hardening), skills#56 (holdout scenarios).


Created via git-mcp on behalf of @mathias

Filed so none of this lives only in PR comments (sprint #209). Each item names where it came from. None blocked a merge; all were stated in the PR threads. **Pipeline / data** 1. **Legacy (flag-off) path archives a note as processed when the model returns `[]`** (or invalid JSON / only invalid types). Pre-existing; #211 fixed it only in wing mode. Source: #211 pass 3 F1. 2. **Shared concept/entity pages lose the first wing's attribution on merge** (`origin` and `last_updated` are re-stamped to the latest ingest; Sources back-references are bare slugs). Source: #211 pass 1 finding 10. Documented in docs/raw-inbox.md. 3. **`[[Home]]`-style links are ambiguous when two sources share a title**: `buildTitleMap` lets the last inventory entry win and inventory is a map, so the winner can vary. Links always carry the right slug when written `[[slug|Title]]`; bare titles can pick either. Source: #211 pass 4 (2). 4. **Entity-only output**: the entity page is written (orphan, no source backlink) before the note is failed. Idempotent on retry; cosmetic. Source: #211 pass 4 A2. 5. **A deliberate `raw/<sensitive-wing>/` folder puts that source's title into shared entity/concept pages** (visible to every search). The client filter guards only the unsignalled lane; the brain's own rule is that client material does not belong in it at all. Source: #211 PR description. 6. **brain_promote into a brand-new wing creates it** (existing promote rule); the router's "never create a wing" does not extend to it. Source: #211 pass 1. **Watcher / write safety** 7. **Disk-full mid-write leaves a truncated file at an archive name** (`brainfs.createNew` is not atomic; the original is kept, the next round writes `name-2`). Source: #210 pass 2 finding 3. Related: `PutRegular/WriteRegular` truncate in place (#158 comment). 8. **EACCES on `raw/processed` repeats its error every poll** (bounded, nothing lost). Source: #210 F5. 9. **`parkForReview` reads a pdf with the default cap, not `cfg.MaxNoteBytes`.** Source: #210 pass 2. 10. **`changedSince` is size+mtime**: a same-size rewrite with a restored mtime is not detected, and there is a check-then-act window before Remove. Source: #206 review. 11. **The marker-fallback write in `retire` is not pinned by a test** (forcing Remove to fail without failing the marker write needs a sticky-bit directory owned by another user). Source: #210 F4. 12. **An over-cap note cannot be cleared through brain_promote/brain_reject** (both read the file and fail at the cap); it is listed with instructions to delete or move it by hand. Reject could move it by rename. Source: #211 pass 4 B. 13. **`.TXT`/`.PDF` upper-case parked files are not listed** (case-sensitive suffix). Source: #211 pass 2. **Client filter** 14. The lookalike table is deliberately small (Cyrillic/Greek); leetspeak, punctuation splits (`a.c.m.e`), encodings and other homoglyphs are not caught. A match spanning >4 KiB across a 1 MiB chunk edge may be missed. A 64 MiB note takes ~10 s to check. Source: #211 passes 2-3. **Process / tooling** 15. **The merge tool refuses risk/medium and above** ("a human reviews and merges in the Gitea UI"); merges in this sprint (#206, #207, #210) went through the Gitea API with the owner token under Mathias's explicit approval. If that is the intended lane, the tool's message should say how; if not, the API token is a bypass worth a decision. 16. **#210 was merged as risk/medium though the PR it superseded (#195) was labelled risk/high** by its author. Disclosed on the PR. Rule of thumb adopted: inherit the highest label of anything you land. 17. **#158 stays open** for the still path-based writers listed in its latest comment (frontmatter lint --fix, brain_edit rollback + snapshot, notes/edit.go atomics, session MkdirAll). Related, already tracked: #203 (brain_query ranking is substring counting), #192/#196/#197/#167 (write-path hardening), skills#56 (holdout scenarios). --- _Created via git-mcp on behalf of @mathias_
mathias added the risk/lowtype/chore labels 2026-10-20 19:00:37 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mathias/hyperguild#212