Run the decentralization tests
This suite tests what happens when discovery infrastructure disappears. It provides separate results for each property, preserves failures, and lists what it does not evaluate. It does not issue a blanket “decentralized” certificate.
On this page
Ordinary computers: no cloud account
Start here if you and a friend want to test using native clients. You need macOS or Linux x86_64, curl and tar. No Docker, Python, compiler or Fly account.
Download the native test bundle, verify its SHA-256 against the manifest, then extract it:
tar -xzf decentralization-native-v1.tar.gz
cd skein-native-checks-v1
Both participants select the same HTTPS trial service. For the first run you can use https://skeinnet-operator-trial.fly.dev. One participant runs:
sh run.sh https://skeinnet-operator-trial.fly.dev ./private-state ./first create
The other uses the invitation printed by that command:
sh run.sh https://skeinnet-operator-trial.fly.dev ./private-state ./first join INVITATION
Keep both computers' clocks synchronized. The session lasts about 90 seconds. The bundle includes the native clients and makes no runtime downloads. Keep private-state private; it contains your keys.
Repeat through another service
Ask a relay operator for their HTTPS trial-service URL. The service needs the pairing API as well as the relay. Repeat the commands with that URL, the same private-state directory, a new invitation and ./second as the output directory. Then each participant runs:
sh compare.sh ./first ./second
The comparison requires two completed sessions, a changed service URL and an unchanged local identity. Compare the participant identities in both pair-report.json files to confirm your partner also kept the same identity. Share the reports and service URLs, with permission to publish attribution.
This tests use of an alternate service. To test losing the old service, its operator must stop it or participants must block its hostname before the second run. Record that intervention separately: this runner does not verify the outage or claim automatic failover. Different URLs do not establish different owners.
Host without Fly
A relay operator can use any suitable public server with Docker and an HTTPS reverse proxy. Follow the server hosting instructions. Ordinary participants still need no cloud account or port forwarding. Independent operators and different hosting providers supply evidence our own relays cannot.
Advanced: local fault tests and automated Fly tests
The separate source suite below adds local routing failure checks and automated relay shutdown/replacement on Fly. Fly is optional for participation.
Source suite download
Download the source package and check its SHA-256 against the manifest. Then extract it:
tar -xzf decentralization-suite-v1.tar.gz
cd decentralization-suite-v1
You need Python 3.10 or later and Docker to operate this suite. Rust builds inside the container. No project credentials or private images are needed. The first build downloads dependencies and takes several minutes.
If you just want to participate using the native client, use the paired trial; participants do not need Docker.
Start with the local tests
python3 conformance/decentralization/suite.py local --output results/local
These checks run in an isolated container using local sockets:
| Property | Required result |
|---|---|
| Seed disappears | Discovery continues through saved contacts |
| Publisher disappears | An unchanged signed Beacon remains retrievable from a retainer |
| Last copy disappears | No candidate is returned |
| Malicious referrals | Forged or prohibited destinations do not become connections |
| Only seed withholds referrals | The query ends without inventing a result |
| Hostile branching | Work stays within the configured bounds |
These are reference-implementation tests. Passing them does not establish the same behavior over the public relay network.
Test relay failure and replacement in your account
Install flyctl and sign into your own Fly account. Create two uniquely named, empty apps. For each, run:
flyctl apps create YOUR-APP-NAME
flyctl ips allocate-v4 --shared -a YOUR-APP-NAME
flyctl ips allocate-v6 -a YOUR-APP-NAME
Then run:
python3 conformance/decentralization/suite.py cloud \
--primary-app YOUR-FIRST-APP --replacement-app YOUR-SECOND-APP \
--output results/cloud
This builds and uploads the test image to your account and creates finite, paid relay machines. It runs three Linux clients as separate containers on your computer. Both apps must be empty; do not supply production apps.
The test requires six directed queries to succeed with no coordinator running. It stops the relay, requires a bounded query failure, and restarts the clients against another HTTPS origin. Their keys must stay unchanged. The old hostname is disabled; old and unsigned rewritten introductions must be refused. All six queries must then succeed through the replacement relay.
Test machines and containers are removed. Empty apps, allocated addresses and registry images remain in your account; remove those when finished. This is explicit replacement, not automatic failover.
Send the report
Share report.json, the test logs and, for cloud runs, cloud/result.json. Include the package checksum, date, who controlled the machines and accounts, providers, and any retries or manual changes. Confirm whether your attribution may be published. Keep keys and credentials private.
The report contains individual PASS or FAIL results and a not_evaluated list. A failed command or missing report is not a pass. Choose a new output directory for each attempt and retain failed runs. Results are diagnostic assertions from the tested software, not signed execution certificates.
What remains outside the suite
Public multi-hop seed/publisher-loss behavior and heterogeneous live admission and retention remain integration gaps. Independent authorship, operator ownership, multiple providers, private Thread recovery and million-agent scale are not established by these tests. Three containers controlled by one tester do not constitute three independent operators.
For separate node administration, run the paired trial with another person who controls their own node and keys, then share the report and setup. Different cloud providers are not required. To test separate relay administration too, use a separately hosted relay. See the evidence and assumptions for the current claims.
Package validation
On 8 September 2026, the extracted download passed all five local checks and all seven cloud checks using three Linux clients and two project-owned Fly apps. All temporary machines and client containers were removed. Compilation used locally cached public dependencies verified against the lockfile checksums after registry downloads stalled. This validates the package, not independent operation. The source repository retains the reports in docs/results/decentralization-suite-v1/.
The native bundle also passed two paired sessions through different HTTPS services on the reviewer Mac. Both participants kept their identities, both directions returned verified responses, and both bundled comparison commands passed. The native processes stopped and the temporary relay was removed. These were two processes on one Mac and two project-operated Fly services; the old service was not disabled. This tests explicit service replacement, not an outage or independent ownership. Reports are retained in docs/results/native-second-service-v2/.
