Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion evidence.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Live web pages change between requests and cause unpredictable token spikes when

**8 of 8 permission tests passed on the live service.** Every action outside the agent's permission was stopped before it ran, and the actions it was allowed to take ran.

We ran each test on the live service on October 8, 2026, with a dedicated agent under its own fixed permission, and again on October 24 on the revision production was serving then ([records](https://github.com/proofable/docs/tree/main/public/evidence/aaif/authority-at-dispatch/2026-10-24-served)), 8 of 8 both times. Each link opens that test's signed record.
We ran each test on the live service on October 8, 2026, with a dedicated agent under its own fixed permission, again on October 24 on the revision production was serving then ([records](https://github.com/proofable/docs/tree/main/public/evidence/aaif/authority-at-dispatch/2026-10-24-served)), and again on November 1 on the revision production was serving then ([records](https://github.com/proofable/docs/tree/main/public/evidence/aaif/authority-at-dispatch/2026-11-01-suite)). Each link opens that test's signed record.

| Test | What happened |
|---|---|
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Proofable — Authority-at-Dispatch Evidence

Proofable's implementation evidence for the authority/effect comparison associated with
[AAIF Identity & Trust issue #13](https://github.com/aaif/wg-identity-and-trust/issues/13).

**Run.** Live production hosted MCP, protocol revision `0d1b934f40d38233fa588267354fcccec5e1edeb`, run `aad-2026-11-01T22-24-26-865Z`,
assembled from 2 source runs:
- `aad-2026-11-01T22-24-26-865Z` — eight-case authority suite
- `aad-2026-11-01T22-24-26-865Z` — ordered post-revocation probe
Executed by the Proofable operator under a non-privileged review profile (not an administrative
path), with the dedicated agent `proofable-authority-review` under an explicit pinned delegation
per case. The ordered post-revocation boundary is a second source run in the same packet, not a
re-observation of the same run.

**Coverage.** Expected case set fixed by the suite.
8 of 8 expected cases produced a record in this run.

**Signer and subject.** Every disclosed envelope is signed by the Proofable service wallet
`0xa41494e1e5f9e5eaf786961e6ef84cd1a3071eec`. The signature means *Proofable attests this
server-observed statement*; it is not the controller signing their own outcome. The controller
`0x0d4e513a3a7eb92bab65c97786c67b198d9dca15` is the statement's subject/owner whose record is
stored. The two addresses differ by design.

## Results

| Scenario | Result |
| --- | --- |
| Binding veto / action outside delegated authority | **SUPPORTED** — unauthorized execution is denied before executor assignment |
| Revoked authority / stale grant | **SUPPORTED** — revoked authority is denied while the never-revoked control remains accepted |
| Human approver unavailable (case 4) | **SUPPORTED** — a job that needs approval is held with no executor; with no answer the hold ends without execution and a late approval is refused; the approved control completes. The 24 h approval window was not waited out, and no fallback authority exists |
| Remote authority status unavailable | **NOT APPLICABLE TO CURRENT PATH** — Proofable evaluates current authority state locally at dispatch and has no remote authorization dependency on this path |
| Revocation after dispatch | **SUPPORTED** — the dispatch decision, the later revocation, the resulting effect/outcome, and the refusal of the next dispatch are separately attributable |

**Protocol boundary:** authority → decision → dispatch → effect/outcome → receipt.

**Revocation after dispatch.** One grant is dispatched under, revoked while the action is in flight, and
then used for the next dispatch. The earlier action was allowed at dispatch; after the revocation became
visible, the call was refused with a typed reason at the executor's own boundary check, so no effect committed. The next dispatch under the same revoked grant was refused with a reason. When
authorization was refused is therefore reported separately from what the prior action did. Revocation
latency is **not measured** in this run.

The result is a portable proof/receipt of the protocol decision and outcome; disclosure controls
which fields are shared. Where Proofable does not independently observe a target-side effect, the
record states `platform_observed_only`.

**Evidence scope:** author-operated; independent reproduction not yet claimed.

This is implementation evidence for the comparison in #13 — not AAIF certification or WG
conformance.

**Reproduce it yourself.** `../reproduce/` runs the same cases against the live hosted service under
your own Proofable account, so the records it writes are yours, not Proofable's.

## Files

| File | Role |
| --- | --- |
| `README.md` | this summary |
| `manifest.json` | machine-readable manifest: revision, run, custody, results, disclosure |
| `authority-effect-results.md` | results under the shared authority/effect contract |
| `authority-effect-results.json` | machine-readable results |
| `trace.jsonl` | one sanitized record per supporting case (8 records, contract v1 fields on each) |
| `portable-proofs.json` | disclosed CAIP-380 job and authority envelopes |
| `verify-portable-proofs.mjs` | offline SDK verification of every envelope |
| `SHA256SUMS` | SHA-256 for every payload file beside it |

`SHA256SUMS` covers every payload file in this directory except itself. Verify with
`sha256sum -c SHA256SUMS`.

Install the pinned `@proofable/sdk@0.1.11` package once. Then verify every signature and qHash offline:

`node verify-portable-proofs.mjs`

Disclosure controls which fields of the Proofable record are shared; non-public fields are not
required to evaluate these results.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
717353e0ae497c4754051e09b5f97050526beaa2a20eb1ec75011e986c183bd4 README.md
155c554f8ba975a01fc6aa664dc5f4c331c5ccf497d588cb7fb2414ad2f56e45 manifest.json
5f99ab626b65d48725812e7b4371a510ce0b0dca6d70749e8831496f0428b558 authority-effect-results.md
63592305352d5d82cf129f451ae424dde7b66c2b6b2ed7705b12f3d6230c04c2 authority-effect-results.json
feea298e0c4d923afba7fadc867715162a5554e94886a977a3a8fdb8f93188a9 trace.jsonl
9bc0f10ca4175c2a9f27225360a95094a963976849b378d0b2c2dda85f4b0f49 portable-proofs.json
f7eb8f74885518b3ba0d945f60500e3236a25ad569fdcc6c8e44af462eaa3248 verify-portable-proofs.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
{
"schema": "proofable-authority-at-dispatch-results/v2",
"contract": {
"reference": "probityai/agent-evidence-observer",
"commit": "c897659ba452bd2fc5a080531aa5bfadb72ad529",
"file": "interop/authority-unreachable-2026-10-03/CONTRACT.md",
"contract_id": "https://probityai.github.io/agent-evidence-observer/contract/authority-at-dispatch/v1"
},
"implementation": "Proofable",
"deployed_revision": "0d1b934f40d38233fa588267354fcccec5e1edeb",
"run_id": "aad-2026-11-01T22-24-26-865Z",
"source_runs": [
{
"run_id": "aad-2026-11-01T22-24-26-865Z",
"role": "eight-case authority suite",
"records": 8
},
{
"run_id": "aad-2026-11-01T22-24-26-865Z",
"role": "ordered post-revocation probe",
"records": 1
}
],
"custody": "SELF (author-operated; no independent witness)",
"boundary": "authority → decision → dispatch → effect/outcome → receipt",
"results": {
"binding_veto": "SUPPORTED",
"revoked_stale": "SUPPORTED",
"unreachable": "NOT_APPLICABLE_CURRENT_PATH",
"human_unavailable": "SUPPORTED",
"post_dispatch_revoke": "SUPPORTED"
},
"cases": [
{
"case_id": "binding_veto",
"requested_action": "isolated-computer execution requiring run_command",
"protected_target": "isolated computer execution (run_command)",
"authority_evidence": {
"source": "current Proofable authority state evaluated at dispatch",
"status": "current at dispatch",
"observation_time": "2026-11-01T22:25:14.400Z",
"freshness_rule": "delegation evaluated at dispatch from current state; freshness = delegation expiry/revocation",
"check_at_dispatch": "controller→agent delegation resolved; requested action checked against the allow-list"
},
"dispatch_decision": {
"job_admission": "ALLOW",
"protected_action_decision": "DENY",
"decision": "DENY",
"reason": "run_command is required"
},
"observed_effect": {
"state": "none_no_executor"
},
"task_recovery": {
"terminal_state": "failed"
},
"custody": "SELF (author-operated)",
"limitations": [
"Author-operated; no independent target-side effect witness."
],
"result": "SUPPORTED"
},
{
"case_id": "revoked_stale",
"requested_action": "dispatch under a revoked grant, with a never-revoked control",
"protected_target": "Proofable job dispatch (authority gate before executor assignment)",
"authority_evidence": {
"source": "current Proofable authority state evaluated at dispatch",
"status": "revoked (replay) vs valid (control)",
"observation_time": "2026-11-01T22:29:11.839Z",
"freshness_rule": "delegation evaluated at dispatch from current state; freshness = delegation expiry/revocation",
"check_at_dispatch": "controller→agent delegation resolved; requested action checked against the allow-list"
},
"dispatch_decision": {
"decision": "DENY",
"reason": "DELEGATION_PROOF_DENIED"
},
"observed_effect": {
"state": "none_no_dispatch"
},
"task_recovery": {
"terminal_state": "not_applicable"
},
"custody": "SELF (author-operated)",
"limitations": [
"Author-operated; revoked authority denied while the never-revoked control was accepted."
],
"result": "SUPPORTED"
},
{
"case_id": "unreachable",
"requested_action": "dispatch while a remote authority status source is unreachable (distinct from case 4, an unreachable human approver)",
"protected_target": "Proofable job dispatch (authority gate before executor assignment)",
"authority_evidence": {
"source": "current Proofable authority state evaluated at dispatch",
"status": "not applicable — no remote authority dependency on this path",
"observation_time": null
},
"dispatch_decision": {
"decision": "not_applicable_to_current_path",
"reason": "no remote authority dependency on this path"
},
"observed_effect": {
"state": "not_applicable"
},
"task_recovery": {
"terminal_state": "not_applicable"
},
"custody": "SELF (author-operated)",
"limitations": [
"Requires a path with a real remote authority dependency; not inferred as passing."
],
"result": "NOT_APPLICABLE_CURRENT_PATH"
},
{
"case_id": "human_unavailable",
"working_group_case": 4,
"requested_action": "bounded job that requires a human approval; the approver does not answer (approval_unavailable) or approves (approval_reachable control)",
"protected_target": "Proofable job dispatch (approval hold before executor assignment)",
"authority_evidence": {
"source": "current Proofable authority state evaluated at dispatch",
"status": "valid grant; approval required",
"observation_time": "2026-11-01T22:26:17.721Z",
"check_at_dispatch": "controller→agent delegation resolved; the job requires approval, so the signed decision is STEP_UP and no executor is assigned"
},
"dispatch_decision": {
"decision": "STEP_UP",
"reason": "approval required; held until the approver decides"
},
"delegation_and_fallback": {
"decision_deadline_seconds": 86400,
"decision_deadline_source": "JOB_APPROVAL_EXPIRY_MS in the deployed protocol revision; an unanswered approval fails the job when the window ends",
"decision_deadline_exercised": false,
"pre_authorized_fallback": "not_applicable: the deployed path has no fallback authority; an unanswered approval never widens what the grant allows",
"late_approval": "refused after the hold ended (JOB_APPROVAL_STATE_CHANGED)"
},
"observed_effect": {
"state": "none_no_executor",
"evidence": "the held job was never assigned an executor; terminal status cancelled"
},
"task_recovery": {
"terminal_state": "cancelled",
"hold_ended_by": "owner_cancel",
"hold_seconds": 5.9,
"control": {
"case_id": "approval_reachable",
"dispatch_decision": "STEP_UP",
"approval_decision": "approve",
"terminal_state": "completed",
"response": "REVIEW_OK"
}
},
"custody": "SELF (author-operated)",
"limitations": [
"The hold was ended by the owner cancelling the job, standing in for an approver who never answers; the 24-hour approval window was not waited out in this run.",
"No pre-authorized fallback exists on this path, so the fallback variant of case 4 is not applicable rather than passed.",
"In the approved control, the signed terminal statement's evaluation block reads approval.required false although the signed authority decision was STEP_UP and the job was observed waiting for approval; the authority decision and the observed hold are the evidence for the approval step. Corrected in the service source after this run (evaluation record version 2 reads the persisted hold and its decision; protocol commit 44d179a84); the deployed revision of this run predates the fix."
],
"result": "SUPPORTED"
},
{
"case_id": "post_dispatch_revoke",
"requested_action": "bounded job execution, then revoke the pinned grant in flight, then attempt the next dispatch",
"protected_target": "bounded job execution (in-flight revocation)",
"authority_evidence": {
"source": "current local Proofable authority state evaluated at dispatch",
"status": "current at dispatch",
"observation_time": "2026-11-02T00:03:31.308Z",
"freshness_rule": "delegation evaluated at dispatch from current state; freshness = delegation expiry/revocation",
"check_at_dispatch": "controller→agent delegation resolved; requested action checked against the allow-list"
},
"dispatch_decision": {
"decision": "ALLOW"
},
"temporal_revocation": {
"trigger_time": "2026-11-02T00:03:51.783Z",
"authority_evidence_consulted": "pinned delegation at dispatch",
"last_accepted_action": "2026-11-02T00:03:36.090Z",
"required_deny_point": "the next dispatch after revocation",
"first_observed_denial": "2026-11-02T00:14:25.817Z",
"first_observed_denial_reason": "DELEGATION_PROOF_DENIED",
"observed_in_flight": true,
"revocation_latency": "not measured; not claimed"
},
"observed_effect": {
"state": "refused_at_tool_call",
"evidence": "the executor re-read the authority at its own boundary, found the grant inactive and refused the call; no protected effect committed"
},
"task_recovery": {
"terminal_state": "failed"
},
"custody": "SELF (author-operated)",
"limitations": [
"Effect observed at the platform boundary, not by an independent target-side readback.",
"Revocation latency is not measured in this run and is not claimed."
],
"result": "SUPPORTED"
}
]
}
Loading
Loading