За один день в двух разных публичных обсуждениях agent infrastructure проявился один и тот же failure shape. В CrewAI вопрос был об authorization и use-time freshness. В LangGraph — о cancellation и persistence. На поверхности это разные темы. На уровне причинной структуры это одна проблема: доказательство существует, но переход не обязан быть связан именно с этим evidence occurrence.

A consequential state transition must be causally bound to the exact evidence occurrence that authorizes, validates, or settles it.

Два разных треда — один архитектурный разрыв.

historical verificationuse-time revalidationexecution

В CrewAI-side discussion use-time revalidation закрывает один gap: исторически корректный receipt больше не используется вслепую против изменившегося мира. Но сразу открывается следующий TOCTOU — между успешной revalidation и реальным side effect.

cancellation acceptedpersistence outcometerminal state

В LangGraph cancellation boundary проблема другая по семантике, но такая же по форме: terminal state нельзя делать доказуемым просто потому, что какой-то persistence outcome случился раньше.

Correct evidence can still be operationally unsafe.

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.

1

Historical validity
Было ли доказательство корректно, когда его создали?

2

Current admissibility
Остаётся ли оно применимым сейчас?

3

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, к которым была привязана.

read version Nvalidate against Nissue use_tokenconsume only if still N

Если 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
}
C

C без P
Recovery / indeterminate. Никогда не terminal.

C+P

C + P без T
Recovery может идемпотентно достроить T.

T?

T без referenced P
Invalid terminal state.

NET

Transport interruption
Отдельная causal branch, не intentional cancel.

Ordering is not causality.

Пусть наблюдаем E1 < E2 < E3. Из этого не следует, что E3 был авторизован E2 или settled E2. Временной порядок отвечает «что было раньше». Causal binding отвечает «какой конкретный факт является основанием для этого конкретного перехода».

Timestamp is not a permission. Adjacency is not a permission. The last known PASS is not a permission.
evidence occurrenceexplicit causal referenceconsequential transition

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.

A

Authorization
Было ли действие разрешено?

F

Freshness / admissibility
Остаётся ли разрешение применимым сейчас?

S

Settlement / durability
Что система может доказать о зафиксированном результате?

O

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.

01

Stale context token
Validate at N → mutate to N+1 → token for N must block.

02

Wrong execution occurrence
Evidence bound to X1 cannot silently authorize X2.

03

Missing settlement
Terminal T referencing absent P is invalid.

04

Crash P→T
C+P survives restart and allows idempotent T publication.

05

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.

The next trust primitive is not more evidence. It is evidence with a causal address.

Доказательство становится операционным только тогда, когда система может показать, к какому именно переходу оно относится.

  1. CrewAI Issue #4877 — GuardrailProvider authorization discussion
  2. babyblueviper1 — verified use-time revalidation and remaining TOCTOU
  3. safal207 — ELR-I9 Execution Binding
  4. LangGraph Issue #5672 — cancellation / streamed state / persistence
  5. atomicdjt — C < P < T happens-before proposal
  6. safal207 — Terminality Binding
  7. Canonical Article 13 markdown
  8. 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.