Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
halo-record — Manipulationssichere Audit-Trails für KI-Agenten: hash-verkettete Runtime Records, ohne Abhängigkeiten, von jedem verifizierbar. | Kitploit
Tools/GitHubGitHub/bkuan001/halo-record
ForensikLieferkettensicherheitIncident ResponseKI-Sicherheit
GitHubbkuan001/halo-record

halo-record

Manipulationssichere Audit-Trails für KI-Agenten: hash-verkettete Runtime Records, ohne Abhängigkeiten, von jedem verifizierbar.

Repository anzeigen
63666vor 1 TagVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Webseite
Teilen

halo-record

Manipulationssichere Audit-Trails für KI-Agenten — hash-verkettete Runtime Records, dargestellt als Runtime Report, den Ihre Kunden selbst überprüfen können.

Jede Aktion, die Ihr Agent ausführt (Tool-Aufrufe, Modell-Aufrufe, Datenzugriffe, Genehmigungen), wird zu einem Runtime Record in einem append-only, hash-verketteten Log; der Runtime Report ist diese Kette, dargestellt als selbstverifizierende HTML-Seite. Jede Partei, die einen Checkpoint der Kette besitzt, kann verifizieren, dass die dahinterliegenden Records nie verändert wurden, ohne demjenigen vertrauen zu müssen, der sie erzeugt hat — dieser Checkpoint ist das tragende Element: Die Kette allein ist manipulationssicher gegenüber allen außer der Partei, die den Recorder betreibt (LIMITS.md §1). Wenn das Sicherheitsteam eines Kunden fragt „Was hat Ihr Agent mit unseren Daten gemacht?", geben Sie ihm einen Link statt eines Absatzes. Sicherheitsreviews stellen bereits KI-Fragen neben der SOC-2-Checkliste — und zunehmend kommen diese Fragen aus ISO 42001, den Aufzeichnungspflicht-Artikeln des EU AI Act und den eigenen Fragebögen der Kunden. Heute besteht noch eine schriftliche Zusicherung. Die Wette hinter diesem Projekt ist, dass das nicht lange so bleiben wird.

Vorgestellt in Help Net Security (August 2026).

Das Record-Format ist offen und frei implementierbar. Dieses Paket ist die Referenzimplementierung: Recorder, Verifier, Witness-Client und Report-Server.

Sie nutzen halo-record oder denken darüber nach? Sagen Sie mir, wer Sie sind und wofür → Who's using halo-record?

Selbst überprüfen

Ihnen wird nahegelegt, einen Recorder in Ihren Agenten einzubauen. Das sollten Sie nicht einfach glauben:

  • Keine Runtime-Abhängigkeiten. Nur Standardbibliothek. pip install halo-record installiert genau ein Paket.
  • Keine Netzwerkaufrufe, außer drei optionalen — Anchoring an einen Witness (sendet die Subject-ID, eine Record-Anzahl und zwei Chain-Fingerprints — den Head und die Chain-Root), das Zurücklesen der Checkpoints eines Witness (sendet die Subject-ID) und der RFC-3161-Zeitstempel (sendet nur den State-Hash eines Checkpoints an eine Timestamp Authority). Alle sind deaktiviert, sofern Sie sie nicht aufrufen; Record-Inhalte verlassen niemals Ihre Infrastruktur.
  • Rohe Tool-Argumente werden gehasht, mit einer redigierten Zusammenfassung daneben. Argumente werden als kanonischer Hash plus einer Zusammenfassung gespeichert: der Argumenttext mit maskierten bekannten Secret- und PII-Mustern, begrenzt auf 200 Zeichen. Eine kurze Eingabe, die keinem Muster entspricht, erscheint vollständig in der Zusammenfassung; der Hash-only-Modus (summaries=False) behält überhaupt keine Zusammenfassung. Die Redaktion ist Best-Effort (Regex über gängige Secret- und PII-Formate plus ein Entropie-Catch-all): Betrachten Sie sie als Defense-in-Depth, nicht als Garantie. Von Ihnen bereitgestellte Outcome-Felder jenseits von summary werden so versiegelt, wie sie sind (LIMITS §13).
  • Klein genug zum Auditieren. ~5.300 Zeilen Python (Codezeilen, ohne Leerzeilen und Kommentare). In einem Nachmittag vollständig lesbar.
  • Apache-2.0.
  • Der Papierkram ist erstklassig. LIMITS.md (was die Kette nicht beweisen kann), PRIVACY.md (was Records enthalten und was Ihre Maschine verlässt), RETENTION.md (Betrieb unter einer Aufbewahrungsrichtlinie) und REVIEWERS.md — die unabhängige Prüfung mit vier Befehlen plus ein Zitierformat für Review-Befunde.

Was jede Ebene beweist — die tragende Unterscheidung in diesem Projekt (LIMITS.md §1): Eine Kette, die Sie selbst halten, beweist, dass Records nicht bearbeitet wurden, relativ zu einem Head, den jemand bereits hält; nur Checkpoints, die außerhalb des Betreibers gehalten werden, beweisen, dass keine entfernt wurden; und kein Hash beweist, dass jede Aktion erfasst wurde.

