Spaces:
Running
Running
Publish seven recorded ControlSpec examples
Browse files- README.md +18 -5
- index.html +42 -18
- observations.json +248 -0
README.md
CHANGED
|
@@ -1,12 +1,25 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
|
|
|
| 7 |
pinned: false
|
| 8 |
license: apache-2.0
|
| 9 |
short_description: Explore recorded agent control decisions and binding checks
|
| 10 |
---
|
| 11 |
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: ControlSpec — Before an agent acts
|
| 3 |
+
emoji: 🧭
|
| 4 |
+
colorFrom: green
|
| 5 |
+
colorTo: blue
|
| 6 |
sdk: static
|
| 7 |
+
app_file: index.html
|
| 8 |
pinned: false
|
| 9 |
license: apache-2.0
|
| 10 |
short_description: Explore recorded agent control decisions and binding checks
|
| 11 |
---
|
| 12 |
|
| 13 |
+
# ControlSpec interactive examples
|
| 14 |
+
|
| 15 |
+
Explore seven personal-spending and sales scenarios generated by the real
|
| 16 |
+
ControlSpec reference evaluator. This free static Space displays recorded outputs;
|
| 17 |
+
it does not run a live evaluator, authorize actions, or execute tools.
|
| 18 |
+
|
| 19 |
+
[Source and quickstart](https://github.com/claytonsamples/controlspec) ·
|
| 20 |
+
[Experimental release](https://github.com/claytonsamples/controlspec/releases/tag/v0.1.1-preview.1)
|
| 21 |
+
|
| 22 |
+
Select a scenario, inspect its route and outcome assessment, and try the recorded
|
| 23 |
+
changed-intent check for the $42 purchase. Raw observations are downloadable.
|
| 24 |
+
Reproduce the data with `scripts/build_static_demo.py` in the source repository.
|
| 25 |
+
All examples use explicit fixed reference time. No signup or keys are needed.
|
index.html
CHANGED
|
@@ -1,19 +1,43 @@
|
|
| 1 |
<!doctype html>
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
| 5 |
+
<title>ControlSpec — Before an agent acts</title>
|
| 6 |
+
<meta name="description" content="Explore seven recorded ControlSpec examples: spending limits, approval requirements, self-approval rejection and changed intent binding.">
|
| 7 |
+
<style>
|
| 8 |
+
:root{color-scheme:light;--ink:#18382e;--muted:#607268;--line:#d7e1d8;--paper:#f5f7ef;--green:#246346;--white:#fff;--amber:#8d590a;--red:#ab3838}*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;line-height:1.55}a{color:inherit;text-underline-offset:3px}button{font:inherit;cursor:pointer}button:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid #297aab;outline-offset:4px}header{display:flex;justify-content:space-between;align-items:center;padding:22px 0;border-bottom:1px solid var(--line);gap:20px}.brand{font-weight:800;font-size:21px;letter-spacing:-.6px}.brand span{display:inline-grid;place-items:center;background:var(--ink);color:white;width:30px;height:30px;border-radius:7px;margin-right:9px;font-size:18px}nav{display:flex;gap:24px;font-size:14px}main,header,footer{max-width:1120px;margin:auto}main{padding:42px 0}.eyebrow{text-transform:uppercase;letter-spacing:1.8px;font-size:11px;font-weight:800;color:var(--green);margin:0 0 10px}h1{font-size:clamp(30px,4vw,47px);letter-spacing:-1.8px;line-height:1.15;margin:0 0 15px;max-width:830px}h2,h3,p{margin-top:0}.intro{max-width:700px;color:var(--muted);font-size:17px;margin-bottom:18px}.notice{font-size:13px;border-left:3px solid #93b598;padding:8px 12px;max-width:790px;margin-bottom:30px}.workbench{display:grid;grid-template-columns:340px 1fr;gap:20px}.panel{background:var(--white);border:1px solid var(--line);border-radius:14px;padding:25px}.tabs{display:flex;border-bottom:1px solid var(--line);gap:8px;padding-bottom:16px;margin-bottom:20px}.tab{border:0;border-radius:7px;padding:8px 14px;background:transparent;color:var(--muted);font-weight:650}.tab[aria-pressed=true]{background:var(--ink);color:white}.section-label{font-size:12px;color:var(--muted);margin-bottom:12px}.choices{display:flex;flex-direction:column;gap:10px}.choice{border:1px solid var(--line);border-radius:9px;background:white;text-align:left;color:var(--ink);padding:14px 15px;transition:border-color .12s}.choice:hover{border-color:var(--green)}.choice[aria-pressed=true]{border-color:var(--green);box-shadow:inset 3px 0 var(--green);background:#f1f7f1}.choice strong{display:block;font-size:15px}.choice small{display:block;color:var(--muted);margin-top:3px;font-size:12px}.pack{font-size:12px;overflow-wrap:anywhere;color:var(--muted);padding-top:22px}.pack code{display:block;margin-top:6px;font-size:11px}.result-head{display:flex;justify-content:space-between;align-items:center;gap:14px;margin-bottom:21px}.result-head .section-label{margin:0}.badge{font-size:11px;letter-spacing:1px;text-transform:uppercase;font-weight:750;border-radius:30px;padding:6px 12px;background:#e5f1e7;color:var(--green)}.badge.approval,.badge.conditions{background:#fff0d6;color:var(--amber)}.badge.block{background:#ffe9e6;color:var(--red)}.decision{font-size:32px;letter-spacing:-1px;margin:0 0 12px}.explanation{color:var(--muted);max-width:620px;min-height:49px}.steps{display:grid;gap:0;margin-top:25px}.step{display:grid;grid-template-columns:32px 1fr;gap:10px;border-top:1px solid var(--line);padding:17px 0}.num{color:var(--muted);font-size:12px;padding-top:3px}.step h3{font-size:14px;margin:0 0 4px}.step p{font-size:13px;color:var(--muted);margin:0}.step code{font-size:12px;overflow-wrap:anywhere}.toggle{margin-top:12px;border:1px solid var(--line);background:#f5f7f4;color:var(--ink);border-radius:7px;padding:8px 12px;font-size:12px}.toggle[aria-pressed=true]{background:#ffe9e6;border-color:#d6aaa4}.binding-error{color:var(--red)!important;font-weight:650}.bottom{display:flex;gap:24px;justify-content:space-between;padding-top:28px;color:var(--muted);font-size:13px}.bottom p{max-width:610px}details{margin-top:20px;border:1px solid var(--line);border-radius:10px;padding:15px 18px;background:#fff}summary{cursor:pointer;font-size:13px;font-weight:650}pre{font-size:11px;white-space:pre-wrap;overflow-wrap:anywhere;max-height:300px;overflow:auto;background:#f5f7f4;padding:14px;border-radius:6px}footer{border-top:1px solid var(--line);padding:20px 0 30px;color:var(--muted);font-size:12px;display:flex;justify-content:space-between;gap:20px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}[hidden]{display:none!important}@media(max-width:1180px){header,main,footer{margin-left:24px;margin-right:24px}}@media(max-width:760px){main{padding-top:28px}.workbench{grid-template-columns:1fr}.panel{padding:20px}.choices{display:grid;grid-template-columns:1fr 1fr}.choice{padding:12px}.pack{padding-top:15px}.bottom,footer{flex-direction:column;gap:8px}.result-head{align-items:flex-start}.decision{font-size:28px}nav{gap:14px}header{padding:17px 0}.intro{font-size:15px}}@media(prefers-reduced-motion:reduce){*{transition:none!important}}
|
| 9 |
+
</style>
|
| 10 |
+
</head>
|
| 11 |
+
<body>
|
| 12 |
+
<header><a class="brand" href="https://github.com/claytonsamples/controlspec" target="_blank" rel="noopener noreferrer"><span aria-hidden="true">C</span>ControlSpec</a><nav aria-label="Project"><a href="https://github.com/claytonsamples/controlspec#try-it-locally" target="_blank" rel="noopener noreferrer">Run locally ↗</a><a href="https://github.com/claytonsamples/controlspec" target="_blank" rel="noopener noreferrer">GitHub ↗</a></nav></header>
|
| 13 |
+
<main><p class="eyebrow">An open-source experiment in agent controls</p><h1>Before an agent acts,<br>what should it be allowed to do?</h1><p class="intro">Explore how a proposed action meets a specific set of controls. Change the scenario. Inspect the decision, its binding, and what the outcome actually proves.</p><p class="notice"><strong>Recorded reference examples.</strong> These outputs come from the real Python evaluator. This static page does not evaluate new policies or execute actions. An “allow” result here is not production permission.</p>
|
| 14 |
+
<div class="workbench">
|
| 15 |
+
<section class="panel" aria-label="Choose an agent scenario"><div class="tabs" role="group" aria-label="Example domain"><button class="tab" id="personal-tab" aria-pressed="true">Personal spending</button><button class="tab" id="smb-tab" aria-pressed="false">Sales</button></div><p class="section-label">Choose a proposed action</p><div class="choices" id="choices"></div><p class="pack">Selected immutable example pack<code id="pack"></code></p></section>
|
| 16 |
+
<section class="panel" aria-label="Recorded reference result"><div class="result-head"><p class="section-label">ControlSpec reference result</p><span class="badge" id="badge"></span></div><div aria-live="polite" aria-atomic="true"><h2 class="decision" id="decision"></h2><p class="explanation" id="explanation"></p></div><div class="steps"><div class="step"><span class="num">01</span><div><h3>Decision and route</h3><p id="route"></p></div></div><div class="step"><span class="num">02</span><div><h3>Recheck the exact action</h3><p id="binding" aria-live="polite"></p><button class="toggle" id="mutate" aria-pressed="false" hidden>Change the purchase after the decision</button></div></div><div class="step"><span class="num">03</span><div><h3>Assess the outcome</h3><p id="receipt"></p></div></div></div></section>
|
| 17 |
+
</div>
|
| 18 |
+
<details><summary>Inspect the recorded data and provenance</summary><p class="section-label" id="provenance"></p><pre id="raw"></pre><a href="observations.json" download>Download all seven observations</a></details>
|
| 19 |
+
<div class="bottom"><p><strong>Building an agent?</strong> Try one of your controls against the Python reference. We want integration attempts, uncomfortable edge cases, and feedback on the contract.</p><a href="https://github.com/claytonsamples/controlspec/issues/new" target="_blank" rel="noopener noreferrer">Share an integration idea ↗</a></div>
|
| 20 |
+
</main><footer><span>ControlSpec · Apache-2.0 · Experimental community preview</span><span>Human-owned controls. Exact action binding. Evidence after action.</span></footer>
|
| 21 |
+
<script id="observations" type="application/json">{"mode":"recorded_reference_outputs","source_commit":"77178798ffe7fed1e6608b7d4037e67c1c8cd113","reference_time":"2026-08-20T12:00:00.000000Z","external_actions_executed":false,"domains":[{"domain":"personal","release_id":"v0.1.1","catalog_digest":"sha256:07e00e11176752146d402c31269d3c89dbe1f8ae200c98a91f7e4f34f7888322","scenarios":[{"scenario_id":"groceries-42","intent_digest":"sha256:eae71621e734dcf7b654a778562900935637da3b62384ac8a06802ede2d1c16d","pack_catalog_id":"personal.agent.spending:spending-baseline@0.1.0","verdict":"allow","route_kind":"continue","route_id":"continue","recheck_valid":true,"changed_recheck_valid":false,"receipt_status":"incomplete","missing_evidence_count":1,"verified_evidence_count":0,"assessment_basis":"caller_report_only","stored":false,"durable":false,"route_substitution_rejected":true},{"scenario_id":"groceries-142","intent_digest":"sha256:5b0a007d31cec073c4a6c8731e192c15cc7de7e0a0c4d96b64d4b23210afd1c0","pack_catalog_id":"personal.agent.spending:spending-baseline@0.1.0","verdict":"require_approval","route_kind":"ask_user","route_id":"ask-before-purchase","recheck_valid":true,"changed_recheck_valid":null,"receipt_status":"failed","missing_evidence_count":0,"verified_evidence_count":0,"assessment_basis":"caller_report_only","stored":false,"durable":false,"route_substitution_rejected":true},{"scenario_id":"recurring-999","intent_digest":"sha256:bc82299648aa586ad4cb8da960d413c5cfbeaca046e58912a359714b7d0ec801","pack_catalog_id":"personal.agent.spending:spending-baseline@0.1.0","verdict":"require_approval","route_kind":"ask_user","route_id":"ask-before-recurring-purchase","recheck_valid":true,"changed_recheck_valid":null,"receipt_status":"failed","missing_evidence_count":0,"verified_evidence_count":0,"assessment_basis":"caller_report_only","stored":false,"durable":false,"route_substitution_rejected":true}],"machine_summary":{"status":"ok","scope":"local_reference_examples","domain":"personal","release_id":"v0.1.1","catalog_digest":"sha256:07e00e11176752146d402c31269d3c89dbe1f8ae200c98a91f7e4f34f7888322","observed":[{"id":"groceries-42","verdict":"allow","recheck_valid":true,"receipt_status":"incomplete","non_authoritative":true,"deterministic_repeat":true,"route_substitution_rejected":true},{"id":"groceries-142","verdict":"require_approval","recheck_valid":true,"receipt_status":"failed","non_authoritative":true,"deterministic_repeat":true,"route_substitution_rejected":true},{"id":"recurring-999","verdict":"require_approval","recheck_valid":true,"receipt_status":"failed","non_authoritative":true,"deterministic_repeat":true,"route_substitution_rejected":true}],"scenario_count":3,"probe_count":0,"operations":["GET packs","GET packs/{id}","GET controls","GET controls/{id}","POST decide","POST recheck","POST receipts"],"external_actions_executed":false,"receipts_stored":false}},{"domain":"smb","release_id":"v0.1.1","catalog_digest":"sha256:07e00e11176752146d402c31269d3c89dbe1f8ae200c98a91f7e4f34f7888322","scenarios":[{"scenario_id":"draft","intent_digest":"sha256:c97b00a3ce7f1e71a27f90bab783f4490f1fe09286f137abaa5cf2cf2882b64d","pack_catalog_id":"smb.sales.controls:sales-baseline@0.1.0","verdict":"allow","route_kind":"continue","route_id":"continue-draft","recheck_valid":true,"changed_recheck_valid":null,"receipt_status":"failed","missing_evidence_count":0,"verified_evidence_count":0,"assessment_basis":"caller_report_only","stored":false,"durable":false,"route_substitution_rejected":true},{"scenario_id":"discount-8","intent_digest":"sha256:be0d497159b6110a72d0a6bea0c2db21f82202f40e6217ef586ae1f51bbac7d0","pack_catalog_id":"smb.sales.controls:sales-baseline@0.1.0","verdict":"allow_with_conditions","route_kind":"continue","route_id":"continue-within-limit","recheck_valid":true,"changed_recheck_valid":null,"receipt_status":"failed","missing_evidence_count":0,"verified_evidence_count":0,"assessment_basis":"caller_report_only","stored":false,"durable":false,"route_substitution_rejected":true},{"scenario_id":"discount-15","intent_digest":"sha256:ec4f4dee20b67ee8dd0b264dcbf60f185eda92d48fa48bbf2ed54f0ff090e5d4","pack_catalog_id":"smb.sales.controls:sales-baseline@0.1.0","verdict":"require_approval","route_kind":"continue","route_id":"continue","recheck_valid":true,"changed_recheck_valid":null,"receipt_status":"failed","missing_evidence_count":0,"verified_evidence_count":0,"assessment_basis":"caller_report_only","stored":false,"durable":false,"route_substitution_rejected":true},{"scenario_id":"smb-discount-15-direct-self-approval","intent_digest":"sha256:c28c5920136a243b8256f8baaa59709217a8f7043e95dcec06013aaee3d1bf1a","pack_catalog_id":"smb.sales.controls:sales-baseline@0.1.0","verdict":"block","route_kind":"block","route_id":"fail-closed-block","recheck_valid":true,"changed_recheck_valid":null,"receipt_status":"failed","missing_evidence_count":0,"verified_evidence_count":0,"assessment_basis":"caller_report_only","stored":false,"durable":false,"route_substitution_rejected":true}],"machine_summary":{"status":"ok","scope":"local_reference_examples","domain":"smb","release_id":"v0.1.1","catalog_digest":"sha256:07e00e11176752146d402c31269d3c89dbe1f8ae200c98a91f7e4f34f7888322","observed":[{"id":"draft","verdict":"allow","recheck_valid":true,"receipt_status":"failed","non_authoritative":true,"deterministic_repeat":true,"route_substitution_rejected":true},{"id":"discount-8","verdict":"allow_with_conditions","recheck_valid":true,"receipt_status":"failed","non_authoritative":true,"deterministic_repeat":true,"route_substitution_rejected":true},{"id":"discount-15","verdict":"require_approval","recheck_valid":true,"receipt_status":"failed","non_authoritative":true,"deterministic_repeat":true,"route_substitution_rejected":true},{"id":"smb-discount-15-direct-self-approval","verdict":"block","recheck_valid":true,"receipt_status":"failed","non_authoritative":true,"deterministic_repeat":true,"route_substitution_rejected":true}],"scenario_count":4,"probe_count":0,"operations":["GET packs","GET packs/{id}","GET controls","GET controls/{id}","POST decide","POST recheck","POST receipts"],"external_actions_executed":false,"receipts_stored":false}}]}</script>
|
| 22 |
+
<script>
|
| 23 |
+
"use strict";
|
| 24 |
+
const data=JSON.parse(document.getElementById('observations').textContent);
|
| 25 |
+
const labels={
|
| 26 |
+
'groceries-42':['$42 grocery purchase','Within the $75 example limit','The selected control permits this one-time purchase below $75. The reference decision is allow.'],
|
| 27 |
+
'groceries-142':['$142 grocery purchase','Above the example limit','The amount exceeds the example’s $75 boundary. The reference requires human approval.'],
|
| 28 |
+
'recurring-999':['$9.99 subscription','A recurring commitment','A small amount can still create a recurring commitment. The example requires human approval for recurring purchases.'],
|
| 29 |
+
'draft':['Draft a customer email','No message is sent','The example permits preparing a draft. A draft decision does not establish that a message was sent or its outcome verified.'],
|
| 30 |
+
'discount-8':['Offer an 8% discount','Within the example discount limit','The reference returns allow with conditions. Those conditions still need to be followed and supported by evidence.'],
|
| 31 |
+
'discount-15':['Offer a 15% discount','Above the example discount limit','This discount requires approval. A continue route by itself does not override an approval-required verdict.'],
|
| 32 |
+
'smb-discount-15-direct-self-approval':['Approve my own 15% discount','The same actor tries to approve','The approval fails the example’s independence check. The reference blocks this proposed action.']};
|
| 33 |
+
const verdicts={allow:['Allow','Within this example’s controls',''],require_approval:['Approval required','A human decision is needed','approval'],allow_with_conditions:['Allow with conditions','Conditions remain to be met','conditions'],block:['Blocked','The proposed action cannot proceed','block']};
|
| 34 |
+
let domain='personal', selected='groceries-42', changed=false;
|
| 35 |
+
const el=id=>document.getElementById(id);
|
| 36 |
+
function current(){return data.domains.find(d=>d.domain===domain).scenarios.find(s=>s.scenario_id===selected)}
|
| 37 |
+
function renderChoices(){el('choices').replaceChildren();for(const row of data.domains.find(d=>d.domain===domain).scenarios){const b=document.createElement('button');b.className='choice';b.setAttribute('aria-pressed',String(row.scenario_id===selected));const title=document.createElement('strong');title.textContent=labels[row.scenario_id][0];const subtitle=document.createElement('small');subtitle.textContent=labels[row.scenario_id][1];b.append(title,subtitle);b.addEventListener('click',()=>{selected=row.scenario_id;changed=false;renderChoices();renderResult()});el('choices').append(b)}}
|
| 38 |
+
function renderResult(){const row=current(),v=verdicts[row.verdict];el('decision').textContent=v[0];el('badge').textContent=row.verdict.replaceAll('_',' ');el('badge').className='badge '+v[2];el('explanation').textContent=labels[selected][2];el('pack').textContent=row.pack_catalog_id;el('route').textContent='Verdict: '+row.verdict+'. Route: '+row.route_kind+' / '+row.route_id+'.';el('binding').textContent=changed?'Binding rejected. The recorded changed intent no longer matches the prior decision. Evaluate the new intent again.':'Binding matches. The recorded actor, action, resource, context and policy selection are unchanged. This also holds for restrictive verdicts; a valid binding is not permission.';el('binding').className=changed?'binding-error':'';el('mutate').hidden=row.changed_recheck_valid===null;el('mutate').setAttribute('aria-pressed',String(changed));el('mutate').textContent=changed?'Restore the original purchase':'Change the purchase after the decision';el('receipt').textContent='Assessment: '+row.receipt_status+'. The caller reported success, but no action ran and no execution was verified. '+row.missing_evidence_count+' required evidence item(s) missing. Nothing is stored.';el('raw').textContent=JSON.stringify({...row,displaying_changed_intent:changed},null,2);el('provenance').textContent='Source commit '+data.source_commit.slice(0,12)+' · Fixed reference time '+data.reference_time+' · '+data.mode+'.'}
|
| 39 |
+
function chooseDomain(next){domain=next;selected=data.domains.find(d=>d.domain===domain).scenarios[0].scenario_id;changed=false;el('personal-tab').setAttribute('aria-pressed',String(domain==='personal'));el('smb-tab').setAttribute('aria-pressed',String(domain==='smb'));renderChoices();renderResult()}
|
| 40 |
+
el('personal-tab').addEventListener('click',()=>chooseDomain('personal'));el('smb-tab').addEventListener('click',()=>chooseDomain('smb'));el('mutate').addEventListener('click',()=>{if(current().changed_recheck_valid===false){changed=!changed;renderResult()}});
|
| 41 |
+
renderChoices();renderResult();
|
| 42 |
+
</script>
|
| 43 |
+
</body></html>
|
observations.json
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"mode": "recorded_reference_outputs",
|
| 3 |
+
"source_commit": "77178798ffe7fed1e6608b7d4037e67c1c8cd113",
|
| 4 |
+
"reference_time": "2026-08-20T12:00:00.000000Z",
|
| 5 |
+
"external_actions_executed": false,
|
| 6 |
+
"domains": [
|
| 7 |
+
{
|
| 8 |
+
"domain": "personal",
|
| 9 |
+
"release_id": "v0.1.1",
|
| 10 |
+
"catalog_digest": "sha256:07e00e11176752146d402c31269d3c89dbe1f8ae200c98a91f7e4f34f7888322",
|
| 11 |
+
"scenarios": [
|
| 12 |
+
{
|
| 13 |
+
"scenario_id": "groceries-42",
|
| 14 |
+
"intent_digest": "sha256:eae71621e734dcf7b654a778562900935637da3b62384ac8a06802ede2d1c16d",
|
| 15 |
+
"pack_catalog_id": "personal.agent.spending:spending-baseline@0.1.0",
|
| 16 |
+
"verdict": "allow",
|
| 17 |
+
"route_kind": "continue",
|
| 18 |
+
"route_id": "continue",
|
| 19 |
+
"recheck_valid": true,
|
| 20 |
+
"changed_recheck_valid": false,
|
| 21 |
+
"receipt_status": "incomplete",
|
| 22 |
+
"missing_evidence_count": 1,
|
| 23 |
+
"verified_evidence_count": 0,
|
| 24 |
+
"assessment_basis": "caller_report_only",
|
| 25 |
+
"stored": false,
|
| 26 |
+
"durable": false,
|
| 27 |
+
"route_substitution_rejected": true
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
"scenario_id": "groceries-142",
|
| 31 |
+
"intent_digest": "sha256:5b0a007d31cec073c4a6c8731e192c15cc7de7e0a0c4d96b64d4b23210afd1c0",
|
| 32 |
+
"pack_catalog_id": "personal.agent.spending:spending-baseline@0.1.0",
|
| 33 |
+
"verdict": "require_approval",
|
| 34 |
+
"route_kind": "ask_user",
|
| 35 |
+
"route_id": "ask-before-purchase",
|
| 36 |
+
"recheck_valid": true,
|
| 37 |
+
"changed_recheck_valid": null,
|
| 38 |
+
"receipt_status": "failed",
|
| 39 |
+
"missing_evidence_count": 0,
|
| 40 |
+
"verified_evidence_count": 0,
|
| 41 |
+
"assessment_basis": "caller_report_only",
|
| 42 |
+
"stored": false,
|
| 43 |
+
"durable": false,
|
| 44 |
+
"route_substitution_rejected": true
|
| 45 |
+
},
|
| 46 |
+
{
|
| 47 |
+
"scenario_id": "recurring-999",
|
| 48 |
+
"intent_digest": "sha256:bc82299648aa586ad4cb8da960d413c5cfbeaca046e58912a359714b7d0ec801",
|
| 49 |
+
"pack_catalog_id": "personal.agent.spending:spending-baseline@0.1.0",
|
| 50 |
+
"verdict": "require_approval",
|
| 51 |
+
"route_kind": "ask_user",
|
| 52 |
+
"route_id": "ask-before-recurring-purchase",
|
| 53 |
+
"recheck_valid": true,
|
| 54 |
+
"changed_recheck_valid": null,
|
| 55 |
+
"receipt_status": "failed",
|
| 56 |
+
"missing_evidence_count": 0,
|
| 57 |
+
"verified_evidence_count": 0,
|
| 58 |
+
"assessment_basis": "caller_report_only",
|
| 59 |
+
"stored": false,
|
| 60 |
+
"durable": false,
|
| 61 |
+
"route_substitution_rejected": true
|
| 62 |
+
}
|
| 63 |
+
],
|
| 64 |
+
"machine_summary": {
|
| 65 |
+
"status": "ok",
|
| 66 |
+
"scope": "local_reference_examples",
|
| 67 |
+
"domain": "personal",
|
| 68 |
+
"release_id": "v0.1.1",
|
| 69 |
+
"catalog_digest": "sha256:07e00e11176752146d402c31269d3c89dbe1f8ae200c98a91f7e4f34f7888322",
|
| 70 |
+
"observed": [
|
| 71 |
+
{
|
| 72 |
+
"id": "groceries-42",
|
| 73 |
+
"verdict": "allow",
|
| 74 |
+
"recheck_valid": true,
|
| 75 |
+
"receipt_status": "incomplete",
|
| 76 |
+
"non_authoritative": true,
|
| 77 |
+
"deterministic_repeat": true,
|
| 78 |
+
"route_substitution_rejected": true
|
| 79 |
+
},
|
| 80 |
+
{
|
| 81 |
+
"id": "groceries-142",
|
| 82 |
+
"verdict": "require_approval",
|
| 83 |
+
"recheck_valid": true,
|
| 84 |
+
"receipt_status": "failed",
|
| 85 |
+
"non_authoritative": true,
|
| 86 |
+
"deterministic_repeat": true,
|
| 87 |
+
"route_substitution_rejected": true
|
| 88 |
+
},
|
| 89 |
+
{
|
| 90 |
+
"id": "recurring-999",
|
| 91 |
+
"verdict": "require_approval",
|
| 92 |
+
"recheck_valid": true,
|
| 93 |
+
"receipt_status": "failed",
|
| 94 |
+
"non_authoritative": true,
|
| 95 |
+
"deterministic_repeat": true,
|
| 96 |
+
"route_substitution_rejected": true
|
| 97 |
+
}
|
| 98 |
+
],
|
| 99 |
+
"scenario_count": 3,
|
| 100 |
+
"probe_count": 0,
|
| 101 |
+
"operations": [
|
| 102 |
+
"GET packs",
|
| 103 |
+
"GET packs/{id}",
|
| 104 |
+
"GET controls",
|
| 105 |
+
"GET controls/{id}",
|
| 106 |
+
"POST decide",
|
| 107 |
+
"POST recheck",
|
| 108 |
+
"POST receipts"
|
| 109 |
+
],
|
| 110 |
+
"external_actions_executed": false,
|
| 111 |
+
"receipts_stored": false
|
| 112 |
+
}
|
| 113 |
+
},
|
| 114 |
+
{
|
| 115 |
+
"domain": "smb",
|
| 116 |
+
"release_id": "v0.1.1",
|
| 117 |
+
"catalog_digest": "sha256:07e00e11176752146d402c31269d3c89dbe1f8ae200c98a91f7e4f34f7888322",
|
| 118 |
+
"scenarios": [
|
| 119 |
+
{
|
| 120 |
+
"scenario_id": "draft",
|
| 121 |
+
"intent_digest": "sha256:c97b00a3ce7f1e71a27f90bab783f4490f1fe09286f137abaa5cf2cf2882b64d",
|
| 122 |
+
"pack_catalog_id": "smb.sales.controls:sales-baseline@0.1.0",
|
| 123 |
+
"verdict": "allow",
|
| 124 |
+
"route_kind": "continue",
|
| 125 |
+
"route_id": "continue-draft",
|
| 126 |
+
"recheck_valid": true,
|
| 127 |
+
"changed_recheck_valid": null,
|
| 128 |
+
"receipt_status": "failed",
|
| 129 |
+
"missing_evidence_count": 0,
|
| 130 |
+
"verified_evidence_count": 0,
|
| 131 |
+
"assessment_basis": "caller_report_only",
|
| 132 |
+
"stored": false,
|
| 133 |
+
"durable": false,
|
| 134 |
+
"route_substitution_rejected": true
|
| 135 |
+
},
|
| 136 |
+
{
|
| 137 |
+
"scenario_id": "discount-8",
|
| 138 |
+
"intent_digest": "sha256:be0d497159b6110a72d0a6bea0c2db21f82202f40e6217ef586ae1f51bbac7d0",
|
| 139 |
+
"pack_catalog_id": "smb.sales.controls:sales-baseline@0.1.0",
|
| 140 |
+
"verdict": "allow_with_conditions",
|
| 141 |
+
"route_kind": "continue",
|
| 142 |
+
"route_id": "continue-within-limit",
|
| 143 |
+
"recheck_valid": true,
|
| 144 |
+
"changed_recheck_valid": null,
|
| 145 |
+
"receipt_status": "failed",
|
| 146 |
+
"missing_evidence_count": 0,
|
| 147 |
+
"verified_evidence_count": 0,
|
| 148 |
+
"assessment_basis": "caller_report_only",
|
| 149 |
+
"stored": false,
|
| 150 |
+
"durable": false,
|
| 151 |
+
"route_substitution_rejected": true
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"scenario_id": "discount-15",
|
| 155 |
+
"intent_digest": "sha256:ec4f4dee20b67ee8dd0b264dcbf60f185eda92d48fa48bbf2ed54f0ff090e5d4",
|
| 156 |
+
"pack_catalog_id": "smb.sales.controls:sales-baseline@0.1.0",
|
| 157 |
+
"verdict": "require_approval",
|
| 158 |
+
"route_kind": "continue",
|
| 159 |
+
"route_id": "continue",
|
| 160 |
+
"recheck_valid": true,
|
| 161 |
+
"changed_recheck_valid": null,
|
| 162 |
+
"receipt_status": "failed",
|
| 163 |
+
"missing_evidence_count": 0,
|
| 164 |
+
"verified_evidence_count": 0,
|
| 165 |
+
"assessment_basis": "caller_report_only",
|
| 166 |
+
"stored": false,
|
| 167 |
+
"durable": false,
|
| 168 |
+
"route_substitution_rejected": true
|
| 169 |
+
},
|
| 170 |
+
{
|
| 171 |
+
"scenario_id": "smb-discount-15-direct-self-approval",
|
| 172 |
+
"intent_digest": "sha256:c28c5920136a243b8256f8baaa59709217a8f7043e95dcec06013aaee3d1bf1a",
|
| 173 |
+
"pack_catalog_id": "smb.sales.controls:sales-baseline@0.1.0",
|
| 174 |
+
"verdict": "block",
|
| 175 |
+
"route_kind": "block",
|
| 176 |
+
"route_id": "fail-closed-block",
|
| 177 |
+
"recheck_valid": true,
|
| 178 |
+
"changed_recheck_valid": null,
|
| 179 |
+
"receipt_status": "failed",
|
| 180 |
+
"missing_evidence_count": 0,
|
| 181 |
+
"verified_evidence_count": 0,
|
| 182 |
+
"assessment_basis": "caller_report_only",
|
| 183 |
+
"stored": false,
|
| 184 |
+
"durable": false,
|
| 185 |
+
"route_substitution_rejected": true
|
| 186 |
+
}
|
| 187 |
+
],
|
| 188 |
+
"machine_summary": {
|
| 189 |
+
"status": "ok",
|
| 190 |
+
"scope": "local_reference_examples",
|
| 191 |
+
"domain": "smb",
|
| 192 |
+
"release_id": "v0.1.1",
|
| 193 |
+
"catalog_digest": "sha256:07e00e11176752146d402c31269d3c89dbe1f8ae200c98a91f7e4f34f7888322",
|
| 194 |
+
"observed": [
|
| 195 |
+
{
|
| 196 |
+
"id": "draft",
|
| 197 |
+
"verdict": "allow",
|
| 198 |
+
"recheck_valid": true,
|
| 199 |
+
"receipt_status": "failed",
|
| 200 |
+
"non_authoritative": true,
|
| 201 |
+
"deterministic_repeat": true,
|
| 202 |
+
"route_substitution_rejected": true
|
| 203 |
+
},
|
| 204 |
+
{
|
| 205 |
+
"id": "discount-8",
|
| 206 |
+
"verdict": "allow_with_conditions",
|
| 207 |
+
"recheck_valid": true,
|
| 208 |
+
"receipt_status": "failed",
|
| 209 |
+
"non_authoritative": true,
|
| 210 |
+
"deterministic_repeat": true,
|
| 211 |
+
"route_substitution_rejected": true
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"id": "discount-15",
|
| 215 |
+
"verdict": "require_approval",
|
| 216 |
+
"recheck_valid": true,
|
| 217 |
+
"receipt_status": "failed",
|
| 218 |
+
"non_authoritative": true,
|
| 219 |
+
"deterministic_repeat": true,
|
| 220 |
+
"route_substitution_rejected": true
|
| 221 |
+
},
|
| 222 |
+
{
|
| 223 |
+
"id": "smb-discount-15-direct-self-approval",
|
| 224 |
+
"verdict": "block",
|
| 225 |
+
"recheck_valid": true,
|
| 226 |
+
"receipt_status": "failed",
|
| 227 |
+
"non_authoritative": true,
|
| 228 |
+
"deterministic_repeat": true,
|
| 229 |
+
"route_substitution_rejected": true
|
| 230 |
+
}
|
| 231 |
+
],
|
| 232 |
+
"scenario_count": 4,
|
| 233 |
+
"probe_count": 0,
|
| 234 |
+
"operations": [
|
| 235 |
+
"GET packs",
|
| 236 |
+
"GET packs/{id}",
|
| 237 |
+
"GET controls",
|
| 238 |
+
"GET controls/{id}",
|
| 239 |
+
"POST decide",
|
| 240 |
+
"POST recheck",
|
| 241 |
+
"POST receipts"
|
| 242 |
+
],
|
| 243 |
+
"external_actions_executed": false,
|
| 244 |
+
"receipts_stored": false
|
| 245 |
+
}
|
| 246 |
+
}
|
| 247 |
+
]
|
| 248 |
+
}
|