T2 fan-out · personal / research:for_eachfans onenika:fetchwithmode: metadataper URL — the page’s OG/meta head as typed data, not a scrape — withretry:for transient blips andon_error: recover:so a dead link degrades to a{ dead: true }row instead of failing the batch.nika:jqrenders the triage table;nika:writepersists it.
The job
Every bookmark pile has the same two questions: what is this, and is it even alive? Answering them by hand means opening every tab. This workflow answers both in one run — title/description/site from each page’s own metadata, dead links marked as dead — and leaves a table you can sort, grep, and prune from.The shape
The file
t2-bookmark-triage.nika.yaml
The resilience ladder, in order
retry: { max_attempts: 2, backoff_ms: 500 }— a transient blip gets a second chance BEFORE any verdict.on_error: recover:— a link that still fails becomes{ dead: true }and the batch keeps walking.recover:takes a YAML value, not a JSON string: quote it and jq downstream sees an unindexable string instead of an object.- The table renders both worlds — the jq step escapes pipes and
newlines from page-controlled metadata (a
|in someone’s OG title must not break your markdown table), and dead rows print asDEADinstead of vanishing.
mode: metadata fetches the page’s head, typed —
when all you need is identity, don’t ask for the body.
Run it
This workflow is newer than the currently shipped engine pack:
nika examples run showcase/t2-bookmark-triage says
unknown example until the next engine tag re-vendors the pack.
Until then, run it from the spec checkout as above — the file is the
same one the pack will embed, sha-pinned in the spec manifest.vars.bookmarks with your own export (most browsers dump
bookmarks to HTML — one jq pass turns that into the URL list this file
expects).