docs(website): settle Phase 3's shape, correct the library build, record slice 0 #135
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/module-phase3-plan"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Phase 2 closed with website#136 / docs#134, so Phase 3 — the extraction — needs a plan before any of it moves. Four decisions, one finding that set the first of them, and then slice 0's outcome including a correction to the normative contract.
The finding that set the slicing
The server and client halves are independent. Because §1.2 preserves API URLs exactly, core's client keeps calling
/api/v1/public/shard/statusafter that route is served by the module, and a module page calls the same URL while core still serves it. Nothing forces a feature's two halves to move together — so the extraction is server-first, then client, sliced by feature, which keeps each PR inside one layer.The four decisions
module-uomerges beforewebsite. The loader'sownedByCoreprobe stops a module loading while core owns its prefix, but the module's own CI never loads it into core, so its PR merges fine beforehand — andedgethen serves the feature from core right up to the moment core drops it, never sitting in a state where the branch is missing a feature outright.module-uo's CI clones core at a pinned ref to generate its frozen route manifest. A hand-frozen manifest goes stale silently, and the failure it would have caught is a route that moved.module-rustdry run lands asdocs/modules/rust-dryrun.md; Phase 5's Integration Kit links to it rather than copying it.§3.6 is corrected —
externaland the aliases do not composeSlice 0 built against the contract as written and got a chunk that could not load. Rollup asks
externalbefore Vite's alias resolver runs, so a specifier listed in both is marked external and never aliased; the chunk emits bareimport 'react', which no browser can resolve without an import map, and CSP forbids the inline script an import map has to be. It built cleanly and emitted exactly that.§3.6 now shows alias only,
externalempty, with the full alias table — the anchoring is what stopsreactalso capturingreact/jsx-runtime. Whatexternalwas guarding (a missed alias welding a second React into the chunk) moves to a resolution-time build plugin, and two of its properties are contract because both were wrong first:transform, notload—loadis first-wins, so written against it the guard never ran, and a deliberately-broken alias produced a 24 kB chunk with react-router bundled and a green build;Slice 0 recorded (§2.7.1)
Module-uo#2. Verified against a real core, not asserted: loads, mounts, reaches
started, is published by/api/v1/public/modules; chunk servesno-cachefrom the entry's directory while the module's server source andmodule.json404; and in Chrome under the enforcedscript-src 'self'every shared dependency is identity-equal to core's, zero CSP reports.Two findings worth carrying forward:
filter(e => e.isDirectory())reports a junction as a symlink. Harmless for a real install, and the first thing to check when a module fails to appear locally.Also recorded
lib/format.jsis vendored by the module rather than becoming an eighth §3.4 member.Documentation only. Slice 1, the atlas, is next.
docs(website): settle Phase 3's shape, slices and merge orderto docs(website): settle Phase 3's shape, correct the library build, record slice 0