Feature 017: MailerPress workflow (automation) abilities — 15 new agent-facing abilities across READ + WRITE surfaces + 3 durable memory captures + 7 lifecycle workflow blueprints. MailerPress goes from 69 → 84 abilities; combined free+Pro from 97 → 112.
Feature 017 closes the workflow coverage gap left by Features 014/016. MailerPress workflows (their term for email automations) power sequence-based sends triggered by contact events — trial started, license purchased, license activated, tag added, custom hook fired, etc. Prior to F017 agents could create + edit campaigns and contacts but couldn't compose or deploy the automations that wire them together into lifecycle sequences. F017 ships both the READ surface (discover triggers/actions/conditions + inspect existing workflows) and the WRITE surface (create/update/delete/enable/retry) as separate PRs so the read side landed first and could be validated in isolation.
READ abilities (9 new — PR #67)
Composition metadata for agents authoring workflows: list-workflow-triggers (every registered trigger key + settings_schema + output_fields), list-workflow-actions (every action handler + settings), list-workflow-conditions (operators + condition-builder fields). Workflow CRUD reads: list-workflows (paginated, filterable by status/trigger_type/search, sortable), get-workflow (full node graph). Per-workflow analytics: get-workflow-stats (throughput + failed/completed job counts), get-workflow-logs (per-job execution log, status enum FAILED/COMPLETED), get-workflow-ab-test-results (A/B test metrics per version, winner declared, winning_criteria — bare-array response wrapped as {ab_tests: [...]}). Cross-workflow operational: list-failed-workflow-jobs (global failed-job list capped at 500 rows by MailerPress, filterable by interval days).
WRITE abilities (6 new — PR #70, supersedes closed #68)
Single-entity writes: create-workflow + update-workflow (atomic {automation, nodes[]} payload — see A12 for the shape), update-workflow-status (bulk activate/deactivate/draft via ids array or literal "all"). Operational side-effect: retry-failed-workflow-jobs (one job via job_id or all failed jobs for the workflow). Destructive-tier: delete-workflow (single-entity confirm_name guardrail — server-side fetch → strict name match → dispatch), delete-all-workflows (double guardrail — confirm_count matched against live workflow count fetched inside execute() PLUS confirm_phrase matched against the literal string DELETE ALL WORKFLOWS, case-sensitive, enforced at both JSON-schema and runtime layers per new DEC-DESTRUCTIVE-DOUBLE-GUARDRAIL).
3 durable memory captures established
- ARC-MAILERPRESS-WORKFLOW-NODE-GRAPH (A12) — Documents the create/update payload shape, node wiring semantics (
step_idstring handles +next_step_id/alternative_step_idpointers), CONDITION rule shape ({combinator, rules:[{field, operator, value}]}), DELAY/SEND_EMAIL/custom_triggersettings shapes, and the Pro-gate on non-template workflows. - DEC-DESTRUCTIVE-DOUBLE-GUARDRAIL (D18) — Formalizes the three-tier guardrail model surfaced across F014–F017: single-entity → bulk → wipe-everything, with escalating confirmation friction. Reference impls for each tier now in the codebase.
- WORKLOG W13 — Records the milestone including the first live end-to-end 16-node workflow deployed atomically via one
create-workflowMCP call.
7 lifecycle workflow blueprints under docs/examples/lifecycle-workflows/
Full-fidelity {automation, nodes[]} JSON payloads for the complete SaaS lifecycle map: purchase→activation (16 nodes), activated→first-connection (14 nodes), 30-day trial (32 nodes, 3 phases, dual-exit design), free→paid (14 nodes), renewal reminders (6 nodes), failed-payment dunning (6 nodes), win-back (10 nodes). 98 nodes total, deployed atomically as an integration test via 7 parallel create-workflow MCP calls with zero failures. Any operator can json.load() a file and pass it to mailerpress/create-workflow to redeploy the same map.
Endpoint-drift bug caught during code review
list-failed-workflow-jobs initially advertised an automation_id filter param, but source-trace of MailerPress Workflows::getFailedJobs at line 4004 revealed the endpoint reads only interval — the request param was silently ignored. Fifth instance of BUG-ENDPOINT-DRIFT-PATTERNS. Removed from schema before merge; description now guides callers to client-side post-filter the returned failed_jobs[] array.
Test coverage delta
Started F017 at 377 MailerPress unit tests / 1376 assertions (post-0.9.6). Ended at 454 tests / 1657 assertions — a +77 test / +281 assertion expansion covering every new ability's shape invariants plus two new destructive-tier regression tests (test_delete_workflow_requires_confirm_name_matching_id, test_delete_all_workflows_requires_double_guardrail). Full suite runs in ~150 ms via composer test:mailerpress.
Operator note
Both MailerPress + MailerPress Pro suites now register a combined 112 abilities (84 free + 28 Pro) — up from 97 at 0.9.6. All 15 new abilities appear automatically on the abilities-manager Integrations page's MailerPress tab under a new workflows sub-group. No database schema changes; no runtime migration. Companion acrossai-mcp-manager version parity unchanged.
Merged PRs
- #67 — feat(abilities): Feature 017 PR-A — MailerPress workflow reads (+9)
- #70 — feat(abilities): F017 workflow writes + lifecycle blueprints (supersedes #68 + #69)
- #71 — release(0.9.7): Feature 017 — 15 MailerPress workflow abilities + 7 lifecycle blueprints
Previous release
For 0.9.6 (Feature 016: comprehensive MailerPress coverage, +54 abilities), see v0.9.6 release notes.