T3 fan-out · strategy / product marketing — the flagshipfor_each. The number of pages is decided at RUNTIME by the competitor’s sitemap;max_parallelkeeps the crawl polite,fail_fast: falsekeeps one dead page from killing the radar,retry:absorbs the flaky web.
The job
Monday 8am: what did they ship? Instead of 40 tabs, the sitemap is mapped, the 8 freshest pages are read concurrently, and one brief tells you what it signals. Every page that survives lands in the fan-in; every page that doesn’t is reported, not fatal.The shape
The file
t3-competitor-radar.nika.yaml
How it works
The collection is computed, not hardcoded
for_each: ${{ tasks.map.recent }} — eight URLs this week, three
next week. The DAG doesn’t change.Resilience is per-iteration
retry: (exponential + jitter) and timeout: "30s" apply to EACH
page fetch. fail_fast: false collects errors instead of aborting
the batch.Constructs you just used
| Construct | Where | Reference |
|---|---|---|
for_each over a binding | pages | Workflows |
max_parallel + fail_fast | pages | Workflows |
per-iteration retry: + timeout: | pages | Error model |
${{ item }} loop-local | pages.args.url | Bindings |
Make it yours
- Track THREE competitors: lift the sitemap URL into a list and nest the pattern — or run the workflow per competitor and merge the briefs.
- Filter the sitemap by date with a sharper jq binding before fanning out.
- Schedule it for Monday 07:30 from your host’s cron — the brief is on your desk before standup.
Next · Localization factory
Chained fan-outs and the jq
transpose zip — the whole docs tree,
translated.