scroll # The Silent Panic — How Inbound FederationCame Back *A scroll on a task that diedwithout a sound, and the maze walked to findit.* ## The symptom Federation looked dead.`△ mesh fed verify` showed the firehosesequence frozen at **1**. Posts made onBluesky from a linked account never appearedon hex.hexcraft.dev. The inbound cursor —the `bsky-cursor` Thing that remembers how farthe Jetstream subscriber has read — had notmoved in **weeks**. Zero posts ingested. Andthe strangest tell of all: the subscriber'slog was utterly silent. Not an error, not areconnect, not a heartbeat. Nothing. ## Themaze The truth hid behind four false floors,each convincing: 1. **"The firehose isdown."** No — *outbound* was merelyun-pushed. The firehose only advances on amanual `▲ mesh fed push`; nothingauto-emits. One push and 1034 records flowed,seq 1 → 2. That was a different door. 2.**"The subscriber is idle."** No — a runningsubscriber forces a reconnect every tenminutes and logs it. Twelve hours of totalsilence meant the task wasn't sleeping. It was*dead*. 3. **"Wrong account."** No —`hex.hexcraft.dev` resolved to exactly thewatched DID, and the test post sat plainly onthe repo. 4. **"A bad Jetstream instance."**Tempting — one of the four relay mirrorsgenuinely lagged the post in a spot check. Butthe Bluesky AppView had indexed the post in0.3 seconds, so the network *had* it. Theinstance was a red herring. ## The floorbeneath the floors The subscriber is a spawnedtask. On its very first connection it asks theTLS layer to build a client config — and theTLS layer, rustls, **panicked**: > *Could notautomatically determine the process-levelCryptoProvider from > Rustls crate features.*Two cryptographic providers — `ring` and`aws-lc-rs` — were both compiled into thebinary, one pulled by the websocket client,the other by the web server. With two presentand no tie-breaker, rustls refuses to guess.It panics. And because the subscriber livesinside a spawned task, that panic killed *onlythe task* — no crash, no log, no trace. Thedaemon walked on, whole, with one of itssenses quietly severed. That is why thesilence was so complete: a dead limb makes nosound. The reqwest-based pollers nevernoticed, because reqwest carries its ownprovider. Only the websocket subscriber leanedon the absent process default. ## The fix Oneline, at the very top of `main`, before anyconnection is dreamt of: > install the `ring`provider as the process default. A rebuild, arestart, and the subscriber connected — nopanic — replayed the cursor, and withinseconds the test post landed as a Thing. Thecount rose, the cursor began to track the liveedge, and a second post drifted in on its own.Posting on Bluesky now shows up onhex.hexcraft.dev. The loop is closed in bothdirections. ## The lesson A `tokio::spawn`task that panics dies alone and quietly. Whena background worker goes silent — no errors,no heartbeat, just absence — suspect apanicked task before a broken network. Andwhen two crypto providers share one binary,name the one you mean. Ambiguity, to rustls,is not a default. It is a fault.