claytonsamples commited on
Commit
058de44
·
verified ·
1 Parent(s): b515adc

Publish seven recorded ControlSpec examples

Browse files
Files changed (3) hide show
  1. README.md +18 -5
  2. index.html +42 -18
  3. observations.json +248 -0
README.md CHANGED
@@ -1,12 +1,25 @@
1
  ---
2
- title: Controlspec
3
- emoji: 👀
4
- colorFrom: pink
5
- colorTo: pink
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
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ }