Skip to main content

Workflow

Workflow is the managed DAG authoring and execution capability for scheduled Spark notebook workloads. It is distinct from the connector-ingestion feature documented as Pipeline.

Assessment scope​

FieldValue
ActorsWorkflow viewer, editor, administrator, platform administrator, and workflow services
Product validationNot yet recorded
Components assessedsparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, sparqd/workflow-resource-monitoring, sparqd/spark-recommendation, sparqd/platform-stacks, and Airflow
Assessed environmentRealm gj76anadpsc; workspace w-t5e2kcxjd
Source baselineOqullus 8c9f240410b2; BFF 9b2fd45a4da1; workflow-backend d3d6a3ad7313; workflow-resource-monitoring 8665dd6efe13; platform-stacks a71390d12463
Last verified3 September 2026

This assessment covers workflow discovery, authoring, validation, persistence, DAG publication, synchronization, schedules, manual runs, pause, clone, delete, runs, tasks, logs, XCom, clear and mark-state actions, notification implementation readiness, resource monitoring, authorization, caching, and recovery. It also covers Airflow metadata lifecycle, long-running Spark log transport, workflow concurrency, and managed execution capacity.

Connector creation and ingestion execution are excluded; those belong to Pipeline. Airflow-native DAGs that have no managed workflow record are also outside the managed Workflow contract.

Current capability boundary​

CapabilitySource-backed stateDeployment evidence
List, search, filter, sort, and pinWorkflow-backend is canonical; UI uses itWorkflow-list filters are source-wired; live role and scale matrix pending
Create and editUI submits managed workflow definitions; backend persists and publishes DAG artifactsEnd-to-end create/update evidence pending
Run as UserIncomplete and incorrectly exposedOqullus displays and submits the field and workflow-backend persists it, but the reviewed DAG-generation and runtime paths do not apply it as the execution identity; hide it until completion
Spark task authoringSingle-task and multi-task Spark Kubernetes forms are exposedLive execution matrix pending
Condition, Empty, and Workflow Trigger tasksBackend contract and compiler support existNot exposed by the current Workflow form
Semantic validation warningsBackend validation endpoint existsCurrent UI does not call or display it
Projects and permissionsThe frontend uses the backward-compatible single-project path; omitted project_id resolves to coreCurrent single-project mode is deployed. Multi-project selection and OpenFGA-backed capabilities are implemented in backend source but not rolled out
Synchronization stateCreating, Applying changes, Ready, and Needs attention are modeledFailure and recovery evidence pending
Pause and unpauseRouted through workflow-backendRole matrix and reconciliation evidence pending
Runs, tasks, logs, XCom, graph, grid, clear, and mark stateWorkflow-backend has workflow-scoped routes and OpenFGA checks in sourceImplemented but inactive: UI/BFF use the generic Airflow path and deployed OpenFGA is not activated; run-state filtering is not in the Airflow list-runs contract
NotificationsIncomplete and incorrectly exposedOqullus exposes workflow assignment controls without channel management; workflow-backend has unscoped channel CRUD, returns config, implements AWS-only secret synchronization, and emits DAG callbacks; deployed delivery is unverified
Resource monitoringUI, BFF proxy, and dedicated backend source existImplemented in pieces but not integrated by current KCL; see the subfeature assessment for deployment, trust, security, and scale boundaries
Airflow metadata lifecycleOne 20 GiB, single-replica PostgreSQL database; no cleanup, capacity alert, or rehearsed upgrade lifecycle identifiedSource-verified; deployed growth, backup/restore, and migration evidence pending
Long-running Spark logsAirflow reads and combines the complete available log before offset slicing; the UI omits the continuation token and requests the growing complete log every five secondsSource-verified; ten-minute buffering user-observed; deployed byte and scale evidence pending
Concurrency and capacityMax Active Runs is user-configurable; KubernetesExecutor and Karpenter provide task-pod and node elasticitySource-verified; workspace admission, queue feedback, scheduler HA, and tested scale boundaries pending

Critical journeys​

