Source
This app’s code and revision history are public. Download a copy or explore the files below.
Public
The app’s code and revision history are public.
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone c7891873549c9ca1004894b3
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
policy-tests/draw.json
{
"version": "1",
"name": "only the API draws; Santas, wish lists and anonymous questions (written by the API)",
"actors": {
"Org": "org_user",
"Sam": "sam_user",
"Eve": "eve_user",
"Api": "api_principal"
},
"constants": {
"BOUNDED_PUBLIC_PRINCIPAL_API": "api_principal"
},
"steps": [
{
"op": "setTime",
"epoch": 1800000000
},
{
"op": "as",
"who": "Org"
},
{
"op": "setMany",
"writes": [
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa",
"data": {
"name": "Family",
"budget": "$25",
"date": "2026-12-18",
"notes": "",
"allowJoin": true,
"organizerSees": false,
"revealAt": 0,
"status": "open",
"round": 0,
"drawnAt": 0,
"createdBy": "$Org",
"createdAt": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/joins/org_user",
"data": {
"at": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/owners/org_user",
"data": {
"at": 1800000000
}
},
{
"path": "exchangekeys/exaaaaaaaaaaaaaaaaaa",
"data": {
"key": "kexkexkexkexkexkexkexkex"
}
},
{
"path": "keepapart/exaaaaaaaaaaaaaaaaaa",
"data": {
"pairs": "[]"
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/people/pann",
"data": {
"name": "Ann",
"addedBy": "$Org",
"self": false,
"createdAt": 1800000000
}
},
{
"path": "personkeys/pann",
"data": {
"key": "kannkannkannkannkannkann",
"exchangeId": "exaaaaaaaaaaaaaaaaaa"
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/people/pben",
"data": {
"name": "Ben",
"addedBy": "$Org",
"self": false,
"createdAt": 1800000000
}
},
{
"path": "personkeys/pben",
"data": {
"key": "kbenkbenkbenkbenkbenkben",
"exchangeId": "exaaaaaaaaaaaaaaaaaa"
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/people/pcat",
"data": {
"name": "Cat",
"addedBy": "$Org",
"self": false,
"createdAt": 1800000000
}
},
{
"path": "personkeys/pcat",
"data": {
"key": "kcatkcatkcatkcatkcatkcat",
"exchangeId": "exaaaaaaaaaaaaaaaaaa"
}
},
{
"path": "personclaims/pann/c/org_user",
"data": {
"key": "kannkannkannkannkannkann",
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"openId": "pann_org_user"
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/opens/pann_org_user",
"data": {
"pid": "pann",
"by": "org_user",
"via": "web",
"at": 1800000000
}
}
]
},
{
"op": "setMany",
"shouldFail": true,
"writes": [
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa",
"data": {
"status": "drawn",
"round": 1,
"drawnAt": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pann",
"data": {
"to": "pben",
"round": 1,
"at": 1800000000
}
}
]
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pann",
"data": {
"to": "pben",
"round": 0,
"at": 1800000000
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/wishes/pann",
"data": {
"text": "Socks, a good book",
"at": 1800000000
}
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/wishes/pben",
"data": {
"text": "I want everything",
"at": 1800000000
},
"shouldFail": true
},
{
"op": "as",
"who": "Api"
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/joins/api_principal",
"data": {
"at": 1800000000
}
},
{
"op": "setMany",
"writes": [
{
"path": "exchangeclaims/exaaaaaaaaaaaaaaaaaa/c/api_principal",
"data": {
"key": "kexkexkexkexkexkexkexkex"
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/owners/api_principal",
"data": {
"at": 1800000000
}
}
]
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pann",
"data": {
"to": "pben",
"round": 0,
"at": 1800000000
},
"shouldFail": true
},
{
"op": "setMany",
"shouldFail": true,
"writes": [
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa",
"data": {
"status": "drawn",
"round": 1,
"drawnAt": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pann",
"data": {
"to": "pann",
"round": 1,
"at": 1800000000
}
}
]
},
{
"op": "setMany",
"shouldFail": true,
"writes": [
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa",
"data": {
"status": "drawn",
"round": 1,
"drawnAt": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pann",
"data": {
"to": "nobody",
"round": 1,
"at": 1800000000
}
}
]
},
{
"op": "setMany",
"shouldFail": true,
"writes": [
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa",
"data": {
"status": "drawn",
"round": 1,
"drawnAt": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pann",
"data": {
"to": "pben",
"round": 2,
"at": 1800000000
}
}
]
},
{
"op": "setMany",
"writes": [
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa",
"data": {
"status": "drawn",
"round": 1,
"drawnAt": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pann",
"data": {
"to": "pben",
"round": 1,
"at": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pben",
"data": {
"to": "pcat",
"round": 1,
"at": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pcat",
"data": {
"to": "pann",
"round": 1,
"at": 1800000000
}
}
]
},
{
"op": "as",
"who": "Org"
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pcat/s/org_user",
"data": {
"from": "pann",
"round": 1
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pben/s/org_user",
"data": {
"from": "pben",
"round": 1
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pben/s/org_user",
"data": {
"from": "pann",
"round": 0
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pben/s/org_user",
"data": {
"from": "pann",
"round": 1
}
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1",
"data": {
"text": "Do you like jazz?",
"answer": "",
"round": 1,
"askedAt": 1800000000,
"answeredAt": 0
},
"shouldFail": true
},
{
"op": "set",
"path": "askrequests/q1",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pben",
"text": "Do you like jazz?",
"round": 1
}
},
{
"op": "set",
"path": "askrequests/q2",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pben",
"text": "",
"round": 1
},
"shouldFail": true
},
{
"op": "set",
"path": "askrequests/q4",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pcat",
"text": "Who are you?",
"round": 1
},
"shouldFail": true
},
{
"op": "set",
"path": "askrequests/q3",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pben",
"text": "Pre-answered?",
"round": 1
}
},
{
"op": "set",
"path": "askrequests/q3",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pben",
"text": "Changed",
"round": 1
},
"shouldFail": true
},
{
"op": "as",
"who": "Api"
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q9",
"data": {
"text": "No request",
"answer": "",
"round": 1,
"askedAt": 1800000000,
"answeredAt": 0
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1",
"data": {
"text": "Something else",
"answer": "",
"round": 1,
"askedAt": 1800000000,
"answeredAt": 0
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pcat/q/q1",
"data": {
"text": "Do you like jazz?",
"answer": "",
"round": 1,
"askedAt": 1800000000,
"answeredAt": 0
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q3",
"data": {
"text": "Pre-answered?",
"answer": "yes",
"round": 1,
"askedAt": 1800000000,
"answeredAt": 0
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1",
"data": {
"text": "Do you like jazz?",
"answer": "",
"round": 1,
"askedAt": 1800000000,
"answeredAt": 0
}
},
{
"op": "expect",
"expr": "get(/exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1).text == 'Do you like jazz?' && get(/exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1).answer == '' && get(/exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1)._createdBy == 'api_principal'"
},
{
"op": "as",
"who": "Org"
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1",
"data": {
"answer": "Answering my own question"
},
"shouldFail": true
},
{
"op": "as",
"who": "Sam"
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/joins/sam_user",
"data": {
"at": 1800000000
}
},
{
"op": "setMany",
"writes": [
{
"path": "personclaims/pben/c/sam_user",
"data": {
"key": "kbenkbenkbenkbenkbenkben",
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"openId": "pben_sam_user"
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/opens/pben_sam_user",
"data": {
"pid": "pben",
"by": "sam_user",
"via": "web",
"at": 1800000000
}
}
]
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/wishes/pben",
"data": {
"text": "Jazz records",
"at": 1800000000
}
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1",
"data": {
"answer": "Yes, Coltrane",
"answeredAt": 1800000000
}
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1",
"data": {
"text": "Changed question"
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pcat/s/sam_user",
"data": {
"from": "pben",
"round": 1
}
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pcat/s/org_user",
"data": {
"from": "pben",
"round": 1
},
"shouldFail": true
},
{
"op": "as",
"who": "Eve"
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/joins/eve_user",
"data": {
"at": 1800000000
}
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/wishes/pben",
"data": {
"text": "spam",
"at": 1800000000
},
"shouldFail": true
},
{
"op": "set",
"path": "askrequests/q5",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pben",
"text": "spam",
"round": 1
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pben/s/eve_user",
"data": {
"from": "pann",
"round": 1
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q1",
"data": {
"answer": "hijacked"
},
"shouldFail": true
},
{
"op": "as",
"who": "Org"
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa",
"data": {
"status": "open"
}
},
{
"op": "set",
"path": "askrequests/q6",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pben",
"text": "Still there?",
"round": 1
},
"shouldFail": true
},
{
"op": "as",
"who": "Api"
},
{
"op": "setMany",
"writes": [
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa",
"data": {
"status": "drawn",
"round": 2,
"drawnAt": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pann",
"data": {
"to": "pcat",
"round": 2,
"at": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pben",
"data": {
"to": "pann",
"round": 2,
"at": 1800000000
}
},
{
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/matches/pcat",
"data": {
"to": "pben",
"round": 2,
"at": 1800000000
}
}
]
},
{
"op": "as",
"who": "Org"
},
{
"op": "set",
"path": "askrequests/q7",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pben",
"text": "Still there?",
"round": 2
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pben/s/org_user",
"data": {
"from": "pann",
"round": 2
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/santas/pcat/s/org_user",
"data": {
"from": "pann",
"round": 2
}
},
{
"op": "set",
"path": "askrequests/q8",
"data": {
"exchangeId": "exaaaaaaaaaaaaaaaaaa",
"to": "pcat",
"text": "Tea or coffee?",
"round": 2
}
},
{
"op": "as",
"who": "Api"
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q3",
"data": {
"text": "Pre-answered?",
"answer": "",
"round": 1,
"askedAt": 1800000000,
"answeredAt": 0
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pben/q/q3",
"data": {
"text": "Pre-answered?",
"answer": "",
"round": 2,
"askedAt": 1800000000,
"answeredAt": 0
},
"shouldFail": true
},
{
"op": "set",
"path": "exchanges/exaaaaaaaaaaaaaaaaaa/asks/pcat/q/q8",
"data": {
"text": "Tea or coffee?",
"answer": "",
"round": 2,
"askedAt": 1800000000,
"answeredAt": 0
}
}
]
}
Change history
Point OpenApps links to openapps.free
Bind agent address in policy constants
Use functions.openapps.xyz alias, add OpenApp contribution strip
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync