Build Workflow
The repository command surface is the FAKE target graph invoked through the repo-local wrappers:
./fake.sh build -t Dev./fake.sh build -t Verify./fake.sh build -t Ci
On Windows command prompts, use:
fake.cmd build -t Devfake.cmd build -t Verifyfake.cmd build -t Ci
FAKE-backed commands (./fake.sh, fake.cmd, or dotnet fake) share
repository .fake state and are not safe to run concurrently. When a workflow
needs more than one FAKE-backed target, run one command to completion before
starting the next and preserve that order in readiness evidence. Non-FAKE
checks may still run in parallel when they do not invoke FAKE or depend on
.fake.
The wrappers run the dedicated compiled build front-end
dotnet run --project build/Build.fsproj (feature 045): there is no fake-cli
tool, no FSX script runner, and no build.fsx — the front-end is a normally-compiled
exe that registers every target off the typed Targets registry and delegates each
body to the compiled governance library. Automation should call ./fake.sh build -t Ci.
Targets are registered through FAKE's native target graph. ./fake.sh build
--list is the supported discovery surface for runnable target names, and
TargetMetadataDrift verifies that discovered targets, metadata, docs, and
validation.contract.yml stay aligned.
All build/governance rules live in the single compiled library
FS.Skia.UI.Build (build/Governance/**) — a mistyped gate is a compile error.
Generated artifacts are generated from that single source, not hand-synced:
validation.contract.yml is generated from Routing.fs, and the .claude skill
tree is generated from the canonical .agents tree (regenerate with
./fake.sh build -t RefreshSurfaceBaselines; currency is enforced by
TargetMetadataDrift / SkillSyncCheck).
Targets
Target |
Responsibility |
Output |
|---|---|---|
|
Removes target-owned generated readiness outputs. |
Clean logs, FSI transcripts, smoke output, and package notes. |
|
Restores local tools and |
Active feature |
|
Builds the solution with the repository warning policy. |
Active feature |
|
Runs the default non-visual test set. |
Active feature |
|
Fast local verification: |
Active feature |
|
Packs the current public capability packages: Scene, SkiaViewer, Elmish, KeyboardInput, Controls.Elmish, Testing, the compatibility core package, Layout, and Controls; writes generated-consumer package snippets and setup-drift guidance. |
|
|
Regenerates current package surface baselines. |
|
|
Checks the current package surface against stable baselines. |
|
|
Runs public prelude scripts through FSI. |
|
|
Runs non-visual sample |
|
|
Runs Spec Kit task graph and task |
|
|
Runs the synthetic evidence audit after a valid task graph. |
|
|
Writes machine-readable target metadata for external tooling and reviewers. |
Active feature |
|
Validates native FAKE targets, metadata, docs, and validation contract references. |
Active feature |
|
Records process-health and bootstrap evidence for |
Active feature |
|
Records process-health and bootstrap evidence for |
Active feature |
|
Records stale active ownership scan status for removed package/boundary evidence. |
Active feature |
|
Summarizes final readiness status and broad aggregate authority. |
Active feature |
|
Full repository verification requiring process-health preflight, bootstrap, package, template, generated-product, guidance, drift, dependency, and evidence audit artifact classes. |
|
|
Non-interactive automation entry running |
|
Template And Governance Targets
Target |
Responsibility |
Output |
|---|---|---|
|
Builds |
|
|
Installs the template from the source directory. |
Active feature |
|
Installs the local packaged template artifact. |
Active feature |
|
Creates source and package generated projects for the V3 |
|
|
Scans generated projects and runs their |
Active feature |
|
Requires the full template validation artifact class. |
Active feature |
|
Validates |
Active feature |
|
Validates package-owned local skills and selected default app skill destinations. |
Active feature |
|
Generates and verifies the V3 app, packaged app, headless-scene, governed, and sample-pack product rows; for generated graphical consumers it also restores from local packages, runs semantic tests, bounded smoke, and scene evidence. |
Active feature |
|
Verifies Central Package Management and dependency metadata. |
Active feature |
|
Verifies active and preset-owned spec/plan prompts, task |
Active feature |
|
Classifies template-owned path changes and checks required alignment classes plus active feature evidence or accepted deferrals. |
Active feature |
Generated Graphical Integration
Feature 013-tetris-demo-integration adds contracted graphical integration
evidence before story implementation may be declared complete. The build
surface may extend GeneratedProductCheck, GeneratedGuidanceCheck,
TemplateCheck, TemplateDrift, PackLocal, Verify, and Ci so generated
apps can prove normalized viewer input, bounded real-viewer smoke,
deterministic scene evidence, local package setup, and unsupported-host
diagnostics.
The generated graphical app command surface is:
|
Bounded real-viewer evidence and deterministic scene-level evidence are separate artifact classes. A headless scene hash or PNG does not replace first-frame viewer startup evidence; an unsupported desktop host must produce an explicit unsupported-environment diagnostic.
Persistent generated graphical launch evidence uses the default executable
path and reports mode=persistent-window. Bounded smoke, first-frame,
frame-count, scene metadata, and unsupported-host diagnostics remain explicit
helper evidence and do not substitute for supported-host persistent launch
readiness.
Dev remains the fast local restore/build/test path and is independent of
template packaging. Verify includes source tests, local package packing,
package surface checks, public FSI transcripts, sample contract smoke,
template validation, capability validation, selected skill validation,
generated product validation, dependency governance, generated guidance,
template drift, and the evidence audit. VerifyPreflight and CiPreflight
run process-health and bootstrap checks before high-pressure broad work. A
preflight or bootstrap failure is an environment-failure: it fails the broad
aggregate, records non-authoritative product evidence, and recommends rerunning
in a fresh shell, fresh container, or CI runner. Ci runs its own preflight and
then delegates to Verify.
If a FAKE-backed command fails with a race-like or unexplained setup symptom, record whether another FAKE-backed command was running. When the concurrent context is suspected or unknown, rerun the affected FAKE-backed commands sequentially before classifying the result as a product regression.
Focused gates remain direct entry points. Each focused gate writes or appends a
row to readiness/focused-gates.md with its direct prerequisites, command, log
path, readiness path, verdict category, and stale build/restore assumption
diagnostics. Targets that intentionally use --no-restore or --no-build
must name the affected gate and remediation command when the assumed artifact
is stale.
Focused Gate Matrix
Gate |
Direct prerequisites |
Primary output |
|---|---|---|
|
none |
|
|
none |
|
|
restored |
|
|
restored |
|
|
restored |
|
|
none |
|
|
template pack/install/instantiate/smoke targets |
|
|
|
|
|
none |
|
|
none |
|
|
|
|
|
none |
|
|
|
|
No focused gate may depend on Verify or Ci. Adding a broad prerequisite is
a command-contract change and must be documented with a test before it lands.
Verify checks existing baselines; it does not silently refresh them. Use
RefreshSurfaceBaselines when an intentional public surface change has already
been reviewed.
Deferred
The following roadmap items remain outside repository pass/fail: full visual evidence, release validation, an external template repository split, and broader distribution automation. Package consumer smoke remains available as an explicit deferred target:
|
Tiered development process and the Route entry point (feature 042)
The build defines authoritative tiers — inner-loop, focused-authority,
agent-ready, maintainer-verify, automation-final — and a single entry point
that selects the right one for a change: ./fake.sh build -t Route.
Route computes the change's Diff (the union of the branch-vs-main
merge-base diff and the uncommitted/untracked working tree), runs the pure
compiled selector in FS.Skia.UI.Build.Routing, and prints:
-
developer-class—framework-author(default) orconsumer-agent(./fake.sh build -t Route consumer-agent, which raises the floor tofocused-authority). Consumer-contract paths escalate regardless of class. tier— the highest applicable tier (escalation always wins).gates— the minimal, registry-ordered list of targets to run.
How Route selects
-
A routine framework-internal change (
src/**/*.fs, no surface) → inner-loop, gate listDevonly. -
A public
src/**/*.fsisurface edit → escalates via thepackage-surfacerule (PackageSurfaceCheck,FsiTranscripts). -
template/**→TemplateCheck,GeneratedProductCheck;.specify/**→GeneratedGuidanceCheck,TemplateDrift;build.fsx/scripts/build/**→ themaintainer-verifyescalated path. -
An unrecognised path default-denies to the broad
Verifyfallback (never an empty success), and a dogfood feature (e.g.042) is forced to the full pipeline regardless of its diff.
--enforce
./fake.sh build -t Route --enforce exits non-zero when an escalated change is
being shipped without the tier's required evidence artifacts, naming each missing
artifact and the requiring tier; in plain mode it only prints the gate list.
validation.contract.yml is generated from Routing.fs (the single source of
truth) and currency-checked by TargetMetadataDrift; regenerate it with
./fake.sh build -t RefreshSurfaceBaselines.
FAKE-backed commands share repository .fake state and are not safe to run
concurrently; when Route escalates to several gates, run them sequentially in
the deterministic order documented above.