--- name: daily-finds description: Capture-only daily sweep for unique.rzen.dev. Scans every source in sources.json, writes one find file per qualifying item to src/content/find/, and nominates 1-2 new sources to consider. Does NOT pick a winner, write a superpost, or address the user/audience. Picking happens via /build-finds and /build-review. Use when the user asks for "today's finds", "morning sweep", "capture", or runs /daily-finds. disable-model-invocation: true --- # daily-finds Pure capture: every item that passes the bar becomes a `find` file. No daily cap, no theme detection, no audience-facing post. Whether any of these finds appears in a `finds` superpost or graduates to a review is a separate editorial decision. Invoke from inside the `unique.rzen.dev` repo. ## Inputs - `sources.json` at the project root — curated source list with per-source `fetch` strategy (`webfetch` / `curl` / `skip`) and optional `fetchUrl`. - `daily-finds.log.md` — running log of every find slug ever written (used to skip duplicates). - `src/content/find/*.mdx` — already-captured finds (every existing slug is a "do not re-suggest" item). - `src/content/reviews/*.mdx` — already-reviewed items (do not re-suggest). - `candidate-sources.md` — newly nominated sources awaiting user vetting. ## The bar A find qualifies if and only if it is **(a)** delightful, unusual, or distinctive in a way the audience would care about *and* **(b)** usable daily (relax to "memorable for a visitor" for travel). Drop generic mass-market items, ad-copy listicles, speculative / not-yet-shipping products, self-promo, and anything not traceable to a real currently-buyable / currently-visitable thing. Crucially: do **not** filter by "is it the best of the day." Capture broadly. Editorial selection happens later. ## Procedure ### 1. Scan every source For each source in `sources.json`: - **Default (`fetch: "webfetch"` or no field)**: WebFetch against `fetchUrl` if present, else `url`. Extract recently-featured items (name, link, one-line description). - **`fetch: "curl"`**: shell out to `curl -sL -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" --max-time 25 ""` and parse the HTML body. For Reddit JSON endpoints, pipe through `python3 -c '…'` to extract titles, links, and selftext. Treat HTTP 403 with a non-empty HTML body as a content response (Atlas Obscura quirk) — only treat empty bodies or Cloudflare challenge markers as blocked. - **`fetch: "skip"`**: log the source as skipped (with `skipReason`) and move on. Do not retry. Parallelize WebFetch in batches of ~8 concurrent requests; finish all sources before proceeding. For each source record: items extracted, or `empty` / `blocked` / `skipped`. ### 2. Filter For each extracted item, drop: - Anything whose slug already exists in `src/content/find/`. - Anything whose name appears anywhere in `daily-finds.log.md`. - Anything reviewed in `src/content/reviews/` (compare by `name` field). - Items that fail the bar above. ### 3. Write find files For every survivor, write one file at `src/content/find/.mdx`: - Slug: kebab-case form of the name (lowercase, ASCII, no leading numbers). - Frontmatter: `name`, `subtitle` (optional, one-liner), `date` (today), `link` (external URL — required), `linkText` (optional), `source` (the source name from sources.json — required, exact match), `topics` (copied from the source's `topics`), `tags` (free editorial tags inferred from the item — keep to 2-4), `description` (optional meta override). - Body: 2-3 sentence note. Concrete, name a *specific* virtue. Bad: "great design". Good: "the silicone bumper means it survives drops onto concrete; the lanyard hole is positioned where your thumb naturally rests". - No daily cap — write every survivor. If `link` for a Reddit-discovered item points at a v.redd.it / i.redd.it URL, fetch the post's selftext or comments to find the actual product URL before writing the file. ### 4. Nominate 1–2 new sources Spend a small slice of the run on source discovery: - During scans, when another publication / blog / shop / newsletter is referenced in a way that suggests it'd fit the brief, capture it. - Or run one targeted `WebSearch` for `"best newsletter"` or `" curator blog"`. - Append nominees to `candidate-sources.md` (create if missing) under today's date heading. For each: name, URL, a one-line case for adding, and which existing source surfaced it (or "WebSearch"). - Don't auto-add to `sources.json` — that's a user decision. ### 5. Update the log Append to `daily-finds.log.md`: ``` ## YYYY-MM-DD — capture run Sources scanned: total — hits, empty, blocked, skipped. Productive sources: . Captured finds: - — source: - — source: - ... New source nominees: (see candidate-sources.md). ``` ### 6. Report to the user Short summary in chat: ``` Captured finds across productive sources today. Blocked: sources. New source nominees: . Run /build-finds to draft a superpost from the recent pool, or /build-review to graduate one to a review. ``` That's it. No theme, no candidates list, no "pick a winner." ## Notes - "Why it fits" / find descriptions should name a *specific* virtue. Bad: "great design". Good: "magnetic connector means it never strains the cable when a foot catches it". - Travel destinations relax the daily-use criterion — a place qualifies if a visitor would remember it years later. - If a source's homepage is too noisy, prefer adding a `fetchUrl` to `sources.json` rather than working around it inside the skill. - Never invent slugs that collide with existing finds or reviews. If a name would produce a colliding slug, append a year or distinguishing word. - Source attribution must be exact — the `source` field in each find file must match a `name` in `sources.json` so the `/sources` page cross-reference works.