PSA/ee/docs/plans/workflow-overhaul-scratchpad.md
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

632 lines
55 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.

# Workflow Overhaul Scratchpad
## 2025-12-21 — Initial Survey
### Docs reviewed
- `docs/AI_coding_standards.md` (general coding rules + UI rules).
- `docs/workflow/README.md` (points to current workflow system docs).
- `docs/workflow/workflow-system.md` + `docs/workflow/workflow-event-sourcing-model.md` (legacy TS runtime: action registry, event sourcing, worker, Redis streams, etc.).
- PRD: `ee/docs/plans/2025-12-21-workflow-overhaul.md` (new data-defined runtime, Envelope, structured pipeline, JSONata, registries, node types, email workflow, GUI, API, etc.).
- Checklist: `ee/docs/plans/workflow_runtime_feature_checklist.json` (all items currently false).
### Legacy runtime + email workflow code locations
- Legacy runtime core: `shared/workflow/core/workflowRuntime.ts` (TypeScriptWorkflowRuntime)
- Legacy action registry: `shared/workflow/core/actionRegistry.ts`
- Worker service: `services/workflow-worker/src/WorkflowWorker.ts`
- Legacy system email workflow (code-based): `shared/workflow/workflows/system-email-processing-workflow.ts`
- Email workflow actions (shared): `shared/workflow/actions/emailWorkflowActions.ts`
- Email workflow action registration: `shared/workflow/init/registerWorkflowActions.ts` (registers find_contact_by_email, find_ticket_by_reply_token, etc.)
### Workflow editor UI
- Existing editor components under `server/src/components/workflow-editor/*` and actions in `server/src/lib/actions/workflow-editor-actions.ts` (currently code-based definitions, not new structured pipeline).
### DB schema status
- Existing workflow tables: workflow_executions, workflow_events, workflow_action_results, etc.
- No tables yet for new runtime entities (`workflow_runs`, `workflow_run_steps`, `workflow_run_waits`, `workflow_action_invocations`), per checklist.
- System workflow registration tables exist (system_workflow_registrations, versions, event attachments).
### Observations
- Current workflow system is code-based TS workflow execution with ActionRegistry idempotency, Redis Streams, event sourcing.
- PRD requires new data-defined runtime (Envelope, NodeTypeRegistry, ActionRegistry with Zod schemas + idempotency), JSONata expression engine, structured pipeline steps, waits/retries, run history, GUI node-in-pipe designer, plus new email workflow as data.
### Next steps
- Deep read of `shared/workflow/core/workflowRuntime.ts` and related persistence models to map reuse/impact.
- Locate existing validation utilities and editor flows for potential reuse.
- Draft new schema + registry components and runtime interpreter design within repo structure (likely in `shared/workflow` + server actions + worker).
- Begin checklist execution by implementing foundational registry + schema + expression engine + persistence + runtime.
## 2025-12-21 — Runtime V2 Implementation Progress
### New runtime foundation (shared/workflow/runtime)
- Added Zod-based runtime types + workflow definition schema + envelope schema in `shared/workflow/runtime/types.ts`.
- Implemented SchemaRegistry + NodeTypeRegistry + ActionRegistry (V2) under `shared/workflow/runtime/registries/`.
- JSONata expression engine with allowlist + timeout/output size checks in `shared/workflow/runtime/expressionEngine.ts`.
- Expression resolver supports recursive Expr objects and wraps errors as `ExpressionError`.
- Redaction utilities with JSON pointer masking + secretRef masking in `shared/workflow/runtime/utils/redactionUtils.ts`.
- Assignment utilities for dot-path + JSON pointer updates in `shared/workflow/runtime/utils/assignmentUtils.ts`.
- Publish validation (`shared/workflow/runtime/validation/publishValidation.ts`) validates WorkflowDefinition shape, step IDs, node types, action references, configs, and Exprs (plus best-effort assign path warnings).
### Runtime interpreter + persistence
- Implemented deterministic interpreter in `shared/workflow/runtime/runtime/workflowRuntimeV2.ts`:
- Uses `workflow_runs`, `workflow_run_steps`, `workflow_run_waits`, `workflow_action_invocations`, `workflow_run_snapshots`.
- Persists nodePath after each step; supports RUNNING/WAITING/SUCCEEDED/FAILED/CANCELED.
- Retry scheduling with backoff + jitter to `workflow_run_waits`.
- Event waits + timeout handling (TimeoutError) + try/catch + per-item forEach error handling.
- Idempotency enforced via unique `(action_id, action_version, idempotency_key)` with cached outputs.
- OutputMapping for `control.callWorkflow` now maps child run snapshots into parent env.
### Node types (registry)
- Implemented required node types in `shared/workflow/runtime/nodes/registerDefaultNodes.ts`:
- `state.set`, `event.wait`, `transform.assign`, `action.call`, `email.parseBody`, `email.renderCommentBlocks`, `human.task`.
- Email node fallbacks in `shared/workflow/runtime/nodes/utils/emailNodes.ts`.
### Action registry (email workflow)
- Registered Zod-schemas for required email actions in `shared/workflow/runtime/actions/registerEmailWorkflowActions.ts`:
- parse_email_reply, find_ticket_by_reply_token, find_ticket_by_email_thread, convert_html_to_blocks, create_comment_from_email, process_email_attachment, find_contact_by_email, resolve_inbound_ticket_defaults, create_ticket_from_email, create_human_task_for_email_processing_failure, send_ticket_acknowledgement_email.
### Schema registry
- Email payload schema `payload.EmailWorkflowPayload.v1` registered in `shared/workflow/runtime/schemas/emailWorkflowSchemas.ts` and `shared/workflow/runtime/init.ts`.
### DB + migrations
- Added migration `server/migrations/20251221090000_create_workflow_runtime_v2_tables.cjs` creating:
- workflow_definitions, workflow_definition_versions, workflow_runs, workflow_run_steps, workflow_run_waits, workflow_action_invocations, workflow_run_snapshots, workflow_runtime_events.
- Added migration `server/migrations/20251221103000_register_email_workflow_runtime_v2.cjs` to seed draft + version for new JSON email workflow.
### Email workflow (data-defined)
- Draft JSON definition in `shared/workflow/runtime/workflows/email-processing-workflow.v1.json` (structured pipeline, no initial event.wait per instruction).
- Covers reply-token threading, fallback to threading headers, new ticket creation, attachment processing, human task on failure.
### API endpoints (server)
- Added Next.js API routes:
- `/api/workflow-definitions` (list/create)
- `/api/workflow-definitions/{id}/{version}` (get/update)
- `/api/workflow-definitions/{id}/{version}/publish`
- `/api/workflow-runs` (start)
- `/api/workflow-runs/{runId}` (status)
- `/api/workflow-runs/{runId}/steps`
- `/api/workflow-runs/{runId}/cancel`
- `/api/workflow-runs/{runId}/resume`
- `/api/workflow/registry/nodes`, `/api/workflow/registry/actions`, `/api/workflow/registry/schemas/{schemaRef}`
- `/api/workflow/events` (submit + list; submit now transactional/atomic).
### Worker / Scheduler
- Added `services/workflow-worker/src/v2/WorkflowRuntimeV2Worker.ts` polling:
- due retry waits + timeout waits + runnable runs.
- Wired worker start/stop in `services/workflow-worker/src/index.ts`.
### Package updates
- Added `jsonata` + `zod-to-json-schema` to `shared/package.json`.
- Added `zod-to-json-schema` to `server/package.json`.
- Added shared exports for `./workflow/runtime`.
### Known gaps / to-do
- GUI node-in-pipe designer + run viewer not implemented.
- No expression inline validation in UI yet.
- No tests added yet for runtime, registries, expression engine.
- Event wait start step removed per instruction; checklist item for 10s wait remains false.
- HTML->blocks fallback in initial comment not wired into workflow definition.
## 2025-12-21 - Server actions first-class for workflow runtime V2
- Added `server/src/lib/actions/workflow-runtime-v2-actions.ts` with server actions for all V2 definition, publish, run, registry, schema, and event operations (server actions are now the primary entry point).
- Added shared schemas in `server/src/lib/actions/workflow-runtime-v2-schemas.ts` and API error helper `server/src/lib/api/workflowRuntimeV2Api.ts`.
- Updated workflow V2 API routes to delegate to server actions and use the API error helper:
- `server/src/app/api/workflow-definitions/route.ts`
- `server/src/app/api/workflow-definitions/[workflowId]/[version]/route.ts`
- `server/src/app/api/workflow-definitions/[workflowId]/[version]/publish/route.ts`
- `server/src/app/api/workflow-runs/route.ts`
- `server/src/app/api/workflow-runs/[runId]/route.ts`
- `server/src/app/api/workflow-runs/[runId]/steps/route.ts`
- `server/src/app/api/workflow-runs/[runId]/cancel/route.ts`
- `server/src/app/api/workflow-runs/[runId]/resume/route.ts`
- `server/src/app/api/workflow/registry/nodes/route.ts`
- `server/src/app/api/workflow/registry/actions/route.ts`
- `server/src/app/api/workflow/registry/schemas/[schemaRef]/route.ts`
- `server/src/app/api/workflow/events/route.ts`
## 2025-12-21 - PRD aligned with server-action-first pattern
- Updated PRD section 6.1 to state server actions are first-class and API routes are thin delegates.
- Expanded section 11 with a Server Actions table and labeled API surfaces as delegating layers.
- Clarified publish response applies to server actions and endpoints.
## 2025-12-21 — Tests + Event Triggers + Redaction + Admin Resume
### Test plan implementation
- All 220 backend test plan items now have matching Vitest tests; `ee/docs/plans/workflow_runtime_backend_test_plan.json` updated to `implemented=true` for all items.
- Added new integration suites:
- `server/src/test/integration/workflowRuntimeV2.eventTrigger.integration.test.ts` (event-triggered runs, payload validation, audit events).
- `server/src/test/integration/workflowRuntimeV2.redaction.integration.test.ts` (snapshot redaction, action invocation redaction, snapshot truncation, retention).
- Added new E2E suite: `server/src/test/e2e/workflowRuntimeV2.e2e.test.ts` covering publish/run, event triggers, waits/resume/timeouts, retries, idempotency, cancel/resume, and email workflow paths.
- Updated existing tests:
- `server/src/test/integration/workflowRuntimeV2.control.integration.test.ts` (retry/catch behavior + exact test names).
- `server/src/test/integration/workflowRuntimeV2.email.integration.test.ts` (use beforeEach to avoid DB resets wiping shared runs).
- `server/src/test/integration/workflowRuntimeV2.publish.integration.test.ts` (resume action now completes event waits).
### Runtime/Actions updates driven by tests
- `shared/workflow/runtime/runtime/workflowRuntimeV2.ts`: respect `RetryPolicy.maxAttempts` when deciding to schedule retries.
- `server/src/lib/actions/workflow-runtime-v2-actions.ts`: admin resume now resolves one WAITING wait, sets resume_event_name to the wait event, clears resume payload, and executes the run (enables "resume to completion" E2E).
### Redaction + retention checks
- Added integration coverage for redacted snapshots + action invocations, snapshot truncation, and retention pruning via event wait resume.
### PRD updates
- Added terminology section + expression best-practices subsection in `ee/docs/plans/2025-12-21-workflow-overhaul.md`.
### Feature checklist adjustments
- Updated `ee/docs/plans/workflow_runtime_feature_checklist.json` for backend/runtime items (goals, validation pipeline, events, tests, idempotency patterns).
- Remaining false items are GUI designer + UI workflow run viewer + rollout tasks (parallel-run + cutover) and "tenant_id log context".
### Dev environment setup (Alga Dev Env + Test Env skill)
- Ports chosen via detect_ports (env #8): app 3007, postgres 5439, redis 6386, hocuspocus 1241, pgbouncer 6439.
- Secrets regenerated into `./secrets` via `generate_secrets.py`.
- Updated `server/.env` with PROJECT_NAME=workflow_overhaul_env8 and new ports.
- Docker dev build started with `docker compose -f docker-compose.yaml -f docker-compose.base.yaml -f docker-compose.ee.yaml --env-file server/.env build server redis workflow-worker setup`.
- Build emits warnings about unset env vars (ITERATION, HOST, etc.) but proceeds.
### Notable findings
- Event waits do not create snapshots while waiting; retention pruning requires a later snapshot (handled via resume).
- Admin resume previously re-waited; now resolves waits and resumes using wait event name to allow completion.
## 2025-12-21 — Dev env fixes + stack up
- `docker compose up -d` initially failed due to missing secrets `secrets/ninjaone_client_id` + `secrets/ninjaone_client_secret`; created empty files to satisfy bind mounts.
- `docker compose up -d` then hit host port conflict on pgbouncer (6432). Updated `server/.env` to use internal ports for container-to-container connections and EXPOSE_* for host mappings:
- Internal: DB 5432, Redis 6379, Hocuspocus 1234, PgBouncer 6432.
- Exposed: DB 5439, Redis 6386, Hocuspocus 1241, PgBouncer 6439, Server 3007.
- Brought stack down/up with new env; setup now connects via pgbouncer 6432, migrations + seeds completed, and all containers started successfully.
## 2025-12-21 — Runtime test fixes (control integration)
### Runtime fixes
- Fixed expression normalization to handle nested allowlisted functions (non-consuming lookahead). This resolved `coalesce` / `append` ExpressionError in forEach body assignments.
- Corrected path stack containerPath handling for nested blocks in `resolveStepAtPath` so forEach loops resume correctly across body steps.
- Cleared `lease_owner` + `lease_expires_at` whenever runs enter WAITING (event waits + retry scheduling) to allow resume by other workers.
- `control.callWorkflow` now checks child run status after inline execution and throws `ActionError` if child failed (enables propagation + retry scheduling).
- Idempotency keys are now tenant-scoped by prefixing with `tenantId` when present.
### Test helper updates
- `actionCallStep` helper now accepts `retry` and sets it on the step.
- Stale-lease test setup uses tenant-scoped idempotency keys (`${tenantId}:fixed|stale`).
### Test expectation fixes
- `control.return inside control.if` now asserts the downstream action never runs (instead of expecting only 1 step record).
- WAITING resume test now checks `definition_step_id === 'state-1'` (step_path is index-based).
### Tests run
- `npx vitest --run server/src/test/integration/workflowRuntimeV2.control.integration.test.ts -t "control.return inside control.if|WAITING run resumes"` (both tests pass after updates).
### Open items
- None in control integration suite after fixes; full suite expected to pass (only earlier failures were expectation mismatches).
## 2025-12-22 — Workflow UI tests (Runs detail) + env note
### Environment
- Confirmed correct stack: `workflow_overhaul_env8` (workflow-overhaul/workflow_overhaul_env8).
### Playwright runs-detail suite fixes
- `ee/server/src/__tests__/integration/workflow-designer-runs.playwright.test.ts`: `createWorkflowAuditLog` now normalizes empty userId → null and uses a transaction to set `app.current_tenant` + insert on the same connection (avoids `invalid input syntax for type uuid: ""` from audit log insert + trigger).
### Tests executed (all passing after fix)
- `run logs tab filters by search and level`
- `run logs load more appends additional entries`
- `run audit logs tab loads entries and supports export`
- `run audit logs load more appends additional entries`
### Notes
- Audit log failures were due to `set_config` being connection-scoped; pooling meant the insert ran without `app.current_tenant` set.
## 2025-12-21 — Workflow Designer Playwright UI tests (batch 2)
### UI test coverage added
- `ee/server/src/__tests__/page-objects/WorkflowDesignerPage.ts`: added workflow step locators + helpers (`selectWorkflowByName`, `selectStepById`) and settings panel locators.
- `ee/server/src/__tests__/integration/workflow-designer-basic.playwright.test.ts`: added 8 tests:
- Read-only users see the read-only message when selecting steps.
- Workflow selection loads payload schema ref and trigger event name from stored definition.
- Editing workflow name, version, description updates the draft inputs.
- Trigger input accepts a non-empty event name and clears to empty.
- Read-only test permissions now include `workflow:read` to allow workflow list load.
- `ee/docs/plans/workflow_ui_test_plan.json`: marked 8 additional items as implemented.
### Test run
- Ran `npx playwright test src/__tests__/integration/workflow-designer-basic.playwright.test.ts --project=chromium` with Playwright DB port 5437; **13 tests passed**.
### Observations
- Read-only users trigger registry server actions that return 403 (expected with current UI); UI shows toast but tests still pass.
- Occasional `ECONNRESET` / `Error: aborted` logs during navigation and repeated `NotificationAccumulator` Redis auth warnings (existing noise; did not fail tests).
## 2025-12-21 — Full workflow runtime v2 test run (unit + integration + e2e)
### Fixes applied before full run
- Email workflow integration expectations updated:
- Attachment idempotency key assertion now checks both attachment ids irrespective of call order (non-deterministic iteration).
- `resolve_inbound_ticket_defaults` expectation updated to assert input object `{ tenant, providerId }` rather than positional args.
### Tests run
- `DB_HOST=localhost DB_PORT=5437 DB_USER_ADMIN=postgres DB_USER_SERVER=app_user DB_PASSWORD_ADMIN=$(cat secrets/postgres_password) DB_PASSWORD_SERVER=$(cat secrets/db_password_server) npx vitest --run server/src/test/unit/workflowRuntimeV2.unit.test.ts server/src/test/integration/workflowRuntimeV2.*.test.ts server/src/test/e2e/workflowRuntimeV2.e2e.test.ts`
### Results
- All tests passed: 221/221 across unit, integration, and e2e suites.
- Known DB log warnings during failure-path tests (invalid uuid like `provider-1` / `tenant-...`) are expected in negative-path coverage and did not fail.
- `workflow_runtime_backend_test_plan.json` already shows all 220 tests marked `implemented: true` (no update needed).
### Checklist status
- `workflow_runtime_feature_checklist.json` still has 22 items marked `implemented: false` (appears to be GUI/editor-focused items such as inline syntax validation). Backend checklist items appear complete.
## 2025-12-21 — Workflow Designer (Section 10) Progress
### Implemented UI (EE)
- Added `ee/server/src/components/workflow-designer/WorkflowDesigner.tsx` with node-in-pipe canvas, nested blocks, and right-side config panel.
- Integrated designer as the workflow entry point by exporting it from `packages/product-workflows/ee/entry.tsx` and `packages/product-workflows/ee/entry.ts`.
- Node palette loads from `/api/workflow/registry/nodes` with search; steps insert into selected pipe.
- Drag/drop reorder within pipes and move between nested pipes via `@hello-pangea/dnd`.
- Config panel generates forms from node config JSON Schema with required-field warnings and JSON fallback editors.
- Expression editor supports field picker insertion (payload/vars/meta/error) and local JSONata syntax validation.
- Publish workflow triggers server validation and surfaces publish errors with step breadcrumb context.
### Remaining
- Run list + run detail viewer (status filters, timelines, snapshots, logs).
- Admin resume/cancel UI actions.
- Redacted snapshot rendering in UI.
## 2025-12-21 — Operational/Observability Expansion
### PRD updates
- Added Section 14 (Operational Support, Observability, and Governance) to the PRD with run list, run detail, logging, audit, RBAC, retention/export, metrics/alerts, ops controls, event observability, and performance targets.
### Checklist updates
- Appended detailed operational/observability features (run history, logs, audit, RBAC, retention, metrics, alerting, ops controls, event observability, performance) to `workflow_runtime_feature_checklist.json`.
### Run list implementation start
- Added workflow run list API (GET `/api/workflow-runs`) via `listWorkflowRunsAction` with filters, pagination, and workflow name join.
- Added run list UI tab with filters and table in `ee/server/src/components/workflow-designer/WorkflowRunList.tsx` and wired into `WorkflowDesigner` tabs.
- Marked checklist item for run list view as implemented.
### Run details implementation
- Added run details panel with step timeline, snapshot viewer, action invocation logs, and wait summary.
- Added admin resume/cancel UI actions with confirmation dialogs.
- Added UI-side masking for sensitive keys (secret/token/password/etc.) before rendering JSON.
- Updated run steps API payload to include invocations + waits.
- Marked checklist items for run details, snapshots/logs, admin actions, and redaction as implemented.
### Operational iteration (Section 14)
- Added run summary endpoint (`GET /api/workflow-runs/summary`) with counts by status and filters.
- Added quick time-range chips (last 24h/7d) and status count badges to the run list UI.
- Expanded run detail wait history to show event name, correlation key, timeouts, and resolution timestamps.
- Marked §14 items for timeline display, wait history, correlation fields, and quick filters as implemented.
## 2025-12-21 — Operational Section Progress (continued)
### Run list enhancements
- Added tenant context column (shown when multiple tenants appear) and correlation key search (via wait key join).
- Implemented bulk select with resume/cancel actions and confirmation dialogs.
### Run detail enhancements
- Added workflow metadata (workflow id/version/trigger/run id) and richer error display.
- Step details now include status/attempt/timestamps, error category/at, and next retry.
- Added payload/vars/meta/error/raw tabs with redaction notice; action invocation redaction notice.
- Added timeline filters (status + node type), collapse nested blocks toggle, and step deep-linking via `?step=`.
### API shim alignment (server actions first)
- Workflow designer UI now uses server actions directly for definitions, registries, runs, logs, audits, events, exports, and admin operations.
- Export logic moved into server actions (runs/events/audits/logs); API routes are thin shims over actions.
- Added workflow run log export action and API shim for external access.
### Run log observability
- Added `workflow_run_logs` persistence + model, runtime log hooks (steps, waits, action invocations, retries, resume/timeouts).
- Implemented log APIs (`/api/workflow-runs/{runId}/logs`) with pagination + CSV export.
- Added run log viewer with level filters, search, and export in run details.
- Action invocation cards now show input/output size and truncation markers in UI.
### Audit trail
- Added audit logging for workflow definition create/update/publish and run cancel/resume (with reasons).
- Added audit APIs for workflows and runs plus CSV export routes.
- Added Audit tab for workflow definitions and audit trail section in run details.
### RBAC + workflow metadata
- Added workflow permissions (view/publish/admin) migration and wired RBAC checks across workflow actions.
- Added workflow definition metadata (system/visible/paused/concurrency/auto-pause thresholds) + UI settings + metadata endpoint.
- Enforced system workflow edit protection and visibility filtering; hid admin controls based on permissions.
## 2025-12-21 — Operational Section Progress (ops controls + events)
### Run controls + dead-letter
- Added retry/replay/requeue admin actions with required reasons, audit log entries, and run log markers.
- New API routes: `/api/workflow-runs/{runId}/retry`, `/replay`, `/requeue`, plus `/api/workflow-runs/dead-letter`.
- Dead-letter queue UI (retries threshold + run detail panel) added as a new tab.
- Added run list CSV export and run detail JSON export with redactions.
### Event observability
- Added event tracking fields (matched_run_id, matched_wait_id, error_message, created_at index) and lookup index migration.
- Event ingestion now records match metadata, error messages, and processed timestamps.
- Event list UI with filters, status badges, payload preview (redacted), and event detail panel linking to matched run.
- Event summary endpoint + UI badges for matched/unmatched/error counts.
- Event export endpoints (CSV/JSON) wired to the event list filters.
### Performance + indexing
- Added index on workflow_runs (workflow_id, status, updated_at) and workflow_run_steps (run_id, step_id).
- Enforced per-tenant run start rate limits and max payload size checks in server action.
## 2025-12-21 — Runtime V2 fixes + test stabilization
### Runtime/action changes
- `shared/workflow/runtime/runtime/workflowRuntimeV2.ts`
- Retry scheduling now stops when `attempt >= maxAttempts`.
- `control.forEach` now treats non-array items as `ValidationError`.
- `control.callWorkflow` now checks child run status and throws `ActionError` on failure (enables parent failure + retry policy).
- Idempotency keys are tenant-scoped (prefix with `tenantId:` unless already prefixed).
- `acquireRunnableRun` uses JS time (`new Date().toISOString()`) for stale-lease comparison for better test consistency.
- Snapshot retention pruning added (default 30 days, env override `WORKFLOW_RUN_SNAPSHOT_RETENTION_DAYS`).
- `server/src/lib/actions/workflow-runtime-v2-actions.ts`
- `startWorkflowRunAction` now uses latest published version when version omitted and validates payload against schema registry.
- `submitWorkflowEventAction` now resumes both `event` and `human` waits.
- `listWorkflowEventsAction` accepts `undefined` input (defaults to `{}`) and still returns `{ events, nextCursor }`.
- `resumeWorkflowRunAction` now records admin resume events and re-stores `resume_event_payload` after execution (admin override metadata persists).
- `services/workflow-worker/src/v2/WorkflowRuntimeV2Worker.ts`
- Scheduler skips retries/timeouts for CANCELED runs; marks waits CANCELED instead of resuming.
- `shared/workflow/runtime/nodes/registerDefaultNodes.ts`
- Admin resume bypasses human-task validation when resume event name is `ADMIN_RESUME` or payload includes `__admin_override`.
### Test plan + test updates
- Updated admin-resume test plan wording to reference admin override metadata.
- `workflowRuntimeV2.control.integration.test.ts` now expects `listWorkflowEventsAction()` to return `{ events }`.
- Increased `beforeAll` timeout for `workflowRuntimeV2.email.integration.test.ts` to 180s to avoid hook timeouts on heavy DB resets.
- Marked checklist item “Persist sanitized envelope snapshot per checkpoint and cap size/retention” as implemented.
### Test runs
- Control + publish integration suites now pass when run together.
- Full workflow runtime suite (`unit + integration + e2e`) still fails in this environment due to Knex connection pool timeouts during repeated `createTestDbConnection()` calls:
- Errors: `Knex: Timeout acquiring a connection` during DB recreation.
- Cascading failures in multiple workflow runtime test files and e2e runtime suite.
- Suggest running workflow runtime test files in smaller batches or increasing DB connection capacity/timeout when running the full suite.
## 2025-12-21 Playwright UI test plan
- Created `ee/docs/plans/workflow_ui_test_plan.json` with 207 Playwright-focused UI tests covering Workflow Designer, Runs, Events, Dead Letter, and Audit tabs.
- Tests are framed as user-facing behavior with mockable non-target dependencies, and include 8 E2E scenarios for end-to-end UI flows.
- Plan aligns with the workflow overhaul UI (node-in-pipe designer, run viewer, event list) surfaced at `/msp/workflows` (EE uses WorkflowDesigner via `@product/workflows/entry`).
## 2025-12-21 — Playwright UI tests (batch 3)
- Fixed workflow list count assertion regex (removed escaped backslashes) so it matches digits.
- Added `workflow:read` to `MANAGE_PERMISSIONS` in `workflow-designer-basic.playwright.test.ts` so Runs tab data can load (listWorkflowRunsAction requires read).
- Ran Playwright workflow designer suite after fixes: `ee/server/src/__tests__/integration/workflow-designer-basic.playwright.test.ts` now passes (17/17).
- Marked UI test plan items implemented: workflow list count, admin Dead Letter/Audit tabs + empty states, settings panel visibility, Runs/Events/Dead Letter/Audit empty states.
- Observed recurring logs during tests: registry 401/403 on aborted requests, Redis NOAUTH notifications, ECONNRESET “aborted” logs; tests still pass.
## 2025-12-22 — Playwright UI tests (batch 4)
- Added new workflow designer control block coverage in `ee/server/src/__tests__/integration/workflow-designer-blocks.playwright.test.ts`:
- Pipe selector root + nested pipe updates (If THEN/ELSE).
- control.forEach BODY pipe + config fields + Block badge.
- control.tryCatch TRY/CATCH + capture error field.
- control.return helper text.
- control.callWorkflow input/output mapping add/edit/remove flows + empty state.
- Fixed selector failures by targeting stable IDs instead of labels (Input labels dont use `htmlFor`).
- Final run: `workflow-designer-blocks.playwright.test.ts` passes (7/7). Observed recurring server logs: Redis NOAUTH and occasional `ECONNRESET` + one `Unauthorized` log from `listWorkflowRegistryActionsAction` during setup; tests still green.
- Marked 19 UI test plan items implemented (control blocks, mapping editor behaviors, pipe selector updates, return helper text, Block badge).
## 2025-12-22 — Playwright UI tests (batch 5)
- Updated workflow permission model to match PRD/test plan: manage no longer implies publish/admin.
- `ee/server/src/components/workflow-designer/WorkflowDesigner.tsx`: `canPublish` now requires `workflow:publish` (or admin), `canAdmin` requires `workflow:admin`, `canManage` allows manage/admin.
- `server/src/lib/actions/workflow-runtime-v2-actions.ts`: `requireWorkflowPermission` fallback now allows admin for manage/publish; removed manage→publish fallback. `listWorkflowRegistryNodesAction`/`listWorkflowRegistryActionsAction` now require `read` (not manage).
- Expanded `WorkflowDesignerPage` helpers (setName, selectWorkflowByName, selectStepById, clickSaveDraft) to support new tests.
- Fixed control test expectations to check active workflow selection after tab switches (switch to Runs then back to Designer).
- Ran `workflow-designer-controls.playwright.test.ts` with env to avoid DB auth mismatch when Playwright forces admin credentials:
- Command: `PW_REUSE=false PLAYWRIGHT_APP_PORT=3300 PLAYWRIGHT_DB_PORT=5437 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env DB_PASSWORD_ADMIN=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) DB_PASSWORD_SERVER=$(cat ../../secrets/postgres_password) npx playwright test src/__tests__/integration/workflow-designer-controls.playwright.test.ts`
- Result: 4/4 passing (manage-only save vs publish, publish-only, active selection persists across tabs, switching workflows clears config panel).
- Noted recurring server logs: Redis NOAUTH and occasional ECONNRESET aborted requests (no test failures).
## 2025-12-22 — Playwright UI tests (batch 6)
- Added workflow designer settings coverage in `ee/server/src/__tests__/integration/workflow-designer-controls.playwright.test.ts`:
- System workflow settings hidden for non-admin.
- System workflow settings visible for admin.
- Added workflow list/metadata coverage in `ee/server/src/__tests__/integration/workflow-designer-basic.playwright.test.ts`:
- Workflow list shows total count and buttons.
- Selecting a workflow loads draft metadata (Inbound Email Processing fields).
- Version field accepts numeric input.
- Clearing trigger event name removes trigger from draft.
- Added cleanup for created workflows (delete from `workflow_definitions`).
- Fixed list count assertion to poll until label count matches button count to avoid timing flakiness.
- Ran Playwright subset (basic + controls) with DB env overrides to keep admin creds aligned:
- Command: `PW_REUSE=false PLAYWRIGHT_APP_PORT=3300 PLAYWRIGHT_DB_PORT=5437 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env DB_PASSWORD_ADMIN=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) DB_PASSWORD_SERVER=$(cat ../../secrets/postgres_password) npx playwright test src/__tests__/integration/workflow-designer-basic.playwright.test.ts src/__tests__/integration/workflow-designer-controls.playwright.test.ts`
- Result: 21/21 passing.
- Noted recurring logs during run (no test failures): Redis NOAUTH notification accumulator, `ECONNRESET` aborted requests, occasional `Unauthorized` errors from registry actions when non-admin sessions hit registry endpoints.
## 2025-12-22 — Playwright UI tests (batch 7)
- Added workflow settings tests in `ee/server/src/__tests__/integration/workflow-designer-controls.playwright.test.ts`:
- Settings toggles update draft values (Visible, Paused), concurrency accepts numeric/empty, auto-pause toggles enable failure inputs.
- Save Settings persists metadata overrides; verified UI state after reload and DB values.
- Added helper `createSavedWorkflow` in `workflow-designer-controls.playwright.test.ts` for reuse.
- Updated settings UI so failure threshold/min inputs are disabled when auto-pause is off:
- `ee/server/src/components/workflow-designer/WorkflowDesigner.tsx` now passes `disabled={!metadataDraft.autoPauseOnFailure}` to both inputs.
- Ran controls suite with DB env overrides:
- Command: `PW_REUSE=false PLAYWRIGHT_APP_PORT=3300 PLAYWRIGHT_DB_PORT=5437 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env DB_PASSWORD_ADMIN=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) DB_PASSWORD_SERVER=$(cat ../../secrets/postgres_password) npx playwright test src/__tests__/integration/workflow-designer-controls.playwright.test.ts`
- Result: 12/12 passing.
- Recurring logs during run (no test failures): Redis NOAUTH notification accumulator, ECONNRESET aborted requests, registry Unauthorized logs during non-admin sessions.
## 2025-12-22 — Playwright UI tests (batch 8)
- Added workflow persistence + palette search coverage in `ee/server/src/__tests__/integration/workflow-designer-basic.playwright.test.ts`:
- Save draft persists metadata + steps after reload (verifies step label and id).
- Palette search filters nodes by id.
- Marked UI test plan items implemented for save draft persistence and palette search (plus related helper-text/step label items already covered).
- Ran basic suite with DB env overrides:
- Command: `PW_REUSE=false PLAYWRIGHT_APP_PORT=3300 PLAYWRIGHT_DB_PORT=5437 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env DB_PASSWORD_ADMIN=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) DB_PASSWORD_SERVER=$(cat ../../secrets/postgres_password) npx playwright test src/__tests__/integration/workflow-designer-basic.playwright.test.ts`
- Result: 13/13 passing.
- Noted recurring server logs during run (no test failures): Redis NOAUTH notification accumulator, ECONNRESET aborted requests, and intermittent workflow runtime action errors (401/403/404) during registry/schema fetches.
## 2025-12-22 — Playwright UI tests (batch 9)
- Added empty-list state coverage in `ee/server/src/__tests__/integration/workflow-designer-basic.playwright.test.ts`:
- New snapshot/restore helpers for workflow_definitions + workflow_definition_versions.
- Test asserts 0 workflows, no workflow buttons, Save Draft/Publish disabled, empty metadata fields, and workflow settings not shown.
- Marked UI plan items implemented: empty workflow list, save draft disabled (no active definition), publish disabled (no active definition), save settings disabled when workflow id missing.
- Ran basic suite with DB env overrides:
- Command: `PW_REUSE=false PLAYWRIGHT_APP_PORT=3300 PLAYWRIGHT_DB_PORT=5437 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env DB_PASSWORD_ADMIN=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) DB_PASSWORD_SERVER=$(cat ../../secrets/postgres_password) npx playwright test src/__tests__/integration/workflow-designer-basic.playwright.test.ts`
- Result: 14/14 passing.
- Recurring logs during run (no test failures): Redis NOAUTH notification accumulator, ECONNRESET aborted requests, intermittent workflow runtime action 401/404 noise.
## 2025-12-22 — Playwright UI tests (batch 10)
- Fixed `WorkflowDesignerPage.saveDraft()` to wait for the Save Draft button to be enabled (avoids timeout when button text stays “Saving...” longer than default wait).
- Adjusted forEach on-item-error selection/assertion to target the combobox role selector to avoid strict-mode failures from duplicate IDs.
- Reran `workflow-designer-basic.playwright.test.ts` with DB env overrides:
- Command: `PW_REUSE=false PLAYWRIGHT_APP_PORT=3300 PLAYWRIGHT_DB_PORT=5437 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env DB_PASSWORD_ADMIN=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) DB_PASSWORD_SERVER=$(cat ../../secrets/postgres_password) npx playwright test src/__tests__/integration/workflow-designer-basic.playwright.test.ts`
- Result: 18/18 passing.
- Recurring logs during run (no test failures): Redis NOAUTH notification accumulator, ECONNRESET aborted requests, intermittent workflow action 401/403/404 noise.
## UI tests batch 5 (expressions)
- Added Playwright tests for expression field + picker in `ee/server/src/__tests__/integration/workflow-designer-expressions.playwright.test.ts`.
- Covered: field picker roots, insert field into expression, append to existing expression, invalid syntax styling + clears when valid, multi-line, and empty input handling.
- Locator stability: Radix Select options were flaky with role selectors; switched assertions to `listbox.toContainText(...)` with longer timeout.
- Latest run: `workflow-designer-expressions.playwright.test.ts` passes (6/6). Still seeing benign `ECONNRESET` + `NOAUTH` log noise during runs.
## 2025-12-22 — Playwright UI tests (batch 11: basic + blocks re-run)
- Re-ran `workflow-designer-basic` + `workflow-designer-blocks` after adding unauth redirect + pipe insertion tests.
- Had to move Playwright dev server to port 3301 because 3300 was in use.
- Command: `PW_REUSE=false PLAYWRIGHT_APP_PORT=3301 PLAYWRIGHT_DB_PORT=5437 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env DB_PASSWORD_ADMIN=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) DB_PASSWORD_SERVER=$(cat ../../secrets/postgres_password) npx playwright test src/__tests__/integration/workflow-designer-basic.playwright.test.ts src/__tests__/integration/workflow-designer-blocks.playwright.test.ts`
- Result: **27/27 passed**.
- Noisy server logs persisted (expected / non-failing): Redis `NOAUTH` notification accumulator, occasional `ECONNRESET` aborted requests, and intermittent 401/403/404 errors from workflow registry/schema actions during setup.
## 2025-12-22 — Playwright UI tests (batch 12: control blocks drag/drop)
- Added nested-pipe drag fallback + selectors:
- `ee/server/src/components/workflow-designer/WorkflowDesigner.tsx`: track hovered pipe via `data-pipe-path` + global mousemove when dragging; add `data-step-id` to top-level draggable wrappers for reliable step queries.
- `ee/server/src/__tests__/integration/workflow-designer-blocks.playwright.test.ts`: `getStepIdsIn` now reads direct `[data-step-id]` children (avoids nested pipe leakage).
- `ee/server/src/__tests__/page-objects/WorkflowDesignerPage.ts`: wait for New Workflow button visibility before clicking.
- Reran `workflow-designer-blocks` full suite with DB env overrides:
- Command: `PW_REUSE=false PLAYWRIGHT_APP_PORT=3301 PLAYWRIGHT_DB_PORT=5437 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env DB_PASSWORD_ADMIN=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) DB_PASSWORD_SERVER=$(cat ../../secrets/postgres_password) npx playwright test src/__tests__/integration/workflow-designer-blocks.playwright.test.ts`
- Result: **10/10 passed** (1.3m).
- Still seeing noisy logs during runs (non-failing): Redis `NOAUTH` notification accumulator, occasional `ECONNRESET` aborted requests, and intermittent 401/403/404 errors from workflow registry/schema actions.
## 2025-12-22 — Env alignment
- Confirmed the correct dev stack for this work is `workflow-overhaul` / `workflow_overhaul_env8`.
- Updated `server/.env` to align ports + names with env8 (app 3007, pg 5439, redis 6386, hocuspocus 1241, pgbouncer 6439).
## 2025-12-22 — Playwright UI tests (batch 13: action.call + publish)
- Confirmed active stack is `workflow-overhaul/workflow_overhaul_env8`.
- UI change: moved “Available actions: X” display into `StepConfigPanel` for `action.call` steps so its always visible regardless of schema title logic.
- Added `workflow-designer-publish.playwright.test.ts` and new action.call config tests in `workflow-designer-config.playwright.test.ts`.
- Tests added:
- action.call shows available actions count
- action.call config args/saveAs/idempotencyKey persist after save
- publish without saving shows toast
- publish failure shows error cards + breadcrumbs + error badge
- publish warnings show warning badge count
- Ran with env8 DB overrides:
- Command: `ADMIN_PASS="$(cat ../../secrets/db_password_server)" PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_ADMIN_PASSWORD=$ADMIN_PASS PLAYWRIGHT_DB_APP_PASSWORD=$ADMIN_PASS DB_PASSWORD_ADMIN=$ADMIN_PASS DB_PASSWORD=$ADMIN_PASS DB_PASSWORD_SERVER=$ADMIN_PASS DB_PASSWORD_SUPERUSER=$ADMIN_PASS npx playwright test src/__tests__/integration/workflow-designer-config.playwright.test.ts src/__tests__/integration/workflow-designer-publish.playwright.test.ts`
- Result: **8/8 passed** (2.1m).
- Noisy server logs persisted (non-failing): Redis `WRONGPASS/NOAUTH` notifications and occasional 401 `Unauthorized` from registry/schema actions.
## 2025-12-22 — Playwright UI tests (batch 14: publish + latest published version)
- Added publish flow tests in `ee/server/src/__tests__/integration/workflow-designer-publish.playwright.test.ts`:
- publish success clears errors + warnings (by removing invalid steps and re-publishing)
- publish errors reset when switching workflows
- publish button disabled while publish in progress (uses publish delay override)
- publish failure toast preserves draft (uses failPublish override)
- publish success updates latest published version indicator
- Added Playwright overrides in `WorkflowDesigner` for publish delay/failure, and surfaced latest published version in UI (`#workflow-designer-published-version`).
- Updated `listWorkflowDefinitionsAction` to include `published_version` (max version per workflow) and added type support in shared model.
- Marked publish-related UI checklist items as implemented, including step error badge count.
- Test run (env8 DB) passed:
- Command (from `ee/server`): `ADMIN_PASS="$(cat ../../secrets/db_password_server)" PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_ADMIN_PASSWORD=$ADMIN_PASS PLAYWRIGHT_DB_APP_PASSWORD=$ADMIN_PASS PLAYWRIGHT_DB_NAME=alga_contract_wizard_test npx playwright test src/__tests__/integration/workflow-designer-publish.playwright.test.ts`
- Result: **8/8 passed** (2.3m).
- Non-failing noisy logs: intermittent 401 Unauthorized from workflow actions, Redis WRONGPASS reconnect errors, and various migration/seed warnings during bootstrap.
## 2025-12-22 — Playwright UI tests (batch 15: runs details + admin bulk actions)
- Added run detail status selector: `workflow-run-detail-status` in `ee/server/src/components/workflow-designer/WorkflowRunDetails.tsx`.
- Updated runs test helpers to also insert `workflow_definition_versions` so runtime resume/cancel can execute.
- Added run details + admin/bulk action tests in `ee/server/src/__tests__/integration/workflow-designer-runs.playwright.test.ts`:
- run row click opens details panel
- run details shows workflow name/version + status badge
- admin selection checkboxes + bulk action controls
- select all toggles selection
- bulk resume/cancel flows
- bulk action clears selection
- Updated checklist items to implemented in `ee/docs/plans/workflow_ui_test_plan.json` for the above.
- Test run (env8 DB):
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3314 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_NAME=alga_contract_wizard_test REDIS_HOST=localhost REDIS_PORT=6386 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env npx playwright test src/__tests__/integration/workflow-designer-runs.playwright.test.ts -g "run details panel|run metadata|admin sees run selection|select all toggles|bulk resume|bulk cancel|bulk action clears"`
- Result: **7/7 passed** (1.6m).
- Noisy but non-failing logs continue: `NOAUTH` notification accumulator, occasional `ECONNRESET`, intermittent Unauthorized from workflow actions during background load.
## 2025-12-22 — Playwright UI tests (batch 16: run detail admin actions + export/error)
- Environment note: using `workflow-overhaul/workflow_overhaul_env8` stack.
- Added run detail helpers in `ee/server/src/__tests__/integration/workflow-designer-runs.playwright.test.ts`:
- `openRunDetails`, `createWorkflowRunStep`, optional run error/node fields, wait type override.
- Added run-detail tests:
- error card renders on failed run
- run export downloads JSON bundle
- admin resume/cancel/retry/replay/requeue actions (with reasons/payload)
- Marked corresponding checklist items implemented in `ee/docs/plans/workflow_ui_test_plan.json`.
- Test run (env8 DB):
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3314 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_NAME=alga_contract_wizard_test REDIS_HOST=localhost REDIS_PORT=6386 SECRET_READ_CHAIN=env SECRET_WRITE_PROVIDER=env npx playwright test src/__tests__/integration/workflow-designer-runs.playwright.test.ts -g "run details shows run error card|run details export|admin resume action|admin cancel action|admin retry action|admin replay action|admin requeue action"`
- Result: **7/7 passed** (1.8m).
- Noisy but non-failing logs: `NOAUTH` notification accumulator, intermittent `ECONNRESET` during test navigation, and post-teardown `Unauthorized` from `listWorkflowRunStepsAction`.
## 2025-12-22 UI Playwright progress (batch)
- Env confirmed: workflow_overhaul_env8 stack.
- Dead Letter tests: fixed row status locator and changed error-handling test to remove workflow admin permission and assert toast via [role="status"].
- File: ee/server/src/__tests__/integration/workflow-designer-dead-letter.playwright.test.ts
- Result: `npx playwright test ...dead-letter...` => 7 passed.
- Audit tests: error-handling test now revokes workflow admin permission and asserts toast via [role="status"] with polling.
- File: ee/server/src/__tests__/integration/workflow-designer-audit.playwright.test.ts
- Result: `npx playwright test ...audit...` => 6 passed.
- E2E flows: `npx playwright test ...workflow-designer-e2e...` => 5 passed.
- workflow_ui_test_plan.json now shows 0 remaining unimplemented items.
## 2025-12-22 — Runs error handling tests stabilized
- Updated runs error-handling tests to avoid flaky server-action interception:
- `run list fetch error` now uses invalid workflow version (`0`) to trigger validation error and toast.
- `run details fetch error` now deletes the run record before clicking view to force a 404 + toast + close.
- Removed unused server-action manifest lookup helpers from `ee/server/src/__tests__/integration/workflow-designer-runs.playwright.test.ts`.
- Test run:
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3310 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_NAME=alga_contract_wizard_test PLAYWRIGHT_DB_ADMIN_USER=postgres PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_USER=app_user PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/db_password_server) PW_REUSE=true npx playwright test src/__tests__/integration/workflow-designer-runs.playwright.test.ts -g "run list fetch error|run details fetch error"`
- Result: **2/2 passed**.
- Note: noisy but non-failing server logs still show intermittent Unauthorized errors during background fetches.
## 2025-12-22 — Playwright UI tests (batch 17: audit + dead-letter + events + e2e combined)
- Env: workflow_overhaul_env8 stack.
- Ran combined suite to validate cross-page flows after recent fixes.
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3312 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_NAME=alga_contract_wizard_test PLAYWRIGHT_DB_ADMIN_USER=postgres PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_USER=app_user PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/db_password_server) REDIS_HOST=localhost REDIS_PORT=6386 npx playwright test src/__tests__/integration/workflow-designer-events.playwright.test.ts src/__tests__/integration/workflow-designer-dead-letter.playwright.test.ts src/__tests__/integration/workflow-designer-audit.playwright.test.ts src/__tests__/integration/workflow-designer-e2e.playwright.test.ts`
- Result: **36/36 passed** (5.4m).
- Noise: expected Unauthorized/Forbidden logs during error-handling tests and background fetches; no test failures.
## 2025-12-22 — Playwright UI tests (batch 18: basic suite)
- Env: workflow_overhaul_env8 stack (app port 3312).
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3312 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_NAME=alga_contract_wizard_test PLAYWRIGHT_DB_ADMIN_USER=postgres PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_USER=app_user PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/db_password_server) REDIS_HOST=localhost REDIS_PORT=6386 npx playwright test src/__tests__/integration/workflow-designer-basic.playwright.test.ts`
- Result: **27/27 passed** (4.1m).
- Noise: recurring `ECONNRESET` + Unauthorized/Forbidden logs from server actions during negative paths; no test failures.
## 2025-12-22 — Playwright UI tests (batch 19: runs detail sub-suite)
- Env: workflow_overhaul_env8 stack (app port 3312).
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3312 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_NAME=alga_contract_wizard_test PLAYWRIGHT_DB_ADMIN_USER=postgres PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_USER=app_user PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/db_password_server) REDIS_HOST=localhost REDIS_PORT=6386 npx playwright test src/__tests__/integration/workflow-designer-runs.playwright.test.ts --grep "(runs row click|run details panel|admin sees run selection|select all toggles|bulk resume|bulk cancel|bulk action clears|run details shows|run details export|admin resume action|admin cancel action|admin retry action|admin replay action|admin requeue action|step timeline filter|collapse nested blocks|step timeline view|step details show|step error card|step wait history|envelope tabs|envelope view shows redaction|envelope view shows empty-state|action invocations list|action invocations empty state|run logs tab|run logs export|run logs load more|run logs empty|run audit logs tab|run audit logs load more|run audit logs empty)"`
- Result: **33/33 passed** (4.9m).
- Noise: intermittent `ECONNRESET` and a transient `Unauthorized` in server logs for `listWorkflowRunStepsAction` during admin replay flow; no test failures.
## 2025-12-22 — Playwright UI tests (batch 20: runs tab + publish + config)
- Env: workflow_overhaul_env8 stack (app port 3312).
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3312 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_NAME=alga_contract_wizard_test PLAYWRIGHT_DB_ADMIN_USER=postgres PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_USER=app_user PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/db_password_server) REDIS_HOST=localhost REDIS_PORT=6386 npx playwright test src/__tests__/integration/workflow-designer-runs.playwright.test.ts src/__tests__/integration/workflow-designer-publish.playwright.test.ts src/__tests__/integration/workflow-designer-config.playwright.test.ts --grep "(runs (tab lists|tab shows summary counts by status|filter by status|filter by workflow id and version updates list|search filters by run id or correlation key|date range filters update list|sort order changes list ordering|reset filters restores defaults and reloads list|quick range buttons set date inputs|refresh reloads list without changing filters|export triggers CSV download and success toast|load more appends additional results|empty state displays when no runs available)|run list fetch error shows toast and preserves filters|run details fetch error shows toast and closes details panel|publish|node config renders|json field|action\\.call config)"`
- Result: **28/28 passed** (4.1m).
- Noise: recurring `ECONNRESET` and `Unauthorized` errors in server logs during background fetches; expected Zod validation errors for invalid version in error-handling tests; no test failures.
## 2025-12-22 — Playwright UI tests (batch 21: flake fixes for runs/expression selectors)
- Env: workflow_overhaul_env8 stack (app port 3312).
- Fixes:
- Expression picker tests now select exact listbox option to avoid matching `payload.*` entries.
- `openRunsTab` now clicks the Runs tab by role/name and waits for `data-state="active"` before proceeding (also updated in E2E helper).
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3312 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_NAME=alga_contract_wizard_test PLAYWRIGHT_DB_ADMIN_USER=postgres PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_USER=app_user PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/db_password_server) REDIS_HOST=localhost REDIS_PORT=6386 npx playwright test src/__tests__/integration/workflow-designer-expressions.playwright.test.ts src/__tests__/integration/workflow-designer-runs.playwright.test.ts -g "expression field inserts|expression field combines|bulk cancel prompts|step timeline filter by node type|action invocations list renders|run audit logs empty state"`
- Result: **6/6 passed** (1.4m).
- Note: Server startup logs are noisy; no new Unauthorized/Forbidden issues observed in these runs.
## 2025-12-22 — Playwright UI tests (batch 22: controls + blocks + expressions)
- Env: workflow_overhaul_env8 stack (app port 3312).
- Command (from `ee/server`):
`PLAYWRIGHT_APP_PORT=3312 PLAYWRIGHT_DB_HOST=localhost PLAYWRIGHT_DB_PORT=5439 PLAYWRIGHT_DB_NAME=alga_contract_wizard_test PLAYWRIGHT_DB_ADMIN_USER=postgres PLAYWRIGHT_DB_ADMIN_PASSWORD=$(cat ../../secrets/postgres_password) PLAYWRIGHT_DB_APP_USER=app_user PLAYWRIGHT_DB_APP_PASSWORD=$(cat ../../secrets/db_password_server) REDIS_HOST=localhost REDIS_PORT=6386 npx playwright test src/__tests__/integration/workflow-designer-controls.playwright.test.ts src/__tests__/integration/workflow-designer-blocks.playwright.test.ts src/__tests__/integration/workflow-designer-expressions.playwright.test.ts`
- Result: **29/29 passed** (2.8m).
- Noise: intermittent Unauthorized/Forbidden logs during background fetches and occasional `ECONNRESET`/`Error: aborted` messages; no test failures.