BehauptungSelbst gehaltene Kette+ Externe Checkpoints+ Vertrauenswürdige Erfassung
Bearbeitungen an einem etablierten Artefakt erkennen✔✔✔
Umschreiben committeter Historie erkennen—✔✔
Fehlende/verspätete Checkpoints erkennen—✔ (vereinbarte Kadenz)✔
Beweisen, dass jede Aktion aufgezeichnet wurde——abhängig von der Erfassungsgrenze

Sehen Sie sich einen an, bevor Sie installieren: ein Beispiel-Runtime-Report — fiktive Daten, echte Kette, und er verifiziert sich selbst in Ihrem Browser, während Sie zusehen.

60-Sekunden-Demo

Kein Agent erforderlich. Mit uv nichts zu installieren:``` uvx --from halo-record halo demo --serve

root@kitploit:~
oder auf die klassische Weise:```
pip install halo-record
halo demo --serve

Entweder scaffoldet man einen fiktiven Support-Agent-Anbieter mit zwei Kunden, beobachtet die Chains (mit einer lokalen Witness-Datei als Stellvertreter für eine außerhalb des Operators — siehe LIMITS.md §1), serviert deren gated Runtime Reports und öffnet die Operator-Konsole im Browser. Dann den Tamper-Test versuchen: eine Zeile aus einer der .jsonl-Dateien löschen und neu laden. Der Report erkennt es.

Den eigenen Agenten aufzeichnen

Eine Zeile an der Grenze:```python from halo_record import trace

agent = trace(run_my_agent, profile="my-agent", log="audit.jsonl") # wraps your entrypoint; records the run boundary to ./audit.jsonl — add record_call() or a framework adapter at each tool boundary to capture individual calls

root@kitploit:~
Ein `from halo import ...`-Convenience-Shim wird ebenfalls mitgeliefert — aber der Name `halo` auf PyPI gehört zu einem unabhängigen Terminal-Spinner-Paket, und wenn dieses Paket installiert ist, gewinnt es den Import. `halo_record` ist eindeutig, daher verwenden die Beispiele es.

Ohne `log=` gehen Records nach `~/.halo/my-agent.jsonl` (eine Chain pro Agent). Der Wrapper versiegelt die Run-Grenze; die Evidenz liegt in den Per-Call-Records. Erfasse diese mit einem Framework-Adapter (Matrix unten) — oder explizit, was auch zeigt, wie Delegation verknüpft:```python
from halo_record import Recorder, record_call

rec = Recorder("audit.jsonl")

with record_call(rec, "crm.lookup", {"account": "acct-9"}) as call:            # one sealed record per tool call
    call.result = crm.lookup("acct-9")

with record_call(rec, "payments.refund", {"amount": 120},
                 parent_id=rec.last_record_id()) as call:                      # child links to the action that spawned it
    call.result = payments.refund(120)

Dann den Bericht rendern:``` halo report audit.jsonl -o report.html # one chain -> self-verifying HTML halo serve ./records --port 8721 # all tenants, gated per customer

root@kitploit:~
Der Quickstart endet, wenn du den Runtime Report deines eigenen Agenten im Browser siehst. Wenn du eine JSONL-Datei und keinen Report bekommen hast, stimmt etwas nicht: Öffne ein Issue.

### Der Verifikationsblock

Wenn eine Guardrail- oder Policy-Schicht die Aktion geprüft hat, kann ihr Urteil auf dem Datensatz mitgeführt werden — ein optionaler Block, der festhält, was das Gate entschieden hat, versiegelt in der Hash-Kette wie jedes andere Feld:```python
from halo_record import build

build("tool_call", "security", tool="payments.refund",
      verification={"status": "allowed", "verifier": "gate/1.2",
                    "policy_ref": "sha256:1f3a...",
                    "checked_at": "2026-08-01T12:00:00Z"})

