The 2026-09-28 answers to OTF said bridge users "can reach the relay from anywhere". That was false: the bridge forwarded to relay:8080 in plain HTTP while the apps speak TLS through the tunnel, so no app session could complete. The upstream was fixed on 2026-10-07 and checked with one GET, and a GET is not a message.
This is the exchange behind the claim: two accounts, two devices, a sealed envelope from this engine, the recipient decrypting it, and every byte over obfs4 to a relay on the internet.
Run against the live bridge on 2026-10-14, relay1.flamenet.io through 135.148.121.177:8443:
ok the relay answers /health through the tunnel
ok the certificate is the relay's own (relay1.flamenet.io)
ok two accounts were created through the tunnel
ok both devices published their bundles
ok alice fetched bob's bundle
ok the bundle names a device
ok the envelope was deposited through the tunnel
ok bob's inbox answered through the tunnel
ok the envelope arrived
ok bob decrypted the exact plaintext alice sealed
10 passed, 0 failed
The edge access log carries the other half. ClientHost was the real client address for every request in the run, and the bridge's own 172.18.255.240 appeared as a client zero times, so the PROXY v1 line works and a ban or a rate limit lands on one bridged client rather than on all of them.
Not in npm test: it needs a live bridge and bridgeforward (merged as extant2000/flamenet-elligator2#4), so it skips when nothing is listening rather than failing about the environment. It creates accounts, so it points at a test relay by default.
Three things this cost, each a 400 or a 401 with no hint in it:
usernames are lowercase letters and digits only;
the proof-of-possession signature must come from the identity's own CryptoKey, because ikSig.privRaw is a 48-byte PKCS#8 blob and not the 32-byte seed a hand-rolled wrapper expects, and the wrong wrapper signs happily and verifies against nothing;
§8.2 wants to as an integer with a messages list, not a flat {to, device_id, payload}.
Gate: node test/conformance.mjs 304 passed, 0 failed, 2 skipped. The skip path was exercised too, with the port pointed somewhere empty.
The 2026-09-28 answers to OTF said bridge users "can reach the relay from anywhere". That was false: the bridge forwarded to `relay:8080` in plain HTTP while the apps speak TLS through the tunnel, so no app session could complete. The upstream was fixed on 2026-10-07 and checked with one GET, and a GET is not a message.
This is the exchange behind the claim: two accounts, two devices, a sealed envelope from this engine, the recipient decrypting it, and every byte over obfs4 to a relay on the internet.
Run against the live bridge on 2026-10-14, relay1.flamenet.io through `135.148.121.177:8443`:
```
ok the relay answers /health through the tunnel
ok the certificate is the relay's own (relay1.flamenet.io)
ok two accounts were created through the tunnel
ok both devices published their bundles
ok alice fetched bob's bundle
ok the bundle names a device
ok the envelope was deposited through the tunnel
ok bob's inbox answered through the tunnel
ok the envelope arrived
ok bob decrypted the exact plaintext alice sealed
10 passed, 0 failed
```
The edge access log carries the other half. `ClientHost` was the real client address for every request in the run, and the bridge's own `172.18.255.240` appeared as a client zero times, so the PROXY v1 line works and a ban or a rate limit lands on one bridged client rather than on all of them.
Not in `npm test`: it needs a live bridge and `bridgeforward` (merged as extant2000/flamenet-elligator2#4), so it skips when nothing is listening rather than failing about the environment. It creates accounts, so it points at a test relay by default.
Three things this cost, each a 400 or a 401 with no hint in it:
- usernames are lowercase letters and digits only;
- the proof-of-possession signature must come from the identity's own `CryptoKey`, because `ikSig.privRaw` is a 48-byte PKCS#8 blob and not the 32-byte seed a hand-rolled wrapper expects, and the wrong wrapper signs happily and verifies against nothing;
- §8.2 wants `to` as an integer with a `messages` list, not a flat `{to, device_id, payload}`.
Gate: `node test/conformance.mjs` 304 passed, 0 failed, 2 skipped. The skip path was exercised too, with the port pointed somewhere empty.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The 2026-09-28 answers to OTF said bridge users "can reach the relay
from anywhere". That was false: the bridge forwarded to relay:8080 in
plain HTTP while the apps speak TLS through the tunnel, so no app
session could complete. The upstream was fixed on 2026-10-07 and checked
with one GET, and a GET is not a message.
This is the exchange behind the claim. Two accounts, two devices, a
sealed envelope from this engine, the recipient decrypting it, and every
byte over obfs4 to a relay on the internet.
Run against the live bridge on 2026-10-14, relay1.flamenet.io through
135.148.121.177:8443, 10 passed and 0 failed, ending in "bob decrypted
the exact plaintext alice sealed".
The edge access log carries the other half: ClientHost was the real
client address for every request in the run, and the bridge's own
172.18.255.240 appeared as a client zero times. So the PROXY v1 line
works, and a ban or a rate limit lands on one bridged client rather
than on all of them at once.
Not in `npm test`: it needs a live bridge and the forwarder, so it skips
when nothing is listening on the local port rather than failing about
the environment. It also creates accounts, so it is pointed at a test
relay by default.
Three things this cost, each a 400 or a 401 with no hint in it:
usernames are lowercase letters and digits only; the proof-of-possession
signature must come from the identity's own CryptoKey, since `privRaw`
is a 48-byte PKCS#8 blob and not the 32-byte seed a hand-rolled wrapper
expects; and §8.2 wants `to` as an integer with a `messages` list, not a
flat payload.
The engine suite still passes: 304 passed, 0 failed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`const password = '...'` inside the account helper matched the sweep's
"assigned password" probe, which is the probe doing its job. Hoisted to
a module-level FIXTURE_PASSWORD with the `sweep:allow` annotation the
script documents, the same shape test/relay.mjs already uses.
Sweep clean across 86 files, and the proof still passes 10 of 10.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The 2026-09-28 answers to OTF said bridge users "can reach the relay from anywhere". That was false: the bridge forwarded to
relay:8080in plain HTTP while the apps speak TLS through the tunnel, so no app session could complete. The upstream was fixed on 2026-10-07 and checked with one GET, and a GET is not a message.This is the exchange behind the claim: two accounts, two devices, a sealed envelope from this engine, the recipient decrypting it, and every byte over obfs4 to a relay on the internet.
Run against the live bridge on 2026-10-14, relay1.flamenet.io through
135.148.121.177:8443:The edge access log carries the other half.
ClientHostwas the real client address for every request in the run, and the bridge's own172.18.255.240appeared as a client zero times, so the PROXY v1 line works and a ban or a rate limit lands on one bridged client rather than on all of them.Not in
npm test: it needs a live bridge andbridgeforward(merged as extant2000/flamenet-elligator2#4), so it skips when nothing is listening rather than failing about the environment. It creates accounts, so it points at a test relay by default.Three things this cost, each a 400 or a 401 with no hint in it:
CryptoKey, becauseikSig.privRawis a 48-byte PKCS#8 blob and not the 32-byte seed a hand-rolled wrapper expects, and the wrong wrapper signs happily and verifies against nothing;toas an integer with amessageslist, not a flat{to, device_id, payload}.Gate:
node test/conformance.mjs304 passed, 0 failed, 2 skipped. The skip path was exercised too, with the port pointed somewhere empty.🤖 Generated with Claude Code