JourneyRequired result
CreateValidate, persist one canonical workflow, publish one revision, show synchronization, and preserve errors
EditPreserve identity, warn about unsaved changes, publish a new revision, and never leave an old DAG orphaned
ScheduleShow the effective cron and timezone, distinguish paused from unscheduled, and verify the next run
Run nowApply the active access contract, create exactly one run, and handle partial unpause/trigger failure safely
ObserveKeep definition state separate from Airflow runtime state and label stale or unavailable observations
RecoverExpose actionable synchronization failure, retry, edit, delete, and operator escalation paths
Clear or mark stateApply the supported legacy role today and the specific workflow capability after OpenFGA rollout; confirm scope, audit, and refresh consistently
DeleteApply the active access contract to canonical workflow identity and remove definition, artifacts, authorization state, and runtime visibility coherently
Dependency failureDistinguish workflow-backend, Git, Airflow, authorization, monitoring, and cache failures
Capacity and upgradePrevent metadata exhaustion, retain recoverable history, and rehearse database migration before production upgrade
Long-running workloadKeep log reads bounded and preserve workload observability without coupling application lifetime to an Airflow task pod
Load burstApply workflow intent and workspace admission while the platform scales schedulers, task pods, and nodes internally

Findings​

Use this table as the register. Components identifies code repositories or runtime systems involved; it is not a person or team assignment. Each detailed finding states what must change in each listed component.

IDFindingComponentsEvidenceImpact
ARCH-WF-001Route runtime operations through the managed workflow boundarysparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, AirflowDeployed split path source-verified; target path inactiveHigh
ARCH-WF-002Wire one canonical Resource Monitoring backend through KCLsparqd/oqullus, sparqd/bff-api, sparqd/workflow-resource-monitoring, sparqd/spark-recommendation, sparqd/platform-stacksBackend source exists; current KCL wiring absent; live request pendingHigh
ARCH-WF-003Expose concurrency intent and manage Airflow capacity internallysparqd/oqullus, sparqd/workflow-backend, Airflow, sparqd/platform-stacks, Karpenter, Kubernetes, PostgreSQLSource-verified; scale boundaries pendingHigh
DATA-WF-001Preserve canonical identity when a workflow name changessparqd/workflow-backend, sparqd/oqullus, DAG Git, Airflow, monitoringSource-verifiedHigh
DATA-WF-002Bind Resource Monitoring to task executions, not workflowssparqd/workflow-resource-monitoring, sparqd/spark-recommendation, sparqd/workflow-backend, sparqd/bff-api, sparqd/oqullus, Airflow, SparkSource-verifiedHigh
DATA-WF-003Replace periodic snapshots with execution-lifecycle metricssparqd/workflow-resource-monitoring, sparqd/spark-recommendation, sparqd/platform-stacks, Prometheus, Kubernetes, SparkSource-verified; collector not KCL-deployedHigh
OPS-WF-001Prevent Airflow metadata exhaustion and rehearse upgradessparqd/platform-stacks, Airflow, KubeBlocks, PostgreSQL, platform operationsSource-verified; deployed capacity and recovery evidence pendingCritical
PERF-WF-001Bound Workflow polling and request fan-outsparqd/oqullus, sparqd/bff-api, sparqd/workflow-backendSource-verified; scale pendingHigh
PERF-WF-002Stop re-downloading growing Spark logs through Airflowsparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, Airflow, Spark, sparqd/platform-stacks, Loki, AlloySource-verified; deployed volume and failure evidence pendingHigh
PROD-WF-001Expose backend task types and semantic validation coherentlysparqd/oqullus, sparqd/workflow-backendSource-verifiedHigh
PROD-WF-002Make the single-project compatibility mode explicit before multi-project rolloutsparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, OpenFGACurrent mode source-verified; future mode inactiveMedium
PROD-WF-003Never substitute generated metrics for unavailable monitoringsparqd/oqullus, resource-monitoring serviceSource-verifiedHigh
PROD-WF-004Hide notifications until the channel and delivery contract is completesparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, sparqd/platform-stacks, AirflowSource-verified; deployed delivery unverifiedHigh
PROD-WF-005Hide Run as User until execution identity is enforcedsparqd/oqullus, sparqd/workflow-backend, Airflow, Spark, storage, TrinoSource-verifiedHigh
REL-WF-001Make synchronization failure and retry actionablesparqd/oqullus, sparqd/bff-api, sparqd/workflow-backendSource-verifiedHigh
REL-WF-002Fail closed while workflow state is unknownsparqd/oqullus, sparqd/bff-api, sparqd/workflow-backendSource-verifiedHigh
REL-WF-003Reconcile Git publication with workflow database statesparqd/workflow-backend, DAG Git/publisher, operationsSource-verified; fault injection pendingHigh
REL-WF-004Keep Run now and pause state consistentsparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, Airflow, sparqd/platform-stacksRoot cause source-verified; deployed request capture pendingHigh
REL-WF-005Reconcile a cleared run without adding a grid columnsparqd/oqullus, sparqd/workflow-backend, AirflowUser-observed; source risk verifiedHigh
SEC-WF-001Block multi-project rollout until runtime authorization is activesparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, OpenFGA, AirflowSingle-project legacy path source-verified; future enforcement inactiveCritical rollout blocker
SEC-WF-003Protect monitoring now and add resource scoping before multi-project rolloutsparqd/bff-api, sparqd/workflow-backend, resource-monitoring service, OpenFGACurrent service boundary source-verified; resource scoping inactiveHigh
SEC-WF-004Never delete an unmatched DAG name without authorizationsparqd/bff-api, sparqd/workflow-backend, OpenFGA, DAG Git/operationsSource path verified; deployed role evidence pendingCritical
SEC-WF-005Add Pin to workflow authorization before multi-project rolloutsparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, OpenFGASingle-project path source-verified; future enforcement inactiveHigh rollout blocker
UX-WF-001Protect unsaved workflow editssparqd/oqullus; sparqd/workflow-backend only for server draftsSource-verified; live refresh pendingMedium
UX-WF-002Make run filters match the Airflow query contractsparqd/oqullus, sparqd/bff-api, sparqd/workflow-backend, AirflowSource-verified; live blocked at sign-inMedium
UX-WF-003Present complete and trustworthy selected-run detailssparqd/oqullus, sparqd/workflow-backend, AirflowSource-verifiedMedium

