Sibling to #66, surfaced in the same 2026-06-23 capture dogfood. The classification mechanism shipped in #50/#56 (server reads an optional classification.yaml at brain root; defaultFor() returns internal for hyperguild/homelab, confidential for client-*, and confidential fail-safe for anything untagged). But no classification.yaml has ever been written, so only defaultFor() governs.
Consequence: every brain wing / gitea repo except hyperguild and homelab resolves to confidential, and since effective classification = strictest across all capture targets, a capture from claude.ai (us-nexus) that touches any other repo (brain, ai-sessions, infra, tapir, …) is refused by the I1 gate. This is technically correct (fail-safe), but it means capture is unusable from claude.ai for most real sessions until the homelab-internal repos are explicitly tagged.
What to do
Create classification.yaml at the brain repo root, explicitly tagging the homelab-internal repos and wings as internal so they stop fail-safing to confidential. Confirm the exact schema against the #56 loader (Load/classificationFor in ingestion/internal/classification/), but it is a wings: + repos: map of name → level.
Tag as internal (homelab-sovereign, non-client): the homelab repos — brain, ai-sessions, infra, hyperguild, homelab, tapir, agentsquad, jepa-fx-risk, swedsl, and the other non-client mathias/* repos. Leave any client-* work to default confidential. Treat genuinely public repos (if any) as public.
Important — this is a classification policy artifact, not a code change. It declares which repos are safe to handle through us-nexus harnesses (claude.ai). That is a sovereignty/trust-zone decision (I1) and should be reviewed deliberately, not auto-generated. Mathias should eyeball the final repo→level map before it merges. When in doubt, leave untagged (fail-safe confidential) rather than tag permissively.
Acceptance
classification.yaml at brain root, schema matching the #56 loader
Homelab-internal repos + wings tagged internal; client-* left to default confidential
Repo→level map reviewed by Mathias before merge (sovereignty decision, not a mechanical fill)
Brain pod picks up the file (confirm load path — does it need a reload/restart, or is it read per-request?)
Re-dogfood from claude.ai: a capture touching ai-sessions + hyperguild resolves internal and is NOT refused
Untagged/unknown repo still fail-safes to confidential (regression check — do not break the fail-safe)
Related
#66 (SummaryWriter wiring — sibling; both needed for capture to fully work from claude.ai)
#50/#56 (the classification mechanism this populates)
brain note wiki/hyperguild/failures/first-live-dogfood-of-braincapture-surfaced-two-real-operat.md (the finding)
## Symptom
Sibling to #66, surfaced in the same 2026-06-23 capture dogfood. The classification **mechanism** shipped in #50/#56 (server reads an optional `classification.yaml` at brain root; `defaultFor()` returns `internal` for `hyperguild`/`homelab`, `confidential` for `client-*`, and **`confidential` fail-safe for anything untagged**). But **no `classification.yaml` has ever been written**, so only `defaultFor()` governs.
Consequence: every brain wing / gitea repo except `hyperguild` and `homelab` resolves to **confidential**, and since effective classification = strictest across all capture targets, a capture from claude.ai (us-nexus) that touches *any* other repo (`brain`, `ai-sessions`, `infra`, `tapir`, …) is **refused by the I1 gate**. This is technically correct (fail-safe), but it means capture is unusable from claude.ai for most real sessions until the homelab-internal repos are explicitly tagged.
## What to do
Create `classification.yaml` at the brain repo root, explicitly tagging the homelab-internal repos and wings as `internal` so they stop fail-safing to confidential. Confirm the exact schema against the #56 loader (`Load`/`classificationFor` in `ingestion/internal/classification/`), but it is a `wings:` + `repos:` map of name → level.
Tag as **internal** (homelab-sovereign, non-client): the homelab repos — `brain`, `ai-sessions`, `infra`, `hyperguild`, `homelab`, `tapir`, `agentsquad`, `jepa-fx-risk`, `swedsl`, and the other non-client mathias/* repos. Leave any `client-*` work to default `confidential`. Treat genuinely public repos (if any) as `public`.
**Important — this is a classification policy artifact, not a code change.** It declares which repos are safe to handle through us-nexus harnesses (claude.ai). That is a sovereignty/trust-zone decision (I1) and should be reviewed deliberately, not auto-generated. Mathias should eyeball the final repo→level map before it merges. When in doubt, leave untagged (fail-safe confidential) rather than tag permissively.
## Acceptance
- [ ] `classification.yaml` at brain root, schema matching the #56 loader
- [ ] Homelab-internal repos + wings tagged `internal`; `client-*` left to default confidential
- [ ] Repo→level map reviewed by Mathias before merge (sovereignty decision, not a mechanical fill)
- [ ] Brain pod picks up the file (confirm load path — does it need a reload/restart, or is it read per-request?)
- [ ] Re-dogfood from claude.ai: a capture touching `ai-sessions` + `hyperguild` resolves `internal` and is NOT refused
- [ ] Untagged/unknown repo still fail-safes to confidential (regression check — do not break the fail-safe)
## Related
- #66 (SummaryWriter wiring — sibling; both needed for capture to fully work from claude.ai)
- #50/#56 (the classification mechanism this populates)
- brain note `wiki/hyperguild/failures/first-live-dogfood-of-braincapture-surfaced-two-real-operat.md` (the finding)
client-* left absent → confidential by default; fail-safe preserved for anything untagged.
STOP point — this is yours to confirm: the repo→level map is a sovereignty/trust-zone decision (which repos are safe through us-nexus). I drafted; review every entry before merging #12. When you were unsure I left it out.
Load path (acceptance Q): read once at startup, not per-request → after merge + brain-sync to the koala hostPath, the ingestion pod must restart/roll to pick it up.
## Drafted — brain PR #12 (held for your sovereignty review)
`classification.yaml` at the `mathias/brain` root (where `classification.Load` reads it). Schema matches the #56 loader (`wings:` / `repos:` → level).
**Tagged `internal`** (from the dispatch's list, nothing beyond it):
- wings: `hyperguild`, `homelab`
- repos: `brain`, `ai-sessions`, `infra`, `hyperguild`, `homelab`, `tapir`, `agentsquad`, `jepa-fx-risk`, `swedsl`
`client-*` left absent → confidential by default; fail-safe preserved for anything untagged.
**STOP point — this is yours to confirm:** the repo→level map is a sovereignty/trust-zone decision (which repos are safe through us-nexus). I drafted; **review every entry before merging #12**. When you were unsure I left it out.
**Load path (acceptance Q):** read **once at startup**, not per-request → after merge + `brain-sync` to the koala hostPath, the ingestion pod must **restart/roll** to pick it up.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Symptom
Sibling to #66, surfaced in the same 2026-06-23 capture dogfood. The classification mechanism shipped in #50/#56 (server reads an optional
classification.yamlat brain root;defaultFor()returnsinternalforhyperguild/homelab,confidentialforclient-*, andconfidentialfail-safe for anything untagged). But noclassification.yamlhas ever been written, so onlydefaultFor()governs.Consequence: every brain wing / gitea repo except
hyperguildandhomelabresolves to confidential, and since effective classification = strictest across all capture targets, a capture from claude.ai (us-nexus) that touches any other repo (brain,ai-sessions,infra,tapir, …) is refused by the I1 gate. This is technically correct (fail-safe), but it means capture is unusable from claude.ai for most real sessions until the homelab-internal repos are explicitly tagged.What to do
Create
classification.yamlat the brain repo root, explicitly tagging the homelab-internal repos and wings asinternalso they stop fail-safing to confidential. Confirm the exact schema against the #56 loader (Load/classificationForiningestion/internal/classification/), but it is awings:+repos:map of name → level.Tag as internal (homelab-sovereign, non-client): the homelab repos —
brain,ai-sessions,infra,hyperguild,homelab,tapir,agentsquad,jepa-fx-risk,swedsl, and the other non-client mathias/* repos. Leave anyclient-*work to defaultconfidential. Treat genuinely public repos (if any) aspublic.Important — this is a classification policy artifact, not a code change. It declares which repos are safe to handle through us-nexus harnesses (claude.ai). That is a sovereignty/trust-zone decision (I1) and should be reviewed deliberately, not auto-generated. Mathias should eyeball the final repo→level map before it merges. When in doubt, leave untagged (fail-safe confidential) rather than tag permissively.
Acceptance
classification.yamlat brain root, schema matching the #56 loaderinternal;client-*left to default confidentialai-sessions+hyperguildresolvesinternaland is NOT refusedRelated
wiki/hyperguild/failures/first-live-dogfood-of-braincapture-surfaced-two-real-operat.md(the finding)Drafted — brain PR #12 (held for your sovereignty review)
classification.yamlat themathias/brainroot (whereclassification.Loadreads it). Schema matches the #56 loader (wings:/repos:→ level).Tagged
internal(from the dispatch's list, nothing beyond it):hyperguild,homelabbrain,ai-sessions,infra,hyperguild,homelab,tapir,agentsquad,jepa-fx-risk,swedslclient-*left absent → confidential by default; fail-safe preserved for anything untagged.STOP point — this is yours to confirm: the repo→level map is a sovereignty/trust-zone decision (which repos are safe through us-nexus). I drafted; review every entry before merging #12. When you were unsure I left it out.
Load path (acceptance Q): read once at startup, not per-request → after merge +
brain-syncto the koala hostPath, the ingestion pod must restart/roll to pick it up.