was in den Datensatz einsiegelt als:```json "verification": {"status": "allowed", "verifier": "gate/1.2", "policy_ref": "sha256:1f3a...", "checked_at": "2026-08-01T12:00:00Z"}

root@kitploit:~
`record_call(...)` akzeptiert dasselbe `verification=`-Schlüsselwort. `status` ist innerhalb des Blocks erforderlich; `verifier`, `policy_ref` und `checked_at` sind optional. Was die einzelnen Status bedeuten:

| Status | Was das Gate meldet | Wurde die Aktion ausgeführt? |
|---|---|---|
| `allowed` | es hat die Aktion erlaubt | ja — die Aktion wurde fortgesetzt |
| `blocked` | es hat die Aktion verweigert | bestimmt durch die Integration, nicht durch dieses Feld — ein Datensatz kann dennoch ein Ergebnis tragen, und ein Block beweist für sich genommen keine Nichtausführung |
| `modified` | es hat die Aktion vor der Ausführung verändert — `action.input` beschreibt die Aktion **wie ausgeführt**, nach der Modifikation | ja, in der veränderten Form |
| `unverified` | es lief (oder wurde konsultiert), traf aber keine Feststellung — verschieden von einem fehlenden Block, was bedeutet, dass überhaupt keine Verifikationsaussage gemacht wurde | ja — die Aktion wurde ohne Urteil fortgesetzt |

Der Block wird vom Integration-Code des Betreibers bereitgestellt und zeichnet auf, was dieser als Aussage des Gates meldet — dieselbe Vertrauenshaltung wie bei `principal` (siehe [LIMITS](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md#11-verification-status-is-the-gates-report-not-halos-finding)). Das Versiegeln beweist, dass der Status nachträglich nicht verändert wurde; es beweist nicht, dass die Prüfung stattgefunden hat, dass das Urteil korrekt war oder dass eine blockierte Aktion nicht ausgeführt wurde. Dies ist keine unabhängige Verifikation.

Damit `policy_ref` als Nachweis verwendbar ist, verwenden Sie einen Content-Hash des Regelsatzes und bewahren Sie das Regelsatz-Artefakt auf — ein nicht auflösbares Label macht das Feld dekorativ.

## Anbinden an das, was Sie bereits betreiben

| An der Grenze erfasst | Aus vorhandener Telemetrie eingespeist |
|---|---|
| Nativer Recorder (`from halo_record import trace`) | OpenTelemetry GenAI Spans |
| MCP-Interceptor | LiteLLM-Callbacks |
| LangChain / LangGraph-Callback | Langfuse-Export |
| OpenAI Agents SDK Hooks | Jedes Gateway- / Reverse-Proxy-Log |
| Claude Agent SDK Hook | Claude Code und Codex CLI `PostToolUse` Hooks (feuern, nachdem das Tool lief) |

Framework-Adapter und Ingestion-Pfade versehen jeden Datensatz mit einem `source`-Tag, sodass der Bericht offenlegt, wie jeder Nachweis erhoben wurde. Erfasste und eingespeiste Datensätze leben in derselben Kette.

Für LangChain / LangGraph ist es ein Callback-Handler:```python
from halo_record import Recorder
from halo_record.integrations.langchain import HaloCallbackHandler

recorder = Recorder("audit.jsonl")
result = my_chain.invoke(inputs, config={"callbacks": [HaloCallbackHandler(recorder)]})   # every tool call becomes a record

Für MCP umschließt ein Aufruf die Client-Sitzung — und dann gibt jeder MCP-verwendende Agent Datensätze für jeden Tool-Aufruf aus, unabhängig davon, welches Framework ihn steuert:```python from halo_record.integrations.mcp import instrument_client_session

instrument_client_session(session, Recorder("audit.jsonl"), server="stripe") # every session.call_tool() is now recorded

root@kitploit:~
Für Gateway- oder Proxy-Logs (Cloudflare AI Gateway, Portkey, nginx vor dem Modell) wird eine Log-Zeile in die Kette eingefügt – explizit als ingestiert gekennzeichnet, nicht als Boundary-captured:```python
from halo_record.integrations.gateway import record_log

record_log(Recorder("audit.jsonl"), {"tool": "gen_ai:gpt-4o", "model": "gpt-4o", "status": 200, "subject": "acme-corp"})

Alles, was OpenTelemetry GenAI-Spans ausgibt (CrewAI, LlamaIndex und die meisten Agent-Frameworks mit OTel-Instrumentierung), landet über den OTel-Adapter in der Chain, und das TypeScript-Paket liefert native Adapter für das Vercel AI SDK und das JS-Agent-Ökosystem. Fehlt ein Adapter für deinen Stack? Eröffne ein Issue. Die meisten Adapter umfassen etwa hundert Zeilen.

Zeichne deinen Coding-Agenten auf (Claude Code oder Codex)

Claude Code feuert einen PostToolUse-Hook nach jedem Tool-Aufruf. Richte ihn auf halo hook aus, und jede Aktion — Dateischreibvorgänge, Shell-Befehle, MCP-Connector-Aufrufe — wird zu einem Record in einer lokalen Chain. Keine Codeänderungen; ein Eintrag in den Einstellungen:```json { "hooks": { "PostToolUse": [ {"matcher": "*", "hooks": [{"type": "command", "command": "halo hook"}]} ] } }

root@kitploit:~
Füge das zu `~/.claude/settings.json` hinzu, und Einträge landen in `~/.halo/audit.jsonl` (überschreibbar mit `$HALO_LOG`). Reine Orchestrierungswerkzeuge, die keine Daten, Netzwerk oder externen Zustand berühren, werden übersprungen — die Kette zeichnet Vertrauensgrenzaktionen auf, nicht Denken. Setze `HALO_HASH_ONLY=1`, um Inhalts-Hashes ohne Zusammenfassungen aufzuzeichnen. Setze `HALO_AGENT_VERSION` (und optional `HALO_AGENT_MODEL`), um jeden Eintrag an den Agenten-Build zu binden, der ihn erzeugt hat — wenn ein Auditor nach der Version fragt, die in einem bestimmten Zeitfenster lief, antwortet der Export spaltenweise statt aus dem Gedächtnis.

Codex CLI liefert dieselben Lifecycle-Hooks mit derselben Ereignisform (Hooks sind standardmäßig aktiviert). Füge dies zu `~/.codex/hooks.json` hinzu, und Codex' Shell-Befehle, `apply_patch`-Bearbeitungen und MCP-Aufrufe landen in derselben Kette:```json
{
  "hooks": {
    "PostToolUse": [
      {"matcher": ".*", "hooks": [{"type": "command", "command": "halo hook"}]}
    ]
  }
}

