算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
software-workflow-automation【设计与创意】Designs workflow automation with n8n, Zapier/Make, Temporal, Trigger.dev, Inngest. Use when choosing platforms, durable execution, or approval gates; not job queues or agents.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
| Need | Default path | Notes |
|---|---|---|
| Broad integration workflow with many SaaS connectors | n8n | Strong default for business and product operations with many external systems. Check the licence before reselling hosted access (Licensing). |
| Visual AI or LLM pipeline prototyping | Langflow | Best fit when the workflow is model-centric and still evolving quickly. Open source; self-host it, or check which managed Langflow offerings exist before recommending a hosted one. |
| Self-hosted event watchers and automation agents | Huginn | Good fit for monitoring, alerts, and privacy-first self-hosted automations; check upstream release activity before committing |
| Long-running, retried, or replay-sensitive business workflows | Temporal or Trigger.dev | Use when durable execution, idempotency, and code review matter more than visual editing speed. |
| Complex state, strong testing, or strict SLOs | Custom code | Move out of no-code/low-code once the workflow becomes core software |
| Tool protocol or reusable tool surface | ../agents-mcp/SKILL.md | MCP is the integration contract layer, not the workflow designer itself |
| Platform state, version traps, and migration notes (check vendor release notes before advising) | references/platform-state.md | Temporal, Trigger.dev, n8n, Inngest, Hatchet, durable-execution selector, iPaaS buy-vs-build, licensing |
| Durable execution deep-dive: Temporal, Trigger.dev, n8n, Langflow | references/durable-execution.md | breaking changes and production traps |
| Replay DLQ messages from a JSON file | scripts/replay_dlq.py | generic scaffold; adapt TARGET_COMMAND_TEMPLATE |
| Platform | Best fit | Durable execution | Visual editor | Code review | Self-host |
|---|---|---|---|---|---|
| n8n | SaaS integration glue, many connectors | No | Yes | Limited | Yes (Sustainable Use License) |
| Langflow | AI/LLM chain prototyping | No | Yes | Limited | Yes |
| Huginn | Self-hosted event monitoring, alerts | No | Yes | No | Only |
| Temporal | Long-running, retried business processes | Yes (replay-safe) | No | Yes | Yes |
| Trigger.dev | Code-first durable tasks, cloud or self-host | Yes | No | Yes | Yes |
| Custom code | Core product logic, strict SLOs, testable | Custom | No | Yes | Yes |
| Signal | Action |
|---|---|
| Flow has conditional branches affecting billing, access control, or user-visible state | Move to code |
| Team cannot run unit tests against the flow | Move to code |
| Flow cannot meet its measured latency SLO in the visual runtime | Move to code |
| Flow has several dependent external side effects | Audit idempotency first; then evaluate code |
| Flow is still a prototype with evolving branches | Stay in visual tool |
| Flow is pure integration glue between stable SaaS APIs | Stay in visual tool |
<business-id>:charge, <business-id>:email).When not to automate. Leave a task manual (with a checklist) when it runs rarely, its inputs change shape each time, the failure cost of a wrong automated side effect exceeds the time saved, or no one will own the flow after launch. Automate the checklist first; automate the action once the steps have stayed stable for several runs.
LLM steps in workflows. Treat each model call as an untrusted step: validate structured output against a schema and route failures to a deterministic fallback or a human queue; cap tokens, cost, and retries per run; run evals before letting model output trigger side effects without approval; and version prompts and model IDs with the workflow version so in-flight runs stay reproducible. Keep deterministic routing in code, not in the model.
Compensation contract.
For each multi-step workflow, classify every completed side effect as reversible, compensatable, or irreversible. Define compensation order, retry behavior, and the terminal state when compensation also fails. Never claim transaction semantics across independent SaaS APIs; expose partial completion to operators with the run ID, completed steps, and safe next action.
Before a workflow is production-ready:
parameters.operation, check the node type/version’s default in vendor documentation and review its side effects manually. The linter does not resolve app defaults; a clean report does not satisfy this gateUse this skill when the user asks:
Recipes keyed to common workflow automation design moments. Each lists the shortest path using patterns above.
Math.random and Date.now deterministic, but I/O still belongs in activities.Activity; activities own all I/O.ScheduleToCloseTimeout on each activity to bound how long a retry loop may run for that step.workflow.Sleep in Go, sleep in TypeScript) for delays inside the workflow; do not use OS sleep or tickers.HeartbeatTimeout on long-running activities so Temporal detects worker crashes and reschedules.docs/workflow/trigger-deployment-decision.md for future team members, including any static-IP allowlist updates needed for outbound calls (Trigger.dev's infrastructure IPs can change on major-version migrations).workflow.GetSignalChannel("approve") or use a Condition; resume on signal receipt.pending_escalation state and notify the escalation owner; do not silently expire.References
Scripts
steps/tasks/nodes/activities/jobs object, a bare step array (group steps with their own steps stay steps), or an array made only of workflows (each linted separately; issues carry workflow). Anything else exits 2, and so does input with no steps at all ({"nodes": []}, [{"nodes": []}]), so an empty export cannot pass a --fail-on error gate; one empty workflow inside a non-empty batch gets a no-steps-found warning.sendgrid, createOrder; words split on non-alphanumerics and camelCase, with an exception list so words such as postgres, posthog and postal are not post), outbound POST/PUT/PATCH/DELETE (method, or requestMethod on the n8n HTTP Request node's typeVersion 1), and n8n app nodes whose parameters.operation contains a write verb (create, update, delete, upsert, insert, send, charge, post, capture, refund, add, remove, cancel, append, upload, reply, publish, push, incr/increment, decr/decrement, move, copy, share, invite, archive). Not linted: n8n trigger nodes (Webhook, Form, Manual, any *Trigger, whose httpMethod is inbound), Respond to Webhook, explicit reads (select, get, getAll, find, aggregate), and DLQ targets, meaning DLQ-named nodes reached only through an error output (a duplicate failure record is harmless; check the DLQ write's own durability by hand). Any other error-path node, such as a fallback charge, is linted like the normal path.upsert and simple SQL conflict writes are static candidates, not proof: confirm a unique business key, stable input, and replay-safe triggers. SQL SET assignments accept only literals/binds or direct incoming values (excluded.col, a simple MERGE source alias, MySQL VALUES(col)). Increments, functions, complex expressions, comments and multiple statements get a warning rather than a clean result; complex safe SQL needs manual review. A query is read-only only when every statement is a SELECT or WITH … SELECT with no write keyword. Any other write, including a node with no operation (n8n omits default values from exports), gets the warning non-idempotent-db-write: use stable replacement values on a unique business key. App nodes relying on a default operation are not detected; resolve the default against the exported node type/version before accepting a clean report.idempotency (e.g. X-Idempotency-Key), and PayPal-Request-Id; add other providers' key headers to IDEMPOTENCY_HEADER_NAMES in the script. In n8n exports a key must be a ={{ }} expression reading the current item ($json.id, $('Node').item.json.id): a constant, $execution, $workflow, or a batch accessor (.first(), .last(), .all(), $items(...)[n]) alone is static-idempotency-key (use .item to follow the current item); item data mixed with $execution, $runIndex, $now, $today, Date()/new Date(), Date.now(), DateTime.now/local/utc(), performance.now(), Math.random(), randomUUID() or a batch accessor is unstable-idempotency-key. A passing key can still have the wrong business scope.dlq field. In n8n exports only a connected onError error output whose direct target is a DLQ-named node counts; a dlq field on an n8n node does not, and disabled nodes, sticky notes and No-Op nodes never do. Either is static evidence, not proof of delivery.--fail-on (default warning, so any issue fails; --fail-on error reports warnings but passes them); 2 input error, including no steps to lint. --strict changes what is found (keyword steps need keys and DLQs, missing retries become errors); --fail-on only sets which severities fail, so --strict --fail-on error gates on strict-mode errors. --format text prints a readable report.--execute exits 2 until the echo template is configured; invalid messages, missing payloads, non-object filters and non-positive limits also exit 2. Offline regressions: scripts/test_replay_dlq.py.Related Skills
When prior decisions or pitfalls are relevant, consult learnings.consolidated.md if present; use learnings.md only for needed history or as the available fallback. Otherwise skip both.
After applying it, if you encountered a pattern worth remembering, a mistake worth preventing, or a domain fact that surprised you, append one dated bullet to learnings.md via agents-skills-feedback-loop/scripts/append_learning.py. Do not modify SKILL.md itself.