This is an engineering assessment as of 2026-07-17. It complements the architecture overview: the overview explains the intended system, while this page distinguishes implemented foundations from integration work and assigns tests to the repository that owns each failure.
The stack has the essential building blocks for permissionless identity, authenticated connectivity, reliable streams, decentralized real-time events, verified storage and content routing, viewer-local social policy, and permissionless settlement. Decentralized compute is not required to make those capabilities useful. If it becomes useful, it can be introduced later as a metered service route rather than inserted into every layer.
The principal risk is now integration complexity, not a missing universal protocol. The architecture stays tractable when it enforces four rules:
- One repository owns each wire contract and its resource bounds.
- Capability cores do not depend on product repositories or the stack lab.
- Products remain standalone and retain their application-owned outbound links when same-host peers appear or disappear.
- A shared abstraction should delete more policy and failure modes than it adds; similar-looking code is not enough reason to merge semantics.
The economic loop is less mature than the protocol loop. The stack lab composes Cashu service credit, receipts, a real local CDK mint, an offline failure, payer replacement, exact-token replay, double-spend rejection, and settlement recovery across operating-system processes. Paid forwarding and paid storage still need product-specific gates that bind an authenticated service effect to the receipt and receiver acknowledgement before they should be described as a deployed market.
flowchart TB
Nostr["Nostr identity and signed events"]
Fips["FIPS\nauthenticated datagrams"]
Tcp["fips-tcp\nreliable streams"]
Pubsub["nostr-pubsub\nreal-time events"]
Tree["Hashtree\nverified content and HTL routing"]
Graph["nostr-social-graph\nfacts and local policy"]
Cashu["cashu-service\ncredit and settlement"]
Adapters["thin integration adapters"]
Products["Chat · Drive · VPN · Git · other apps"]
Lab["iris-stack-lab\nblack-box released-product tests"]
Nostr --> Fips
Nostr --> Pubsub
Nostr --> Graph
Fips --> Tcp
Fips --> Adapters
Tcp --> Adapters
Pubsub --> Adapters
Tree --> Adapters
Graph --> Adapters
Cashu --> Adapters
Adapters --> Products
Products --> Lab
Optional adapters may join capabilities; they must not invert the arrows. In
particular, nostr-pubsub announces events and content references but is not a
blob-routing layer. FIPS transports authenticated traffic but does not own
Hashtree HTL or settlement policy.
| Area | Evidence as of 2026-07-17 | Remaining integration risk |
|---|---|---|
| FIPS | Rust 0.4.6 and TypeScript runtime 0.0.26 provide authenticated links, fixed loopback UDP rendezvous, capability exchange, routing, and multiple carriers. The same-host identity hint is proved by the ordinary authenticated handshake. The cross-language Chromium matrix passed 16/16 plus five sequential replacement-page repetitions against native 0.4.5. | Continue cross-carrier churn, bounded-admission, and mobile lifecycle gates. A local peer must never become a mandatory daemon or implicit egress owner. |
fips-tcp |
Rust crates 0.2.0 provide reliable ordered streams over FIPS and cross-language wire fixtures. | Reset, retransmission, acknowledgment, backpressure, and long loss/reordering simulations belong here. Application record delivery is a separate semantic layer. |
nostr-pubsub |
Core 0.1.11 and FIPS adapter 0.3.1 share the standard REQ/EVENT/CLOSE service and have simulator, stress, role-blind discovery, and Cashu-incentive gates. |
Browser and native consumers must use the shared carrier instead of product-private endpoint namespaces. Offline history remains a storage concern. |
| Hashtree | Core 0.2.86, LMDB 0.2.85, network 0.2.87, FIPS transport 0.4.6, CLI 0.2.100, and embedded runtime 0.2.86 provide one adaptive read-only BlobRouter, a read-routed/write-explicit RoutedStore, and one application-owned adaptive PoolStore with bounded temperature balancing. Network 0.2.87 owns exactly one HTL decrement per Hashtree mesh forward; FIPS hops and terminal routes do not consume HTL. Legacy DataRequest framing, duplicate peer selection, WebRTC stubs, and mesh pubsub are removed; release binaries retain FIPS-owned WebRTC and prove it from each packaged artifact. Multiprocess crash/resize/pin/GC, bounded multi-terabyte metadata behavior, HTL, corruption, provider churn, and native product gates pass. |
Keep exercising multi-hop churn and bounded recovery through released artifacts. |
| Social graph and facts | Signed facts, graph traversal, social policy, UUID identity tools, exact fact lookup, and the nostr-identity 0.4.0 crate exist. |
Unify fact-name search and recovery UX; gate FIPS identity bindings and resource-policy inputs without creating a global reputation score. |
| Cashu service layer | Published cashu-service 0.3.1 owns bounded peer credit, useful-service receipts, Cashu transfer, and settlement adapters. The stack process gate uses its real loopback CDK mints and SQLite wallets to prove offline failure, payer death/replacement, exact-token recovery, second-receiver rejection, receiver-ACK completion, and conservation. |
Bind the generic recovery path to authenticated paid bandwidth and storage effects. Mint trust and cross-mint settlement remain explicit policy. |
| Iris Chat | Native 0.1.40 uses the canonical FIPS Nostr relay adapter for roster-authorized device links, shared decentralized pub/sub, paged device synchronization, and one BlobRouter over its cache, authenticated Hashtree providers, and Blossom. Its application owns the primary store and TCP/FIPS transport; RoutedStore supplies verified routed reads without routing writes. The released Stack fixture calls its production attachment reader. |
Keep native and browser device-sync fixtures byte-compatible, and test connection loss after local stream acceptance so resynchronization—not wishful delivery—is the recovery mechanism. |
| Nostr VPN | Version 4.0.96 at 81c1dee7664a85af4d153f856bc0f4f277ba2e29 has a canonical two-process Docker gate: explicit application-owned UDP roster links carry bidirectional traffic while a signed kind-37196 event crosses shared TCP/FIPS pubsub. It pins FIPS 0.4.6, fips-tcp 0.2.0, and nostr-pubsub-fips 0.3.1. Iris Stack pins and delegates to that owner test. |
Keep the VPN topology owner-local. Do not delegate VPN routes, roster policy, or egress to a same-host process. |
| Iris Drive | Hashtree full-history commit dbf43b2f49fe75f44ab19044a6040f68b3d22cb8 and byte-identical GitHub snapshot 97be0058df6c2a66dff9cb7303f172034e03420d pin the corrected adaptive Hashtree/FIPS tuple. The product and Stack gates prove exact roster ACLs, relay-only WebRTC bootstrap, provider death and replacement, standalone retrieval, and preservation of Drive-owned outbound links. |
Keep the released-product gate in the cross-platform matrix and extend it to larger multi-frame trees under sustained churn. |
| Iris Git | Web release 0.1.9 at 88fa708c pins immutable Hashtree v0.2.100 plus the TypeScript 0.5.1 tuple. Its ordered browser gate performs a real extracted-artifact htree://self push, retrieval, edit, and exact-provider FIPS read. |
Treat paid repository storage as a product integration, not a reason to fork Hashtree transport or Git object semantics. |
Versions identify the verified native release boundary on the stated date; the repository sources and package registries remain the authority for later versions.
- FIPS Rust
v0.4.6is commit7c5100a2e076e58dfeafa3c80341e295e65e8d39. The publishedfips-core0.4.6 crate checksum is12cc0df5e04a1aae16efa85313976e87eb037d6e7955b8a035febd91b00383dc; the publishedfips-endpoint0.4.6 checksum is510adeaf1aa5ecacf71064750502a3e7d8f4b58c22e98ea8b3adbff260cf96e0. - FIPS TypeScript
runtime-v0.0.26is commit7295a1243ec1d9ea48cf713eb7594e6f365850dc: core 0.0.26, browser 0.0.8, WebRTC 0.0.42, Ethernet 0.0.25, and memory 0.0.6. Its full native-0.4.5 Chromium matrix passed 16/16 and the sequential replacement path passed another 5/5 repetitions. - Hashtree
v0.2.100is commitf2d3426ab2191784f944aea591f566119bc10361. Published checksums are574476b1fe122bddc7783ba0346dca42ec673a241128b0edf9e38166c1bb800ffor core 0.2.86,e61f72986fce9c84f9fd03c72c581af092e25ea698e8b7bc54ddc18fe821286bfor LMDB 0.2.85,aa83a68204dfbdc10f2fa9e810740c981e6f87c114a763ee56d8823df02c077efor network 0.2.87,3817b451831f915787090cb1ca33dac2e5313bc1e5afd2da515f0e57bb0c997ffor FIPS transport 0.4.6, andeb8ee2266a43e58b4182da07c8829fa06b0e27e32d66164d6385ccedd6de2e89for CLI 0.2.100, and28482b66ec409702a50ceeac1a49f5fae42b141326822f394ad66a6ebc37562ffor embedded runtime 0.2.86. - Iris Chat source commit
4e1fe4fbced6bccfd806c4cfce0d348f30f4eac5releasediris-chat0.1.40 with checksum6fee11a9da20fddd2af3c52cad14588ec947d347c95470e1c1d0b61d10c44ce5. Itsiris-chat-protocol0.1.8 dependency has checksuma61f94d5ee8bdd2115588a202c95636011046293c05a3082b7c1840431e190c0. Its registry package, all-target/all-feature tests, strict Clippy, and real roster-authorized relay process test passed. - Iris Git
v0.1.9is commit88fa708c2fdc93169d3babf16a8dd3f2323a138e. Its 74-case ordered Chromium gate uses the immutable Hashtree macOS arm64 archive with SHA-256c60eea1f0b47f08c64093d95843419904830096bbce0ea402ca1ec1cb7fe590e. - WebVM
v2.0.2is commitd29273a578ed51b077bf08ece4745e3f1b9d8148. Its production gate composes nVPN 4.0.96, FIPS 0.4.6, and immutable nostr-pubsub TypeScript 0.3.1; Cloudflare production version5c7ec187-aa93-48ee-8669-b11a18187594passed all four production scenarios. nostr-identity0.4.0 was released from the social-graph repository at commitd8faabd1bf865f4cf95c9d56eddf99de31436862; its published crate checksum is95fd048871579a175d1c38d1ea947f1034206d93696ea7ac74d140979e8022bb.cashu-servicesource commitb45a7e16744928b2ebae54e42e8f62c1d7eabdcbis available from both its Hashtree and GitHub remotes. The publishedcashu-service0.3.1 checksum isc339af6a3c7a748230e980df1e89c4199532b33222d3c47e0cf148ab4d15498f; the publishedcashu-credit0.3.0 checksum isc35743015747540d9c912284f10ccf89c40ded00c51fd3710c08c60700c71339. Thecashu_payment_productprocess gate consumes those registry artifacts; it proves the generic service-payment failure/replay/resumption boundary, not a paid Iris product meter.- Nostr VPN 4.0.96 at
81c1dee7664a85af4d153f856bc0f4f277ba2e29ownsscripts/e2e-connect-docker.sh. Its two real processes preserve explicit UDP roster traffic in both directions while delivering a signed kind-37196 paid-exit event through the shared TCP/FIPS pubsub service. Iris Stack'sscripts/vpn-product-lab.shfetches that exact snapshot and invokes the owner harness without copying its protocol or topology.
Keep the capability repositories separate. Their state machines, release cadence, fuzz targets, language implementations, and downstream consumers are different enough that a monorepo would hide rather than remove coupling.
| Repository | Owns | Must not own |
|---|---|---|
nostr-protocol/nips |
Portable public-key identity and the signed-event format | Application authorization, event distribution, social interpretation, or transport |
fips / fips-ts |
Public-key-addressed links, Noise authentication, carriers, routing, discovery, admission, authenticated capability roster | Reliable application streams, blob HTL, event subscription policy, product egress policy |
fips-tcp |
Reliable ordered byte streams and their Rust/TypeScript wire contract | Product record schemas or application commit semantics |
nostr-pubsub |
Nostr subscription/event protocol, source policy, deduplication, carrier adapters | Blob transfer, durable mailbox/history, product-specific event formats |
nostr-double-ratchet |
End-to-end encrypted 1:1 sessions, group sender keys, and multi-device session management | General event distribution, product conversation state, or UI |
hashtree |
Blob/tree formats, verification, cache policy, BlobRoute, HTL forwarding, and Git/release data; the route boundary for a future paid provider |
FIPS link routing, Nostr event distribution, product UI, or claims that paid blob retrieval is already implemented |
@hashtree/index / @hashtree/collection |
Immutable B-tree indexes, canonical records, derived search roots, and collection manifests | Source completeness, global query policy, or mutable database authority |
nostr-social-graph |
Signed fact interpretation, graph traversal, contextual names, reputation and policy inputs | A global name registry or global trust score |
cashu-service |
Credit, receipts, transfer and settlement primitives | Product pricing, access policy, or claims of globally trusted mints |
| Product repositories | Startup, authorization, durable product effects, user policy, explicit peers and outbound links | Copies of capability carriers, discovery protocols, or retry state machines |
iris-kit |
Shared web integration and UI packages | Capability wire contracts or product-owned policy |
iris-stack |
Durable public architecture, machine-readable ownership map, and black-box process/released-artifact lab | Another implementation of FIPS, TCP/FIPS, pub/sub, Hashtree, or product logic |
iris-stack-lab therefore belongs in this repository. It is a consumer-only
integration lab and must never become a dependency of a capability or product.
Tests should be placed where the failed invariant can be fixed without editing an unrelated layer.
| Repository | Required gates |
|---|---|
fips |
Noise identity proof; capability authenticity; route and carrier churn; fixed-loopback bind/rebind; admission/resource bounds; every app retaining independent direct links |
fips-tcp |
Loss, duplication, reordering, reset, marker acknowledgment, flow control, concurrent streams, bounded buffers, and Rust/TypeScript vectors/process interop |
nostr-pubsub |
Codec vectors; inventory/want convergence; deduplication; role-blind discovery; malicious peers; simulator scale; real FIPS and Cashu adapters |
nostr-double-ratchet |
TypeScript/Rust interop; 1:1 ratchet recovery; group sender-key rotation; multi-device authorization; replay and malformed-event handling |
hashtree |
Local hit/miss; exact HTL decrement; multi-hop and cycles; bounded fan-out; route-local NoResult; timeout/error distinction; corrupt reply rejection; cache population; provider replacement; paid-route behavior when a production adapter exists |
nostr-social-graph |
Deterministic graph and fact interpretation; key/device binding; local-policy boundaries; malicious or conflicting claims |
cashu-service |
Credit limits; idempotent receipts; double-spend/replay rejection; partial settlement; mint outage; restart recovery; real local-mint processes |
| Product repositories | Standalone startup; explicit outbound links; authorization; durable effects; app protocol recovery; graceful and forced dependency death |
iris-stack |
Released-artifact compatibility; several real product processes on one host; same-host discovery; provider churn; direct egress preservation; generic Cashu failure/replay/recovery and product crash matrices; paid product routes when implemented |
Simulators should run production state machines, not simplified copies. Deterministic protocol simulations stay with their owner; cross-repository black-box simulations stay here. Release gates should prefer registry artifacts and consumer lockfiles. Path dependencies are useful during development but cannot prove that published packages compose.
The desired direction is one implementation per semantic responsibility:
- One fixed-loopback FIPS UDP rendezvous mechanism. No parallel filesystem, TCP, Ethernet-only, daemon-election, or shared-egress protocol.
- One authenticated FSP capability roster. The plaintext loopback exchange is only an identity hint and carries no capabilities or policy.
- One Hashtree blob request/reply contract for local stores, same-host
providers, remote mesh routes, cloud adapters, and future paid wrappers.
NoResultmeans only that one bounded route produced no data. - One Hashtree HTL router. FIPS hops and terminal adapters do not consume HTL.
- One standard Nostr pub/sub service. Large bytes travel through Hashtree, not through a second pub/sub blob protocol.
- Product-owned control and synchronization schemas remain product-owned until an extraction removes meaningful code and preserves their different retry, authorization, resync, and commit semantics.
The native Hashtree migration removed thousands of lines of duplicate carrier
code, including the CLI DataRequest framing and WebRTC compatibility stub,
after equivalent owner-level coverage passed. Similar cleanup in products is
valuable when it deletes a private transport, but a tiny common frame codec
alone is not automatically a simplification: if the shared package plus
language parity adds more code than the consumers remove, wait for stronger
semantic convergence or a third user. Iris Stack must not grow replacement
shims for the deleted paths.
- Bind paid FIPS forwarding and paid Hashtree storage to the verified generic Cashu recovery gate. Inject product-effect rejection, timeout, duplicate receipt, crash, restart, and eventual receiver acknowledgement.
- Enforce the same native/TypeScript fixtures in owner-repository release gates, including browser constraints where native loopback UDP is not available.
- Add long-running loss, churn, bounded-memory, file-descriptor, and process death tests using production state machines.
- Gate exact authenticated capability and service-port selection so an arbitrary connected peer can never be mistaken for a provider.
- Treat record acceptance, TCP acknowledgment, and application commit as distinct states in product protocols; make reset/resync behavior explicit.
- Add Iris Git only after the shared content and event paths are sufficient; do not create Git-specific copies of discovery or blob routing.
This backlog deliberately does not include a generic decentralized compute substrate. It can be evaluated later against a concrete workload, proof model, resource market, and failure contract.