Der Hook unterscheidet die beiden vom Event selbst (Codex fügt turn_id und model hinzu) und kennzeichnet jeden Datensatz als claude-code oder codex; setze HALO_HOOK_AGENT, um eines zu erzwingen. Beide sind die ingestierte Stufe: Ein PostToolUse-Hook wird ausgelöst, nachdem das Tool ausgeführt wurde, sodass der Datensatz aus dem aufgebaut wird, was das Harness meldet.

Wenn der Bericht die Frage beantworten soll, „unter welchen Regeln dieser Lauf stattfand?", setze HALO_AUTHORITY_FILE auf einen JSON-Snapshot der effektiven Authority für die Sitzung. Halte ihn datenschutzsicher: Hashes und Refs, keine rohen Prompts, privaten Policy-Text, Secrets oder vollständigen Tool-Schemas — bekannte Secret-Formate werden zum Versiegelungszeitpunkt maskiert, aber Hashes und Refs passieren unverändert und Freitext wird nicht erkannt (siehe LIMITS §6). Verwende eine snapshot_id nur so lange wieder, wie die zugrunde liegende Authority unverändert ist; aufeinanderfolgende Datensätze mit derselben ID und unverändertem Inhalt werden kompaktiert — eine wiederverwendete ID über geändertem Inhalt wird vollständig gespeichert, mit einem Hinweis.```json { "snapshot_id": "auth_2026_07_08T1100Z", "captured_at": "2026-07-08T11:00:00Z", "scope": "session", "workspace": {"path_hash": "sha256:...", "git_commit": "abc1234"}, "refs": [ {"kind": "project_rules", "id": "CLAUDE.md", "hash": "sha256:...", "loaded": true, "truncated": false}, {"kind": "mcp_tool_registry", "id": "filesystem", "hash": "sha256:..."} ], "omissions": [{"kind": "private_policy", "reason": "customer_secret", "hash": "sha256:..."}], "stale_if": ["project_rules_hash_changed", "mcp_tool_registry_hash_changed"] }

root@kitploit:~
| `--config` | Pfad zur Konfigurationsdatei (Standard: `config.yaml`) |
| `--output` | Ausgabeverzeichnis für Berichte (Standard: `reports/`) |
| `--format` | Ausgabeformat: `json`, `html`, `csv` (Standard: `json`) |
| `--verbose` | Ausführliche Protokollierung aktivieren |
| `--quiet` | Alle Ausgaben außer Fehlern unterdrücken |

### Verwendungsbeispiele

```bash
# Grundlegende Ausführung mit Standardkonfiguration
python -m scanner --config config.yaml

# Ausführung mit benutzerdefiniertem Ausgabeverzeichnis und HTML-Bericht
python -m scanner --config config.yaml --output ./results --format html

# Ausführung im ausführlichen Modus
python -m scanner --config config.yaml --verbose

Konfiguration

Die Konfigurationsdatei verwendet das YAML-Format. Ein Beispiel finden Sie unter config.example.yaml.

Konfigurationsoptionen

OptionBeschreibungStandard
targetsListe der zu scannenden Ziele[]
timeoutTimeout in Sekunden30
threadsAnzahl der gleichzeitigen Threads10
retryAnzahl der Wiederholungsversuche3
log_levelProtokollierungsstufeINFO

Beispielkonfiguration

root@kitploit:~
targets:
  - https://example.com
  - https://test.example.org

timeout: 60
threads: 20
retry: 5
log_level: DEBUG

Ausgabe

Der Scanner unterstützt drei Ausgabeformate:

  • JSON: Maschinenlesbares Format, geeignet für die weitere Verarbeitung
  • HTML: Visueller Bericht, geeignet für die manuelle Überprüfung
  • CSV: Tabellarisches Format, geeignet für die Datenanalyse

JSON-Ausgabebeispiel

root@kitploit:~
{
  "scan_id": "abc123",
  "timestamp": "2024-01-15T10:30:00Z",
  "targets": [
    {
      "url": "https://example.com",
      "status": "success",
      "findings": []
    }
  ]
}

Fehlerbehebung

Häufige Probleme

Problem: ModuleNotFoundError: No module named 'scanner'

Lösung: Stellen Sie sicher, dass Sie sich im Stammverzeichnis des Projekts befinden und die Abhängigkeiten installiert sind:

root@kitploit:~
pip install -r requirements.txt

Problem: Permission denied beim Schreiben von Berichten

Lösung: Überprüfen Sie die Schreibberechtigungen für das Ausgabeverzeichnis oder verwenden Sie --output mit einem beschreibbaren Pfad.

Problem: Timeout-Fehler bei großen Zielen

Lösung: Erhöhen Sie den Wert timeout in der Konfigurationsdatei oder reduzieren Sie die Anzahl der threads.```sh HALO_AUTHORITY_FILE=./authority.json halo hook

