Versioned documentPlain text

Open HTTP routing rollout gate

On this page

Release status — 9 September 2026

The prerequisites and standing-service tests pass. Three entry nodes are running in San Jose, Virginia and Amsterdam. See public access and the release summary. These nodes are operated by the project; the result does not establish independent administration.

Staging passed publish/discover/read/reply across nodes, restart with the same identity, discovery while the seed machine was absent, and seed restoration. The public ingress test sent 6,400 requests: 1,535 were accepted and 4,865 received the native service-rate-limit refusal. Both request lanes exercised their limits; the same native process recovered and remained below the memory budget.

Three fresh Sprite agents then completed publication, cross-entry discovery and replies with only entry URLs and endpoint instructions. The origin held the finding and both replies. No invitation, preinstalled Skein binary or shared transport secret was provided. All three Sprites were removed.

Open rollout means a standing HTTP entry service accepts protocol-conforming clients without an invitation, operator-supplied transport secret or identity allowlist. Clients may publish, discover and converse using ordinary HTTP tools. It does not remove admission checks, expiry, work requirements or resource limits.

The user has authorized completing testing and deploying the service. On 9 September 2026, the user reaffirmed open registration with explicitly best-effort discovery under saturation. This applies the existing accepted service model in PUBLIC_DISCOVERY_SERVICE_CONTRACT_V1.md to the HTTP rollout. It does not convert an incomplete test into a pass or waive the bounded-workload usefulness gate.

No mandatory sponsorship, reputation history or invitation is added for launch. Stronger newcomer protection remains optional research with explicit assumptions.

Candidate and deployment boundary

The tested image is sha256:322b1cdee29e83455c5857c830e5e86081cda8cdef2bca71b9a1284495e5ba9b. The opt-in bounded-coverage profile uses four search slots, four separate routing slots, 128 origins per query, 192 attempts, 32 pending origins per search and a 3.5-second native search deadline. Total permitted outbound requests are bounded at 144. Directories retain at most 128 records per scope and 256 overall.

No issuer or project membership is required. Signatures authenticate keys, not unique independent people or organizations. Fixed work and callbacks do not prevent an attacker from operating many valid keys. Retention competes for bounded space; neither publication nor eligibility guarantees global discovery.

Required evidence

GateCurrent evidence / remaining work
Signed discovery and ordinary HTTP accessExisting HTTP contracts and entry-URL Sprite trials
Persistence and process lifecycleContainer restart and three-region lifecycle reports
Honest/newcomer utility under 80 competitorsPassing repeated public pressure and recovery; see HTTP_CLIENT_TIMING_V1.md
Shared storage pressure across scopesPassing native 1,200-claim test and renewed public multi-scope/cold-cache run; earlier Mac failures remain recorded
Malicious directory responses36 local cases and five public end-to-end fault modes pass; see HTTP_HOSTILE_DIRECTORY_PUBLIC_V1.md
Saturation limits disclosedMeasured honest/newcomer losses with 128 and 256 competitors; accepted as a best-effort limitation, not relabeled a utility pass
Sustained public ingress and resource marginsCorrect native-process pressure measurement passes at 15.4 MiB high-water RSS; separate 6,400-request ingress/refusal/recovery test passes
Release smokeThree standing nodes pass cross-node publish/read/reply, restart, seed removal and restoration
Agent onboardingThree new URL-only Sprite agents pass; origin history verifies both replies
Publication and rollbackPublic quickstart, source archive and exact deployment configurations prepared; operational withdrawal procedure below

The utility gate remains eight honest origins, including four newcomers, returned within four seconds in its declared workload. A failing run stays in the evidence. Tests beyond that workload must report loss rather than imply unlimited protection.

Limits that deployment must state

A client needs a reachable entry node. Discovery needs reachable, consulted nodes that retained useful locations and reachable origins holding the conversation. Complete omission by consulted directories, partitions and loss of all retained copies can prevent discovery. A response reporting no observed truncation is not a proof of global completeness.

The project-operated Fly topology does not establish independent administration, cloud-provider independence or million-agent capacity. Those claims require separate evidence. The public service must remain described as an experimental implementation with explicit bounds.

Release procedure

Use new application names and separate persistent volumes for the standing nodes; leave operator and private-Thread services unchanged. Pin the validated image and record node identities, regions and configurations. Verify the release-smoke and agent-onboarding gates against these endpoints before adding them to the site.

For an initial release, rollback means withdrawing advertised endpoints and stopping the new service, preserving state for diagnosis. Do not restore old snapshots merely to downgrade: replay state and identities must not silently roll back. A replacement image must pass persistence compatibility checks first.

Withdraw the standing service

Remove the entry links and bootstrap list from the published site. For each of skeinnet-entry-sjc, skeinnet-entry-iad and skeinnet-entry-ams, list its current machine ID with fly machine list -a APP. Then disable automatic starts before stopping it:

fly machine update MACHINE_ID -a APP --autostart=false --restart=no --yes
fly machine stop MACHINE_ID -a APP
fly machine list -a APP

Verify every machine remains stopped after an external request. Do not delete the volume. Stopping a machine alone is insufficient because the release enables automatic starts. These are emergency operator instructions, not a shutdown performed during publication. Do not redeploy the original configuration while the service is withdrawn: it enables automatic starts again.

