1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# Features
What socialweb-computer supports today, how far each item is proven, and where it is documented. Releases at the
time of writing: socialweb-computer rc159 (`ec0f4849`) on the gateway, the ssh gateway and the bidders local, hat-9,
hat-7, and rc162 for the CLI (`run requester`, `install requester`, `run request`); page-rc143 on `shell.socialweb.computer`; atirc v0.1.0-5a8dfa2 on irc.fedfork.com.
Proof levels: **prod** = proven on the production gateway and bidders with real accounts; **local** = proven in a
market network of one host (`dev up`); **built** = in the code, not yet proven live.
## Infrastructure as code
| Feature | How | Proven | Docs |
| --- | --- | --- | --- |
| `Infra` / `EphemeralInfra` objects: VMs, Deno sandboxes, agent VMs in one file | `kubectl apply -f examples/infra/*.yaml` | prod (page, CLI), local | [quickstart-local.md](quickstart-local.md), [quickstart-prod.md](quickstart-prod.md) |
| `EphemeralInfra` lifetime: `ttlSeconds`, `endWhen: Deadline` or `Complete` | Complete ends in the pass that sees every contract Released or Failed | local | [acceptance/0012](acceptance/0012-infra-quickstart.md) |
| Infra records in the user's repo, never deleted (`endedAt`, successor rkeys) | `computer.socialweb.infra` / `ephemeralInfra` | prod | [protocol/infra.md](protocol/infra.md) |
| Long-lived requester in the foreground | `run requester --name <n>`: own kcp, port 0, `ready.json` with kcpUrl + kubeconfig | prod (alice, OAuth QR, acceptance 0013 A) | [quickstart-prod.md](quickstart-prod.md) section 7 |
| Requester as a systemd unit of its own account | `install requester` (account created or adopted, `socialweb.slice`, upgrade, uninstall) | prod (0013 B, rc160 CLI): install, `run requester signin`, contract, ssh as the account, restart keeps Held, uninstall --purge | quickstart-prod.md 7a |
| Requester under an account that already runs a core | `kubectl apply -f examples/infra/requester-hostprocess.yaml` | local | quickstart-prod.md 7b |
| Restart keeps the DID, the vault and every Held contract | resume waits for its policy engine, then runs the policy | local + prod (rc158) | [acceptance/0013](acceptance/0013-mixed-prod.md) |
| Tenant k8s cluster from the requester | `run requester --with-gateway`, `run requester cluster`, `kubeconfig`; nodes rented by the same requester | prod: node on a remote bidder (hat-7) fetches meshd from the public bucket, pod runs, scale to zero (0013 C) | quickstart-prod.md section 8 |
| Tenant k8s cluster from the hosted gateway | `k8s.socialweb.computer`: createCluster, getKubeconfig, NodeClaim to rented node, scale to zero | prod | [acceptance/0001](acceptance/0001-auth-modes.md) |
## Compute
| Feature | Proven | Notes |
| --- | --- | --- |
| Firecracker VM per contract, cloud-init `user_data` from the RFP | prod | one VM per host on demand, released on request or ttl |
| Deno sandbox contracts (`computeKind: deno`) | prod (local bidder opted in: CLI 0013 and the page) | `dev up --compute-kinds vm,deno`, `install bidder --compute-kinds vm,deno`, `run bidder --compute-kinds` |
| Guest transports: iroh (default), ssh over WebRTC, opentunnel https, wootty web shell | prod | STUN `stun.cloudflare.com` only, no TURN |
| Guest fence: no TCP to the LAN or the host, only declared host ports | prod | `lanUDP` / `hostUDP` per bidder |
| Secrets: getSecrets by workload identity, sealed fallback on demand | prod | bundle in the requester's OpenBao |
| Bidder-side termination of a VM (ops) | prod | [acceptance/0007](acceptance/0007-bidder-termination.md) |
## Agents (atirc)
| Feature | Proven | Notes |
| --- | --- | --- |
| atirc agent in a rented VM (`spec.agent`, `guest.agentStart`) | prod (CLI, page, ssh gateway) | leased mint after the receipt; revoked before `vm.terminated` |
| Agent placeholder bundle for kubectl-applied contracts | local, prod (page) | no `bao` step needed |
| Agent identity: OAuth (QR / browser) | prod | |
| Agent identity: app password (`pdsAccount`) | prod (rc161 CLI, hat.dplc.rip on pds.rip: Held, JOIN, revoke before release) | market calls and the mint signed through the owner MarketIdentity; `ATPROTO_PASSWORD` goes to the requester's own OpenBao before sign-in |
| Agent identity: local PDS (`localRepo`) | built | needs did:plc on plc.directory, a public PDS ingress and a handle you control; `.local` is refused before the RFP |
| `ssh <handle>@socialweb.computer atirc agent run <name>` | prod | per-user OAuth; the VM is rented as the ssh user |
| Guest requester R2 with a contract-scoped association, nested VM, grandchild agent, cascading release | prod | [acceptance/0005](acceptance/0005-guest-requester-association.md) |
## Market, identity and policy
| Feature | Proven | Notes |
| --- | --- | --- |
| RFP, bid, accept, receipt, events over XRPC submit* and relay / Jetstream | prod | [protocol/market.md](protocol/market.md) |
| Default policies always run: `requester-tangled-vouch`, `bidder-tangled-vouch` | prod, local | `open` only when the user names it; dev networks compose both vouch directions |
| Vouch records through an OAuth requester (optional scope) | built | old sessions stay Ready with a scope-upgrade prompt |
| Operator vouch from an installed bidder (`--bidder-operator-signin`) | local | QR page carries the vouch scope since 2026-11-01 |
| Stable rkeys, single getRecord reads | prod | no listRecords on hot paths |
| Per-user OAuth ssh gateway on port 22 | prod | [acceptance/0002](acceptance/0002-ssh-gateway.md) |
## Browser page (shell.socialweb.computer)
Real kcp and the socialweb control plane compiled to js/wasm, running in the tab as a requester. Release page-rc143.
| Feature | Proven |
| --- | --- |
| Sign in with any atproto account (OAuth, PAR, PKCE, DPoP) | prod |
| Snapshot hibernation: reload restores in about 3 s, also while a VM is Held | prod |
| Request VM button, ssh over WebRTC from the page terminal, Agent button, Release | prod |
| `kubectl apply` of Infra / EphemeralInfra in the page terminal (heredoc); the page adds the ssh key, the ssh tunnel and the agent bundle | prod |
| Policy in a fenced sandbox on every bid | prod |
| `/chat` web chat | prod |
| Deno sandbox contracts from the page terminal, on a bidder that opts in (`install bidder --compute-kinds vm,deno`, pinned with `bidderDids`) | prod (mixed.yaml, stdout `quickstart-deno-ok on linux/x86_64`) |
Not yet: release by deleting the EphemeralInfra (use `kubectl patch ... state Released`);
reading repo files from the page terminal (paste them). Acceptance: [acceptance/0009](acceptance/0009-browser-page.md).
## atirc (irc.fedfork.com)
- Transports: IRC (SASL PLAIN), XRPC `chat.atirc.subscribe` over websocket (CBOR or `?format=json`) and over iroh
- Tokens: service-auth JWTs and long tokens; mint equal-or-below your own handle; 11 scopes per NSID; revoke by the
parent; contract leases (receipt + termination) that latch dead
- Presence: join and leave events carry an RFC3339 `ts` and `by: client|server`
- Web chat `/chat`, owner questions (`ask`, `answer`, `decide`, owner mode)
- `atirc agent run`, and `atirc send` / `atirc recv` byte pipes (the receiver's child token is revoked when it ends)
- Protocol and acceptance live in the atirc repo (`docs/protocol/atirc.md`, `docs/acceptance/0001-atirc.md`)
## iOS app
The embedded requester (`pkg/embedded`) runs in the app on its own in-process kcp. Last proven on the simulator on
2026-10-31 ([acceptance/0010](acceptance/0010-ios-app.md)); not re-run on rc158/rc159.
## Acceptance status (2026-11-01, rc158 / rc159)
| Runbook | Result | Release |
| --- | --- | --- |
| [0001](acceptance/0001-auth-modes.md) account modes, pause, one VM per host, tenant k3s | pass | rc159 |
| [0002](acceptance/0002-ssh-gateway.md) ssh gateway, per-user OAuth | pass | rc158 |
| [0003](acceptance/0003-cli-webrtc-ssh.md) CLI ssh over WebRTC, every host | pass | rc158 |
| [0004](acceptance/0004-vm-atirc-agent.md) atirc agent in a VM | pass | rc158 |
| [0005](acceptance/0005-guest-requester-association.md) guest requester R2, nested VM, cascade | pass | rc159 |
| [0006](acceptance/0006-rollout-compat.md) rollout checks, compat smoke | pass | rc158 |
| [0007](acceptance/0007-bidder-termination.md) bidder-side termination | pass | rc158 |
| [0008](acceptance/0008-host-observer.md) host observers | pass | rc158 |
| [0009](acceptance/0009-browser-page.md) browser page A1-A7, deno from the page | pass | page-rc143 |
| [0010](acceptance/0010-ios-app.md) iOS app | not run (no iOS client session); last pass simulator 2026-10-31 | - |
| [0011](acceptance/0011-atirc.md) atirc | pass | v0.1.0-5a8dfa2 |
| [0012](acceptance/0012-infra-quickstart.md) Infra quickstart, every example | pass (own network) | main ec97f78e |
| [0013](acceptance/0013-mixed-prod.md) mixed prod: A run requester, B install requester, C gateway in the requester | pass (A, C on rc159; B on the rc160 CLI) | rc159 / rc160 |
## Known limits
- `run request release` on an invocation that already settled waits 3 min and exits 1 instead of reporting it is done
- a tenant-cluster node's cloud-init fetches `get.k3s.io` from the internet (not pinned)
- `dev down` can warn that the MarketNetwork was not gone within 2 min; it still finishes clean
- `units roll kcp` cannot roll an installed requester's kcp yet (a drifted kcp rolls when the core starts)
- an atirc agent from a local PDS (`localRepo` on plc.directory with a public handle) is built but not yet proven against irc.fedfork.com