Files
HartOMat/docs/workflows/WORKERS.md
T

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:

  1. stabilize runtime and output-type contracts
  2. formalize module-backed node definitions
  3. organize editor authoring around those contracts
  4. 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_file and order_line concerns 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-contracts
  • workflow/block-b-module-unification
  • workflow/block-c-starter-graphs
  • workflow/block-d-output-type-contracts
  • workflow/block-e-editor-organization
  • workflow/block-f-run-inspection
  • workflow/block-g-parity-golden-cases
  • workflow/block-h-cad-material-parity
  • workflow/block-i-rollout-regression-gates

Preferred integration order:

  1. Block A
  2. Block D
  3. Block B
  4. Block C
  5. Block E
  6. Block F
  7. Block H
  8. Block G
  9. 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.py
  • backend/app/domains/rendering/workflow_schema.py
  • backend/tests/domains/test_workflow_node_registry.py
  • backend/tests/domains/test_workflow_schema.py
  • frontend/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_*, and legacy_source authoritative 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.py
  • backend/app/domains/rendering/workflow_executor.py
  • backend/app/domains/rendering/workflow_graph_runtime.py
  • backend/app/domains/rendering/tasks.py
  • backend/app/domains/pipeline/tasks/render_order_line.py
  • backend/tests/domains/test_workflow_graph_runtime.py
  • backend/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.py
  • backend/app/domains/rendering/workflow_builder.py
  • backend/app/api/routers/admin.py
  • frontend/src/api/workflows.ts
  • seed/migration helpers and related tests

Tickets:

  • maintain canonical cad_file and order_line starter 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.py
  • backend/app/domains/rendering/output_type_contracts.py
  • backend/app/api/routers/output_types.py
  • backend/alembic/versions/065_output_type_workflow_contracts.py
  • backend/alembic/versions/066_output_type_invocation_overrides.py
  • backend/tests/domains/test_output_types_api.py
  • frontend/src/api/outputTypes.ts
  • frontend/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.tsx
  • frontend/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.py
  • backend/app/domains/rendering/models.py
  • backend/app/domains/rendering/schemas.py
  • frontend/src/api/workflows.ts
  • frontend/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 /workflows without 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.py
  • backend/app/api/routers/products.py
  • backend/app/domains/pipeline/tasks/export_glb.py
  • backend/app/domains/pipeline/tasks/extract_metadata.py
  • backend/app/services/part_key_service.py
  • frontend/src/components/cad/InlineCadViewer.tsx
  • frontend/src/components/cad/ThreeDViewer.tsx
  • frontend/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.py
  • backend/app/domains/rendering/workflow_comparison_service.py
  • backend/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
  • /workflows supports 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