Skip to content

Screen: cross-repo build order and dependency map #7

Description

@einari

Tracking issue for the screen work — the UI half of the Screenplay stack, spanning six repositories. Every issue below carries the screen label in its own repo.

The work splits by lifecycle, the same way Chronicle/Arc/Components/AuthProxy already do:

  • Screenplay owns the language — what a screen, form, layout, theme or ui profile can say.
  • Scene owns the object model and runtimeScene.Model (platform-agnostic), Scene.Engine (binding/resolution), Scene.React (one renderer).
  • Stage owns the seam and the build — translating parsed Screenplay into Scene.Model, and producing a shipped artifact per ui profile.
  • Studio owns the design-time tooling — designers built on top of Scene's object model, previewing through the unmodified Scene engine.
  • Arc / Components own the form runtime the form construct ultimately compiles down to.

Build order

Waves are dependency layers, not sprints — everything inside a wave can run in parallel.

Wave 1 — foundations, nothing blocking

Issue What
Cratis/Screenplay#94 Language construct: ui profile — the vocabulary (target platform, target size, packages) everything else layers on
Cratis/Screenplay#92 Language construct: contribution points and navigation
Cratis/Screenplay#91 Language construct: form
#1 Scene object model, and the split into Model / Engine / React
Cratis/Arc#2549 CommandForm populated at startup

ui profile and the Scene object model are the two real roots — starting anywhere else risks rework.

Wave 2

Issue Depends on
Cratis/Screenplay#95 — layout arrangement (flow / freeform) #94, for the size-class vocabulary
Cratis/Screenplay#96theme construct #94, for the package chain it declares compatibility against
Cratis/Screenplay#93 — string resources for UI text #92 (nav labels) — also blocked on reconciliation with the existing Internationalization construct, Cratis/Screenplay#7
Cratis/Components#133 — initial values for CommandForm Cratis/Arc#2549
Cratis/Components#104 — dynamically populate form content Cratis/Arc#2549
Cratis/StudioIssues#156 — editor architecture: chrome vs. preview surface #1

Wave 3 — Scene engines

Issue Depends on
#3ui profile package resolution engine Cratis/Screenplay#94, #1
#4 — layout engine Cratis/Screenplay#95, #1
#2 — contribution point runtime and NavBar widget Cratis/Screenplay#92, #1

Wave 4

Issue Depends on
#5 — theme engine Cratis/Screenplay#96, #3 (themes resolve against the profile's package list)

Wave 5

Issue Depends on
#6 — UI starters (kits) and sample gallery #3, #5, #2 — the gallery is a real mini-app driven by all three

Wave 6 — Stage

Issue Depends on
Cratis/Stage#37 — hook Screenplay's constructs into Scene's object model #1 and every Screenplay construct it translates: #91, #92, #94, #95, #96
Cratis/Stage#39 — runtime rendering per deployment target Cratis/Stage#37, #3, #4, #5

Wave 7 — Studio designers

All of these sit on Cratis/StudioIssues#156, which establishes that the preview surface runs the real Scene.Engine + Scene.React rather than a Studio-specific reimplementation.

Issue Depends on
Cratis/StudioIssues#157 — form designer Cratis/Screenplay#91; runtime via Cratis/Arc#2549, Cratis/Components#133
Cratis/StudioIssues#158 — navigation / contribution designer #2
Cratis/StudioIssues#159 — string resource management Cratis/Screenplay#93 (itself blocked on Cratis/Screenplay#7)
Cratis/StudioIssues#160ui profile and theme configuration #3, #5 — refines the original request in Cratis/StudioIssues#80
Cratis/StudioIssues#161 — layout designer Cratis/Screenplay#95, #4
Cratis/StudioIssues#162 — new-project wizard and gallery preview #6

Decisions that gate more than one issue

These are open questions whose answers change work in several repos at once, so they are worth settling before the wave that consumes them starts.

Not part of this

#6 (ui starter) is deliberately a packaged tooling artifact, not a .play construct — see the out-of-scope note in Cratis/Screenplay#96. Don't reuse theme or the earlier "template" wording for it.


Decisions taken 2026-08-14

Scene is dual-stack: C# Scene.Model as the source of truth, with a TypeScript mirror. Scene.Engine and Scene.React are TypeScript and consume the mirror; Stage references the C# model directly, so the Screenplay → Scene seam is typed rather than serialized. Arc's proxy generator does not cover a standalone object model, so the mirror is hand-maintained behind a parity spec unless #1 decides to build a generator. Full detail in #1.

Screenplay#93 drops the inline strings block. The compiler already ships companion .strings files per locale and $strings.<key> references covering label, title and validation message. The work narrows to extending $strings. to the operands Cratis/Screenplay#92 introduces — principally navigation-item's label. This closes the reconciliation question against Cratis/Screenplay#7, so Cratis/Screenplay#93 and Cratis/StudioIssues#159 are no longer blocked on it, and Wave 2 loses a dependency.

Metadata

Metadata

Assignees

No one assigned

    Labels

    screenScreen/UI work: Screenplay UI constructs, Scene runtime, Stage rendering, Studio designers

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions