12 KiB
Workflow Worker Orchestration
Purpose
This file defines the parallel work split to bring /workflows to full production-capable parity while keeping the legacy workflow operational at all times.
The orchestration is intentionally contract-first:
- stabilize runtime and output-type contracts
- formalize module-backed node definitions
- organize editor authoring around those contracts
- prove parity with dual-run and golden-case validation
Non-Negotiable Constraints
- Legacy workflow dispatch must remain callable throughout the migration.
- Mixed-family graphs may exist for migration visibility, but new authoring must converge on family-safe graphs.
- No worker may revert unrelated user changes in the dirty worktree.
cad_fileandorder_lineconcerns must be separated explicitly in contracts, editor palette organization, and output-type validation.- A worker may only edit files in its assigned ownership scope unless the handoff section explicitly allows expansion.
Shared Acceptance Baseline
Each worker block is only complete when all of the following hold:
- targeted tests for the touched scope pass
- legacy-safe behavior is preserved or explicitly guarded with fallback
- the changed API surface is reflected in frontend/backend types where applicable
- docs and seed/default data stay aligned with the runtime behavior
Branching And Commit Order
Suggested branch naming:
workflow/block-a-node-contractsworkflow/block-b-module-unificationworkflow/block-c-starter-graphsworkflow/block-d-output-type-contractsworkflow/block-e-editor-organizationworkflow/block-f-run-inspectionworkflow/block-g-parity-golden-casesworkflow/block-h-cad-material-parityworkflow/block-i-rollout-regression-gates
Preferred integration order:
- Block A
- Block D
- Block B
- Block C
- Block E
- Block F
- Block H
- Block G
- Block I
Worker Blocks
Block A: Node Contract Closure
Purpose: Turn the node registry into the canonical module contract source for every editor-visible graph node.
Primary ownership:
backend/app/domains/rendering/workflow_node_registry.pybackend/app/domains/rendering/workflow_schema.pybackend/tests/domains/test_workflow_node_registry.pybackend/tests/domains/test_workflow_schema.pyfrontend/src/api/workflows.ts
Tickets:
- audit every editor-visible node for missing or weak param schemas
- close real settings gaps for graph-authorable nodes, especially export and CAD bridge nodes
- make
family,module_key,input_contract,output_contract,artifact_roles_*, andlegacy_sourceauthoritative and complete - strengthen family-aware graph validation in the backend schema layer
Acceptance criteria:
- every editor-visible node has a machine-usable contract
- no node required for still-render parity is missing editable settings
- backend rejects family-invalid graphs with clear errors
Dependencies:
- none
Block B: Module Unification
Purpose: Route graph and legacy execution through the same reusable production-module layer wherever parity nodes already exist.
Primary ownership:
backend/app/domains/rendering/workflow_runtime_services.pybackend/app/domains/rendering/workflow_executor.pybackend/app/domains/rendering/workflow_graph_runtime.pybackend/app/domains/rendering/tasks.pybackend/app/domains/pipeline/tasks/render_order_line.pybackend/tests/domains/test_workflow_graph_runtime.pybackend/tests/domains/test_workflow_runtime_services.py
Tickets:
- reduce duplicate behavior split across legacy task code and graph adapters
- ensure async task wrappers are transport, not business-logic owners
- close remaining drift for still, turntable, and blend export paths
Acceptance criteria:
- graph and legacy call the same module behavior for extracted parity nodes
- parity bug fixes land once in the shared module layer
- fallback to legacy still works on graph failure
Dependencies:
- Block A
Block C: Canonical Starter Graphs And Seeds
Purpose: Keep live workflow definitions, blueprints, and starter templates aligned with the corrected canonical graphs.
Primary ownership:
backend/app/domains/rendering/workflow_config_utils.pybackend/app/domains/rendering/workflow_builder.pybackend/app/api/routers/admin.pyfrontend/src/api/workflows.ts- seed/migration helpers and related tests
Tickets:
- maintain canonical
cad_fileandorder_linestarter graphs - backfill or normalize existing seeded workflow definitions safely
- prevent drift between backend canonical graphs and frontend starter generation
Acceptance criteria:
- starter workflows are family-safe and match backend canonical topology
- existing seeded workflows can be repaired without manual DB surgery
- frontend new-workflow creation matches backend canonical graph shape
Dependencies:
- Block A
Block D: Output-Type Invocation Contracts
Purpose: Turn output types into explicit workflow invocation profiles instead of loose legacy renderer presets.
Primary ownership:
backend/app/models/output_type.pybackend/app/domains/rendering/output_type_contracts.pybackend/app/api/routers/output_types.pybackend/alembic/versions/065_output_type_workflow_contracts.pybackend/alembic/versions/066_output_type_invocation_overrides.pybackend/tests/domains/test_output_types_api.pyfrontend/src/api/outputTypes.tsfrontend/src/components/admin/OutputTypeTable.tsx
Tickets:
- finalize explicit
workflow_family,artifact_kind, and invocation override semantics - validate output-type and workflow compatibility in create/edit flows
- separate productized invocation settings from raw legacy render settings
- make create/edit UX workflow-first instead of renderer-first
Acceptance criteria:
- new output types can be created reliably against the real backend contract
- invalid workflow-family or artifact combinations are blocked early
- legacy output types remain renderable without forced migration
Dependencies:
- Block A
Block E: Workflow Editor Organization
Purpose: Make the editor usable for production authoring by organizing nodes around families and modules instead of a flat mixed palette.
Primary ownership:
frontend/src/pages/WorkflowEditor.tsxfrontend/src/components/workflows/frontend/src/__tests__/components/
Tickets:
- organize palette and search around family, module, and execution role
- support low-friction node insertion from canvas context actions
- reduce top-of-page control bloat and move graph actions closer to the canvas
- improve graph readability with automatic alignment/layout and cleaner inspector behavior
- preserve delete/edit flows for nodes and edges
Acceptance criteria:
- authoring a family-safe graph is materially faster than today
- node discovery works from both sidebar and canvas-local actions
- editor UX follows the backend-owned contracts instead of bespoke per-node logic
Dependencies:
- Block A
- Block D for workflow-first output-type interactions that deep-link into editor usage
Block F: Run Inspection And Workflow Debugging
Purpose:
Make /workflows operationally useful by exposing preflight, dispatch, run records, node outputs, and failure surfaces cleanly.
Primary ownership:
backend/app/domains/rendering/workflow_router.pybackend/app/domains/rendering/models.pybackend/app/domains/rendering/schemas.pyfrontend/src/api/workflows.tsfrontend/src/components/workflows/- runtime/run inspection tests
Tickets:
- complete workflow run inspection UI
- expose node-level statuses, outputs, timings, and key artifacts
- make preflight and manual dispatch part of the normal debugging flow
Acceptance criteria:
- a failed graph run can be debugged from
/workflowswithout jumping through ad hoc DB inspection - node-level outputs are visible enough to diagnose broken contracts and missing artifacts
Dependencies:
- Block A
- Block B
Block G: Golden-Case Parity Suite
Purpose: Prove graph parity against legacy for representative render cases before broad rollout.
Primary ownership:
scripts/test_render_pipeline.py- parity fixtures, comparison tooling, and integration tests
docs/workflows/WORKFLOW_DELIVERY_CHECKLIST.md
Tickets:
- define representative still, turntable, blend, and failure golden cases
- automate legacy-vs-graph comparison for outputs and key side effects
- capture artifacts and logs needed for regression triage
Acceptance criteria:
- golden cases pass for at least one real still-render graph and one legacy fallback path
- parity regressions are reproducible and attributable to specific nodes or contracts
Dependencies:
- Block B
- Block C
- Block F
- Block H for CAD/material-sensitive cases
Block H: CAD/Material Parity
Purpose: Restore parity for GLTF/USD preview identity, material assignment, and instance-aware part mapping so graph workflows consume trustworthy geometry state.
Primary ownership:
backend/app/api/routers/cad.pybackend/app/api/routers/products.pybackend/app/domains/pipeline/tasks/export_glb.pybackend/app/domains/pipeline/tasks/extract_metadata.pybackend/app/services/part_key_service.pyfrontend/src/components/cad/InlineCadViewer.tsxfrontend/src/components/cad/ThreeDViewer.tsxfrontend/src/components/cad/cadUtils.ts- CAD/material tests
Tickets:
- close instance-aware part identity drift in viewer and export pipeline
- restore reliable missing-material assignment and library mapping
- ensure graph nodes consume the same geometry/material truth as legacy-render preparation
Acceptance criteria:
- product preview and GLTF viewer show consistent material assignment on representative legacy products
- manual material repair workflows remain intact
- downstream render nodes receive stable part/material identities
Dependencies:
- Block A
- Block B
Block I: Rollout And Dual-Run Regression Gates
Purpose: Keep graph rollout safe by enforcing shadow-mode parity checks, fallback behavior, and rollback paths per workflow/output type.
Primary ownership:
backend/app/domains/rendering/dispatch_service.pybackend/app/domains/rendering/workflow_comparison_service.pybackend/tests/domains/test_workflow_dispatch_service.py- rollout docs and runbooks
Tickets:
- formalize shadow-mode regression gates
- make rollout decisions per workflow or output type
- preserve immediate rollback to legacy
- encode comparison thresholds and operational readiness checks
Acceptance criteria:
- shadow mode can run on representative workflows without affecting authoritative outputs
- rollout and rollback are explicit and test-backed
- graph error handling stays at or below legacy operational risk
Dependencies:
- Block B
- Block G
First-Wave Parallelization
Run these blocks in parallel first:
- Block A: Node contract closure
- Block D: Output-type invocation contracts
- Block E: Editor organization audit and contract-driven UX split
- Block I: Rollout and dual-run regression gate design
Reason:
- they have the highest leverage on all remaining work
- they define the contracts the later E2E and parity work must obey
- they are separable enough to run in parallel with minimal file overlap if ownership is respected
Cross-Block Handoffs
- Block A hands canonical node/module contracts to Blocks B, C, E, and H.
- Block D hands stable output-type invocation semantics to Blocks E and I.
- Block H hands trustworthy geometry/material identity to Blocks G and I.
- Block F and G jointly define ship-readiness for
/workflows.
Quality Gates By Orchestration Stage
Stage 1: Contract Gate
- Blocks A and D merged
- backend and frontend contracts aligned
- new workflows and new output types validate against the same source of truth
Stage 2: Runtime Gate
- Block B merged
- canonical starter graphs from Block C verified
- no regression in legacy dispatch behavior
Stage 3: Authoring Gate
- Block E and Block F merged
/workflowssupports real authoring, preflight, dispatch, and inspection
Stage 4: Parity Gate
- Block H and Block G merged
- at least one non-legacy still-render workflow passes end to end against a representative product
Stage 5: Rollout Gate
- Block I merged
- shadow mode, rollback, and comparison thresholds are operationally usable