Chapter 14. The Convergence

The evidence chapter. The JavaScript ecosystem had no exposure to any derivation, and it was moved by nothing but its own costs. It has spent a decade converging back toward the proper factorization, one rediscovery at a time:

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.

%%{init: {'theme':'base','themeVariables':{'fontFamily':'-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif','textColor':'#1b1e22','lineColor':'#5a6270','cScale0':'#e3eef7','cScale1':'#f4f1e9','cScale2':'#e3eef7','cScale3':'#f4f1e9','cScale4':'#e3eef7','cScale5':'#f4f1e9','cScaleLabel0':'#1b1e22','cScaleLabel1':'#1b1e22','cScaleLabel2':'#1b1e22','cScaleLabel3':'#1b1e22','cScaleLabel4':'#1b1e22','cScaleLabel5':'#1b1e22','cScaleInv0':'#b9cfe4','cScaleInv1':'#d9d3c5','cScaleInv2':'#b9cfe4','cScaleInv3':'#d9d3c5','cScaleInv4':'#b9cfe4','cScaleInv5':'#d9d3c5'}}}%%
timeline
    title The convergence, 2013–2026
    2013 : the fused term consolidates — client-side read becomes the default
    2016 : SSR returns — the pipeline re-runs on servers
    2019 : hydration is named — the S1 tax gets its industry name
    2021 : islands — least power, rediscovered per component
    2023 : React Server Components — select extracted from the fused term
    2024 : the hypermedia revival peaks — documents argued from the opposite shore

Years mark mainstream arrival, not invention. The axis the figure cannot draw is the one the chapter measures: S1 and S2 recovered to tildes; R3 and S4 still ahead.

Column: 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

Column: 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.

One closing observation: the convergence recovers S1 and S2 — to a tilde, not a check. But it stalls before R3 and S4, the two properties that make it the web rather than an app platform that happens to use browsers. The stall has a reason: the last stretch helps everyone except the vendor walking it. The properties that privately reward the vendor return first; the properties that reward the public wait. Asymptotic, incomplete, and in the predicted order.

A dashed path leaving the front door of a house, wandering past hills, mountains, and a lake, and stopping just short of the door beside it