Demo: the firm's book
Northwind shares part of its book with a member under a role — she administers it at her own authority, and only while she is a member.
Northwind shares part of its book with Alice under a role. She administers it at her own authority, and only for as long as she is a member.
Left screen — Terminal, ~/uma4agents
Right screen — her portal and the firm's console, portal.uma.lab and
org-console.uma.lab
Pre-demo setup
From cold to ready. Four commands on a Mac, two in a Codespace, about 20 minutes.
1 · Once per machine. Points your OS resolver at the lab's DNS so
*.uma.lab works in a browser. One sudo. Skip both in a Codespace — it uses
/etc/hosts instead.
brew install kind helm
make dns-setup2 · Build the lab. Three-node kind cluster, Istio ambient, kgateway,
cert-manager, CloudNativePG, and every party in its own namespace. ~13 minutes
cold. If the compose stack is running it will stop you — both want :443 and
:53, so run make down and try again.
make kind-up3 · Trust the CA. cert-manager issues the lab CA inside the cluster; this
trusts it locally so the portals load with no warning. Re-run after every
kind-up — a new cluster means a new CA. In a Codespace run
make codespaces-web instead.
make k8s-trust-ca
sudo security add-trusted-cert -d -r trustRoot \
-k /Library/Keychains/System.keychain /tmp/u4a-k8s-ca.pem4 · Bring up the agent. kagent's controller, the U4A adapter in Bob's namespace, and a model for the agent to think with. Your key goes into a Kubernetes Secret and nowhere else.
export ANTHROPIC_API_KEY=sk-ant-...
make kagentOpen her portal at https://portal.uma.lab (alice / alice-demo) and the
administrator's console at https://org-console.uma.lab (dana /
dana-demo).
In a Codespace. Only steps 2 and 4. No resolver to edit, no CA to trust —
kind-up publishes the portal for you. To republish it later:
make codespaces-webRunning it again. Rewinds her ledger; her membership is what step 1 re-establishes.
make k8s-resetSwitching the model
Another provider key:
export OPENAI_API_KEY=sk-...
make kagent MODEL=openaiAnother model:
ANTHROPIC_MODEL=claude-sonnet-5 make kagent
OPENAI_MODEL=gpt-4o make kagent MODEL=openaiA model in the cluster instead:
make kagent MODEL=ollamaThe run-through
Her portal and the firm's console, side by side. Step 1 is what brings the resource into existence, so it cannot be skipped or pre-baked.
0 · Terminal. Show the whole lab first. northwind is the firm: an
authority and a console of its own, in its own namespace. It is not above her
authority in alice — by the end you will have shown that it cannot answer for
her.
make k8s-status1 · Her portal — Agent Access → Organization. Alice joins Northwind, and has to agree to do it. The preview shows what the role would give her and what the firm would require. Her authority refuses a join without the tick and records what she agreed to, because this changes the bargain rather than a setting.
Enrolment code: NW-7K2F-QX2 · Her portal — the same page. Joining grants something. The firm's book is now in her authority, marked shared. It was not there a minute ago. She administers it; she does not own it — and her portal says which, because the difference decides what happens when she leaves.
3 · Terminal. Point an agent at the firm's book. That resource did not exist until step 1. Its published metadata names her authority, not Northwind's: the firm holds the book and enforces the charter, and still cannot answer a request about it.
make kagent RESOURCE=shared4 · Terminal — shared · analyst role. It stops — and it stops at her portal. A request about the firm's asset, waiting on a member's decision, at the member's own authorization server.
make kagent-ask RESOURCE=shared Q="What is in the firm's book?" SIM=05 · Her portal — Approve. Held for her. She allows it: NWCF, NWEQ, TLT, VNQ. The firm's book — not her portfolio. Her own account was never in scope for this agent, and the role is what drew that line.
6 · The console — Groups · Charter → Rules. The charter's two halves, on two pages. Groups is what a member gets and agrees to; saving one publishes a charter version, because it changes the bargain. Charter → Rules is what the firm enforces operationally, in Rego, and it can only refuse or interrupt — never grant, and never answer for her. The test for which page a rule belongs on: would a member have to agree to it again?
7 · Her portal — Organization → Leave. Taken back. Run step 4 again: refused, and the resource is gone. Leaving takes back exactly what joining gave, and nothing of hers goes with it — her own account, her tiers and her ledger are untouched. What the firm shared was never hers to keep, which is the whole difference between a resource of hers and a resource of theirs.