ADRs
ADR 0069 — Workflow tab hosts the artboard Studio editor (supersedes ADR 0067 §Decision.2 + W2)
  • Status: Accepted; §Decision.2 + W2 (below) superseded 2026-07-27 by the tab removal
  • Date: 2026-07-14
  • Deciders: maintainer
  • Scope: apps/web — the workflow sidebar section, its Workflow header tab
  • Supersedes: ADR 0067 §Decision.2 and invariant W2
  • Superseded in part by: the Workflow/Screen tab removal (7be0e11, product decision) — see docs/workflow/contract.md

⚠️ Read this first. The Workflow / Screen tabs were removed on 2026-07-27 (7be0e11): the section is now a single Workflow Studio view. Everything below about "both tabs" — §Decision.2 ("Tela on both canvas-class tabs") and the reversed W2 ("both tabs host Tela") — is historical. The live rule is: one view, exactly one Tela. This ADR's core decision (Workflow hosts the artboard Studio editor, not the React Flow graph) still holds; only the two-tab framing is retired. Current invariants live in docs/workflow/contract.md.

Context

ADR 0067 split the workflow section into two header tabs: Workflow (the React Flow graph of screens + edges) and Screen (one adaptive screen with Tela). Its invariant W2 pinned "Tela is present only on the Screen tab; the Workflow graph never renders Tela / a device frame."

In practice the graph was never the surface the maintainer wanted first on entry. The 71e0a00 commit had already built the intended Workflow surface — a free 2D Studio editor of composition artboards (ArtboardsCanvas: Tela strip on top, Layers rail, Punta inspector, Dito primitive picker, its own ruler + zoom pill + Library panel) — before the two-tab split moved the graph back onto the Workflow tab and left ArtboardsCanvas mounted nowhere. ADR 0067's own Context even records the intended wiring as workflow → ArtboardsCanvas, fallback WorkflowCanvas.

The maintainer's decision (2026-07-14): the Workflow tab is the artboard Studio editor, not the graph. This puts Tela on the Workflow tab, which W2 forbade — so W2 is reversed here rather than worked around inline (per docs/workflow/contract.md §Versioning, a Tela-placement change requires an ADR amendment).

Decision

  1. The Workflow tab renders the artboard Studio editor. The view === "workflow" branch of app/app/workflow/page.tsx mounts the standard Studio composition — StudioDndShell wrapping LayersSidebar + Tela + ArtboardsCanvas + Punta

    • Dito — identical in shape to /app/library (ADR 0063) and to the Screen tab. This restores the 71e0a00 surface.
  2. Tela is present on both canvas-class tabs. Both Workflow (free 2D artboard canvas) and Screen (single adaptive project screen) host Tela and the Studio rails. The tabs differ by canvas type, not by Tela presence:

    • WorkflowArtboardsCanvas: a pan/zoom world of many composition artboards, each an independently editable studio-bus tree.
    • Screen — the project's own screen canvas: one project screen filling the canvas edge-to-edge.
  3. Invariant W2 is retired and replaced (see docs/workflow/contract.md): the new rule is Tela is present on every canvas-class view; the retired React Flow graph is the only Tela-less workflow surface, and it is no longer mounted.

  4. The screen-flow graph is retained, not deleted. WorkflowCanvas (components/workflow-canvas.tsx) stays in the repo — it is still consumed by app/share/page.tsx — but is no longer mounted on /app/workflow. Where the graph lives long-term (its own tab, a zoom-out mode, or dropped) is left open.

Consequences

  • W1 wording changes. "Workflow is first and active on mount" still holds; the clause "shows the graph, never Screen" becomes "shows the artboard Studio editor, never Screen." Updated in contract.md / scenarios.md.
  • W2 is reversed. Both tabs host Tela. The scenario S2 is rewritten from "Tela only on Screen" to "Tela on every canvas-class view."
  • Two Studio surfaces now share the page. Workflow and Screen render the same rail composition around different center canvases. The rails act on whichever studio-bus tree is active; each tab owns its own active-tree lifecycle (ArtboardsCanvas default-selects the first composition artboard on mount).
  • Graph is dormant, recoverable. No behavioural regression for share/ (still imports WorkflowCanvas); re-mounting the graph later is a one-line change.

Alternatives considered

  • Keep the graph on Workflow, put the artboard editor on Screen — rejected by the maintainer (chose the artboard editor on the Workflow tab explicitly).
  • A third "Artboards" tab — rejected as premature; the artboard canvas is the Workflow surface, not an additional one. Revisit only if the graph earns its own tab back.
  • Delete WorkflowCanvas — rejected; share/ still uses it and the graph may return. Dormant-but-present is cheaper than a re-write.

Implementation (2026-07-14, feat/sorg-layout)

  • app/app/workflow/page.tsxview === "workflow" branch swapped from PersistenceLoader > WorkflowCanvas to StudioDndShell > LayersSidebar + Tela + ArtboardsCanvas + Punta + Dito. PersistenceLoader / WorkflowCanvas imports dropped from this file (still used elsewhere). Workflow tab hint updated.
  • docs/workflow/contract.md, docs/workflow/scenarios.md — W1/W2 + S1/S2 updated.
  • docs/adr/0067-workflow-screen-surface.md — Status annotated "§Decision.2 & W2 superseded by ADR 0069."