[E01-S01-T06] ADR: React SSR #412

Merged
kpcto merged 1 commits from feature/193 into main 2026-08-31 01:11:45 +00:00
Member

What changed

Commits the React SSR decision for public rendering as ADR-007 for [E01-S01-T06] ADR: React SSR (#193):

  • docs/adr/ADR-007-react-ssr-public-rendering.md (new) — the ADR, with the six required sections in order:
    • Context — modular monolith (ADR-001) whose rendering pipeline terminates in the React DOM server renderer → HTML (Architecture wiki §19); v0.1 public surface (§42); React/React DOM 19.2.8 already pinned as class C in the runtime stack and golden tuple (Technology-Stack §5.2, §7) with no RSC in v1 (Technology-Stack §6); the renderer is not implemented yet (apps/server is the Fastify health shell), so this ADR records the decision ahead of the code
    • Decision — EPPP renders all public pages with React SSR for public rendering: server-side rendering through the React DOM server renderer, React 19.2.8 exact-pinned; public pages are server-rendered first with no client hydration (§19, §19.1), core Home/article pages target 0 bytes of EPPP JavaScript, and only interactive features register client islands (§19.2); decision text matches the ADR index entry (§70)
    • Alternatives — client-side rendering/SPA (rejected), build-time SSG (rejected), SSR with full client hydration (rejected for v1), React Server Components (rejected for v1), template engine via @fastify/view (rejected)
    • Consequences — positive/negative/neutral trade-offs: zero-JS baseline met, fast first paint, one rendering path; per-request CPU cost and request-time rendering errors; React stays a server-rendering detail, constraining ADR-009/ADR-010
    • Operational impact — one Node.js 24 process renders HTML in-process in the single application image; no separate rendering service or build step; stateless horizontal scaling; React 19.2.8 upgrades flow through ADR-026 lanes; today rollback is reverting this doc commit
    • Revisit trigger — zero-JS baseline not meetable by SSR alone, RSC/hydration proposed for v1, React major/support-class change in the golden tuple, or v1.1 boundary contracts (ADR-027..032) demanding a different model
  • Documentation-only: no source, manifest, lockfile, workflow or test changes. Rollback is a revert of this commit.

Criterion → test table

Acceptance criterion Test / evidence
A committed ADR records React SSR as the public rendering approach (ADR-007) docs/adr/ADR-007-react-ssr-public-rendering.md committed on feature/193; the H1 heading reads # ADR-007: React SSR for public rendering and the Decision section records that EPPP renders all public pages with React SSR for public rendering. CI gate: the formatting-lint stage scans every git-tracked text file (including the new ADR) — verified locally with the committed policy suite: node --test tests/formatting-policy.test.mjs → 13/13 pass on the branch
The ADR contains Context, Decision, Alternatives, Consequences, Operational impact and Revisit trigger All six ## sections present, in the mandated order, in the committed file (document review per the issue test plan); locally verified against the committed file content
The decision text matches the ADR index entry in section 70 ADR index (§70) lists | ADR-007 | React SSR for public rendering |; the ADR's decision text is React SSR for public rendering and the Decision section states it matches the ADR index entry (ADR-007, section 70)

Risks / notes

  • Documentation-only change (one new markdown file); no runtime, schema, dependency, lockfile or CI-workflow impact. Rollback = revert the single commit.
  • CI on this PR runs the full seven-stage pipeline; the only stage touching this change is formatting-lint (tracked-file policy), which passes locally; all other stages are unaffected but will run as usual.
  • Out of scope per the brief: the other thirteen E01-S01 ADR subjects are separate task cards.

Closes #193

## What changed Commits the React SSR decision for public rendering as **ADR-007** for [E01-S01-T06] ADR: React SSR (#193): - **`docs/adr/ADR-007-react-ssr-public-rendering.md`** (new) — the ADR, with the six required sections in order: - **Context** — modular monolith (ADR-001) whose rendering pipeline terminates in the React DOM server renderer → HTML (Architecture wiki §19); v0.1 public surface (§42); React/React DOM 19.2.8 already pinned as class C in the runtime stack and golden tuple (Technology-Stack §5.2, §7) with no RSC in v1 (Technology-Stack §6); the renderer is not implemented yet (`apps/server` is the Fastify health shell), so this ADR records the decision ahead of the code - **Decision** — EPPP renders all public pages with **React SSR for public rendering**: server-side rendering through the React DOM server renderer, React 19.2.8 exact-pinned; public pages are server-rendered first with no client hydration (§19, §19.1), core Home/article pages target 0 bytes of EPPP JavaScript, and only interactive features register client islands (§19.2); decision text matches the ADR index entry (§70) - **Alternatives** — client-side rendering/SPA (rejected), build-time SSG (rejected), SSR with full client hydration (rejected for v1), React Server Components (rejected for v1), template engine via `@fastify/view` (rejected) - **Consequences** — positive/negative/neutral trade-offs: zero-JS baseline met, fast first paint, one rendering path; per-request CPU cost and request-time rendering errors; React stays a server-rendering detail, constraining ADR-009/ADR-010 - **Operational impact** — one Node.js 24 process renders HTML in-process in the single application image; no separate rendering service or build step; stateless horizontal scaling; React 19.2.8 upgrades flow through ADR-026 lanes; today rollback is reverting this doc commit - **Revisit trigger** — zero-JS baseline not meetable by SSR alone, RSC/hydration proposed for v1, React major/support-class change in the golden tuple, or v1.1 boundary contracts (ADR-027..032) demanding a different model - Documentation-only: no source, manifest, lockfile, workflow or test changes. Rollback is a revert of this commit. ## Criterion → test table | Acceptance criterion | Test / evidence | | --- | --- | | A committed ADR records React SSR as the public rendering approach (ADR-007) | `docs/adr/ADR-007-react-ssr-public-rendering.md` committed on `feature/193`; the H1 heading reads `# ADR-007: React SSR for public rendering` and the Decision section records that EPPP renders all public pages with **React SSR for public rendering**. CI gate: the `formatting-lint` stage scans every git-tracked text file (including the new ADR) — verified locally with the committed policy suite: `node --test tests/formatting-policy.test.mjs` → 13/13 pass on the branch | | The ADR contains Context, Decision, Alternatives, Consequences, Operational impact and Revisit trigger | All six `##` sections present, in the mandated order, in the committed file (document review per the issue test plan); locally verified against the committed file content | | The decision text matches the ADR index entry in section 70 | ADR index (§70) lists `\| ADR-007 \| React SSR for public rendering \|`; the ADR's decision text is **React SSR for public rendering** and the Decision section states it matches the ADR index entry (ADR-007, section 70) | ## Risks / notes - Documentation-only change (one new markdown file); no runtime, schema, dependency, lockfile or CI-workflow impact. Rollback = revert the single commit. - CI on this PR runs the full seven-stage pipeline; the only stage touching this change is `formatting-lint` (tracked-file policy), which passes locally; all other stages are unaffected but will run as usual. - Out of scope per the brief: the other thirteen E01-S01 ADR subjects are separate task cards. Closes #193
bot-implementer added 1 commit 2026-08-31 00:51:52 +00:00
docs(adr): record React SSR for public rendering decision as ADR-007
CI / Stage 6 — PostgreSQL integration tests (E00-S05-T01) (pull_request) Successful in 1m14s
CI / Stage 4 — Unit tests (E00-S05-T01) (pull_request) Successful in 1m37s
CI / Stage 7 — Build the admin and server applications (E00-S05-T01) (pull_request) Successful in 1m3s
CI / Stage 5 — Architecture tests (E00-S05-T01) (pull_request) Successful in 3m14s
CI / Stage 2 — Typecheck (E00-S05-T01) (pull_request) Successful in 1m20s
CI / Stage 1 — Frozen lockfile install (E00-S05-T01) (pull_request) Successful in 51s
CI / Stage 3 — Formatting/lint policy (E00-S05-T01) (pull_request) Successful in 45s
b6c3fd9a28
kpcto merged commit 893707604d into main 2026-08-31 01:11:45 +00:00
kpcto deleted branch feature/193 2026-08-31 01:11:46 +00:00
Sign in to join this conversation.