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