an agent skill · workflow automation — cross-system and human-in-the-loop

/automation

automation builds the workflow that fires when a customer upgrades, the nightly sync between two SaaS tools, the refund that waits for someone to approve it, and the cron job nobody has checked in six months. It owns the decisions, not the click-path: whether to automate a thing at all, which platform to build it on, what triggers it, what order the steps run in, who approves the risky one, and how you learn it stopped — across hosted iPaaS (Zapier, Make), self-hosted engines (n8n, Windmill), code-first durable execution (Temporal, Inngest), and plain cron. Two properties shape every technique here: a step may belong to a vendor you cannot deploy to, and a step may be a person — hence you cannot deploy a fix into someone else's system, and you cannot un-send.

# natural language — no flags, no fixed pipeline /automation the Stripe charge succeeded but the CRM record never got created — was the webhook ever sent?

runs onClaude CodeCodexCursorAntigravityopencodeGrok BuildHermes

The router is the skill. There is no fixed pipeline to run start-to-finish — each job stands alone and enters where your request is. The animation traces one path (a reconciliation loop closing a gap nothing else caught); the sections below map the whole surface it routes across.

Own what spans the boundary you cannot deploy to

Build processes that span systems, schedules, events and human approvals — and make them survive the fact that you cannot deploy a fix into someone else's system, and you cannot un-send. backend owns async work inside a system you control: your queue, your workers, your database, deployable and testable end to end. automation owns the case where most of the steps belong to vendors you cannot deploy to, cannot unit-test, and cannot roll back — where the API changes with no deploy on your side, the quota belongs to someone else, and a person clicking "approve" is a node in the graph. It writes workflow definitions, integration code, connector configuration and functions — it does not author the business rule; when no upstream rule exists, it captures it explicitly rather than inventing one silently.

automation owns

the wiring across a boundary you don't control

  • reconciliation against the vendor's state ⭐ — an ack is not evidence; the loop that catches what a webhook missed
  • every irreversible step, named — sends, charges, writes to a system of record; hardest-to-revert runs last
  • the credential fleet — API keys and OAuth across many vendors, monitored as its own resource, not a side effect of a workflow running
  • human approval, trigger design, sync, cost — a timeout policy named before the gate ships; what a trigger will also fire on; drift between two systems; a quota that belongs to the vendor

hands off to

the "Not this skill" table — eight asks this skill declines by design

  • backend — jobs, queues, outbox, saga inside your own system; the idempotency-key primitive itself
  • ai — the model's cognition: prompts, retrieval, evals, model-level guardrails
  • data — the warehouse, ETL/ELT, analytical modelling, the governed dataset
  • operate — deploying the workflow, running the monitoring platform, incident response
  • quality — independent verification and the ship/claim decision
  • product / marketing / sales / success — authoring the business rule, or customer-facing comms
  • architecture — system shape, contracts, NFR budgets, threat model
  • orchestrate — coordinating agents inside a development session; not a lifecycle skill

The default reader is one person, or a small team, with no second pair of eyes. That matters more than it looks: nearly every control this domain teaches assumes a counterparty. Approval assumes an approver who is not the requester. Reconciliation assumes a reconciler who is not the recorder. The functions survive at n=1; the second body does not — the substitute is an independent source, a clock, or a rule committed to in advance (I6).

The faceted router

SKILL.md is a router, not a script. Every request selects the smallest sufficient route: one primary job — the twelve below — combined with at most one base surface that reshapes how the job applies to what's actually running, plus the additive agentic overlay when a model decides which tool to call, in what order, or is the trigger itself. Read the selected references completely; load one or two at most, never the whole pack.

facetoptionsrule
① Primary job reconciliation ⭐ · integration-reliability · compensation-and-recovery · credentials-and-connections · approval-and-authority · trigger-design · sync-semantics · workflow-observability · cost-and-quota · platform-selection · workflow-testing · process-capture Exactly one. Pick the single job the request needs; the flagship — reconcile against the vendor's own state, never your record of what you told it — is the loop every other job assumes exists somewhere, or states plainly that it does not.
② Base surface surface-hosted-ipaas (default) · surface-self-hosted-engine · surface-code-first-durable · surface-platform-native At most one. The surface reshapes what each job means for where the workflow actually runs — it points to the job references, it doesn't redefine them.
③ Agentic overlay surface-agentic — spend ceiling, step/iteration limit, wall-clock deadline, kill switch, blast-radius scope Additive. Stacks on top of the base surface, only when a model decides which tool to call, in what order, or is the trigger. A model doing one bounded, deterministic task inside a step is not this overlay.
Every claim on this page is true of the shipped pack. Where a number is cited — the retry windows, the registrar-style vendor delivery guarantees, the agent iteration ceilings — it carries a source and a verification date; where a hazard is this pack's own judgment rather than a sourced one (the recursion at n=1, the loop counter), the page says so rather than dressing it up as a citation.

The twelve primary jobs

Each job is one reference, read fully only when its route is selected. Reconciliation is the flagship because every other job either assumes this loop exists somewhere, or has to say plainly that it does not — this is the whole surface, not a headline slice.

I need to…ReadContribution
Prove what actually happened — catch what the webhook missed, diff against the vendor reconciliation.md Flagship. Reconcile against the vendor's authoritative state, never your own record; cadence and window; ID-set diff before field diff; matched / within-tolerance / exception; alert-first at n=1
Stop duplicates and missed work — delivery semantics, dedup integration-reliability.md Quick Acknowledgment (ack fast, process async); dedup keyed on the business event; the completion-check false positive; per-vendor delivery guarantees
A step failed after an earlier one already sent, charged or wrote compensation-and-recovery.md Compensation is a forward action, not a rollback; hardest-to-revert last; compensation as a human act; resume-vs-restart before any irreversible step
Manage API keys and OAuth across many vendors; something silently stopped authenticating credentials-and-connections.md The credential fleet; silent-expiry traps; scheduled pre-expiry refresh; credential health as its own monitored resource; the shared-account bus factor
Put a human in the loop — who approves, what happens on timeout approval-and-authority.md Translating meeting-paced GRC (maker-checker, delegation of authority) into machine-timeout policy; no engine ships a default; the n=1 compensating control
Decide what starts the workflow; a trigger fires too often, too broadly, or twice trigger-design.md Trigger taxonomy; over-broad conditions; the cron/DST comparison; trigger idempotency across two delivery paths
Keep two systems in step; records duplicated, deleted rows diverging, a loop sync-semantics.md The A→B→A loop; deletes are invisible to incremental sync; updated_at is a lie; conflict policy as a decision; backfill-to-incremental cutover
Tell whether it is still running, and what "green" does not mean workflow-observability.md A workflow that stopped is not a workflow that failed; no engine alerts by default; missing-heartbeat over failure notification; audit of what ran on whose authority
Cap what this costs; a loop or a retry is burning quota cost-and-quota.md Per-task billing; the quota is the vendor's, and its blast radius is the whole account; retry × 429; the workflow circuit breaker
Choose or leave a platform — no-code, self-hosted, code-first platform-selection.md The four tiers; resume-capability as a selection criterion; licence and liveness; exit cost asked up front
Test a workflow that spans vendors you cannot control workflow-testing.md What is genuinely untestable and what replaces it — dry run, narrow canary, first-then-bulk gate, fixture replay
Turn a business rule into a workflow — or decide not to automate at all process-capture.md Capturing the rule at n=1; the control-flow vocabulary worth having; when not to automate; prefer the API, and what you buy when there isn't one

Full router table & invariants: SKILL.md.

Four surfaces + one additive overlay

One base surface, at most, reshapes every job for where the workflow actually runs — the same reconciliation job is bounded differently on a hosted builder than on code-first durable execution. The agentic overlay is additive — it stacks on top of whichever base you picked, never replaces it — and carries a distinct violet identity throughout this page, the same convention operate, quality, and data use for their own additive overlay.

Hosted iPaaS surface-hosted-ipaas.md

The default: Zapier/Make/Workato/Tray/Pipedream/IFTTT-class — you rent execution on a vendor-run, connector-based builder. The reliability gaps are worst served here, because the product's entire job is to make the wiring look easy.

