Chapter 14. The Convergence
This chapter is the evidence. The JavaScript ecosystem was not reading a derivation; it had its own problems: pages that crawlers could not read and first paints that took too long. Driven by those problems, it has spent a decade converging back toward the proper factorization, one rediscovery at a time:
- SSR — server-side rendering. Documents should arrive as documents. The S4 cost landed as Chapter 11 predicted: every integrator had to reverse-engineer a private API, and search crawlers could not read the page at all. The industry moved for its own reasons (SEO and first paint) and the fix is
present ∘ arrange ∘ selectrunning on a server, where it had been running all along. - Hydration. The industry gave Chapter 11’s S1 cost a name of its own. The name records a category error: it classes the document as an incomplete form of the program, dry until the program re-runs in the browser. Nothing needs hydrating in an architecture that can tell its document from its program.
- Islands. The industry rederived the principle of least power from the costs: most of the page needs no program, so most of the page is no longer written as one.
- React Server Components. RSC pulls
selectback out of the fused term, ten years after fusion. But its wire format is a bespoke, non-addressable serialization of exactly the intermediate value S4 says should have a URI. So RSC restores theselectfactor, but not the addressable resource that S4 requires. - GraphQL. GraphQL provides declarative queries over a graph model, and those queries return projections. It rebuilds
selectand R1, but without global identifiers. Because R3 is missing, GraphQL stops at the boundary of the organization that defines the schema: federation works within one organization and no further. Its column is below. - HTMX and the hypermedia revival. This is the same convergence, reached from the opposite direction: practitioners argued documents, links, and forms back into fashion on their original merits. Forms are Chapter 7’s instrument.
The framing is convergent evolution: independent lineages, under the same pressure, arrive at the same design, and the match is explained by the pressure, not by chance. The lineages had contact with nothing but the costs, and the costs are the derivation’s predictions.
Years mark mainstream adoption, not invention. The figure shows when each piece returned, not how much: S1 and S2 have recovered to partial scores, while R3 and S4 have not been recovered at all.
GraphQL
| GraphQL | |
|---|---|
| R1 | ✓ — a graph model; encodes any domain |
| R2 | ✗ — schemas compose only by coordination |
| R3 | ✗ — no global identifiers; names stop at the schema boundary |
| S1 | ~ — select genuinely separated, but behind one endpoint |
| S2 | ~ — a specified but prose-defined semantics |
| S3 | ~ — substitution within one schema’s contract |
| S4 | ✗ — one endpoint; results are not addressable |
SPA/JS, revised
| SPA/JS (Ch 11) | SPA/JS (2026) | |
|---|---|---|
| S1 | ✗ | ~ — select re-extracted |
| S2 | ✗ | ~ — declarative islands in an imperative shell |
| R3 | ✗ | ✗ |
| S4 | ✗ | ✗ — the wire format has no URI |
R1, R2, S3: unchanged from Chapter 11’s column.
The convergence recovers S1 and S2, to a tilde, not a check, but neither R3 nor S4, the two properties that make an architecture the web rather than an app platform that happens to use browsers. The reason is that the remaining work benefits everyone except the vendor doing it: vendors recover the properties that benefit them privately and stop there.