За один день в двух разных публичных обсуждениях agent infrastructure проявился один и тот же failure shape. В CrewAI вопрос был об authorization и use-time freshness. В LangGraph — о cancellation и persistence. На поверхности это разные темы. На уровне причинной структуры это одна проблема: доказательство существует, но переход не обязан быть связан именно с этим evidence occurrence.
Два разных треда — один архитектурный разрыв.
В CrewAI-side discussion use-time revalidation закрывает один gap: исторически корректный receipt больше не используется вслепую против изменившегося мира. Но сразу открывается следующий TOCTOU — между успешной revalidation и реальным side effect.
В LangGraph cancellation boundary проблема другая по семантике, но такая же по форме: terminal state нельзя делать доказуемым просто потому, что какой-то persistence outcome случился раньше.
Valid evidence ≠ evidence bound to this transition.
Обычная verification-модель часто заканчивается на verify(x) == PASS. Но agent runtime живёт во времени. Между PASS и ACT могут измениться state, authority, policy, arguments, resource version, cancellation status, ownership или сам execution attempt.
Не смешивать
Historical validity
Было ли доказательство корректно, когда его создали?
Current admissibility
Остаётся ли оно применимым сейчас?
Transition binding
Какой exact transition имеет право его потребить?
ELR-I9 — Execution Binding.
В CrewAI discussion следующий proposed invariant можно выразить так:
historical validity
↓
current admissibility
↓
execution-bound authorizationУспешная use-time revalidation не должна становиться свободно переносимым фактом. Она может авторизовать только тот execution occurrence и context/version, к которым была привязана.
Если authoritative context уже N+1, токен для N должен fail closed и отправлять систему на revalidation. По форме это optimistic concurrency / CAS, только CAS применяется не к строке в базе, а к праву использовать verification result.
{
"use_token": "ut_01J...",
"execution_id": "exec_42",
"context_digest": "sha256:...",
"context_version": 17,
"receipt_ref": "receipt_9",
"scope": "single_execution"
}LangGraph: C < P < T — но ordering ещё не causality.
Для cancel(wait=true, action="interrupt") в публичном треде был предложен тестируемый happens-before:
C = cancellation accepted P = bounded persistence/drain outcome established T = terminal interrupted state published assert C < P < T
P не обязано означать «всё идеально сохранено». Оно может честно быть durable | partial | abandoned. Главное — другой клиент не должен увидеть terminal certainty, пока persistence consequence ещё unknowable.
Но temporal order всё ещё не отвечает на вопрос: какой именно P делает именно этот T доказуемым?
Terminality Binding.
Следующий шаг — не просто требовать, чтобы P произошло раньше T, а чтобы T ссылался на exact persistence outcome:
CancellationReceipt {
cancellation_id
cause: user_cancel | transport_interrupted
persistence_outcome: durable | partial | abandoned
last_visible_seq
last_durable_seq
persistence_receipt_id
}
TerminalTransition {
state: interrupted
cancellation_id
persistence_receipt_id
}Crash semantics
C без P
Recovery / indeterminate. Никогда не terminal.
C + P без T
Recovery может идемпотентно достроить T.
T без referenced P
Invalid terminal state.
Transport interruption
Отдельная causal branch, не intentional cancel.
Ordering is not causality.
Пусть наблюдаем E1 < E2 < E3. Из этого не следует, что E3 был авторизован E2 или settled E2. Временной порядок отвечает «что было раньше». Causal binding отвечает «какой конкретный факт является основанием для этого конкретного перехода».
General model: Evidence-Bound Transition.
Назовём consequential transition любое изменение, после которого система, пользователь или внешний мир получают новое значимое состояние: tool execution, payment, terminal publication, resume, commit, escrow release, authority transfer, retry или promotion evidence в accepted state.
{
"transition_id": "tr_42",
"transition_kind": "execute_tool",
"logical_operation_id": "op_7",
"execution_id": "exec_12",
"predecessor_state_ref": "state_91",
"result_state_ref": "state_92",
"required_evidence": [
{"role": "authorization", "receipt_id": "a_17"},
{"role": "freshness", "receipt_id": "f_31"}
],
"context_digest": "sha256:...",
"transition_status": "committed"
}Четыре evidence roles, которые нельзя сжимать в один verified=true.
Evidence roles
Authorization
Было ли действие разрешено?
Freshness / admissibility
Остаётся ли разрешение применимым сейчас?
Settlement / durability
Что система может доказать о зафиксированном результате?
Observation / outcome
Кто и с какой vantage видел фактический outcome?
Execution Binding и Terminality Binding — одна и та же форма.
CrewAI: F31 --authorizes-current-context--> X42 LangGraph: P18 --settles-terminal-claim--> T9
Семантика edges разная. Структура одна: meaningful evidence occurrence должно иметь explicit causal binding к exact consequential transition.
Минимальный falsification suite.
Conformance
Stale context token
Validate at N → mutate to N+1 → token for N must block.
Wrong execution occurrence
Evidence bound to X1 cannot silently authorize X2.
Missing settlement
Terminal T referencing absent P is invalid.
Crash P→T
C+P survives restart and allows idempotent T publication.
Transport ≠ cancel
Socket loss cannot become intentional lifecycle meaning by inference.
Почему это важно для payments и side effects.
На текстовом агенте этот gap выглядит как некрасивый recovery. На платежах, escrow, tool calls и external mutations тот же разрыв превращается в риск повторного side effect: approval был валиден, quote был свежим, balance был достаточным — но к моменту исполнения мир уже другой, а runtime всё ещё несёт вперёд старый PASS.
Evidence-Bound Transition не обещает магическую distributed atomicity. Он делает более скромную и полезную вещь: заставляет систему явно показать, где есть atomic boundary, а где остаётся compare-and-reject protocol boundary.
Доказательство становится операционным только тогда, когда система может показать, к какому именно переходу оно относится.
Sources & evidence
- CrewAI Issue #4877 — GuardrailProvider authorization discussion
- babyblueviper1 — verified use-time revalidation and remaining TOCTOU
- safal207 — ELR-I9 Execution Binding
- LangGraph Issue #5672 — cancellation / streamed state / persistence
- atomicdjt — C < P < T happens-before proposal
- safal207 — Terminality Binding
- Canonical Article 13 markdown
- Article 13 evidence ledger
ELR-I9, Terminality Binding and Evidence-Bound Transition are RESONANCE synthesis / public architecture proposals. This article does not claim official adoption by CrewAI or LangGraph.