reshapeswhat the platform silently does not give you before you wire an irreversible step · the tier-selection question, paired with platform-selection

Self-hosted engine surface-self-hosted-engine.md

n8n / Windmill / Activepieces / Kestra / Node-RED — you run the engine yourself. You trade the vendor's operational burden for your own, and take on a real licensing decision the hosted tier never asks you to make.

reshapesoperational ownership of the engine itself · the licence position, per engine, before adopting or redistributing it

Code-first durable surface-code-first-durable.md

Temporal / Inngest / Restate / Trigger.dev / Cloudflare Workflows / Step Functions — the workflow is code, and the engine durably persists step state. Doesn't redefine any job; changes what I9 (resume-vs-restart) costs to get right, and who else is in the room (backend, operate).

reshapesresume-vs-restart from a real guarantee, not a hope · where an irreversible early step needs a durable engine, not a visual builder

Platform-native surface-platform-native.md

GitHub Actions, a cloud scheduler, plain cron — no engine at all. The platform is the scheduler, and every reliability property an engine would otherwise supply (retry, resume, alerting) has to be built by hand.

reshapeswhether a small periodic job needs an engine at all · the specific DST behaviour of the scheduler you're on

Agentic additive ⭐

A model decides which tool to call, in what order, or is the trigger itself — not a bounded, deterministic task inside one step. Stacks on, does not replace. A named spend ceiling, step/iteration limit, wall-clock deadline, kill switch, and blast-radius scope for every agentic step, on top of any base surface.

