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
6 changes: 6 additions & 0 deletions docs/surfaces/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ nothing about the system; it is a mood board, **disqualified** from documenting
An instrument that can lie is worse than none — the same reason the Life-Mirror surface
flags a never-fired tripwire as SUSPECT.

## Live-feed wiring
The Tier-2 surfaces are **wired to a live feed**: each reads `./data/<name>.json`
(or `window.SURFACE_FEED_URL`) at load, falls back to an embedded seed, and shows a
**LIVE / SAMPLE** badge — an instrument that declares its own provenance. Regenerate a
feed from real state with `tools/build_surface_feed.py`; see `data/README.md`.

## Three tiers
| Tier | What | Medium | Reads |
|---|---|---|---|
Expand Down
17 changes: 13 additions & 4 deletions docs/surfaces/b11-life-mirror.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
header.top{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:4px}
.top h1{font-size:19px;margin:0;font-weight:680;letter-spacing:.3px}
.top .id{font-family:var(--mono);color:var(--cyan);font-size:13px}
.prov{font-family:var(--mono);font-size:9.5px;font-weight:700;letter-spacing:.5px;padding:2px 7px;border-radius:5px;border:1px solid var(--line2);color:var(--muted)}
.prov.sample{color:var(--watchful);border-color:color-mix(in srgb,var(--watchful) 42%,transparent);background:color-mix(in srgb,var(--watchful) 12%,transparent)}
.prov.live{color:var(--normal);border-color:color-mix(in srgb,var(--normal) 42%,transparent);background:color-mix(in srgb,var(--normal) 12%,transparent)}
.tgl{margin-left:auto;background:none;border:1px solid var(--line2);border-radius:7px;width:32px;height:32px;color:var(--muted);cursor:pointer}
.sub{color:var(--muted);margin:0 0 20px;max-width:74ch}
/* state banner */
Expand Down Expand Up @@ -101,7 +104,7 @@

<div class="wrap">
<header class="top">
<h1>Life-Mirror Automaton</h1><span class="id">B₁₁ · surface_map</span>
<h1>Life-Mirror Automaton</h1><span class="id">B₁₁ · surface_map</span><span class="prov" id="prov" title="data provenance"></span>
<button class="tgl" id="tgl" aria-label="Toggle theme">◑</button>
</header>
<p class="sub">The twin mirrors the live system across the four spaces. Deviation drives the automaton <b>NORMAL → WATCHFUL → SAFE-HALT</b>; every transition is receipted and shows its warrant. This is a <i>witness surface</i> — it reads guardrail-fabric decisions, consent-plane state, and netwatch tripwires. It renders the real state or it renders nothing.</p>
Expand Down Expand Up @@ -165,24 +168,28 @@ <h2>Recent transitions <span class="n">receipted</span></h2>
</div>

