Repository navigation
Description
Screens release scope
The old #156 introduction is now stale: upstream ScreenTemplateEditor.tsx imports ScreenEditorWorkspace and Source/Editor/ScreenEditor has Scene edits, inspectors, query bindings and exposure. #394/#395/#396/#397 shipped. Preserve the existing migration/cleanup checklist below where still applicable; do not reimplement the editor or reopen completed work.
Acceptance criteria
- Host package-provided component/internal designers, custom property editors/display and contextual design actions through the Scene extension contract.
- Honor owner-defined visible/enabled state and inherited exposure; action/edit batches participate in validation, save, undo/redo and accessible keyboard interaction.
- Keep preview on the real Scene renderer and permit a package to customize its own component without Studio maintaining another property schema.
- Audit remaining legacy-editor consumers and the six original designer checklist items against current code, retire only unused paths, and record implemented versus remaining items.
- Prove extension loading and fallback both inside Studio and via the embeddable editor.
References and dependencies
Part of Cratis/Scene#7.
Blocked by
Blocks
Previous scope and historical context
The release scope above updates this issue without deleting its prior context. Completed foundations and superseded product questions are not new blockers. Existing non-screen requirements remain in scope.
Studio has two screen editors, and the good one is read-only.
Source/Editor/ |
Source/Scene/Prototypes/Editor/ |
|
|---|---|---|
| Renders through | @cratis/scene.react, unmodified — what Stage actually ships |
its own UIElement/Panel/ContentControl hierarchy, a parallel copy of Scene |
| Can you edit in it? | No | Yes |
| Used by | the routed Blueprint page | EventModelingEditor, ScreenTemplateEditor |
So today you either get a trustworthy preview you cannot touch, or an editor that is quietly drifting from what production renders.
The architecture question this issue originally asked is answered and shipped: chrome and preview are split, and design-mode affordances (selection, hover) are drawn by the chrome using the data-scene-id attribute the renderer already emits. Scene.React needs no design-mode flag.
What's actually left
Port the editing half onto Scene.Model, then delete the legacy editor.
- Migrate
ScreenTemplateEditor— the smaller consumer — ontoPreviewSurface+ chrome - Port drag/drop, resize and multi-select onto
Scene.Modelmutations (the bulk of the work) - Migrate
EventModelingEditor - Make the six designers editable, not just readable:
- Form — rename affordance, populate-source picker,
compose usinghandoff to the code editor - Navigation — drag-to-reorder, jump-to-declaration
- Strings — "extract to resource" actually writing the
.stringsentry and rewriting the.playreference - UI profile — drag-reorderable package list, component picker with package qualification
- Layout — the live flow-reflow canvas, freeform placement editing
- New project — the scaffold/confirm step
- Form — rename affordance, populate-source picker,
- Bind command properties from input widgets (
{property}expressions), with the binding visible in the preview - Delete
Source/Scene/Prototypes/Editor/and its .NET/TS model mirror
Not blocked
Every upstream dependency shipped: Cratis/Scene #1–#6 and Cratis/Screenplay #91–#96 are all closed, and @cratis/scene.* 3.x is a real published dependency.
Related
- Design-time: an empty container renders nothing, so there is no drop target Scene#49 — empty containers render nothing, so there is no drop target for an empty slot
- Preserve the complete authored UI in Screenplay export, import and Play #165 — the open product question of whether screen geometry is exported to
.playat all - Decide and document the component-library manifest authority across Scene and Components Scene#27 — is a
ui profile's component library the same thing as a Components presentation library?
Consolidates #10, #80, #157, #158, #159, #160, #161, #162 — detail in the comment below.
Status
State: Done — Closed by einari; follow-up StudioIssues#630. Registry reconciled by L0 sweep.
Branch: -
Scope: As described above.
Delivered: Nothing yet.
Remaining: To be confirmed.
Follow-ups: None.
Activity
cratis-direct commentedon Aug 27, 2026
Thanks for opening this - it has been received and will be looked at.
Posted by Stagehand (AI) - an autonomous agent, not a person. Review accordingly.
cratis-direct commentedon Aug 27, 2026
Thanks for opening this - it has been received and will be looked at.
Posted by Stagehand (AI) - an autonomous agent, not a person. Review accordingly.
woksin commentedon Sep 6, 2026
Program kickoff and scoping have started locally as part of the coordinated end-to-end Screenplay/Stage/Studio/CLI delivery effort tracked in Cratis/Screenplay#174. This issue is in a later/nonblocking lane, not a prerequisite for the first deterministic backend delivery. @woksin is coordinating in dependency order with repository-specific AI corpus instructions and specifications. Existing work/PRs will be reconciled rather than duplicated. This is a kickoff, not a completion claim or a claim that a coding branch exists for this issue; focused progress, verification evidence and blockers will follow here.
[-]Studio editor architecture: chrome vs. preview surface[/-][+]Screen editor: make the Scene designers editable and retire the legacy wireframe editor[/+]einari commentedon Sep 24, 2026
What the eight consolidated issues asked for, and where each one stands
Verified against
Cratis/Studio@main(Source/Editor/,Source/Editor/README.md) on 2026-09-24.PreviewSurface.tsx,SelectionOverlay.tsx; design-mode question resolved in favour of chrome-side injection viadata-scene-idPrototypeEditorclassifyFormFields(AutoMapped/Renamed/Composed/Broken, so a renamed command property shows broken in the designer instead of only at build),summarizePopulateSource,FormDesigner.tsxcommandPropertiescomes from; rename affordance; populate-source picker interaction;compose usinghandoff; live previewaggregateNavigationItemsWithSource(runs the identical aggregationNavBaruses, but keeps the item↔contribution pairing),groupNavigationItemsproposeResourceKey,computeMissingTranslations, per-locale table.strings(needs a backend endpoint over Screenplay's ownStringsFile); the extract action's file mutation; hooking it to a selected literalui profile+ theme configurationfindComponentCollisions(reusesresolveComponentName),filterCompatibleThemes(reusesisThemeCompatible), routed Blueprint page composing all four package bundles.play, or Studio holding it in its own model. That decides the State Change/State View slice shapes. Then: drag-reorder, platform/size-class inputs, component pickerfindMissingVariants(reusesevaluateFreeformArrangement)selectableStarterThemes, starter picker, sandboxed profile viabuildStarterProfile, filtered theme switcher, gallery list{property}style, visible in the previewTwo known Scene-side limits surfaced by the Blueprint page
var(--surface-card), so only CSS reading Scene's variables follows. Against a dark PrimeReact host you get a light shell with dark cards. The package's own answer swaps the stylesheet globally, which an embedded preview cannot do.dataTableresolves away from PrimeReact in a full profile —Cratis.Componentsoutranks PrimeReact for that name and its implementation is Arc-bound, so the gallery showsMissing query binding. That is the designed indicator, not a failure.Migration order recommended by the spike
ScreenTemplateEditorfirst — standalone, smaller.Source/Scene/Prototypes/Editor/WireframeElement/ontoScene.Modelmutations.EventModelingEditoronce the new path has parity.einari commentedon Oct 2, 2026
#394 (PR Cratis/Studio#1501) takes the necessary part of this, by decision.
Delivered in that PR
ScreenTemplateEditoronto the Scene model: it opens a Scene document and edits it in the same window, surface, palette and inspector as the floating editor.EventModelingEditor's floating editor onto the Scene model. The screen is drawn by@cratis/scene.reactthrough the same name resolution Play uses, and edited only through Scene'sapplyEditwith inspection throughinspect.InsertNodeEdit,MoveNodeEdit,RemoveNodeEdit,SetProperty), with drop regions computed from the model so empty containers and insertion markers need no renderer flag.Left here
Source/Scene/Prototypes/Editorand theUIElementhierarchy. Other readers still use it: the board thumbnails, the Viewer andComponents/TemplateEditorread the prototype element shape, and the editor still saves that projection beside every document.[-]Screen editor: make the Scene designers editable and retire the legacy wireframe editor[/-][+]Complete the Scene-based editor with package designers and design-time actions[/+]einari commentedon Oct 8, 2026
Implementation plan
Screens release: Cratis/Scene#7.
Prerequisites: Cratis/Scene#70, Cratis/Scene#75.
Audit current ScreenEditorWorkspace and migrated ScreenTemplateEditor/EventModelingEditor consumers against the historical Complete the Scene-based editor with package designers and design-time actions #156 checklist; distinguish shipped work from remaining legacy paths.
Add package extension discovery and host rendering for whole-component/internal/property editors and action menus, using Scene descriptors and optional design bundles.
Route all edits/actions through existing controller validation, exposure and undo/redo. Keep design chrome outside unmodified Scene rendering.
Test a third-party plugin in Studio and the embeddable editor, then remove only legacy paths proven unused or fully migrated.
Completion evidence: link implementation PRs and the tests/results for every checkbox under
## Acceptance criteria; keep release dependency links current. This is a proposed implementation plan, not a claim that the work or tests have already run.woksin commentedon Oct 9, 2026
Recommendations for when you get to this
You own this one, and you have already started it, so this is not a takeover. These are our answers to the open points, in case they save you time. Ignore anything that does not fit what you are building.
Stored UI profile
.playui profile/themeis the source of truth (decision 0012, Preserve the complete authored UI in Screenplay export, import and Play #165). Studio's event-sourced profile is only the authoring working copy. It should have the same shape as Screenplay's and export and import without loss.layoutpackages(keeps the order)iconsthemetokens.playis reported as a classified loss, not dropped silently.Scope
Deleting the legacy editor
Source/Scene/Prototypes/Editor/and its .NET/TS model mirror to Move saved screens to screen documents with an explicit data migration, not conversion on open #470. The board thumbnails, the Viewer and the TemplateEditor still read the prototype shape, so deleting it here would drag the saved-screen migration into this issue.Trusted bundles
scene-package-catalog.json, and only in the editor, never at runtime.Action results
applyEdit. They then take the normal path to.play, which decision 0012 already settles. Validation, exposure and undo/redo then come for free.Shout if you disagree, einari.
einari commentedon Oct 12, 2026
Final conformance refresh (2026-10-12). Public vector: CLI 3.53.1 (latest) +
cratis/stage:4.73.1+ Screenplay 4.137.0 + corpusCratis.Screenplay.CanonicalCorpus4.139.0, viarun-public-acceptance.sh: live-Stage browser PASSED 76 assertions / 0 blockers (60 + 16 history/guarded assertions added by Screenplay#671, merged), render-audit PASSED (62 artifacts byte-identical and portable,CLI-RENDER-007/008refusals exit 5, stale managed artifact refused, 45 declarations recovered), MCP transcript PASSED (38 tools, stale apply refused, apply, reopen). Generated React on the same CLI/Stage pair: 70 passed / 0 blockers. Local Studio (Playwright screen-editor-dom): 18/18. Production Studio 0.157.7 scratch vector: save PASS, export PASS (lossy), import PASS (lossy,STUDIO0026), Play chrome PASS, Play content blocked (no Stage pod schedulable: cluster CPU).Not closing. Status on Studio 0.157.7 (production is on this version): package designers/actions load and fail safely in Studio and the embedded editor (#1637, #1642; Playwright
extensions.spec.ts2/2), per-component CommandForm and Form editors (#1685), no raw-JSON property editors: structured recursive Object/Collection editors with an undescribed-property diagnostic (#1686, Scene 4.19), template preview and input-widget command feeding (#1660). Local Playwright vector 18/18.Remaining gaps: the migration/deletion checklist is unfinished: drag/drop, resize and multi-select on Scene.Model mutations (ScreenTemplateEditor and EventModelingEditor migration), 'make the six designers editable', and deleting
Source/Scene/Prototypes/Editor/; Scene PrimeReact descriptors still declare chart options/style, selection, icons and tree columns as plain Json (Studio now shows a 'Properties without an editor' diagnostic for them instead of a text box); the extension-loading proof ran against the local Studio only, not production.einari commentedon Oct 12, 2026
Gap run (2026-10-12). Scene PrimeReact descriptors now describe every structured property (chart options/style/data, treeTable columns/nodes/selection, dataScroller items, multiStateCheckbox options/icons/value) - Scene#91, 4.22.0 - and Studio#1718 edits them with no JSON text; Playwright
structured-properties3/3 asserts no 'Properties without an editor'. Not closing.einari commentedon Oct 13, 2026
Closing; the unfinished editor migration is tracked in the new follow-up Cratis/StudioIssues#630.
Proven: package designers/internal designers, custom property editors and contextual design actions hosted through the Scene extension contract with safe fallback (Studio #1637, #1642; Playwright
extensions.spec.ts2/2 in Studio and the embedded editor); owner-defined visible/enabled state and inherited exposure, action/edit batches in validation/save/undo-redo and keyboard interaction; preview on the real Scene renderer; no JSON-text property editors - recursive Object/Collection editors and package-registered editors (#1686, Scene #91 describing every PrimeReact structured property, #1718,structured-properties.spec.ts3/3); per-component CommandForm/Form editors (#1685); a package can customize its own component without Studio maintaining another schema.Not done (#630): the legacy-editor audit/record,
ScreenTemplateEditor/EventModelingEditormigration, making the six designers editable, deletingSource/Scene/Prototypes/Editor/, and the extension-loading proof against the deployed Studio.Final public acceptance (2026-10-13),
run-public-acceptance.shagainst the newest public releases: CLI 3.59.0 (Homebrewcratis3.59.0) +cratis/stage:4.92.0(the CLI default; Stage 4.93.0 is published too) + Screenplay 4.153.0 withCratis.Screenplay.CanonicalCorpus4.153.0 (read from the NuGet package) + Scene 4.22.1 (npm + NuGet) + AI 7.46.0 + production Studio 0.170.1 (core2/2 ready):CLI-RENDER-007/008refusals); MCP stdio transcript: passed (41 tools, stale apply refused, apply, reopen); production Studio scratch vector: passed, 14 steps (corpus ZIP imported with 0 compiler notes, board drew, a layout authored/saved/survived reload, Screenplay file + folder export, Play rendered the application on a Stage pod with no unresolved component, Stop restored the chrome, scratch project deleted).agents/wave2/closer2-evidence/public-acceptance-cli-3.59.0/.