reshapesI12 — an agentic step fails by continuing · what's ai's (the model's cognition) vs ours (the deterministic envelope around it)

Reconciliation — the flagship

Ask an agent to wire Stripe to your CRM and it writes the webhook handler, watches it return 200, and calls the integration done. Nobody checked whether the vendor's side still holds what you think it holds, what a refund actually undoes, or what happens when the approval gate times out at 3am with nobody watching. Closing that gap — proving what actually happened, not what a 200 response or your own "handled" flag claims happened — is reconciliation, and everything else in this pack assumes a reconciliation loop exists somewhere, or states plainly that it does not. I1 is the spine: reconcile against the vendor's authoritative state, never against your own record of what you told it. A 200 response, a queued job, a webhook subscription you believe is active — none of these are evidence the vendor's side actually holds what you think it holds. A webhook that never arrives leaves no trace in your logs at all — nothing failed loudly, so there is nothing to notice.

SignalWhat it actually establishesWhat it does not
A 200 responseThe vendor accepted the request, at that momentThat the vendor's side still holds it later, or that nothing downstream reversed it
An active webhook subscriptionThe subscription existed at setup timeThat every event since actually fired — a dropped delivery leaves no trace at all (I1)
Your own "handled" flagYou believe you finished processing itThat you did — a corrupted retry can read as confirmation instead of failure (I2)
Retries protect against a delivery you know was attempted — not one that never was

What reconciliation catches that retries can't

  • retriesprotect a delivery you know was attempted, retried against a known failure
  • dedupcatches the same delivery arriving twice — still assumes a delivery happened
  • reconciliationthe only control that catches a delivery never attempted, or attempted and silently dropped before it reached you

Compare the ID set first — cheap, and it catches the two failure modes that matter most: something the vendor has that you don't, and something you have that the vendor doesn't. Tolerance-banded field comparison runs second, on IDs present in both sets only; full-field diff only on suspected drift.

Classify every discrepancy — never binary

matched — auto-close, no human touch needed within-tolerance — timing skew and rounding, expected, not drift exception — routes to a human queue; auto-heal only on high confidence, earned over time
The recursion (I6): COSO names independent reconciliation as the standard escape hatch for missing segregation of duties. Stripe's own guidance requires the opposite in the same breath — the reconciler must not be the recorder. For one person, the escape hatch leads back into the room it was supposed to get you out of.
resolution: independence from the source, the clock, or a pre-committed rule — never a second person who doesn't existthe function survives; the second body doesn't need to

Cadence is tiered, not uniform — this is three jobs at different altitudes, not one:

TierWhat it doesWhat it leaves for the next tier
Recent activityFrequent, tight-window checks against whatever the vendor just processedAnything left ambiguous rolls to the daily pass
Daily accountingA full pass over the prior period, closing what the fast tier left ambiguousDrift that survives past the day rolls to the period close
Periodic closeA slower, wider pass — the last backstop before numbers get reported anywhere externalNothing — this is the floor

The n=1 minimum viable loop: one cron job, calling the provider's "list since timestamp" endpoint, diffing the returned ID set against local IDs — and alerting, never auto-healing, on any gap that survives a grace window. Adding this loop is not a free safety net: it is a second delivery path for the same business event, so the idempotency key must be derived from the event's own identity, not from whichever path delivered it (I4) — trigger-design's job, named here as the obligation the moment reconciliation exists.

What makes this different

Two things set automation apart from a technique library: it names its own wedge as synthesis, not discovery, and it grounds its agentic-overlay claim in filed bug reports and merged fixes, not vendor marketing.

The wedge — five literatures that don't cite each other

Almost nothing here is unknown. The problem is that it is known in five places that have never been introduced to each other.

  • distributed systems — idempotency, saga, delivery semantics, framed for services you own, not vendors you don't
  • Hohpe's Conversation Patterns — compensation and acks for parties you don't control, 20 years old, stalled since 2017, largely unread — no reconciliation practice, no credential fleet, no cost model
  • fintech / ledger engineering — reconciliation, exhaustively — never generalises past money movement
  • enterprise GRC — maker-checker, delegation of authority, the n=1 escape hatch — paced by quarterly certifications, never says what to decide at 3am
  • the 2026 agentic wave — guardrails and iteration ceilings, framed for models, not deterministic business processes

An agentic step fails by continuing (I12)

Not vendor claims — filed issues and a merged fix, which is stronger evidence than any retelling.

  • langgraph #7417 — a long tool call is silently re-executed from checkpoint on replay. The textbook duplicate, filed as a live open bug
  • microsoft/autogen #7071 — the reporter's own logs print "Termination condition evaluated to: True" and the stream keeps processing indefinitely. Not erroring — continuing after its own stop signal
  • CrewAI PR #6370 — merged; adds a hard ceiling of 500 on max_iter (default stays 25) and a 100-hop flow-router cap, citing CWE-770 and CWE-835

The refined claim: an agentic step fails by continuing by default. It fails loudly only to the extent someone bolted a deterministic ceiling onto it — and the mechanism that makes failure loud again is itself a deterministic guardrail, not the model's own restraint.

The universal invariants

References cite these by number; the numbering is canonical. These rules govern every route, whichever files it loads.

What a pass produces

automation's core workflow runs against whatever upstream artifacts exist — a business rule from product, a contract from backend, an NFR budget from architecture — and says so explicitly when none were supplied, rather than inventing one.

step 1routeprimary job + base surface; agentic overlay added only if a model decides or triggers
step 2name the rulestate the business rule and its owner — or say plainly none was supplied
step 3inventoryevery irreversible step first; hardest-to-revert runs last (I3)
step 4key + reconcileidempotency key from the business event (I4); the reconciliation loop, cadence, and escalation (I1)
step 5gate + learna named timeout policy before any gate ships (I13); how you'll learn it stopped (I8)
step 6recordcost per run with a ceiling (I10); handoff when downstream work is expected

Irreversibility inventory

assets/irreversibility-inventory.md

One row per step that reaches outside your system, in three tiers — reverses cleanly, compensable only, cannot be taken back — filled before the run order is decided, not after.

Reconciliation worksheet

assets/reconciliation-worksheet.md

The vendor's authoritative source, cadence, comparison method, and tolerance — fixed before the loop's first cycle, not after a month of unread exceptions.

Credential register

assets/credential-register.md

One row per externally-issued credential — detection method written before the mitigation. Never records a real key, token, or secret value.

Approval policy card

assets/approval-policy-card.md

Who may approve, requester ≠ approver, and the timeout default — filled before the gate goes live, not the first time a request times out.

Trigger audit sheet

assets/trigger-audit-sheet.md

One row per trigger — the business event it stands for, DST behavior, other paths on the same event, self-audited before calling trigger design done.

Run cost table

assets/run-cost-table.md

Billing unit named before the number; a monthly ceiling, a circuit breaker, and the blast radius if the quota is exhausted — this workflow, this account, or the vendor's shared bucket.

handoff.yaml

assets/handoff.yaml

The routing companion carrying irreversible steps, idempotency, the reconciliation loop, credentials, human gates, evidence, and every volatile fact with its re-verify trigger.

The handoff seams

automation consumes upstream artifacts without silently overriding them — the business rule from product, a contract from backend, an NFR budget from architecture — and says so explicitly when none exist, rather than inventing a rule or a target to fill the gap. It is rarely terminal: it emits a compact handoff.yaml beside the workflow artifacts whenever downstream work is expected.

automation builds

objective: <one sentence>
surface: base + agentic?
irreversible_steps: [step, order,
  compensation, resume_or_restart]
reconciliation_loop: exists,
  compares, cadence, on_discrepancy
credentials: [vendor, expires,
  refresh_mechanism]
human_gates: [approvers, timeout,
  on_timeout]

operate

The deployed process to run and watch — plus the missing-heartbeat gap this skill deliberately leaves unfilled by default (I8), and credential expiries that need their own monitored schedule (I7).

quality

Every claim this skill made about its own reliability — a step is idempotent, the reconciliation loop actually catches drift, a timeout policy is enforced — as something to independently verify, not to re-run and call independent.

backend (lateral)

Owns the idempotency-key primitive, queues, outbox, and saga inside a system you control; automation applies the same discipline across a boundary you don't, and hands back a contract violation rather than silently working around it.

A standalone request with no downstream consumer needs no handoff.yaml at all. Only objective is required — every other field may be empty, and a consumer must tolerate it absent, never treat absence as a schema violation. reconciliation_loop.exists: no is a valid, required answer when there is no loop; leaving the block blank is not the same statement. Never silently invoke a sibling skill — name it in recommended_next.

Start here

Install once. It's a plain SKILL.md router — no flags, no config, no scripts — so it activates on natural-language phrasing ("was the webhook ever sent," "set up nightly reconciliation before we close the books," "the refund double-charged someone, what's the compensating action") rather than a fixed command.

# skills.sh ecosystem npx skills add gabros20/automation-skill # clone + installer (per-host targets) git clone https://github.com/gabros20/automation-skill && cd automation-skill ./install.sh codex # or: claude | cursor | antigravity | opencode | grok | hermes | agents | all # use — natural language, any host /automation the Stripe charge succeeded but the CRM record never got created — was the webhook ever sent? /automation set up a nightly reconciliation between our order table and Shopify before we close the books /automation the refund automation double-charged a customer — what's the compensating action, not a rollback? # → compensation-and-recovery.md

The same install runs on any Agent Skills host. Codex installs to ${CODEX_HOME:-$HOME/.codex}/skills and triggers with $automation; agents remains a separate cross-agent installation target.

install targets by host
hostinstall targetcommand
Claude Code~/.claude/skills./install.sh claude
Codex${CODEX_HOME:-$HOME/.codex}/skills./install.sh codex
Cross-agent path~/.agents/skills./install.sh agents
Cursor CLI~/.cursor/skills./install.sh cursor
Antigravity (IDE + agy)~/.gemini/…/skills./install.sh antigravity
opencode~/.config/opencode/skills./install.sh opencode
Grok Build~/.grok/skills./install.sh grok
Hermes~/.hermes/skills./install.sh hermes

Prefer npx skills add gabros20/automation-skill when you have Node — it maps supported clients itself.

what's in the repo
skills/automation/ the skill: SKILL.md (router) + 18 references/ + assets/ docs/ installation · usage · recipes site/ this guide — deploys to automation-skill.vercel.app install.sh installer (claude | codex | cursor | antigravity | opencode | grok | hermes | agents | all) README.md · CHANGELOG.md · LICENSE

More docs: docs/installation.md · docs/usage.md · docs/recipes.md.