<script>
const WORLDS=[
let WORLDS=[
{g:'א',c:'--atzilut',nm:'Atzilut',sub:'emanation · kernel / source',st:'sealed',cls:'ok'},
{g:'ב',c:'--beriah',nm:'Beriah',sub:'creation · system-space',st:'nominal',cls:'ok'},
{g:'י',c:'--yetzirah',nm:'Yetzirah',sub:'formation · user-space',st:'nominal',cls:'ok'},
{g:'ה',c:'--assiah',nm:'Assiah',sub:'action · agent + twin-bridge',st:'watching',cls:'watch'},
];
const TRIPS=[
let TRIPS=[
{name:'consent.denied-rate',pct:14,fired:'last fired 3h ago',never:false},
{name:'twin.divergence',pct:8,fired:'last fired 2d ago',never:false},
{name:'exfil.fanout',pct:2,fired:'never fired',never:true},
];
const LOG=[
let LOG=[
{t:'12:04:11',g:'w',m:'NORMAL → WATCHFUL',why:'consent.denied-rate crossed soft threshold (agent egress attempts)',seal:'sha256:ca43bf38…'},
{t:'12:05:02',g:'n',m:'WATCHFUL → NORMAL',why:'rate settled; netwatch throttled pid:1234; no owner action needed',seal:'sha256:9f7712ac…'},
{t:'09:20:44',g:'w',m:'NORMAL → WATCHFUL',why:'twin.divergence 4.1% after staged update A→B (verify pending)',seal:'sha256:2b384a17…'},
{t:'09:22:10',g:'n',m:'WATCHFUL → NORMAL',why:'verify passed, owner QR-consent committed generation',seal:'sha256:db6f9677…'},
];
const el=id=>document.getElementById(id);
let __prov='sample';
async function loadFeed(name){try{const base=(window.SURFACE_FEED_URL||'./data/');const r=await fetch(base+name+'.json',{cache:'no-store'});if(!r.ok)throw 0;const j=await r.json();__prov=j.provenance||'live';return j;}catch(e){__prov='sample';return null;}}
function setProv(){const b=el('prov');if(b){b.textContent=(__prov==='live'?'LIVE':'SAMPLE DATA');b.className='prov '+(__prov==='live'?'live':'sample');}}
function renderAll(){
el('worlds').innerHTML=WORLDS.map(w=>`<div class="world">
<span class="glyph" style="background:var(${w.c})">${w.g}</span>
<div class="nm">${w.nm}<small>${w.sub}</small></div>
Expand All @@ -193,5 +200,7 @@ <h2>Recent transitions <span class="n">receipted</span></h2>
<div class="seg"><span>soft</span><span>hard</span><span>trip</span></div></div>`}).join('');
el('log').innerHTML=LOG.map(l=>`<div class="le"><span class="t">${l.t}</span><span class="g ${l.g}"></span>
<div><span class="m">${l.m}</span><div class="why">${l.why}</div><div class="seal">${l.seal}</div></div></div>`).join('');
}
el('tgl').onclick=()=>{const r=document.documentElement;const cur=r.getAttribute('data-theme')||(matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light');r.setAttribute('data-theme',cur==='dark'?'light':'dark');};
(async()=>{const f=await loadFeed('b11');if(f){if(Array.isArray(f.spaces))WORLDS=f.spaces;if(Array.isArray(f.tripwires))TRIPS=f.tripwires;if(Array.isArray(f.transitions))LOG=f.transitions;if(f.state)el('stateV').textContent=f.state;}setProv();renderAll();})();
</script>
21 changes: 21 additions & 0 deletions docs/surfaces/data/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Surface feeds — wiring surfaces to live state

Each Tier-2 surface reads `./data/<name>.json` at load (or `window.SURFACE_FEED_URL`
if the shell injects a live endpoint), falls back to its embedded seed if the fetch
fails, and shows a **LIVE / SAMPLE** badge so it never lies about what it's displaying.

| Surface | feed | required keys |
|---|---|---|
| `b11-life-mirror.html` | `b11.json` | `spaces`, `tripwires`, `transitions` (+ `state`) |
| `e11-consent-receipts.html` | `e11.json` | `surfaces`, `receipts`, `governor` |
| `turn-witness.html` | `turn-witness.json` | `turns` |

## Regenerate from real state
```
python3 tools/build_surface_feed.py --surface e11 --input <runtime-payload>.json # → provenance=live
python3 tools/build_surface_feed.py --surface b11 # re-stamp sample
```
The runtime producer (netwatch snapshot, consent-plane catalog, receipt stream,
App-Intents parser) writes the payload; `build_surface_feed.py` validates the shape,
stamps `provenance` + `generated_at`, and emits the feed. Until a live endpoint is
wired, the committed `*.json` are seeds (`provenance: "sample"`) and the badge says so.
91 changes: 91 additions & 0 deletions docs/surfaces/data/b11.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
{
"provenance": "sample",
"generated_at": "2026-08-03T08:55:40Z",
"source": "sample seed (netwatch snapshot + guardrail-fabric transitions)",
"state": "NORMAL",
"divergence": "0.4% / 5% trip",
"spaces": [
{
"g": "א",
"c": "--atzilut",
"nm": "Atzilut",
"sub": "emanation · kernel / source",
"st": "sealed",
"cls": "ok"
},
{
"g": "ב",
"c": "--beriah",
"nm": "Beriah",
"sub": "creation · system-space",
"st": "nominal",
"cls": "ok"
},
{
"g": "י",
"c": "--yetzirah",
"nm": "Yetzirah",
"sub": "formation · user-space",
"st": "nominal",
"cls": "ok"
},
{
"g": "ה",
"c": "--assiah",
"nm": "Assiah",
"sub": "action · agent + twin-bridge",
"st": "watching",
"cls": "watch"
}
],
"tripwires": [
{
"name": "consent.denied-rate",
"pct": 14,
"fired": "last fired 3h ago",
"never": false
},
{
"name": "twin.divergence",
"pct": 8,
"fired": "last fired 2d ago",
"never": false
},
{
"name": "exfil.fanout",
"pct": 2,
"fired": "never fired",
"never": true
}
],
"transitions": [
{
"t": "12:04:11",
"g": "w",
"m": "NORMAL → WATCHFUL",
"why": "consent.denied-rate crossed soft threshold (agent egress attempts)",
"seal": "sha256:ca43bf38…"
},
{
"t": "12:05:02",
"g": "n",
"m": "WATCHFUL → NORMAL",
"why": "rate settled; netwatch throttled pid:1234; no owner action needed",
"seal": "sha256:9f7712ac…"
},
{
"t": "09:20:44",
"g": "w",
"m": "NORMAL → WATCHFUL",
"why": "twin.divergence 4.1% after staged update A→B (verify pending)",
"seal": "sha256:2b384a17…"
},
{
"t": "09:22:10",
"g": "n",
"m": "WATCHFUL → NORMAL",
"why": "verify passed, owner QR-consent committed generation",
"seal": "sha256:db6f9677…"
}
]
}
23 changes: 23 additions & 0 deletions docs/surfaces/data/e11.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"provenance": "sample",
"generated_at": "2026-08-03T00:00:00Z",
"source": "sample seed — replace via tools/build_surface_feed.py --e11-catalog <spaces_v1.yaml>",
"surfaces": [
{"name":"goose-notes","surface":"notes","space":"user-space","allow":["discover","implement"],"deny":["egress","operate"],"posture":"ask","pk":"per-purpose · personal documents"},
{"name":"BearBrowser","surface":"browser","space":"agent-space","allow":["discover","egress"],"deny":["implement","operate"],"posture":"deny","pk":"untrusted input · agent-space only"},
{"name":"TurtleTerm","surface":"terminal","space":"user-space","allow":["discover","implement","verify"],"deny":["egress","operate"],"posture":"allow","pk":"agent denied egress/operate"},
{"name":"netwatch","surface":"cluster-operator","space":"system-space","allow":["discover","operate"],"deny":[],"posture":"ask","pk":"operate → Governor approval"},
{"name":"Noetica concierge","surface":"cockpit","space":"user-space","allow":["discover","administer"],"deny":["operate"],"posture":"ask","pk":"voice · every act receipted"}
],
"receipts": [
{"t":"12:04:11","g":"escalate","v":"escalate","act":"net.block suspicious.example","why":"netwatch: agent egress on system-space → Governor approval required","seal":"sha256:ca43bf38…"},
{"t":"12:03:52","g":"deny","v":"deny","act":"external-send (notes agent)","why":"surface 'notes' denies purpose 'egress' (envelope) — refused fail-closed","seal":"sha256:9f7712ac…"},
{"t":"12:01:30","g":"allow","v":"allow","act":"source-mutate README.md","why":"implementer · terminal · user-space · admissible","seal":"sha256:2b384a17…"},
{"t":"11:58:04","g":"deny","v":"deny","act":"browser agent → implement","why":"prompt-injection containment: browser surface denies implement","seal":"sha256:6076fa86…"},
{"t":"11:55:19","g":"allow","v":"allow","act":"data-namespace read (tenant=acme, region=EU)","why":"tenant + region tolerations present (Art 6/7 + Ch. V)","seal":"sha256:db6f9677…"}
],
"governor": [
{"cap":"net.block","target":"suspicious.example","tier":"medium","rz":"netwatch flagged beaconing to this host from process curl#100; blocking is reversible but touches the firewall."},
{"cap":"net.throttle","target":"pid:1234","tier":"high","rz":"Egress fan-out to 14 external hosts — possible exfil. Throttling a running process is production-impacting; needs explicit approval + evidence."}
]
}
36 changes: 36 additions & 0 deletions docs/surfaces/data/turn-witness.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"provenance": "sample",
"generated_at": "2026-08-03T00:00:00Z",
"source": "sample seed — replace via tools/build_surface_feed.py --turns <parsed-turns.json>",
"turns": [
{ "id":"turn:8f2a", "user":"show me all contact lists in my org",
"sys":"3 contact lists in org SocioProphet — Sales, Investors, Partners",
"tokens":[
{"w":"show","g":"VB·ROOT","ann":[["ActionShow","intent"]]},
{"w":"me","g":"PRP·iobj","ann":[["ActionShow","intent"]]},
{"w":"all","g":"DT·det","ann":[]},
{"w":"contact","g":"NN·nn","ann":[["ContactLists","intent"]]},
{"w":"lists","g":"NNS·dobj","ann":[["ContactLists","intent"],["Lists","type"]]},
{"w":"in","g":"IN·prep","ann":[["Contains","relation"]]},
{"w":"my","g":"PRP$·poss","ann":[["Own","scope"]]},
{"w":"org","g":"NN·pobj","ann":[["Organization","entity"]]}
], "purpose":"discover", "space":"user-space", "admissible":true },
{ "id":"turn:1c7e", "user":"open terminal on my laptop",
"sys":"awaiting consent to launch TurtleTerm (user-space)",
"tokens":[
{"w":"open","g":"VB·ROOT","ann":[["ActionLaunch","intent"]]},
{"w":"terminal","g":"NN·dobj","ann":[["TurtleTerm","intent"],["App","type"]]},
{"w":"on","g":"IN·prep","ann":[["OnDevice","relation"]]},
{"w":"my","g":"PRP$·poss","ann":[["Own","scope"]]},
{"w":"laptop","g":"NN·pobj","ann":[["Device","entity"]]}
], "purpose":"operate", "space":"user-space", "admissible":"consent" },
{ "id":"turn:a903", "user":"delete last week's logs",
"sys":"refused — routed to Governor (tier=high)",
"tokens":[
{"w":"delete","g":"VB·ROOT","ann":[["ActionDelete","intent"],["Destructive","type"]]},
{"w":"last","g":"JJ·amod","ann":[["TimeWindow","scope"]]},
{"w":"week's","g":"NN·poss","ann":[["TimeWindow","scope"]]},
{"w":"logs","g":"NNS·dobj","ann":[["LogData","entity"],["Data","type"]]}
], "purpose":"operate·destructive", "space":"system-space", "admissible":false }
]
}
19 changes: 14 additions & 5 deletions docs/surfaces/e11-consent-receipts.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
.top h1{font-size:19px;margin:0;font-weight:680;letter-spacing:.2px}
.sub{color:var(--muted);margin:0 0 20px;font-size:13px;max-width:70ch}
.tgl{margin-left:auto;background:none;border:1px solid var(--line2);border-radius:7px;width:32px;height:32px;color:var(--muted)}
.prov{font-family:var(--mono);font-size:9.5px;font-weight:700;letter-spacing:.5px;padding:2px 7px;border-radius:5px;border:1px solid var(--line2);color:var(--muted)}
.prov.sample{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 42%,transparent);background:color-mix(in srgb,var(--warn) 12%,transparent)}
.prov.live{color:var(--ok);border-color:color-mix(in srgb,var(--ok) 42%,transparent);background:color-mix(in srgb,var(--ok) 12%,transparent)}
.grid{display:grid;grid-template-columns:1fr 340px;gap:16px}
@media (max-width:880px){.grid{grid-template-columns:1fr}}
.card{background:var(--panel);border:1px solid var(--line);border-radius:11px;overflow:hidden}
Expand Down Expand Up @@ -75,7 +78,7 @@

<div class="wrap">
<header class="top">
<span class="dot"></span><h1>Consent &amp; Receipts Center</h1>
<span class="dot"></span><h1>Consent &amp; Receipts Center</h1><span class="prov" id="prov" title="data provenance"></span>
<button class="tgl" id="tgl" title="Toggle theme" aria-label="Toggle theme">◑</button>
</header>
<p class="sub">macOS shows you a checkbox per app. SourceOS shows you <b>which purpose</b> each app (and each agent) may act under, on which surface and space — and keeps a <b>hash-sealed receipt of every action</b> with the reason it was allowed, denied, or escalated. This is the E11 surface: privacy you can read, not just toggle.</p>
Expand Down Expand Up @@ -121,24 +124,28 @@ <h2>Data residency <span class="n">GDPR Ch. V</span></h2>

<script>
const PURPOSES=['discover','implement','verify','ship','operate','egress','administer'];
const APPS=[
let APPS=[
{name:'goose-notes',surface:'notes',space:'user-space',allow:['discover','implement'],deny:['egress','operate'],posture:'ask',pk:'per-purpose · personal documents'},
{name:'BearBrowser',surface:'browser',space:'agent-space',allow:['discover','egress'],deny:['implement','operate'],posture:'deny',pk:'untrusted input · agent-space only'},
{name:'TurtleTerm',surface:'terminal',space:'user-space',allow:['discover','implement','verify'],deny:['egress','operate'],posture:'allow',pk:'agent denied egress/operate'},
{name:'netwatch',surface:'cluster-operator',space:'system-space',allow:['discover','operate'],deny:[],posture:'ask',pk:'operate → Governor approval'},
{name:'Noetica concierge',surface:'cockpit',space:'user-space',allow:['discover','administer'],deny:['operate'],posture:'ask',pk:'voice · every act receipted'},
];
const RECEIPTS=[
let RECEIPTS=[
{t:'12:04:11',g:'escalate',v:'escalate',act:'net.block suspicious.example',why:'netwatch: agent egress on system-space → Governor approval required',seal:'sha256:ca43bf38…'},
{t:'12:03:52',g:'deny',v:'deny',act:'external-send (notes agent)',why:"surface 'notes' denies purpose 'egress' (envelope) — refused fail-closed",seal:'sha256:9f7712ac…'},
{t:'12:01:30',g:'allow',v:'allow',act:'source-mutate README.md',why:'implementer · terminal · user-space · admissible',seal:'sha256:2b384a17…'},
{t:'11:58:04',g:'deny',v:'deny',act:'browser agent → implement',why:'prompt-injection containment: browser surface denies implement',seal:'sha256:6076fa86…'},
{t:'11:55:19',g:'allow',v:'allow',act:'data-namespace read (tenant=acme, region=EU)',why:'tenant + region tolerations present (Art 6/7 + Ch. V)',seal:'sha256:db6f9677…'},
];
const GOV=[
let GOV=[
{cap:'net.block',target:'suspicious.example',tier:'medium',rz:'netwatch flagged beaconing to this host from process curl#100; blocking is reversible but touches the firewall.'},
{cap:'net.throttle',target:'pid:1234',tier:'high',rz:'Egress fan-out to 14 external hosts — possible exfil. Throttling a running process is production-impacting; needs explicit approval + evidence.'},
];
let __prov='sample';
async function loadFeed(name){try{const base=(window.SURFACE_FEED_URL||'./data/');const r=await fetch(base+name+'.json',{cache:'no-store'});if(!r.ok)throw 0;const j=await r.json();__prov=j.provenance||'live';return j;}catch(e){__prov='sample';return null;}}
function setProv(){const b=document.getElementById('prov');if(b){b.textContent=(__prov==='live'?'LIVE':'SAMPLE DATA');b.className='prov '+(__prov==='live'?'live':'sample');}}
function renderAll(){
document.getElementById('legend').innerHTML=PURPOSES.map(p=>`<span class="chip${(p==='egress'||p==='operate')?' deny':''}">${p}</span>`).join('')+'<span class="chip deny">✕ = denied on a contained surface</span>';
document.getElementById('surfN').textContent=APPS.length+' surfaces';
document.getElementById('apps').innerHTML=APPS.map(a=>`<div class="app">
Expand All @@ -150,11 +157,13 @@ <h2>Data residency <span class="n">GDPR Ch. V</span></h2>
<div><span class="act">${r.act}</span><span class="verdict ${r.v}">${r.v}</span>
<div class="why">${r.why}</div><div class="seal">${r.seal}</div></div></div>`).join('');
document.getElementById('govN').textContent=GOV.length+' pending';
renderGov();
}
function renderGov(){document.getElementById('gov').innerHTML=GOV.map((g,i)=>`<div class="gov">
<div class="h"><span class="cap">${g.cap} → ${g.target}</span><span class="tier ${g.tier}">${g.tier}</span></div>
<div class="rz">${g.rz}</div>
<div class="btns"><button class="btn approve" onclick="decide(${i},'allow')">Approve</button><button class="btn deny" onclick="decide(${i},'deny')">Deny</button><button class="btn">Evidence</button></div></div>`).join('')||'<div style="padding:14px 15px;color:var(--faint);font-size:12.5px">Queue clear — no actions awaiting approval.</div>';}
function decide(i,d){GOV.splice(i,1);document.getElementById('govN').textContent=GOV.length+' pending';renderGov();}
renderGov();
document.getElementById('tgl').onclick=()=>{const r=document.documentElement;const d=(r.getAttribute('data-theme')||(matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light'))==='dark'?'light':'dark';r.setAttribute('data-theme',d);};
(async()=>{const f=await loadFeed('e11');if(f){if(Array.isArray(f.surfaces))APPS=f.surfaces;if(Array.isArray(f.receipts))RECEIPTS=f.receipts;if(Array.isArray(f.governor))GOV=f.governor;}setProv();renderAll();})();
</script>
Loading
Loading