Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

216 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PRD — Workflow V2 External Schedules
- Slug: `workflow-v2-external-schedules`
- Date: `2026-03-08`
- Status: Draft
## Summary
Add a dedicated schedules system for Workflow V2 in Enterprise Edition. Schedules will be managed outside the workflow definition on a new Automation Hub schedules screen, and each schedule will store its own timing and static payload. A workflow may have many schedules, each schedule follows the workflows latest published version, and saved schedule payloads must validate against the workflows pinned payload schema.
## Problem
The current time-trigger work places schedule configuration inside the workflow definition and starts runs with a fixed clock payload contract. That model does not support the actual operator need: define multiple reusable schedules for the same workflow and attach static business payload data to each one.
Without external schedules:
- one workflow cannot easily support multiple scheduled variants
- schedule timing and schedule input are coupled to the workflow draft instead of an operational schedule object
- operators cannot manage schedules globally
- the system cannot validate and persist a schedules real payload independently from the workflow editor
## Goals
- Add a first-class schedule entity for Workflow V2, owned outside the workflow definition.
- Allow many schedules per workflow.
- Let each schedule define:
- required name
- one-time or recurring timing
- saved static payload
- enabled/paused lifecycle state
- Add a global schedules screen in Automation Hub with create, edit, pause/resume, and delete flows.
- Remove inline time-trigger authoring from the workflow editor.
- Keep event-triggered workflows working as they do today.
- Require pinned payload schemas for scheduled workflows in v1.
- Validate schedule payloads on create/edit and again when a new workflow version is published.
- Make schedules follow the latest published workflow version automatically.
## Non-goals
- CE support.
- Fan-out schedules over domain records.
- Per-schedule version pinning in v1.
- Supporting schedules for inferred-schema workflows.
- Adding seconds to cron syntax.
- Duplicating full schedule CRUD inside the workflow editor.
- Broader production-readiness work such as metrics, observability platforms, or feature-flag rollout.
## Users and Primary Flows
1. Automation manager creates a reusable schedule
- User opens Automation Hub and navigates to Schedules.
- User creates a schedule for an existing workflow.
- User chooses one-time or recurring timing.
- User enters a static payload using form mode or JSON mode.
- System validates the payload against the workflows pinned payload schema.
- User saves and enables the schedule.
2. Automation manager maintains many schedules for one workflow
- User views all schedules filtered to a workflow.
- User distinguishes them by required schedule name.
- User edits timing or payload without editing the workflow definition.
- User pauses, resumes, or deletes schedules independently.
3. Automation manager publishes a new workflow version
- User publishes a new version of a workflow with existing schedules.
- System revalidates every schedule payload against the newly published versions pinned payload schema.
- Valid schedules rebind to the new version.
- Invalid schedules are preserved but disabled/marked failed with a visible validation error.
4. Scheduled execution starts a workflow run
- At fire time, the runner loads the schedule record.
- System launches the latest published workflow version bound to that schedule.
- The run input uses the schedules saved payload, not a synthetic clock contract.
- Run provenance still includes schedule metadata so operators can see which schedule fired.
## UX / UI Notes
- Add a new `Schedules` entry under the Automation Hub parent menu.
- The schedules screen is the source of truth for schedule CRUD.
- Show a global list with filters for workflow, trigger type, status, and search.
- Columns should include:
- schedule name
- workflow name
- trigger type
- next fire / run-at
- last fire
- status
- last error
- The schedule dialog should support:
- workflow picker
- required schedule name
- trigger type
- one-time `runAt` or recurring `cron + timezone`
- payload editor with form/json modes
- inline validation errors
- Workflow editor trigger selector should be reduced to:
- No trigger
- Event
- For workflows using no trigger, manual run remains allowed.
- For workflows using event trigger, existing event configuration and mapping UX remain.
- Add a workflow-context link into the schedules screen, prefiltered to the current workflow.
## Requirements
### Functional Requirements
- Introduce a workflow schedule model separate from workflow definitions.
- A workflow can own many schedules.
- Each schedule must belong to one workflow and tenant.
- Each schedule must have a required user-defined name.
- Each schedule must support either:
- one-time timing with `runAt`
- recurring timing with 5-field cron and timezone
- Each schedule must store a static payload JSON document.
- A schedule may only be created for a workflow that has:
- a published version
- a pinned payload schema
- Schedule payload must validate against the workflow payload schema before save.
- Schedule payload must be revalidated when a new workflow version is published.
- Schedules follow the latest published version automatically.
- If a schedule payload is invalid for the latest published version:
- preserve the schedule record
- prevent firing
- surface a validation error in the schedules UI
- Scheduled workflow runs must use the saved schedule payload as `workflow_runs.input_json`.
- Scheduled workflow runs must still store schedule provenance metadata.
- Workflow definitions must no longer use inline `schedule` or `recurring` trigger types for authoring in this feature path.
- Workflow editor publish and run behavior for `No trigger` and `Event` must keep working.
- Users must be able to edit, pause/resume, and delete existing schedules.
### Non-functional Requirements
- Reuse the existing job-runner abstraction for one-time and recurring registration.
- Keep schedule registration and DB persistence coherent from the users point of view.
- Preserve tenant isolation for schedule data and launches.
- Support DB-backed integration coverage for schedule CRUD, validation, and runner registration.
- Keep the implementation EE-only.
## Data / API / Integrations
- Add or revise a workflow schedule persistence model under `shared/workflow/persistence` and its EE migration.
- Change the schedule table from one-schedule-per-workflow to many-schedules-per-workflow.
- Add schedule fields at minimum:
- `id`
- `tenant_id`
- `workflow_id`
- `workflow_version`
- `name`
- `trigger_type`
- `run_at`
- `cron`
- `timezone`
- `payload_json`
- `enabled`
- lifecycle/job-runner metadata already needed for registration tracking
- Add workflow schedule server actions for:
- list
- get
- create
- update
- pause/resume
- delete
- Update publish logic so schedule rebinding and payload revalidation happen whenever the latest published version changes.
- Reuse the existing workflow run schema-fetching and form/json payload editing patterns from the manual run dialog where possible.
- Scheduled job handlers must load the schedule record and launch with `payload_json`.
- Run metadata should include schedule context such as schedule id, schedule name, and trigger timing info.
## Security / Permissions
- Only users with workflow management permissions may create, edit, pause, resume, or delete schedules.
- Schedule CRUD must remain tenant-scoped.
- Saved schedule payloads must be treated like workflow inputs and pass through existing redaction/display rules where applicable.
- Event-trigger permissions and behavior are unchanged.
## Observability
- Use existing workflow run and schedule state fields rather than introducing new observability infrastructure.
- Schedules UI must expose enough state to diagnose why a schedule is not firing:
- enabled/disabled
- last error
- last fire
- next fire or run-at
- Invalid schedules after publish must show schema validation failure details.
## Rollout / Migration
- This is a follow-on EE redesign for workflow time-trigger functionality.
- Existing inline workflow time triggers should be migrated off the workflow definition model and into schedule records.
- The old one-schedule-per-workflow table shape must be migrated to support many schedules per workflow.
- Existing event-triggered and no-trigger workflows remain valid.
- Existing inline time-trigger UI in the workflow editor should be removed once the schedules UI is in place.
## Open Questions
- None currently. The v1 product decisions are:
- many schedules per workflow
- pinned-schema workflows only
- global schedules screen under Automation Hub
- schedules follow latest published version
- required schedule names
## Acceptance Criteria (Definition of Done)
- Automation Hub contains a Schedules destination with a global schedule list.
- Users can create one-time and recurring schedules for eligible workflows.
- Each schedule stores and validates a static payload against the workflow payload schema.
- Users can edit, pause/resume, and delete schedules.
- A workflow can have many schedules.
- Workflow editor no longer exposes inline one-time/recurring trigger authoring.
- Workflow editor still supports No trigger and Event trigger flows.
- Manual runs still work for no-trigger workflows.
- Publishing a new workflow version revalidates and rebinds schedules to the latest published version.
- Invalid schedules after publish are preserved, visible, and prevented from firing.
- Scheduled runs use the saved schedule payload as workflow input.
- DB-backed integration tests cover schedule persistence and validation behavior.