capture #49e: I5 audit path + classification-aware degradation (loki + buffer + reconcile) #54
Closed
opened 2026-06-22 20:27:44 +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#54
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§2 (I5), §4.4 · Depends on: #50 (classification), #53 (the adapter it instruments) · Independent of: #49f (relay)Scope
The I5 audit path with Q4 classification-aware degradation. Needed by any capture deployment, including direct-REST/library-only — so it's split from the relay (#49f) and can land before it. After this, direct-REST capture (CLI/Agentsquad) is fully I5-compliant.
What to build (per §4.4, classification-aware)
AuditSinkimpl → alloy/loki. Every capture emits a request-level audit record: actor/principal, server-derived harness origin, effective classification, items written (ids/numbers), timestamp, outcome.Acceptance criteria
AuditSinkwrites request-level records to loki with the full field settask checkgreenNotes
Couples to #50's classification (the degradation tier is the effective classification) and instruments #53's adapter. The buffer/reconcile machinery is internal/public-tier only — confidential is a plain refuse, which is why the build is smaller than a global-buffer design. Gherkin scenarios this makes live: the entire I5 classification-aware audit block.
Implemented — PR #60 (open, base main)
PR: #60 · branches from
main(#53 merged).Two-phase port (the load-bearing design):
Reserve(level)runs before any write and refuses (confidential+down, or floor) / grants central / grants buffered;Record(entry, outcome)runs after. Makes "refuse before any write" literally true even though the record lists what landed.audit.DegradingSink(§4.4): central up → central; down+confidential → refuse (no buffer); down+internal/public+buffer-writable → buffer+ntfy+receipt flag; down+buffer-unwritable → floor refuse.Components:
FileBuffer(durable JSONL, survives restart, confirm-then-clear per record),LokiCentral(/ready + /loki/api/v1/push),NtfyNotifier(token never logged),Reconcile/StartReconcile(replay on recovery, failed push keeps record buffered).SlogSink→ two-phase, default when no loki.Wiring:
buildAuditSinkpicks DegradingSink (loki+buffer+ntfy+reconcile) whenBRAIN_LOKI_URLset, else slog.ErrAuditUnavailable→ HTTP 503. Env:BRAIN_LOKI_URL,BRAIN_NTFY_URL,BRAIN_NTFY_TOKEN,BRAIN_AUDIT_RECONCILE_INTERVAL.All ACs met (incl. confidential-refuse, internal-buffer, floor-refuse, reconcile, survives-restart);
task checkgreen.⚠️ For #55 (k3s manifest, I3): the durable buffer is a file at
<brain>/.audit-buffer/capture.jsonl. In k8s it must be on a persistent volume, else "durable across restart" fails on pod reschedule. Flag for the relay manifest.Brain:
wiki/hyperguild/decisions/two-phase-reserve-record-audit-gate.Milestone: #50–#54 complete capture for direct-REST harnesses, fully I1+I5-compliant. Only #55 remains (central relay + I2 security-baseline ledger — heaviest security weight; ledger must merge before relay ships).