Kiedy decyzję podejmuje agent AI, „co on właściwie zrobił i dlaczego" musi być odtwarzalne. Agent Chain-of-Custody (CoC) to uporządkowany, haszowany zapis każdego kroku: od promptu, przez pobrany kontekst i wywołania narzędzi, po wynik i akceptację człowieka. Ta strona opisuje zestaw pól łańcucha i pokazuje przykład syntetyczny — żeby audytor mógł prześledzić decyzję AI, a nie zgadywać.
Zamiast „agent tak zdecydował" — sekwencja powiązanych rekordów, w której każdy krok ma własny
hash i wskazuje na poprzedni (prev_hash), tworząc łańcuch odporny na ciche
podmiany. Human-approval jest jawnym polem: wiadomo, czy i kto zatwierdził działanie o skutkach.
Każdy krok agenta zapisujemy jako rekord o poniższych polach. Kolumna Rola: audyt = element odtwarzalności decyzji · integralność = zabezpiecza łańcuch przed podmianą.
| Pole | Opis | Przykład (skrót) | Rola |
|---|---|---|---|
prompt |
Instrukcja / zadanie postawione agentowi (system + user prompt lub jego odcisk). | „Przygotuj podsumowanie findings z raportu skanera dla incydentu INC-042." | audyt |
input |
Dane wejściowe dostarczone do kroku (parametry, treść dokumentu, identyfikatory). | {incident_id:"INC-042", source:"zap-report.json"} |
audyt |
retrieved_context |
Fragmenty pobrane przez RAG / wyszukiwanie, na których agent się oparł (źródło + odcisk). | 3 chunki z evidence-package INC-042, źródła + sha256 każdego |
audyt |
tool_call |
Nazwa wywołanego narzędzia/funkcji (jeśli krok użył narzędzia). | ip3.get_incident_evidence |
audyt |
args |
Argumenty przekazane do narzędzia — dokładnie to, z czym zostało wywołane. | {id:"INC-042", fields:["findings","cvss"]} |
audyt |
output |
Wynik kroku: odpowiedź modelu lub zwrot narzędzia (treść lub jej odcisk). | Podsumowanie 5 findings, 1 oznaczony do eskalacji | audyt |
human_approval |
Czy krok o skutkach wymagał i uzyskał akceptację człowieka: kto, kiedy, decyzja. | {required:true, by:"analyst@synthetic", verdict:"approved"} |
audyt |
timestamp |
Znacznik czasu kroku (UTC, ISO 8601). Docelowo znacznik z TSA — patrz ograniczenia. | 2026-07-05T11:42:07Z |
integralność |
hash |
sha256 z kanonicznej treści rekordu (pola + prev_hash) — spina łańcuch. |
9f3a…c71b |
integralność |
decision |
Świadoma decyzja/akcja wynikająca z kroku i jej uzasadnienie (dlaczego). | escalate — finding CVSS 8.6 spełnia próg eskalacji |
audyt |
Poniższy trace jest w całości zmyślony na potrzeby ilustracji (dane syntetyczne, konta z sufiksem @synthetic). Pokazuje 3 połączone kroki agenta, gdzie prev_hash każdego kolejnego wskazuje na hash poprzedniego.
{
"chain_id": "coc-INC-042-a1",
"agent": "ip3-triage-agent (synthetic)",
"steps": [
{
"seq": 1,
"prompt": "Pobierz evidence dla incydentu INC-042.",
"tool_call": "ip3.get_incident_evidence",
"args": { "id": "INC-042", "fields": ["findings","cvss"] },
"output": "5 findings (CVSS 4.1–8.6), evidence-package sha256 c0ffee…",
"human_approval": { "required": false },
"timestamp": "2026-07-05T11:42:07Z",
"prev_hash": null,
"hash": "9f3a1d…c71b",
"decision": "continue"
},
{
"seq": 2,
"prompt": "Podsumuj findings i wskaż kandydatów do eskalacji.",
"retrieved_context": [
{ "src": "evidence-package INC-042#f3", "sha256": "a12b…" },
{ "src": "policy: eskalacja CVSS>=8.0", "sha256": "b45c…" }
],
"output": "1 z 5 findings (CVSS 8.6) spełnia próg eskalacji.",
"human_approval": { "required": false },
"timestamp": "2026-07-05T11:42:19Z",
"prev_hash": "9f3a1d…c71b",
"hash": "4c8e77…21aa",
"decision": "propose_escalation"
},
{
"seq": 3,
"prompt": "Eskaluj finding f3 do właściciela ryzyka.",
"tool_call": "ip3.escalate_finding",
"args": { "finding": "f3", "to": "risk-owner@synthetic" },
"output": "Eskalacja zarejestrowana jako task T-9001.",
"human_approval": {
"required": true,
"by": "analyst@synthetic",
"verdict": "approved",
"at": "2026-07-05T11:44:02Z"
},
"timestamp": "2026-07-05T11:44:05Z",
"prev_hash": "4c8e77…21aa",
"hash": "e70b9c…88f4",
"decision": "escalate"
}
]
}
Weryfikacja łańcucha (idea): przelicz sha256 z kanonicznej treści każdego kroku wraz z jego prev_hash i porównaj z zapisanym hash. Rozjazd w którymkolwiek ogniwie = łańcuch naruszony. Metodę spójną z tym opisuje /verify.
Audytor widzi na czym agent oparł wynik: prompt, pobrany kontekst i argumenty narzędzi — a nie tylko końcową odpowiedź.
Pole human_approval pokazuje, czy działanie o skutkach było zatwierdzone przez człowieka, przez kogo i kiedy.
Powiązane hashe (prev_hash→hash) sprawiają, że cicha podmiana pojedynczego kroku jest wykrywalna.
Ten sam język dowodowy co evidence-package incydentów: źródło + sha256 + chain-of-custody.
| Element | Dziś (MVP) | Docelowo | Status |
|---|---|---|---|
| Model pól łańcucha | Zdefiniowany, opisany na tej stronie | Walidowany schemat + wersjonowanie | MVP |
| Przykład trace | Syntetyczny, ilustracyjny (na tej stronie) | Zapis realnego łańcucha w bazie | MVP |
| Interaktywny podgląd (trace viewer) | Brak — statyczny przykład | Przeglądarka kroków krok-po-kroku z weryfikacją hashy | ROADMAP |
| Podpis / znacznik czasu | sha256 jako odcisk integralności |
Podpis + znacznik czasu TSA (RFC 3161) | ROADMAP |
| Automatyczne przechwytywanie | Ręczny/przykładowy zapis | Hook przechwytujący kroki agenta do łańcucha | ROADMAP |
Powiązane: kontrola bezpieczeństwa agentów → /agent-security · zgłoszenie i obsługa incydentu AI → /ai-incident · weryfikacja integralności dowodów → /verify.