ADR 0012 — V3 monolith-retirement closeout
Status: Accepted
Date: 2026-06-02
Feature: 053-v3-monolith-retirement (V3 programme Stage 5 — final stage)
Supersedes/closes: the V3 modular-distribution programme (ADRs 0007–0011)
Context
The V3 modular-distribution programme split the broad FS.Skia.UI monolith into nine
focused packages across Stages 0–4 (features 048/050/051/052): the Vulkan/Skia host was
relocated into FS.Skia.UI.SkiaViewer (ADR 0007), the duplicate scene vocabulary was
collapsed to a single source in FS.Skia.UI.Scene (ADR 0008), the AgentValidation
surface moved into FS.Skia.UI.Build (ADR 0009), the legacy sample policy was settled
(ADR 0010), and the parity oracle method was fixed (ADR 0011). After Stage 4 the only
remaining build-consumer of src/Lib was tests/Package.Tests, and the monolith held
just the Parity evidence helper.
Decision
Complete the retirement:
-
Delete
src/Lib.Library.fs(i)+InternalsVisibleTo.fs+Lib.fsprojaregit rm'd; the project is removed fromFS-Skia-UI.sln, frompackProjects, and from the packable enumerations. TheParityhelper + itsParityReport/ParityStatus/EvidenceType/ParityEvidenceItemtypes retire with it. -
Stop publishing
FS.Skia.UI. It is dropped frompackProjects/the pack flow and fromdocs/reports/dependencies.md(monolith row + the historicalSkiaViewer → FS.Skia.UIleak note removed). No CPM or template pin ever named it (verify-only). -
Decouple the last consumer.
tests/Package.Testsis rewritten against the split-package pack shape and drops its conditionalLib.fsprojreference; the aggregateFS.Skia.UIsurface baseline is removed. -
Enforce the per-package surface gate.
PerPackageSurfaceDiffis added to thepackage-surfacerouting rule'sRequiredGatesand to theknownGatesallowlist, and rendered intovalidation.contract.yml— so a publicsrc/**/*.fsichange Route-selects the per-package DiffPlex check and an unrecorded.fsiedit fails the gate (FR-007). -
Assert generated-app cleanliness.
GeneratedProductCheckgains a cleanliness gate asserting a generatedapp/governedprofile carries nosamples/, frameworkdocs/reports/set, historicalspecs/, or framework root-README copy, and references the split packages rather than copying framework projects (FR-008). -
Publish closeout artifacts. The V2→V3 migration guide
(
docs/migration/v2-to-v3.md), this ADR, and the after-measurement baseline (docs/reports/_baselines/2026-06-02-v3-after.md) mirroring the Stage-0 before-baseline.
No runtime src/** code moved this stage — all runtime moved and was parity-proven in
Stages 1–4. This stage is deletion + governance/enforcement only; the deterministic
scene-output oracle (ADR 0011) is preserved and authoritative.
Consequences
-
The package set is the nine split packages (
FS.Skia.UI.Scene,.SkiaViewer,.Elmish,.KeyboardInput,.Input,.Layout,.Controls,.Controls.Elmish,.Testing) plus theFS.Skia.UI.Buildgovernance engine. The broadFS.Skia.UIidentity no longer exists. - The package dependency graph is acyclic and
FS.Skia.UI.Scenestays FSharp.Core-only. -
A repo-wide no-consumer grep over
src samples tests template build *.slnreturns zero hits for the monolith identity (SC-001). -
The V3 programme is closed. Remaining roadmap items (a first-class
Charts/DataGridpackage split, additional template profiles) are explicitly future work, not a further V3 stage.
Links
- Programme ADRs: 0007 (host ownership), 0008 (scene vocabulary single source), 0009 (AgentValidation placement), 0010 (legacy sample policy), 0011 (parity oracle method).
-
Before/after baselines:
docs/reports/_baselines/2026-06-02-v3-before.md/2026-06-02-v3-after.md. - Migration guide:
docs/migration/v2-to-v3.md.