Add v0.7 "Execution boundary" and move A2A to v0.8 - #127
Merged
Merged
Conversation
Every guarantee shipped so far is about what happens inside CTRLRun. The kernel does not decide whether the remote side acted — an executor does, by raising NotExecuted or not. It does not own the clock its leases are measured against, once the store is on another host. It does not know whether the world still looks the way it did when a human said yes. v0.7 is those five edges: a transport classifier in core, clock-skew detection, a provider idempotency token derived from the effect key and the attempt, a ceiling on renewal after FAILED, and precondition fingerprints on an approval. Three of the five are weaknesses in guarantees already sold. The classifier is the sharpest: FAILED versus AMBIGUOUS is the one decision this project exists to get right, the correct rule is already written and implemented in the gateway's outcome.py, and it is reachable only by installing an extra while @Protect gets a docstring. A2A moves to v0.8 unchanged in content. The renumber is recorded in the document rather than made silently, on the rule this file already follows for the v0.6 receipt-integrity line and the soak criterion.
Contributor
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
The renumber left two documents naming v0.7 as where authority propagation across agent hops lands: the ASI07 row of the agentic Top 10 reading, and the threat model's out-of-scope list. Both are the kind of cross-reference that goes stale silently — the statement stays true and the number stops being.
arpanghoshal
enabled auto-merge
September 7, 2026 21:54
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a
v0.7 — Execution boundarysection to the roadmap, movesv0.7 — Multi-agenttov0.8unchanged, and renumbersv0.8–0.9 — Hardeningtov0.9.Docs only. No
src/change.Why
Every guarantee shipped so far is a guarantee about what happens inside CTRLRun. Three edges are not:
FAILED— an executor does. The correct rule is already written and already implemented, insrc/ctrlrun/gateway/outcome.py: the connection was never established, or the peer said in band and before dispatch that it rejected the request; everything after the first byte isAMBIGUOUS. It is reachable only by installingctrlrun[gateway], while@protect— the surface the README leads with — gets a docstring. A user who maps a post-dispatchConnectionErrortoNotExecutedhas re-enabled blind retry, with a receipt that saysfailedconfidently.PostgresStateStoretakesclock: Callable[[], datetime] = _utc_nowand every liveness check goes throughself._clock(). v0.6 moved the store to another host so several hosts could share it; the clock did not move with it. Skew is fail-closed and therefore quiet — a host running ahead marks a live reservationAMBIGUOUSwhile its real holder is mid-flight and about to succeed, and nothing names the cause.Plus two smaller ones found alongside them:
plan_reservationhas no ceiling on renewal afterFAILED(grep -rn "max_attempt\|attempt >" src/returns nothing), so one approval plus an executor that always reports "nothing happened" is unlimited dispatches; and a provider idempotency token, which has to derive from the effect key and the attempt — from the effect key alone it is stable across §5.4's renewal, and the provider would replay its cached failure for the one retry the kernel permits precisely because the executor proved nothing happened.The renumber
A2A is unchanged in content and moves position only. Multi-agent authority propagation builds on a kernel whose executor boundary is sound; shipping a hop-counting authority model on top of an outcome mapping the primary surface leaves undefended would be building the next floor before the joists.
Recorded in the document rather than made silently, on the rule this file already follows for the v0.6 receipt-integrity line and the soak criterion.
Note on the precondition line
The roadmap entry says, and every later document must say, that precondition fingerprints narrow the window between decision and execution and do not close it. The recheck is a network call and cannot run inside the atomic reservation write, so a residual gap remains between compare and reserve. Minutes of human deliberation become milliseconds. That is worth having and it is not prevention.
Tests
1069 passed— every test that referencesROADMAP, including the docs-site structural and word-budget suites.