root@kitploit:~
Der Snapshot wird in dieselbe Hash-Kette wie die Action-Records eingefügt. Ein guter Standard ist ein Session-Level-Snapshot zu Beginn, plus ein neuer Snapshot, wenn sich Regeln, Skills, Hooks, MCP-Tool-Registries oder die Compaction-Policy ändern. Um lange Sessions schlank zu halten, werden aufeinanderfolgende Records mit derselben `authority.snapshot_id` nach dem ersten vollständigen Snapshot kompaktiert: spätere Records behalten nur `{"snapshot_id": "...", "same_as_previous": true}`. Der Pointer bleibt hash-verkettet, aber der umfangreiche refs/omissions/stale-if-Block wird nicht bei jeder Action wiederholt. (Die Compaction erfolgt pro Recorder-Prozess: Bei Hook-artiger Erfassung, die pro Tool-Aufruf einen Prozess startet, wird der vollständige Body jedes Mal neu gespeichert, wenn der vorherige vollständige Snapshot nicht der Tail-Record ist, sodass kurzlebige Prozesse Ketten-Größe gegen den Wiederverwendungs-Guard eintauschen.)

SDK-Nutzer hängen denselben Block direkt an — `build(..., authority={...})` oder `record_call(..., authority={...})`; Hash-only-Erfassung ist dieselbe Oberfläche (`summaries=False` bei jedem von ihnen):```python
from halo_record import Recorder, record_call

rec = Recorder("audit.jsonl")
with record_call(rec, "crm.lookup", {"account": "acct-9"},
                 authority={"snapshot_id": "auth_1", "rules_hash": "sha256:..."},
                 summaries=False) as call:              # hash-only: no summaries, no excerpts
    call.result = crm.lookup("acct-9")

Dann das Übliche:``` halo verify ~/.halo/audit.jsonl halo report ~/.halo/audit.jsonl -o report.html

root@kitploit:~
Jede Agent-Runtime, die einen Post-Action-Hook bereitstellt, kann denselben Befehl einspeisen — der Hook liest ein Ereignis als JSON von stdin und hängt einen Datensatz an.

