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 runtime —
Scene.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
ui profile and the Scene object model are the two real roots — starting anywhere else risks rework.
Wave 2
Wave 3 — Scene engines
Wave 4
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
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.
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.
Tracking issue for the screen work — the UI half of the Screenplay stack, spanning six repositories. Every issue below carries the
screenlabel in its own repo.The work splits by lifecycle, the same way Chronicle/Arc/Components/AuthProxy already do:
screen,form,layout,themeorui profilecan say.Scene.Model(platform-agnostic),Scene.Engine(binding/resolution),Scene.React(one renderer).Scene.Model, and producing a shipped artifact perui profile.formconstruct 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
ui profile— the vocabulary (target platform,target size,packages) everything else layers onformCommandFormpopulated at startupui profileand the Scene object model are the two real roots — starting anywhere else risks rework.Wave 2
flow/freeform)themeconstructCommandFormWave 3 — Scene engines
ui profilepackage resolution engineWave 4
Wave 5
Wave 6 — Stage
Wave 7 — Studio designers
All of these sit on Cratis/StudioIssues#156, which establishes that the preview surface runs the real
Scene.Engine+Scene.Reactrather than a Studio-specific reimplementation.ui profileand theme configurationDecisions 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.
stringswith the existing Internationalization construct (Internationalization for strings Screenplay#7). Blocks Language construct: string resources for UI text (labels, nav, etc.) Screenplay#93 and, downstream, the per-locale table UI in String resource management UI StudioIssues#159. Until it lands, don't build against a shape that will move.layoutuseflowfor most slots andfreeformfor one? Decided in Language construct: layout arrangement — responsiveflowvs.freeformScreenplay#95; the engine (Layout engine:flowandfreeformarrangement rendering #4) must not assume a layout is uniformly one mode, and the designer (Layout designer UI: flow canvas and freeform artboards StudioIssues#161) needs slot-level mode switching only if it is allowed.ui profileselection happens in the pipeline — Stage given a target profile up front and translating only what's relevant, or translating everything and letting Scene pick at runtime. Decided in Hookup Screenplay with Scene Stage#37; determines whether multi-target builds share one translation pass (Runtime rendering per deployment target (ui profileat build/run time) Stage#39).ui profilestates only a default class and layout owns the width × height matrix (Language construct:ui profile— platform/size targeting and component packages Screenplay#94 vs. Language construct: layout arrangement — responsiveflowvs.freeformScreenplay#95). Affects where size-class computation lives in Layout engine:flowandfreeformarrangement rendering #4.Scene.React(Studio editor architecture: chrome vs. preview surface StudioIssues#156). Leaning toward the former; the latter would put a Studio concern inside Scene.Not part of this
#6 (
ui starter) is deliberately a packaged tooling artifact, not a.playconstruct — see the out-of-scope note in Cratis/Screenplay#96. Don't reusethemeor the earlier "template" wording for it.Decisions taken 2026-08-14
Scene is dual-stack: C#
Scene.Modelas the source of truth, with a TypeScript mirror.Scene.EngineandScene.Reactare 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
stringsblock. The compiler already ships companion.stringsfiles per locale and$strings.<key>references coveringlabel,titleand validationmessage. The work narrows to extending$strings.to the operands Cratis/Screenplay#92 introduces — principallynavigation-item'slabel. 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.