Logo FS-Skia-UI

Generated Apps

Canonical effects boundary: the single source of truth for the two effect categories (application commands at the MVU edge vs viewer effects at the host boundary) and the update→host wiring is the page bundled into every generated project at docs/effects-boundary.md (authored from template/base/docs/effects-boundary.md). The effects notes below are aligned to it; from a generated project follow the bundled page without reading this framework report or framework source.

Generated graphical apps must validate user-reachable input and rendering paths through public package surfaces. For feature 013-tetris-demo-integration the generated app guidance must name:

Compact Consumer API Map

Generated demo authors should be able to find the public API shape before coding:

Default text is intended to be readable in evidence screenshots on supported Linux desktop hosts with common Latin fonts. Specify explicit fonts with TextRun.Font when brand, typography, or exact font selection matters beyond default readability. Use explicit fonts for brand or typography guarantees.

Readiness Contract

For feature-scoped audits, the authoritative readiness directory is the active feature path such as specs/032-sokoban-feedback-followups/readiness/, not a repository-level output directory. Repository evidence directories like readiness/surface-baselines/ and generated consumer logs remain supporting artifacts. Current generated-app follow-up readiness should prepare:

Follow-up classifications should distinguish framework behavior, generated-app guidance, Spec Kit guidance, and consumer-author mistake so backlog ownership stays clear.

Generated app tests should drive keyboard flows through normalized viewer key events, not backend-specific raw string comparisons. Validation failures must identify the app flow, input value, screen, rendering stage, diagnostic category, package identity, or evidence path needed to act on the failure.

Bounded smoke, frame diagnostics, and scene evidence are explicit CI and reviewer-diagnostic commands. They are not interactive readiness substitutes for the default persistent graphical launch path, and they should stay behind explicit command dispatch outside the default product launch branch. The default command for a viewer-backed graphical profile must attempt Viewer.runApp viewerOptions Product.Program.generatedHost; commands that only print metadata, count controls, run bounded smoke, emit scene evidence, or exit without a persistent launch attempt are diagnostic helpers only. Tests that exercise the reducer should call Product.Program.update, not an unqualified or framework-owned update helper.

For Linux desktop review sessions where the generated viewer should outlive the shell, launch it in a detached session while preserving diagnostics:

setsid dotnet run --project src/Product/Product.fsproj > readiness/logs/generated-viewer.log 2>&1 < /dev/null &

Keep the readiness/logs/generated-viewer.log path with the review notes so stderr, stdout, and startup diagnostics remain inspectable after the shell exits.

Generated evidence reports must keep deterministic render proof, persistent launch proof, and screenshot proof as separate evidence kinds. A deterministic scene hash or pixel fallback can support diagnosis, but it must not be relabeled as persistent-window or screenshot evidence. Generated layout, image, screenshot, and pixel-readback evidence commands should share stable report conventions without forcing the default app profile to reference the Testing package: status, command, output, stable key ordering, normalized ok/unsupported/failed status vocabulary, skipped gates, next command, and unsupported-host unsupported-host-reason plus fallback=deterministic-scene-evidence. Evidence reports may only claim the authority of the gates they actually complete. Generated app message examples must qualify app-owned messages such as Product.Program.Msg.CloseRequested; CloseRequested is an app-owned message. When generated code stores a domain vector, use an explicit conversion helper such as toScenePoint before passing the value as a Scene.Point. Generated evidence can record semantic scene facts for lander, terrain, landing pad, and HUD metrics, but deterministic-scene-evidence does not prove semantic object presence in a live screenshot. Pixel-readback fallback evidence must include fallback-reason and proves-screenshot=false unless live viewer-window screenshot capture succeeded. Generated gameplay examples should reuse shared Scene geometry for layout, containment, collision, and rendering evidence when the Scene shape model already fits; do not introduce local duplicate bounds records for the same entities. When an app needs domain-owned geometry aliases or records, use names that describe the product space, such as WorldRect, WorldPoint, TrackBounds, CarPose, or CheckpointBounds. Reserve generic Rect, Point, and Size for shared Scene/layout primitives so generated code does not need ambiguity-driven type annotations.

Generated smoke reports should include a diagnostic mode and captured diagnostic categories so startup failures can be read without repeated frame-loop noise. Frame-loop messages should appear only in an explicit frame-focused run.

Generated consumers must use local NuGet packages produced by PackLocal for package validation. They must not copy repository implementation source to stand in for package consumption.

Bounded-only graphical apps need an explicit migration decision before they can claim readiness: adopt the persistent generated host, declare headless or non-interactive scope, or document a missing persistent viewer capability as a blocking product/package gap.

Repository validation for generated app flows is produced by TemplateCheck, GeneratedGuidanceCheck, TemplateDrift, PackLocal, and GeneratedProductCheck. The active feature stores the generated consumer summary at readiness/generated-product-validation.md and detailed logs under readiness/generated-consumer-validation/. Generated app and template command names are part of the native FAKE target registry. TargetMetadataDrift must stay green after generated workflow changes so generated guidance, docs, target metadata, and validation.contract.yml continue to name runnable commands.

Archive And API Reference Guidance

For current governance work, current feature readiness paths are authoritative for current gates. historical feature readiness is audit context only unless a current evidence map explicitly marks it as supporting evidence. Archived material must not be cited as current package, template, generated-product, or audit pass/fail evidence.

The source-shaped .fsi package API reference remains authoritative for agent authoring. FSharp.Formatting/fsdocs output is secondary or hybrid unless the active generator decision record marks it authoritative. Package consumers must not use assembly reflection or repository source inspection as an authoring substitute.

Type something to start searching.