Skip to content
CSA Loom — the Microsoft Fabric experience for Azure tenants where Fabric isn't yet available: lakehouses, warehouses, notebooks, semantic models, Activator rules, Data Agents, across Commercial, GCC, GCC-High, and DoD IL5

Parity gap — synapse-pipeline

v2 fabric-parity-loop validator, run 2026-05-26. Reference target: Azure Synapse Studio → Integrate → Pipelines (visual canvas + JSON code view). Loom route: https://loom-console-fvbbctd4eehqbkcs.b02.azurefd.net/items/synapse-pipeline/new. Editor source: apps/fiab-console/lib/editors/azure-services-editors.tsx (lines 391-577); shared canvas at apps/fiab-console/lib/components/pipeline/pipeline-dag-view.tsx.

Phase 3 — gap matrix vs Synapse Studio Integrate

# Fabric / Synapse Studio canvas element Loom present? Severity
1 Graph tab with SVG arrows between activities (success/failure/completion/skipped colored edges with arrowheads) MISSING SVG ARROWS — pipeline-dag-view.tsx defines an edgeOverlay CSS class (lines 72-76) but never renders an <svg> element. Edges are emitted as a <Caption1> text line: {e.from} → {e.to} (lines 369-384). The Unicode arrow is the only visual edge indicator. BLOCKER
2 Drag-to-position activity boxes on canvas MISSING — column-based topological layout, no drag (computed via computeRanks line 146-167) MAJOR
3 Right-click / context menu on activity → Edit / Delete / Disable / Duplicate MISSING — no onContextMenu, no popovers MAJOR
4 Activity properties side-pane (per-activity typeProperties form) MISSING — only JSON tab is editable MAJOR
5 Activity palette (drag-to-add OR click-to-add for 50+ activity types) Partial — 8 click-to-add palette entries (Copy/Notebook/Dataflow/Lookup/ForEach/IfCondition/Wait/ExecutePipeline) at lines 183-235. Fabric/Synapse have ~50 activity types. MAJOR
6 JSON spec editor with Monaco + JSON schema validation against ADF pipeline schema MISSING Monaco — plain <textarea> (lines 535-543) BLOCKER
7 Pipeline list tree (with folders) Present (lines 493-505) — flat list, no folder grouping MINOR
8 Run history with status badges + drill-into activity-level run details Present partial (lines 545-573) — table with status, start, duration, invoked-by; no drill-into-activity MAJOR
9 Trigger management inline (Add trigger / Trigger now) MISSING — ribbon claims "Triggers", no handler. Triggers exist as separate editor adf-trigger. MINOR
10 Debug mode (run a single activity, set breakpoints) MISSING — ribbon claims "Debug", no impl MINOR
11 Parameters / Variables / Settings / Output tabs (bottom pane) MISSING — only Graph / JSON / Runs tabs MAJOR
12 Save button + dirty-state indicator Present (lines 513) — real PUT, dirty bit tracked OK
13 Run / Debug / Add trigger / Publish all ribbon Buttons exist as RibbonTab pills (lines 371-373) but no onClick handlers — ribbon-vapor DEAD ribbon

Phase 4 — functional click probe (source-trace)

Control Source impl Live behavior
Save save() (line 438-452) — real PUT /api/items/synapse-pipeline/{name} Real
Run run() (line 454-469) — real POST /api/items/synapse-pipeline/{name}/run Real
Refresh loadPipeline + loadRuns Real
Tab switch (Graph / JSON / Runs) setTab(...) — local state Real
Palette button (Copy / Notebook / Dataflow / etc.) addActivity() — mutates JSON spec via JSON.parse → push → JSON.stringify (lines 477-487) Real
Pipeline tree leaf setSelected(name) Real
Activity node on graph No onClick handler — node is read-only DEAD (can't click an activity to edit it)
Ribbon "Copy data" / "Notebook" / "Stored procedure" / "Mapping data flow" / "Run" / "Debug" / "Triggers" No handlers (RibbonTab actions[].label only) DEAD — 7 ribbon vapor

Grade

D — multiple BLOCKERs.

The graph tab is the headline feature of any pipeline editor; here it renders activities as styled <div> boxes in columns with edges shown as a one-line text caption ({from} → {to}). The very rule in no-scaffold-claims memory explicitly calls this out as the 2026-05-26 regression: "renders columns of <div> boxes with NO ARROWS — edges shown as a paragraph caption". The validator confirms: pipeline-dag-view.tsx:369-384 still emits edges as text spans inside a <Caption1>, not SVG <path> elements. The edgeOverlay CSS class is defined but not used.

Plus the JSON tab is a textarea (BLOCKER #2), 7 ribbon buttons are dead, no Properties/Parameters/Output side panes, no per-activity edit dialog.

Save + Run + Refresh + palette-add are real, which keeps this above F.

Remediation: render a proper <svg> overlay with computed <path d="M..."/> lines + arrowhead <marker> between activity nodes (use the per-node id="activity-node-{name}" already emitted at line 351); replace JSON <textarea> with @monaco-editor/react language="json"; wire activity-node clicks to a Properties pane.