Logo FS-Skia-UI

Implementation Completeness Review: Foundations Rewrite + V3 Monolith Retirement


TL;DR

Both programmes are fully implemented and merged to main. Every stage of the foundations rewrite (features 039–047) and every stage of the V3 monolith retirement (features 048–053) landed, with the headline deletions and new gates verified on disk and the compiled build front-end confirmed running (./fake.sh build -t Route executes the dedicated build/Build.fsproj exe and prints a typed routing decision in 64 ms).

The residual items are minor and almost entirely disclosed: a real-but-low-impact version-pin drift in the generated template's build.fsx (§4.1), lingering FS3261 nullness warnings in the governance library (§4.2), an uncommitted readiness scratch file (§4.3), and a set of explicitly-deferred / non-goal design items that the now-clean architecture finally unblocks (§5). No stage is missing, mis-built, or silently dropped.


1. Method

I treated each plan's "definition of done" as a checklist and verified it against the live tree, not against the plans' own self-reported status. Concretely:


2. Foundations rewrite (analysis 0908 → plan 1049) — verdict: COMPLETE

The analysis converged on one keystone (a tested F# governance library extracted from build.fsx) and one policy (a two-tier process). Both shipped, plus all supporting stages.

Stage

Plan deliverable

Feature

On-disk verification

Status

0

Baselines + 5 ADRs + D2 spike

039

docs/adr/0001–0005; _baselines/2026-05-31-foundations.md + -spike-d2-outcome.md

1

Two-tier Route process (compiled Routing.fs)

042

Route runs; prints developer-class/tier/gates; validation.contract.yml generated from Routing.fs

2

Single-source generation (.claude.agents, constitution, skillist)

040 + 044

SkillSyncCheck; 25↔25 skills; constitution fragment markers

3

Governance library skeleton + first validators

041

build/Governance/{Targets,Findings,TargetMetadata,Capabilities}.fs(i)

4

Python evidence engine → in-process F#

043

build/Governance/Evidence/** (TaskParser, DepsParser, Graph, Audit, StatusRegion, DiffScan, Render); 0 tracked .py/run-audit.sh

5

*build.fsx deleted in full* + dedicated build project

045

root build.fsx absent; build/Build.fsproj + Program.fs + Engine/{Model,Update,Interpret}.fs; fake.sh runs dotnet run --project build/Build.fsproj

6

ConstitutionCheck gate + contract schema_version + prose trim + .gitignore

046

GeneratedProductContract.fs deprecation/removal window

7

Closeout: grep-proofs, after-baseline, ADR 0006, doc pass

047

_baselines/2026-06-02-foundations-after.md; docs/adr/0006

Key empirical proof. The single highest-risk claim across both programmes was "the 4,688-line build.fsx is gone and replaced by a compiled exe." Verified live:

$ ./fake.sh build -t Route
developer-class=framework-author
tier=agent-ready
gates=Dev, EvidenceGraph, EvidenceAudit
dogfood-forced=false
matched-rules=evidence-governance
Finished (Success) 'Route' in 00:00:00.06

This proves (a) the dedicated FAKE exe builds and dispatches, (b) the typed Routing.fs selector is the live decision engine, and (c) the DualDisplay→X11 graphics normalization (features 049/053) is wired into the front-end. The tri-language evidence boundary is genuinely gone: git ls-files '*.py' and **/run-audit.sh both return 0.

2.1 The four original questions — all answered in code


3. V3 monolith retirement (plan 0602) — verdict: COMPLETE

Stage

Plan deliverable

Feature

On-disk verification

Status

0

Baseline + ADRs 0007–0011 + PerPackageSurfaceDiff + parity oracle

048

docs/adr/0007–0011; _baselines/2026-06-02-v3-before.md

1

Keystone host extraction + scene-vocabulary unification

050

src/SkiaViewer/Host/**; SceneConversion.fs gone; no SkiaViewer→Lib ref

2

Relocate AgentValidationFS.Skia.UI.Build

051

build/Governance/AgentValidation.fs(i); knownGates now governance config

3–4

FS.Skia.UI.Input package; decouple samples/tests; retire parity bridge

052

src/Input/Input.fsproj (9th package); tests/Input.Tests

5

Delete src/Lib, unpublish FS.Skia.UI, Route-gate baselines, cleanliness gate, migration docs, ADR 0012, after-measurement

053

see below

Stage 5 verified item-by-item:

The "modularity leak" (default app profile transitively pulling the whole monolith via SkiaViewer→Lib) is closed: SkiaViewer references only Scene + KeyboardInput.


4. Problems & omissions found

All are minor. Listed worst-first.

4.1 Version-pin drift in the generated template's build.fsx (concrete, low-impact)

template/base/build.fsx:1 pins the evidence engine at

#r "nuget: FS.Skia.UI.Build, 0.1.45-preview.1"

while template/base/Directory.Packages.props pins the same package at 0.1.56-preview.1 — an 11-revision gap — even though the build.fsx comment states the #r "is kept in sync with the FS.Skia.UI.Build pin in Directory.Packages.props."

4.2 FS3261 nullness warnings remain in the governance library

The Route build emits FS3261 nullness warnings in build/Governance/Guidance.fs (lines ~522, 543) and build/Governance/Front/Governance.fs (lines ~185–189, 328, 335). They are warnings, not errors — FS3261 is evidently not promoted by the project's TreatWarningsAsErrors / FS0078-as-error policy — so the build is green. Still, they sit oddly against the framework's own warnings-as-errors discipline and are worth clearing (pattern-match the nullable Process/string values) or explicitly suppressing with a note.

4.3 Uncommitted readiness scratch file

specs/053-v3-monolith-retirement/readiness/package/local-packages.md is untracked. Because it lives under an evidence/governance path, it escalates Route to agent-ready (matched-rule evidence-governance) — which is exactly why the live Route above did not show the routine inner-loop. This is the known "readiness-dir churn" hazard: commit it (if it's genuine 053 evidence) or .gitignore it (if it's pack-flow scratch) so the tree is clean and Route reflects real changes.

4.4 Headline targets met "by mechanism," not by measurement (disclosed)

The closeout baselines are commendably honest that several numeric targets from the original analysis were not literally hit:

This is a transparency strength, not a defect — but it means "did framework iteration actually get faster/cheaper?" remains unproven by data.

4.5 What is not a problem (checked and cleared)


5. Possible next steps

Ordered low-risk/high-value first. None is required for correctness — both programmes are done.

5.1 Housekeeping (hours)

5.2 Charts/DataGrid package split — the largest deferred design item

v3Design.md envisioned a separate FS.Skia.UI.Charts package; both V3 and foundations plans list it as an explicit Non-Goal. Charts/DataGrid still live inside src/Controls. With the monolith gone and the per-package surface-baseline machinery in place, this is now the natural next modularization — and the cleanest remaining gap between the shipped state and the original design vision.

5.3 Close the visual-parity gap (disclosed deferral)

Reference screenshots for effects-gallery / screenshot-gallery were never captured (no non-interactive entry point), and persistent-window first-frame capture is headless-GPU- infeasible in CI. Scene-output parity is the authoritative oracle, so this is acceptable — but adding a non-interactive screenshot entry point would let those two galleries get true visual parity coverage and retire the last "infeasible-and-disclosed" caveat.

5.4 Instrument the efficiency claims (if they matter)

If the programme's velocity/cost goals are to be demonstrated rather than asserted (§4.4), add a lightweight timing/token harness around inner-loop vs full-pipeline runs. Otherwise, formally retire those metrics as "mechanism delivered, measurement out of scope."

5.5 Decouple author-guidance prose from generation-currency anchors

The reason governance Markdown can't shrink (§4.4) is that term-checks pin specific phrases. Separating "genuine guidance an agent reads" from "term anchors the currency check requires" would let the prose actually reach the "low hundreds" goal — or, more honestly, let the goal be restated against the corrected ≈6,882 baseline.

5.6 Programme retrospective follow-through

Feature 047 created a tracked recurring-run schedule for the dogfood set (to stop the light tier silently becoming the only tier and rotting the harness). Confirm that schedule is actually firing now that both programmes are closed; a dormant dogfood schedule is the one way the two-tier process quietly degrades.


6. Conclusion

The maintainer's two large programmes — the foundations tooling rewrite and the V3 monolith retirement — are both complete and merged, and the central, highest-risk claims (build.fsx deleted for a compiled front-end; src/Lib deleted with the leak closed) are verified on disk and at runtime, not merely self-reported. The codebase is now a modular distribution of nine focused packages plus a tested governance engine, with a typed two-tier Route process and an in-process F# evidence gate.

The only finding with any user-visible risk is the template build.fsx engine-pin drift (§4.1); everything else is cosmetic housekeeping or work the plans deliberately scoped out. The most valuable forward move is the deferred Charts package split (§5.2), which would carry the modular-distribution design across its last unfinished boundary.

Type something to start searching.