Eine Chain, ein Writer zur Zeit. Eine Chain ist eine verkettete Liste: Zwei Writer, die denselben Head lesen und beide anhängen, spalten sie auf (zwei Datensätze, die denselben Vorgänger beanspruchen), und die Verifikation wird die betroffenen Datensätze benennen. `Recorder` serialisiert seine eigenen Anhänge mit einem Sidecar-Lock (hier POSIX `flock`; ein Lock-Verzeichnis im TypeScript-Paket), und `halo hook` hängt über `Recorder` an, sodass das obige Hook-Setup abgedeckt ist. Alles, was die Chain-Datei direkt schreibt — ein handgeschriebener Hook, parallele Worker, ein Log-Shipper — muss einen äquivalenten exklusiven Lock über die Sequenz Read-Head-dann-Append halten oder in prozessspezifische Chains schreiben. [LIMITS.md Abschnitt 9](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md#9-single-writer-chains) behandelt dies vollständig, einschließlich der sprachübergreifenden Grenze.

## Wenn die Aufzeichnung fehlschlägt

Die beiden Integrationsstile schlagen absichtlich in entgegengesetzte Richtungen fehl — wähle denjenigen, dessen Fehlverhalten du verkraften kannst:

- **Framework-Adapter (LangChain, Hooks über Callback-Manager) schlagen offen fehl.** Wenn ein Datensatz nicht geschrieben werden kann (Festplatte voll, Berechtigungen), wird die Aktion des Agenten normal abgeschlossen und der Datensatz geht verloren. Der LangChain-Handler gibt eine laute Warnung an stderr aus und zählt den Verlust (`handler.lost_records`), aber nichts in der Chain selbst kann einen Datensatz anzeigen, der nie geschrieben wurde — eine stagnierende Chain verifiziert trotzdem. Witness-Checkpoints in regelmäßigen Abständen sind das, was eine stagnierende Chain sichtbar macht: Ein erwarteter Checkpoint, der nie eintrifft, ist der Alarm.
- **Der native `trace()`-Wrapper schlägt geschlossen fehl.** Wenn der Datensatz nicht geschrieben werden kann, breitet sich die Ausnahme in die Aktion des Agenten aus — keine Evidenz, keine Aktion. Strenger, und es kann deinen Agenten unterbrechen.

Keine der beiden Standardeinstellungen ist für alle richtig; wisse, welche du ausführst.

## Integrität vs. Vollständigkeit (lies diesen Teil)

Sei präzise darüber, was jede Schicht beweist — denn es sind unterschiedliche Behauptungen, und die Unterschiede sind der Punkt:

Eine selbst gehaltene Chain beweist **Integrität relativ zu einem etablierten Head**: Gegeben ein Chain-Head, den jemand bereits hält, wird jede Bearbeitung, Umordnung oder Löschung in den Datensätzen dahinter erkennbar. Für sich genommen — bevor jemand außerhalb des Betreibers einen Head gesehen hat — beweist eine Chain interne Konsistenz, nicht Historie: Ein Betreiber könnte einen Datensatz weglassen und neu versiegeln, und die neue Datei würde verifizieren. Die Chain wird **historisch festgeschrieben** in dem Moment, in dem ihr Head die Kontrolle des Betreibers verlässt.

Das ist der Witness: Eine Partei außerhalb des Betreibers, die periodische Checkpoints der Chain hält — die Subject-ID, eine Datensatzanzahl und zwei Chain-Fingerabdrücke (der Head und die Chain-Root); die exakte Payload, und nichts anderes. Checkpoints machen das Umschreiben festgeschriebener Historie erkennbar, und ein verpasster Checkpoint ist selbst ein sichtbares Ereignis:```
halo anchor audit.jsonl witness.jsonl           # anchor a checkpoint to a local witness
halo anchor audit.jsonl witness.jsonl --check   # completeness verdict against it

Für time speziell ersetzt ein externer RFC-3161-Zeitstempel die selbstbehauptete Uhr des Checkpoints durch einen Nachweis von einer Timestamp Authority, die der Betreiber nicht kontrolliert — „diese Chain erreichte diesen Head nicht später als T", verifizierbar durch einen Dritten ohne gehostete Infrastruktur. Die Standard-TSA ist das kostenlose freetsa.org (für die Evaluierung in Ordnung); für die Produktion mit --tsa auf eine kommerzielle TSA (DigiCert / Sectigo / Ihre eigene) verweisen:``` halo anchor audit.jsonl witness.jsonl --timestamp # attach a TSA time proof to the checkpoint halo anchor audit.jsonl witness.jsonl --check # reads the token's claimed time

root@kitploit:~
`--check` bestätigt, dass das Token an diesen Chain-Zustand gebunden ist, und liest dessen bestätigte Zeit, aber es validiert **nicht** die Signatur der TSA — das wird bewusst einem Standardwerkzeug überlassen, damit ein Prüfer keinem Code von uns vertrauen muss. Um die Zeit unabhängig zu verifizieren (das ist es, was Sie einem Sicherheitsprüfer aushändigen):```
# tsa.token_b64 lives in the witness log; decode the latest one to a standard .tsr file
python3 -c 'import json,base64; cps=[json.loads(l) for l in open("witness.jsonl") if l.strip()]; t=[c["tsa"] for c in cps if c.get("tsa")][-1]; open("token.tsr","wb").write(base64.b64decode(t["token_b64"])); print(t["digest"])'
curl -s -o tsa-ca.pem https://freetsa.org/files/cacert.pem     # CA for the default TSA (a commercial TSA publishes its own)
openssl ts -verify -digest <the digest printed above> -in token.tsr -CAfile tsa-ca.pem   # → "Verification: OK"

Eine weitere Grenze, klar ausgedrückt: Weder die Kette noch der Witness beweist, dass jede reale Aktion durch den Recorder gelaufen ist. Das ist Capture-Vollständigkeit — eine Eigenschaft davon, wo der Recorder im Stack sitzt (native Instrumentierung, Hooks, Gateway-Ingestion), nicht von irgendeinem Hash. Records tragen aus genau diesem Grund ein source-Tag. Die Claims-Tabelle unter „Check it yourself“ oben auf dieser Seite ist die Zusammenfassung dieser drei Schichten.

Jeder kann einen Witness betreiben. Ein Witness, den du selbst betreibst, schreibt die Historie dir zu; sie deinem Kunden zuzuschreiben erfordert einen Witness, dem er Grund zu vertrauen hat. Das Protokoll ist in beiden Fällen offen.

Ein gehosteter, anerkannter Witness ist der Weg, wie sich dieses Projekt selbst tragen wird. Early Access: [email protected].

Personenbezogene Daten in der Kette

Die Kette ist append-only: Alles, was in einen Record versiegelt wird, bleibt dort, denn es zu entfernen würde die Verifikation für alles danach brechen. Tool-Argumente werden bereits behandelt — gespeichert als Hash plus eine redigierte Zusammenfassung, begrenzt auf 200 Zeichen (hash-only-Modus behält keine Zusammenfassung).

Beachte die Einschränkung in diesem Satz: redigiert, nicht entfernt. LIMITS.md Abschnitt 6 stellt ausdrücklich fest, dass ein Name oder eine Postanschrift kein verlässliches Muster hat, sodass weder das eine noch das andere erkannt und weder das eine noch das andere maskiert wird. Und subject ist nicht das einzige Feld, das von dir gelieferten Text trägt — principal, approver, session_id, agent, authority, data und die Zusammenfassungen tun dies alle.

Das Muster, das funktioniert: Setze eine stabile pseudonyme ID in die Kette und halte die Zuordnung zu einer beliebigen Person in einem System, aus dem du löschen kannst. Eine Löschungsanfrage wird dann durch Löschen der Zuordnung erfüllt. Halte subject auf die Tenant-Organisation gerichtet, nicht auf eine Person:```python from halo_record import build

build("tool_call", "privacy", subject={"id": "acme", "name": "Acme Corp"})

root@kitploit:~
Keine Einstellung erzwingt dies — es ist eine Disziplin darin, wie du den Recorder aufrufst.
Es macht die Löschung handhabbar; es ist keine Anonymisierung, und es gibt noch keine
integrierte Aufbewahrung oder Bereinigung.
[LIMITS.md Abschnitt 13](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md#13-personal-data-and-erasure) enthält die vollständige Feldliste,
erklärt, warum der gespeicherte Eingabe-Fingerabdruck einen erratbaren Wert bestätigen kann, selbst
nachdem die Zuordnung entfernt wurde, und endet mit Fragen, die ein Prüfer stellen sollte.

Zeichne einen Modellaufruf auf (die erste Frage des Käufers: „Welches Modell hat meine Daten gesehen?"):```python
from halo_record import record_model_call

record_model_call(rec, provider="anthropic", model="claude-sonnet-4-6",
                  zdr=True, purpose="draft support reply",
                  subject="acme")   # tool=model.generate, scope=model:anthropic

Wo das in einen Compliance-Stack passt

halo-record ist eine Evidenzschicht, keine Zertifizierung. Es erzeugt das Artefakt, nach dem Bewertungsframeworks immer wieder mit anderen Worten fragen. Eine Scope-Anmerkung, die jeden Punkt unten bestimmt: Dies sind Integritätsaussagen über den Datensatz; Vollständigkeit gegenüber dem Betreiber erfordert einen externen Zeugen, der Checkpoints hält (LIMITS.md §1).

  • Sicherheitsfragebögen und SOC-2-Prüfungen: Beantworten Sie die KI-Abschnitte mit einem verifizierbaren Runtime Report statt mit Screenshots und Prosa.
  • AIUC-1: erzeugt die manipulationssichere Logging-Evidenz (E015.4) und Execution-Chain-Datensätze mit Autorisierungsereignissen (E015.2 — mit einer erklärten Lücke: Reasoning-Traces werden nicht erfasst), die die Accountability-Kontrolle E015 des Standards benennt. E015 selbst ist verpflichtend; E015.2 und E015.4 sind ihre ergänzende Stufe: nicht erforderlich zum Bestehen, diejenige, die ein Anbieter annimmt, wenn ein Kunde oder Regulator danach fragt. Sobald die Chain an einen Zeugen verankert ist, dem die vertrauende Partei Grund zu vertrauen hat — ein Zeuge, den der Betreiber selbst betreibt, bietet dies nicht —, ist das eine kontinuierlich bezeugte Chain statt einer, die zur Audit-Zeit rekonstruiert wird (was in die Chain gelangt ist, bleibt weiterhin durch die Erfassungsoberfläche begrenzt). Eine kontrolle-für-kontrolle Evidenzzuordnung, einschließlich dessen, was bewusst außerhalb des Scopes liegt, findet sich in AIUC.md.
  • OWASP Top 10 for Agentic Applications 2026: acht der zehn Bedrohungen lassen sich auf deterministische Policy-Regeln über den Datensatz abbilden, zwei sind mit Begründung als außerhalb des Scopes markiert, und das Paket wird lauffähig ausgeliefert. Eine ungefähre Community-Zuordnung, kein offizielles OWASP-Artefakt. Siehe OWASP.md.
  • AARM (CSA): erzeugt die manipulationssichere Action Receipt, die AARM spezifiziert — R5 und die versiegelnde Hälfte von R6 (Identität wird in den Hash versiegelt, nicht kryptografisch authentifiziert). halo-record ist die Receipt-Schicht; kombinieren Sie es mit einem Enforcement-Gateway für ein vollständiges AARM-System. Siehe AARM.md.
  • Agentic Trust Controls: die Runtime-Datensätze hinter den Evidenzkontrollen der ATC — manipulationssicheres Action Logging (RBM-03) und die Datensatz-Hälfte der Authority Attestation (AID-05; die Enforcement-Hälfte gehört zum Gate) in einem verketteten Datensatz. Siehe ATC.md.
  • CSA AI Controls Matrix (AICM) / STAR for AI: die LOG-Domain-Evidenz — generierte Audit-Datensätze, gegen unentdeckte Modifikation versiegelt, Input- und Output-Ereignisse protokolliert — kontrolle-für-kontrolle zugeordnet in AICM.md. CSAs eigener v1.1-Crosswalk verbindet diese Domain mit AIUC-1 E015.
  • MITRE ATLAS: die Agent-Telemetry-Mitigation (AML.M0024) implementiert mit einer Integritätseigenschaft, die ATLAS selbst nicht verlangt — das Log ist von jemandem außerhalb des Betreibers verifizierbar. Siehe ATLAS.md.
  • EU AI Act / ISO 42001 / NIST AI RMF: die Record-Keeping- und Logging-Pflichten, die diese Frameworks beschreiben, sind dieselbe Artefaktklasse — konservativ zugeordnet in EU-AI-ACT.md, ISO42001.md und NIST-AI-RMF.md.

Nichts davon zertifiziert für sich genommen irgendetwas. Es gibt Ihrem Prüfer etwas Verifizierbares, das er sich ansehen kann. Die Grenzen — was halo-record bewusst nicht tut und was zu sagen ist, wenn ein Reviewer fragt — sind in LIMITS.md dokumentiert.

Die Evidenz in Ihre GRC-Plattform bringen

Die meisten GRC-Plattformen (Vanta, Drata und ähnliche) akzeptieren hochgeladene Dateien als benutzerdefinierte Evidenz gegen eine Kontrolle. Der Export von halo-record ist darauf ausgelegt, sich in diesen Ablauf einzufügen:```bash halo export audit.jsonl --from 2026-06-01 --to 2026-06-30 -o evidence.csv

scope the export to the actions a control covers

halo export audit.jsonl --from 2026-06-01 --to 2026-06-30 --tool email.send --tool db.query -o evidence.csv

root@kitploit:~
Dies schreibt zwei Dateien für das Audit-Fenster: die CSV (eine Zeile pro aufgezeichneter Aktion, von links nach rechts gruppiert als *wann → was geschah → wer → unter welcher Berechtigung → was markiert wurde → Provenienz → wie zu verifizieren*, einschließlich einer redigierten Zusammenfassung des Aufrufs und seines Ergebnisses in einfacher Sprache, des Agent-Builds und -Modells, die jeweils erzeugt wurden, der Identität, in deren Namen er ausgeführt wurde, des Datensatzes, durch den er verursacht wurde, seiner Autorisierungsentscheidung und seines Geltungsbereichs sowie etwaiger Kategorien personenbezogener Daten oder aufgenommener Bedrohungsmarkierungen) und ein Manifest (`evidence.csv.manifest.json`), das die CSV mit ihrer Quelle verknüpft — der Head-Hash der Chain verbindet sie mit dem verifizierbaren Log, aus dem sie stammt, und `csv_sha256` ist der eigene Hash der exportierten Datei, sodass eine nach dem Export bearbeitete CSV nicht mehr zu ihrem Manifest passt. Grenzen Sie die Grundgesamtheit mit `--tool` ein, wenn eine Kontrolle nur bestimmte Aktionen abdeckt; das Manifest zeichnet den Filter auf, sodass ein eingegrenzter Export offenlegt, dass er eine Teilmenge ist, statt als die gesamte Grundgesamtheit gelesen zu werden. Laden Sie beide gegen Ihre Logging- oder Monitoring-Kontrolle hoch; fügen Sie den Runtime Report HTML bei, wenn ein Prüfer die Chain selbst verifizieren möchte. Der Export weigert sich, auf einer Chain zu laufen, die die Verifikation nicht besteht.

Eine native Push-Integration — bei der Evidenz automatisch in Ihrer Plattform landet — befindet sich auf der Roadmap. Der obige Dateipfad funktioniert heute mit jeder Plattform, die hochgeladene Evidenz akzeptiert.

## CLI```
halo verify   validate schema + hash chain (exit 1 broken, 3 empty chain; CI-friendly)
halo report   render a chain as a self-verifying HTML Runtime Report
              (--from/--to: a date-windowed report covering only the review period)
halo policy   corroborate a chain against a declarative policy pack
              (per-rule pass / violation / evidence-gap; exit 1 violated, 3 nothing in scope)
halo serve    serve per-tenant reports over HTTP, access-scoped per customer
halo grant    designate a report recipient (email or domain)
halo viewers  list who has unlocked a gated report
halo anchor   witness a chain head, or --check completeness (exit 1 incomplete, 3 unwitnessed)
halo witness-serve  run a witness over HTTP: vendors anchor chain heads, viewers fetch checkpoints
halo demo     scaffold the full vendor demo (record -> witness -> gated report)
halo export   date-bounded evidence export: CSV + manifest tied to the chain head
halo sample   emit a valid example log
halo hash     canonical sha256 of a JSON value
halo hook     Claude Code PostToolUse hook

Integritätsmodell

Um den Hash eines Datensatzes zu berechnen: Nimm den Datensatz ohne integrity.hash, mit integrity.prev_hash auf den Hash des vorherigen Datensatzes gesetzt; kanonisiere mit RFC 8785 (JSON Canonicalization Scheme); wende SHA-256 auf die Bytes an. Der prev_hash des ersten Datensatzes besteht aus 64 Nullen. Die Verifikation berechnet jeden Hash neu und prüft jede Verknüpfung. Kein Geheimnis erforderlich; das ist der Punkt.

Glaubst du, du kannst eine Kette manipulieren, ohne dass der Verifizierer es bemerkt? Versuche und Ergebnisse findest du hier.

Vollständige Feldreferenz: halo-record.schema.json.

TypeScript

Derselbe Recorder ist für Node verfügbar: halo-record-ts. Gleiches Kettenformat, gleiches Witness-Protokoll. In beiden Sprachen geschriebene Datensätze lassen sich mit beiden Verifizierern verifizieren.

Community-Beispiele

trail-halo-poc — Community-Proof-of-Concept, das die Principal-Autorität eines Halo-Datensatzes an TRAIL-Anmeldeinformationen bindet: eine gegenseitige Org–Agent-Bindung und org-signierte Scope-Grants, die in eine Halo-Kette aufgezeichnet werden, mit einer adversarialen Verifikationssuite.

Mitwirken

Issues, Diskussionen und Pull Requests sind willkommen — siehe CONTRIBUTING.md für die Grundregeln (Kurzfassung: Tests erforderlich, kleine PRs, Schemaänderungen werden zuerst diskutiert).

Lizenz

Apache-2.0

Tool herunterladen