Схема трасс и каталог событий¶
Эта страница переводит разговор о наблюдаемости в практическую плоскость: к структуре событий, которую можно экспортировать, читать и использовать в оценочных сценариях.
Она опирается сразу на две части книги:
- Глава 11. Трассы, спаны и структурированные события
- Глава 13. Офлайн-оценки, онлайн-оценки и регрессионные шлюзы
- Сквозная цепочка доказательств: от запроса к решению о раскатке
И на исполняемый пакет:
Зачем вообще нужна явная схема трасс¶
Если у команды нет явной схемы трасс, обычно происходит одно из двух:
- события есть, но они собраны как разрозненный набор JSON-полей;
- события вроде бы полезны для отладки, но плохо подходят для оценки, аудита и разбора инцидентов.
Поэтому в промышленной агентной системе полезно отделять:
- оболочку трассы;
- каталог событий;
- контракты полезной нагрузки;
- контракт идентичности проверяющего;
- связь с доказательствами проверяющего.
Даже если первый рантайм еще маленький.
Минимальная оболочка трассы¶
В agent_runtime_ref сейчас используется намеренно простая оболочка:
{
"schema_version": "1.0",
"event_type": "run_start",
"trace_id": "trace-demo-001",
"payload": {
"input_description": "[REDACTED]",
"input_sha256": "edaf461dd5cf4ef498bfddb0a480355e6e42f669768fe3d42f9da2e67d88b81a",
"tenant_id": "tenant-acme",
"principal_id": "user-42",
"session_id": "session-demo-001",
"agent_id": "support-triage-ref"
},
"redacted_fields": []
}
Неключевой SHA-256 в учебном пакете служит только детерминированной контрольной суммой для повтора. Он не подходит для корреляции чувствительного ввода с низкой энтропией; в промышленной системе используйте keyed HMAC и ротацию ключей.
Минимально полезный набор полей такой:
event_typetrace_idpayload
На практике промышленную схему почти всегда стоит расширять еще и так:
session_idagent_idtenant_idprincipal_idevent_tsspan_idparent_span_id
В справочном рантайме часть этих полей пока живет внутри payload, чтобы схема оставалась компактной и читаемой. При этом сериализованное событие уже несет schema_version и redacted_fields, а экспорт умеет маскировать выбранные поля. Загрузчик событий явно проверяет эту форму: Telemetry path must be a string or path-like object, Telemetry event line is not valid JSON: {line_number}, Telemetry event must be a mapping, Telemetry event is missing required field: {required_field}, Telemetry event field must be a string: {field}, Telemetry event field must not be empty: {field}, Telemetry schema version is not supported: {schema_version}, Telemetry event payload must be a mapping, Telemetry event payload key must be a string, Telemetry event payload key must not be empty, Telemetry event payload keys must be unique, Telemetry event payload value must be a string: {payload_key}, Telemetry event redacted_fields must be a tuple, Telemetry event redacted_fields must be a list, Telemetry event redacted_fields entries must be strings, Telemetry redact field must not be empty и Telemetry redact field is not present in events: {missing}. Для промышленной наблюдаемости поверх этого почти всегда нужны поля, которые делают спаны пригодными для поиска и регрессионного разбора:
span_typeinput_refoutput_reflatency_msretry_counttoken_input_counttoken_output_counttoken_costapproval_statepii_redactedredaction_policy_idretention_classtrace_search_tagsworkspace_idworkspace_persistencecredential_scopeegress_profilesecurity_validation_statusvalidation_gate_resultshuman_review_artifact_ref
Как связаны трасса и сессия¶
Для агентных систем одной трассы обычно мало. Почти всегда нужен и более длинный контекст:
- один
trace_idописывает один запуск; - одна
session_idсвязывает несколько запусков в цепочку; - сводку по сессии уже можно использовать для оценок, проверки раскатки и постмортема.
Именно поэтому пакет поддерживает:
inspect-traceinspect-sessionsession-eval-summaryexport-sessionexport-eval-dataset
dump-events, export-events и inspect-trace также делают ответ команд пригодным для разбора, а не только сырым дампом JSONL: они показывают session_id, tenant_id, principal_id, agent_id, authorization_mode, delegated_principal_id, delegated_scope, status, result, output_preview, failure_reason, approval_ids, approval_capability_names, pending_approval_ids, pending_approval_capability_names, approval_status_counts и непустые idempotency_keys до того, как оператору придется вручную просматривать каждый approval_requested или tool_execution payload. replay-run затем отдельно возвращает source_idempotency_keys и replay_idempotency_keys, явно показывая, что повтор — новый запуск со своим ключом защиты от дублей записи, а не тихое повторное использование исходной операции записи.
Повтор трассы проверяет эти доказательства до того, как они могут стать исходным материалом для нового запуска: Trace ID request must be a string, Trace ID not found in event file: {requested_trace_id}, Trace file does not contain any trace IDs, Trace file contains multiple trace IDs; pass --trace-id explicitly, Trace file does not contain a run_start event, Trace file contains multiple run_start events, Trace run_start event is missing replay fields: {missing_keys}, Trace run_start event has redacted replay fields: {redacted_keys}, Trace run_start replay field must be a string: {field} и Trace run_start replay field must not be empty: {field}.
Каталог событий справочного рантайма¶
Ниже текущий минимальный каталог событий.
| Event type | Когда появляется | Зачем нужен |
|---|---|---|
run_start | в начале запуска | фиксирует входные параметры и идентичность актора |
policy_precheck | сразу после допуска запуска | фиксирует действие, причину и идентификатор политики предварительной проверки |
agent_threat_evidence | когда средство контроля из модели угроз оставляет доказательство | связывает класс угрозы с идентификаторами трассы и доказательств |
retrieval | при извлечении контекста памяти | фиксирует источник и число найденных записей |
context_layers_built | после сборки контекста | показывает, какие слои контекста реально попали в запуск; внутри RunContext хранятся retrieved_context и retrieved_records до обработки tool_request |
tool_policy_decision | перед выполнением инструмента | фиксирует решение политики и причину: разрешить, запретить или запросить подтверждение |
mcp_tool_risk_review | при разборе риска инструмента или сервера MCP | связывает класс угрозы, доказательства из реестра, проверку области доступа и состояние карантина |
tool_execution | после вызова возможности или передачи на подтверждение | фиксирует статус возможности и контекст принципала инструмента |
a2a_handoff | когда один агент делегирует работу другому агенту | фиксирует цепочку делегирования, авторизацию и контекст атрибуции сбоя |
approval_requested | при высокорисковом пути записи | показывает, что система ушла в очередь человеческой проверки |
sandbox_profile_reviewed | при проверке пути на базе песочницы | фиксирует проверенное рабочее пространство, профиль разрешений и доказательства по снимкам и возобновлению |
memory_write_decision | перед фоновой записью памяти | фиксирует, разрешена или запрещена кандидатная запись в память |
model_reasoning_evidence | после шага модели, если поставщик или среда исполнения вернули приватно-безопасное доказательство рассуждения | связывает вывод модели с резюме, ссылкой или зашифрованным артефактом без хранения сырой цепочки рассуждений |
subagent_delegation_decision | когда управляющий агент решает запускать или не запускать подагентов | фиксирует шлюз разветвления, бюджет и причину делегирования |
durable_agent_instance_state | когда именованный экземпляр агента загружается, засыпает, просыпается или сохраняет долговечное состояние | фиксирует владельца экземпляра, версию состояния, пробуждение и связь с возобновляемым потоком |
resumable_agent_recovery | когда запуск продолжается после выкладки, вытеснения или смены соединения (deploy/eviction/connection churn) | фиксирует continuation_id, last_durable_checkpoint, recovery_reason и client_tool_allowlist |
memory_persisted | после фоновой записи | фиксирует происхождение и ревизию записи памяти |
background_compaction | после фонового обслуживания памяти | фиксирует результаты уплотнения на уровне арендатора |
context_compaction | когда текущее представление контекста заменяется более короткой производной сводкой | связывает envelope_id, диапазон исходных событий и summary_sha256, не перенося полномочия |
context_rehydration | после проверки долговечного состояния и пересборки представления контекста | фиксирует контрольную точку, результат проверки и requires_reauthorization=true |
continuity_validation_failed | когда сводка, идентичность, политика, возможность, подтверждение, происхождение событий или состояние внешнего эффекта не допускают безопасного продолжения | останавливает продолжение со стабильной причиной и может нести blocked_on_reconciliation при неизвестном внешнем эффекте |
background_update_scheduled | после постановки или завершения фоновой работы | фиксирует статус фонового обновления для запуска |
verification_result | когда запуск проверяет условие завершения | фиксирует условие остановки, актор проверки, команду или механизм проверки, статусы pass/fail/warning/blocked и ссылки на доказательства |
run_failed | когда сбой инструмента становится итогом запуска | сохраняет явную трассируемость неуспешного запуска |
governance_action | когда сигнал телеметрии запускает решение по политике, сдерживанию, раскатке или реестру | связывает запись управленческого действия с доказательствами трассы |
run_complete | в конце запуска | фиксирует итог запуска |
span | вокруг отдельных вызовов | дает простую телеметрию задержки и статуса |
Это не универсальный каталог на все случаи. Это базовый рабочий словарь, на который уже можно опирать:
background_compaction описывает обслуживание сохранённых записей памяти. Его нельзя смешивать с context_compaction: это граница живого исполнения, которая должна следовать схеме непрерывности контекста.
В более зрелой промышленной схеме в этом словаре полезно сразу оставлять место и для доказательств с учетом проверяющего, чтобы трассы могли объяснять не только что сделал рантайм, но и на каких данных проверяющий оценил качество процесса, качество результата или атрибуцию сбоя.
- просмотр трасс;
- заготовки для регрессий;
- сводки по сессиям;
- разбор инцидентов.
Что важно в контрактах полезной нагрузки¶
Проблема не в том, что события сухие. Проблема в том, что без контрактов payload быстро превращается в мусор.
Для каждого типа событий полезно заранее решить:
- какие поля обязательны;
- какие поля считаются стабильными;
- какие поля можно добавлять без поломки зависимых инструментов;
- какие поля нужны для оценки;
- какие поля нужны для аудита.
Для agent_threat_evidence полезно сохранять маркеры доказательств из единой модели доказательств угроз агенту (unified agent threat evidence model), чтобы строки угроз можно было проверить по трассам, а не только по объясняющему тексту:
prompt_boundary_eventrejected_instruction_tracetool_output_sanitizeduntrusted_content_markerpolicy_decision_traceretrieval_source_idfreshness_scorequarantine_eventmemory_record_idvalidation_staterollback_replay_evidencetool_call_idapproval_recordargument_validation_resultsubject_iddelegation_trace_idcaller_callee_identity_checkstep_budget_eventstop_reasonescalation_decisiontenant_idegress_decisionredaction_dlp_resultcost_budget_eventrate_limit_decisioncircuit_breaker_stateagent_identity_modeagent_registry_recordcapability_loading_modesemantic_policy_decisionagent_gateway_audit_eventhandoff_idcontainment_stateverifier_verdictartifact_digestregistry_decisionsandbox_profile_iddecision_trace_idimmutable_log_pointerevidence_completeness_flag
Например, для tool_policy_decision минимальный payload обычно должен включать:
capability_namedecisionreasonrisk_tiertool_principal
Для mcp_tool_risk_review производственная трасса должна фиксировать доказательства модели угроз MCP (MCP threat-model evidence), а не только решение о разрешении или запрете (allow/deny):
Минимальный payload хранит итоговое решение: разрешить или запретить, а рядом оставляет проверяемые основания:
threat_classmcp_server_idcapability_nametool_contract_versionregistry_ownerscope_reviewquarantine_stateevidence_refs
threat_class лучше держать в словаре модели угроз MCP (MCP threat model): tool poisoning, rug pull attack, tool shadowing, confused deputy, over-scoped tokens, data exfiltration through legitimate channels, supply-chain attack, replay/tampering, sandbox escape, local control-plane crossing.
local control-plane crossing нужен для сценария AutoJack-класса: недоверенный веб-контент попадает в браузерный или инструментальный агент, использует его локальную сетевую позицию, обращается к localhost MCP/debug/control socket и пытается превратить параметр плоскости управления в выполнение команды на узле. Для такого события трасса должна сохранять хотя бы:
untrusted_content_originbrowser_tool_identitylocal_control_channelloopback_auth_resultmcp_server_params_sourceexecutable_allowlist_resultcontainment_action
Для a2a_handoff payload должен сохранять контракт доверия для передачи управления A2A (A2A handoff trust contract), а не только текст делегированного сообщения:
agent_identitydelegation_chainallowed_collaboration_graphinter_agent_authorizationpolicy_inheritancenon_repudiationfailure_attribution
Трасса для цепочки дубля тикета
В кейсе разбора обращений поддержки события tool_policy_decision, approval_requested, tool_execution и финальный исход должны связываться через один trace_id, session_id, approval_id, tool_principal и idempotency_key. Если create_ticket вернулся с тайм-аутом и статус побочного эффекта неизвестен, трасса должна показать side_effect_unknown, а не маскировать запуск как успешный или повторять запись без сверки.
Для subagent_delegation_decision payload должен сохранять не только факт разветвления, но и экономику решения:
subagent_countdelegation_reasonindependence_assessmentshared_context_needwrite_riskcontext_handoff_sizetoken_budgettool_budgetmerge_conflict_riskfanout_decision
Для model_reasoning_evidence payload должен различать наблюдаемость и приватность рассуждения:
model_output_previewreasoning_summaryreasoning_referenceencrypted_reasoning_itemtool_evidence_refsgovernance_access_path
Сырая цепочка рассуждений или полный transcript рассуждения не должны попадать в обычный экспорт трассы. Если расследованию нужен доступ к зашифрованному артефакту, этот доступ должен идти через отдельный управленческий путь с целью, подтверждением, сроком хранения и проверками маскирования/DLP.
Для durable_agent_instance_state payload должен показывать, что долговечный агент не является безымянным обработчиком запроса:
agent_instance_iddurable_state_versionstate_storescheduled_wakeup_idwakeup_reasonresumable_stream_idconnection_ididempotency_keystate_transition
Канонические сценарии трассировки
Три канонических сценария требуют разных акцентов трассировки. Триаж обращений поддержки связывает события подтверждений, idempotency_key, побочные эффекты инструментов и доказательства восстановления после дубля тикета. Внутренний ассистент знаний должен сохранять спаны поиска, доступ к памяти, привязку к источникам, проверки свежести и решения контроля доступа. Координация инцидентов должна показывать линию времени эскалации, побочные эффекты уведомлений, владение ответом, события передачи управления и обучение после инцидента.
Для пути на базе песочницы полезно заранее зарезервировать поля, которые связывают трассу с границей исполнения:
sandbox_session_idsandbox_manifest_versionsandbox_permissions_profilesnapshot_idworkspace_manifest_ref
Если для раскатки или оценки нужен sandbox_profile_review, трасса должна также уметь ссылаться на доказательства проверки, а не только на поля состояния:
sandbox_profile_contractworkspace_entries_reviewedpermissions_profilenetwork_secrets_posturesnapshot_policyreviewed_byreview_evidence_refs
Для governed agent execution loop трасса должна связывать sandbox boundary, policy-mediated tools/network, staged output и validation gates в один проверяемый путь:
execution_loop_idbounded_workspace_reftool_policy_refnetwork_policy_decisionapproval_decision_idstaged_output_refvalidation_gate_resultsmonitoring_signal_idconstraint_bypass_attempt
Для agentic enterprise control plane полезно отдельно фиксировать, что агент не является локальным скриптом с неявными правами, а проходит через управляемый контур:
agent_identity_modeagent_registry_recordagent_gateway_audit_eventsemantic_policy_decisioncapability_loading_modecost_control_signal
Для model_tool_gateway_boundary трасса должна показывать, как один gateway/control-plane контур связал tool side effects, model/provider routing, cost и capacity:
provider_route_decisioncost_capacity_signalcapacity_backpressure_decisionbudget_exhausted
Для gateway-ready runtime полезно расширить этот же контур так, чтобы AI gateway был не billing proxy, а проверяемый runtime boundary:
gateway_idgateway_policy_versionclient_user_agentprovider_namemodel_nameretry_countfallback_reasondlp_resultpii_redaction_policy_idcache_policyrate_limit_decisiontoken_input_counttoken_output_countcost_attribution_ref
Для networked_agent_message трасса должна показывать, почему сообщение от другого агента осталось данными, а не стало полномочием:
source_agent_idprincipal_idmessage_provenance_chainpeer_originated_instructionpropagation_depthfanout_anomaly_scoresybil_independence_checkquarantine_event
Если система опирается на оценки с учетом проверяющего, полезно отдельно определить событие, контракт данных или связанный payload для записи вердикта проверяющего (verifier verdict record):
verdict_idverifier_idverifier_contract_versioninput_refsprocess_scoreoutcome_scorefailure_attributionblocking_decisioncomparison_baselinereviewer_overrideevidence_refs
А для governance_action полезно фиксировать поля записи управленческого действия, которые делают телеметрию управленческим действием, а не просто сигналом панели:
governance_action_idsource_signaldecision_owneraction_stateevidence_refsreview_deadline
source_signal лучше держать в ограниченном словаре, согласованном с управленческой телеметрией: policy_decision_feedback, containment_decision, rollout_gate_input, incident_response_trigger, registry_update_signal.
Для memory_write_decision при проверке отравления памяти трасса должна сохранять те же поля проверки отравления памяти, что и схема памяти:
write_trust_boundaryactivation_policycontamination_scopepolicy_influenceprovenance_checkquarantine_staterollback_ref
А для memory_persisted:
memory_classkindprovenancerevision
Текущие эталонные полезные нагрузки также используют операционные метаданные: runtime_principal, authorization_mode, delegated_principal_id, delegated_scope, policy_id, static_items, session_items, retrieved_items, tool_items, approval_id, reviewer, capability_session_id, capability_session_status, tool_status, output_preview, model_output_preview, reasoning_summary, reasoning_reference, encrypted_reasoning_item, memory_id, revision_mode, compacted_records, persisted_records, tool_results, span_name и duration_ms, а также span_type, input_ref, output_ref, latency_ms, retry_count, token_input_count, token_output_count, token_cost, approval_state, pii_redacted, redaction_policy_id, retention_class, trace_search_tags, subagent_count, delegation_reason, context_handoff_size, token_budget, merge_conflict_risk, agent_instance_id, durable_state_version, scheduled_wakeup_id и resumable_stream_id. Проверка модели запросов и результатов инструмента относится к той же границе трассировки: неправильные выводы модели падают с Model output reasoning_summary must be a string, Model output reasoning_reference must be a string или Model output encrypted_reasoning_item must be a string; неправильные обращения к инструменту падают с Tool request capability name must be a string, Tool request capability name must not be empty, Tool request arguments must be a mapping, Tool request argument key must be a string, Tool request argument key must not be empty, Tool request argument keys must be unique, Tool request argument value must be a string: {argument_key}, а неправильные результаты инструмента падают с Tool result status must be a string, Tool result status must not be empty, Tool result payload must be a mapping, Tool result payload key must be a string, Tool result payload key must not be empty, Tool result payload keys must be unique и Tool result payload value must be a string: {payload_key}.
Что уже умеет пакет¶
Практически это можно посмотреть так:
.venv/bin/python -m agent_runtime_ref dump-events
.venv/bin/python -m agent_runtime_ref export-events --output artifacts/trace-demo.jsonl
.venv/bin/python -m agent_runtime_ref export-events --simulate-failure post_dispatch_timeout --output artifacts/trace-post-dispatch.jsonl
.venv/bin/python -m agent_runtime_ref inspect-trace --input artifacts/trace-demo.jsonl
.venv/bin/python -m agent_runtime_ref export-session --output artifacts/session-demo-001.json
.venv/bin/python -m agent_runtime_ref export-eval-dataset --output artifacts/eval-dataset.json
Это полезно потому, что один и тот же словарь трасс начинает жить сразу в трех местах:
- в рантайме;
- в книге;
- в артефактах для оценки.
Что стоит добавить в промышленную схему¶
Справочный рантайм намеренно небольшой, поэтому в более зрелой системе стоит почти сразу добавить:
- временную метку в каждом событии;
- явные
span_idиparent_span_id; run_idкак отдельный стабильный идентификатор;- версионирование схемы событий;
- разделение отображаемой и машинной полезной нагрузки;
- правила маскирования чувствительных полей;
- явный способ связывать трассы с доказательствами проверяющего, снимками экрана или артефактами оценивания;
- поля
stop_condition,verification_command,verification_result,verifier_actorиevidence_refsдля проверяемого завершения запуска; - стабильный способ фиксировать, какая версия контракта проверяющего породила результат оценивания;
- поля состояния песочницы для запусков, которые материализуют рабочую область, используют возможности оболочки или файловой системы либо продолжаются из снимка состояния;
- событие или связанная полезная нагрузка для
sandbox_profile_reviewed, чтобы доказательства раскатки и оценки по рабочей области, правам и политике снимков/возобновления были прослеживаемыми. - стабильный способ фиксировать, какая версия verifier contract породила grading output;
- поля состояния песочницы для запусков, которые материализуют рабочее пространство, используют возможности shell/filesystem или продолжаются из снимка;
- событие или связанный payload для
sandbox_profile_reviewed, чтобы доказательства раскатки или оценки по рабочему пространству, правам и политике снимков/возобновления были трассируемыми; - поля production runtime contract:
workspace_id,workspace_persistence,credential_scope,egress_profile,cost_ledger_ref,security_validation_status,validation_gate_resultsиhuman_review_artifact_ref; - событие
governed_execution_loop_step, где видны bounded workspace, Agent Workflow Firewall или другой network gate, approval decision, staged output, Safe Outputs / validation gates и audit/monitoring signal; - поля разветвления для делегирования подагентам:
subagent_count,delegation_reason,context_handoff_size,token_budget,tool_budgetиmerge_conflict_risk; - приватно-безопасные поля рассуждения:
reasoning_summary,reasoning_reference,encrypted_reasoning_itemиmodel_output_preview, но не сырой transcript рассуждения; - поля долговечного именованного агента:
agent_instance_id,durable_state_version,scheduled_wakeup_idиresumable_stream_id, чтобы экспорт сессии связывал запуск с долговечным состоянием исполнителя; - поля восстановления:
continuation_id,last_durable_checkpoint,recovery_reasonиclient_tool_allowlist, чтобы выкладка, вытеснение или смена соединения не превращались в потерянный запуск или неявно расширенную делегацию.
Именно эти вещи превращают поток событий из отладочного вывода в полноценный артефакт платформы.
Что сделать сразу¶
Сначала пройди по короткому списку и отдельно отметь все ответы «нет»:
- Есть ли стабильный каталог событий?
- Есть ли разделение между
trace_idиsession_id? - Понятно ли, какие поля обязательны для каждого типа событий?
- Можно ли по трассе восстановить решение политики и путь инструмента?
- Можно ли по экспорту сессии собирать набор для оценки?
- Можно ли связать трассу с доказательствами проверяющего, которые использовались для оценивания или разбора раскатки?
- Есть ли событие или payload, где видно, какое условие завершения проверялось, кем и с каким результатом?
- Если раскатка требует
sandbox_profile_review, есть ли доказательства в трассе для записей рабочей области, прав и политики снимков/возобновления? - Можно ли понять, какая версия контракта проверяющего породила этот результат оценивания?
- Если раскатка требует
sandbox_profile_review, есть ли доказательства трассы для записей рабочей области, прав и политики снимков/возобновления? - Есть ли для agent-generated patch/PR путь governed agent execution loop: bounded workspace, policy-mediated tools/network, approval gates, staged output, automated validation и audit/monitoring?
- Видно ли в трассе, что Safe Outputs, CodeQL, secret scanning, dependency risk или другой validation gate проверили staged output до внешней записи?
- Видно ли в трассе, какая isolated session и durable workspace использовались, какие scoped credentials и egress/tool boundaries действовали, и какой
human_review_artifact_refзакрывает работу? - Есть ли отдельный failure mode для
constraint_bypass_attempt, когда агент пытается обойти network allow/deny, approval gate или staged output boundary? - Если управляющий агент запускает подагентов, видно ли по трассам, почему разветвление было разрешено, каким был бюджет и насколько рискованно слияние?
- Если трасса содержит доказательства рассуждения, хранится ли только резюме, ссылка или зашифрованный указатель, а не сырая цепочка рассуждений?
- Если агент является долговечным именованным экземпляром, видно ли по экспорту трассы или сессии, какое состояние было загружено, чем оно изменилось и какой путь пробуждения/возобновления продолжил работу?
- Можно ли понять, какая версия контракта проверяющего породила этот результат оценки?
- Есть ли план по маскированию данных и версионированию схемы?
Если на несколько вопросов подряд ответ «нет», значит у тебя пока есть логирование, но еще нет полноценной схемы трасс.