Boundaries and interim workarounds​

  • Treat Spark Kubernetes as the only task type exposed by the current UI.
  • Treat core as the backend-resolved compatibility project, not a value the user selected. Multi-project Workflow is not rolled out in the frontend.
  • Do not infer authorization from visible buttons. The current UI does not consume the source-defined per-workflow permission flags, and OpenFGA is not activated in the assessed deployment.
  • Treat Notifications as incomplete despite the visible multi-task assignment controls. Hide or capability-gate them until scoped channel management, secret redaction, environment-specific connection synchronization, runtime delivery, and failure feedback are verified. See PROD-WF-004.
  • Do not expose incomplete capabilities. Hide Run as User from create, edit, clone, and detail until its runtime identity contract is implemented and verified. Do not infer the Airflow, Spark, storage, or Trino principal from the currently persisted value. See PROD-WF-005.
  • Do not use generated resource-monitoring sample values for capacity or cost decisions. See the Resource Monitoring assessment.
  • Treat Spark recommendations as advice for a future Workflow task run. Do not use the copied runtime Python to change driver/executor resources, and do not assume generated advice is validated or effective. See the Spark Recommendation assessment.
  • Avoid renaming an existing workflow until old DAG artifact cleanup is part of the supported lifecycle.
  • Preserve work externally before refreshing or leaving an unsaved form.
  • Treat the run-state selector as unreliable until it uses a supported backend contract. The 365 and All options can exceed Airflow's configured page limit.
  • After clearing, compare unique dag_run_id values in the network response; do not infer a new run from an extra rendered column alone.
  • Use the authorized runtime API or Airflow when logical date, data interval, trigger origin, configuration, or note is required; the current selected-run panel omits them.
  • Monitor Airflow PostgreSQL capacity externally and preserve cleanup headroom; do not begin archive-producing cleanup only after the 20 GiB volume is nearly full. See OPS-WF-001.
  • Close or leave live Log views when continuous output is unnecessary. The current five-second refresh omits Airflow's continuation token, causing a complete growing-log response each time; even correct continuation would not prevent Airflow 2.10/2.11 from reading and reconstructing the complete source before slicing. Remote object logging is not a guaranteed independent live tail. See PERF-WF-002.
  • Use Max Active Runs to limit overlap. Keep scheduler, worker, pool, node, and database controls platform-managed; they are not supported workflow inputs. See ARCH-WF-003.
  • For a workflow in Needs attention, edit or delete is available, but the backend synchronization retry is not exposed through the current BFF/UI.
  • Runtime closure requires role-based evidence in gj76anadpsc, workspace w-t5e2kcxjd; source verification alone does not prove deployed configuration.