Files
unique/CLAUDE.md
T

30 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# unique.rzen.dev
A daily product-discovery site (Astro, static). The editorial pipeline is skill-driven and designed to run unattended.
## Pipeline
- `/daily-pipeline` — the whole daily chain: capture → bundle → reviews (several per run, judgment call) → pick of the day (explicit decision every run) → build → commit → push → digest. This is the entrypoint for scheduled/headless runs; scheduled runs auto-deploy afterwards via the lab CI `publish-unique-daily` job.
- `/daily-finds` — capture-only sweep of `sources.json`; writes `src/content/find/<yyyy>/<mm>/<slug>/`, marks the day's shortlist (`shortlist: true`, up to 12), adds `amazonLink` for confidently-matched physical products, and applies mechanical source maintenance.
- `/build-bundle [auto|weekly|<theme>|<slugs>]` — one themed roundup referencing find slugs. `weekly` = date-based catch of unbundled shortlist finds.
- `/cluster-bundles [auto]` — batch-cluster the backlog into 47 bundles.
- `/build-review <slug> [auto]` — graduate a find to a full review (fact-check against the product's own site is mandatory in auto mode).
Unattended runs never pause for confirmation — they publish, log to `daily-finds.log.md`, and report a digest; the user vetoes after the fact. Only two things stay user-only: vetting `candidate-sources.md` nominees into `sources.json`, and scheduling.
## Conventions that bite
- **`EDITORIAL.md` is the voice charter** — concise, to the point, inspiring delight (through specificity, never ad copy); word budgets per copy type. All audience-facing prose follows it; the pipeline runs a fresh-eyes copy-edit stage over each day's new copy.
- **No tobacco or alcohol content** — hard editorial exclusion at every stage: never captured as finds, never selected into new bundles, never graduated to reviews. A few legacy alcohol finds (MayJuly 2026) stay published and keep their existing bundle spots, but they're ineligible for anything new.
- **No camping equipment as pick of the day** — camper trailers and other camping gear are fine as finds and occasional reviews, but never take the homepage hero.
- **Editorial rules are forward-looking** — what's published stays published; new exclusions apply only to future picks/finds/bundles/reviews, never to retroactive edits or unpublishing.
- Review heroes are auto-discovered from `src/content/reviews/<slug>/hero.<ext>` (`src/lib/hero.ts` glob) — name the file `hero.*`; no registration.
- The homepage "pick of the day" is `src/data/pick.json` (`{"hero": "<review-slug>"}`); falls back to the latest review.
- Find slugs are globally unique although folders are date-bucketed; URLs stay flat at `/find/<slug>/`.
- Finds are reachable through bundles and through tag pages (a secondary "Finds" list under the entry grid on `/tags/<tag>/`) — an unbundled find is still invisible on the home feed, grids, and category pages.
- `source` frontmatter must exactly match a `name` in `sources.json`.
- `topics` frontmatter (finds and reviews) must come from the controlled vocabulary in `src/lib/topics.ts` (`TOPIC_META` keys) — the schema enum fails the build on anything else. Tags are free-form; topics are curated. "Giftable" is a tag (`giftable`), never a topic.
- Amazon links: store canonical `https://www.amazon.com/dp/<ASIN>` with no query params; `src/lib/affiliate.ts` adds the tracking ID, badge, and disclosure at render time.
- Commit style: see `git log``content: …` for capture runs, `site: …` for everything user-visible; one commit per pipeline stage.
- `npm run build` (astro check + build) must pass before pushing.