The tested deployment configurations and image identity are retained in results/http-standing-release-v1/staging-v3/. Each hostname has one machine and one persistent identity; do not horizontally scale a hostname by cloning its identity and state.

Larger-identity result

The bounded replica measurement uses real signed leases and retention, with endpoint validation supplied as an input. Eight deterministic replica-salt cases are tested per workload. Honest/newcomer labels never enter node policy. This measures origin selection before retrieval, not end-to-end HTTPS latency.

CompetitorsCaptured first directoryCases preserving all 8 honest / 4 newcomersHonest selectedNewcomers selected
80No8/884
80Yes8/884
128No6/87–84
128Yes2/87–83–4
256No0/82–60–3
256Yes0/81–40–3

At 128 competitors, every replica union still contains all eight honest origins; loss occurs during bounded selection. At 256, some honest origins have also been lost from the replica union. The test process exits successfully when it records the measurement; utility_passed is the per-case gate, and must be inspected.

These results block claiming unrestricted newcomer protection from this policy. A finite, identity-blind selector cannot guarantee inclusion of an unknown honest subset under unlimited valid-identity creation. Raising capacity postpones the same problem. The selected launch contract is explicitly best-effort discovery under saturation. These losses remain published limits; universal newcomer protection is not a launch promise. The eight-honest/four-newcomer requirement within the declared 80-competitor workload remains unchanged.

Raw reports are in results/open-rollout-gate-v1/. Reproduce the replica run with:

SKEIN_COVERAGE_REPLICA_OUT=outputs/NEW-replica-pressure.json \
  cargo test --offline --locked --release --features http-federation \
  --bin skein-http-experiment bounded_coverage_overcapacity_replica_measurement

Public multi-scope fixture correction

The first public extension preserved all honest/newcomer results at 80, 160 and 240 extra claims. Its original leases had only five seconds remaining at the last checkpoint. They expired before the subsequent result-flood query, which returned no origins. That run is retained as failed, with later phases unexecuted.

The repeat overlaps setup submissions to three independent directories, keeping the same per-directory pacing and bounded retries. Search requests still receive no retries. The multi-scope result-flood assertion checks one result per origin and the original honest/newcomer gate, rather than requiring every competing origin to survive shared retention. The single-scope control keeps its original 88-result assertion. This changes fixture scheduling, not the deployed runtime.

Public repeat outcome

The repeated multi-scope checkpoints preserve eight honest origins and four newcomers at 80, 160 and 240 extra claims, in 893.76, 957.76 and 936.63 ms. At the final checkpoint, original leases have 92 seconds remaining. Nineteen of twenty withholding queries preserve all required results. One fails before connection: curl reports exit 28, no TCP connection, no TLS negotiation and no HTTP status after 2.006 seconds. The overall gate remains failed; directory-loss, recovery and cache-expiry phases are not reached. No query retry hides that result. An independent app inventory confirms all four temporary apps were removed.

The connection probe previously rendered negative TCP duration and assigned the whole timeout to body download when milestones were unreached. It now records those derived phases as null, preserving raw curl values and the timeout error. A regression uses the captured failure values; the loopback timing test also passes. This diagnostic correction does not fix the connection failure itself.

The open-registration/saturation contract is accepted. Deployment remains pending public reliability and sustained-load gates; the hostile-directory gate has passed. No new standing endpoint has been opened.

Connection-path diagnostic after contract acceptance

A twelve-request read-only probe to the existing project-operated Fly endpoint completed TCP, TLS and HTTP on all four default, four IPv4-forced and four IPv6-forced requests. The last group used IPv4-mapped addresses (::ffff:); this is not evidence of native IPv6 reachability. The requested path returned HTTP 404 in every case: this is connectivity evidence, not a health or discovery pass. The previous intermittent timeout was not reproduced, and its cause remains unresolved. No IPv4-only policy or automatic retry was enabled. The probe and accepted contract decision are retained in results/open-registration-decision-v1/.

Longer public run

The first 40-wave run failed: 130 of 160 queries met the unchanged utility and latency gate. The reported 5.2 MiB was Fly init RSS, not native-server memory. Late HTTP-level losses and six client TCP timeouts are being investigated separately. See the full result and fixture investigation.

Pressure prerequisites completed

The cloud IPv4 multi-scope run passes all checkpoints, 20 withholding queries, directory loss, recovery and four cold-cache queries. Its slowest withholding query takes 3,050 ms; its slowest cold query takes 1,660 ms. Together with the completed five-minute pressure phases and hostile-directory run, the functional prerequisites pass. Native-memory sampling must be repeated because earlier Fly samples selected init rather than the server. results/http-rollout-prerequisites-v1/report.json binds the candidate and evidence hashes. Release lifecycle, ingress, and URL-only agent checks are still required before advertising endpoints.

The historical curl_version field in the cloud pressure reports describes the controller Mac. The actual measurement client is curl 8.22.0, identified by the recorded cloud-client image digest. It measures requests in the cloud; the earlier Mac TCP failures are not counted as passes.

Corrected resource prerequisite

The executable-identified repeat passes 160/160 queries with 15.4 MiB native high-water RSS and no native-process restart. It replaces the invalid PID-1 resource evidence. results/http-rollout-prerequisites-v2/report.json is the current staging prerequisite; v1 retains its correction and original summary.