capture #49a: classification taxonomy + per-wing/repo tagging (I1 prerequisite) #50
Closed
opened 2026-06-22 20:26:32 +00:00 by mathias
·
1 comment
No Branch/Tag Specified
main
fix/pipeline-writes-158
fix/edit-path-io-192
fix/create-regular-188
fix/guard-special-179
fix/linkcheck-keeps-write-178
fix/write-dir-redirect-173
fix/tunnel-detect-174
fix/pipeline-root-157
w3/154-mcp-auth-wiring
fix/tunnel-traversal
test/in-brain-targets-171
fix/brain-scan-root-157
fix/graph-wiki-root-157
fix/vectorstore-root-157
fix/notes-root-157
fix/search-root-157
fix/brainwide-root-157
fix/raw-symlinks-153
feat/symlink-tripwire-157
fix/rest-auth-149
fix/123-brain-edit-envelope-check
feat/106-page-aware-extraction
fix/105-source-drift-on-main
fix/104-surface-merge-conflicts-on-main
agent/b1-compile-on-ingest
agent/104-surface-merge-conflicts
agent/105-source-drift
agent/107-loud-unconfigured-alerting
feat/brain-read-edit
fix/capture-i1-refusal-names-target
renovate/configure
feat/consolidate-single-harness
icebox/cmd-routing
feat/brain-pending-promote
fix/close-session-classification-refresh
fix/capture-summarywriter
v0.24.0
v0.23.1
v0.23.0
v0.22.0
v0.21.1
v0.21.0
v0.20.1
v0.20.0
v0.19.1
v0.19.0
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.0
v0.16.1
v0.16.0
v0.15.0
v0.14.0
v0.13.2
v0.13.1
v0.13.0
v0.12.1
v0.12.0
v0.11.2
icebox/cmd-routing-2026-07-01
v0.11.1
v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.0
v0.4.1
v0.4.0
v0.3.0
v0.2.0
v0.1.0
Labels
Clear labels
agent/ready
blocked/client
blocked/supplier
blocked/upstream
risk/high
risk/low
risk/medium
size/l
size/m
size/s
size/xs
status:dispatch
status:dispatched
status:review
status:reviewing
type/chore
type/decision
type/docs
type/feat
type/fix
type/ops
type/research
type/test
Meets the agent-ready contract; authorizes unattended execution
Waiting on the client
Waiting on a supplier
Waiting on an upstream project or vendor
Irreversible, security-relevant, or control plane
Reversible, local, test-covered
Touches shared state, deploys or data
Too big - split it
Under two days
Under half a day
Under an hour
Maintenance, no behaviour change
Human decision required; never agent/ready
Documentation only
New capability
Corrects broken behaviour
Infrastructure, deploy, runtime
Investigate; output is a finding, not code
Test coverage only
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mathias/hyperguild#50
Reference in New Issue
Block a user
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.
Parent: #49 · Spec:
specs/capture-bdd-spec.md§4.1 · Blocks the I1 gate in: #49d, #49fScope
Define the data-classification taxonomy and the per-wing / per-repo tagging mechanism the capture server reads to enforce I1. Pure prerequisite — no code dependency on the other sub-issues; can start immediately.
Per spec decision §4.1 (model C), the server must independently derive a target's classification to cross-check the caller's declared value (stricter wins). That derivation needs a tag to read. This issue provides it.
What to build
public<internal<confidential(ordered so "stricter wins" is a simple max). Confirm/adjust against the sovereignty model ininfra/docs/architecture/01-invariants.md(I1) and the trust zones (sovereign-soil / external-metered / us-nexus) — the classification must map cleanly onto placement rules._index.md, or awing-classification.yamlthe server reads). Aclient-*wing defaults toconfidential;hyperguild/homelabdefault tointernal; explicitly-public wings topublic..classificationfile, or a server-side map). Same defaulting logic.deriveClassification(target) -> levelthe use-case calls. Unknown/untagged target fails safe to the strictest (confidential), never to permissive.Acceptance criteria
deriveClassificationreturns the level for a tagged target; untagged → confidential (fail safe)client-*→ confidential; homelab/hyperguild → internal)task checkgreenNotes
This is the load-bearing prerequisite: until it exists, the I1 sovereignty gate (#49d) and the Q4 classification-aware audit posture (#49f) are not enforceable. Fail-safe-to-strictest is the critical correctness property — a missing tag must never silently downgrade.
Implemented — PR #56 (open, not merged)
PR: #56
New package
ingestion/internal/classification/. Taxonomypublic < internal < confidential(ordered → "stricter wins" =max).Config.Derive(Target)/Wing/Reporesolve a destination's level: explicit tag (from optionalclassification.yaml) wins →client-*=confidential →hyperguild/homelab=internal → everything else=confidential (fail safe).Design call: central
classification.yamlat the brain root, not_index.mdfrontmatter (BuildWingIndex regenerates it) and not gitea repo topics (would couple #50 to the #52 tracker — chose the server-readable map so #50 has zero dependency on #52, keeping both epic roots parallel-buildable). Auditable in one place (I2/I5).All ACs met incl. untagged-fails-safe (
""and unknown wings/repos → confidential), stricter-wins, explicit-override, bad-level-in-file → hard error, case-insensitive matching.task checkgreen.Docs: spec §4.1 "Implemented (#50)" note + brain
wiki/hyperguild/decisions/capture-classification-taxonomy.Unblocks: the I1 gate in #53 and the audit posture in #54 now have a classification source to read. Next on the critical path: #52 (gitea tracker, depends on #51) — and #51 (CaptureService + BrainStore extraction) is the other parallel root, ready to start.