Five-stage lifecycles that can be safely re-run
Two systems: a 17-node content pipeline that conditionally skips a paid API when the format does not need it, and a three-workflow no-code outreach stack reimplemented as ten Python modules in five days.
2026 · for a restoration-services client and others
5
Lifecycle
ingest → extract → validate → enrich → retry
≤4
Retry cap
then permanent-failure tagging
3 → 10
Migration
workflows to Python modules
0
Duplicate sends
after normalising field access
Pipeline
- webhook
-
normalize +
route - skip SEO?
-
keyword
research -
generator
agent - response
Do not pay for what the format does not need
A router inspects the requested content types against an exclusion set and flips a single routing flag. Social posts, emails and newsletters skip the entire SEO limb — no keyword extraction, no paid keyword-research call. Only formats that actually benefit pay for it.
Every filter needs an empty-set answer
The keyword filter prefers medium and high competition terms. If that bucket comes back empty it falls back to the low bucket rather than returning nothing, so the generator downstream always receives something to work with.
Idempotence as the actual requirement
The validation lifecycle caps attempts at four, tags permanent failures, and writes idempotent updates to the system of record. Statuses classify into valid, invalid, redeemed or unknown — unknown treated as a real state rather than an error to retry into oblivion. Multi-route validators reach the same answer three ways: GraphQL interception, DOM parsing, and API interception.
A fight between a process manager and a CLI flag
The gateway kept dying during manual runs. The cause was a user-level service configured to always restart: the manual run killed the service-owned process on the shared port, systemd instantly restarted it, and that killed the manual run. A self-inflicted loop that took reading both sides to see. The fix was one line — stop the service first.
Migration measured by what did not happen
Three linked no-code workflows became ten Python modules in five days, with the intake module frozen as authoritative. The correctness work was all in the seams: normalising field access across two systems of record, aligning completion flags with the original behaviour, and preventing duplicate live emails — a real near-miss rather than a hypothetical one.
From the archive
“Markdown-first: Python scripts are the implementation, the operator docs are the spec.”
“Unknown is a real state, not an error.”
Run log