pipeline: hard editorial exclusion of tobacco and alcohol content
New rule at every selection stage: daily-finds drops such items at capture (categorical, overrides design/gift appeal; borderline cases skip too), build-bundle and cluster-bundles treat legacy alcohol finds as ineligible for new bundles, and build-review refuses to graduate them even on explicit slug. Existing finds stay published per forward-only decision; CLAUDE.md records the policy centrally. Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
This commit is contained in:
@@ -46,6 +46,8 @@ A bundle must contain **at least 2 items that have a hero image** (`hero.<ext>`
|
|||||||
|
|
||||||
Re-use is allowed — a find can appear in multiple bundles under different themes. But by default, prefer surfacing **unbundled** finds first; only reach for re-uses when the theme genuinely calls for them.
|
Re-use is allowed — a find can appear in multiple bundles under different themes. But by default, prefer surfacing **unbundled** finds first; only reach for re-uses when the theme genuinely calls for them.
|
||||||
|
|
||||||
|
**Ineligible: tobacco- and alcohol-related finds.** The site no longer promotes either; a few legacy finds (wine, whisky, cocktail, bar items) predate the rule and stay published, but they must never be selected into a new bundle — not as expansion, not in the weekly catch, not even if the user's seed theme seems to invite them (flag it instead). Don't count them as "unbundled finds awaiting a home."
|
||||||
|
|
||||||
### 2. Confirm the cluster
|
### 2. Confirm the cluster
|
||||||
|
|
||||||
**Autonomous mode skips this step** — apply the bar yourself, write, and put the cluster rationale in the log entry instead. Otherwise, show the proposed cluster(s) before writing anything. The exact format depends on which path step 1 took.
|
**Autonomous mode skips this step** — apply the bar yourself, write, and put the cluster rationale in the log entry instead. Otherwise, show the proposed cluster(s) before writing anything. The exact format depends on which path step 1 took.
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ Parse frontmatter. Note: `name`, `subtitle`, `link`, `linkText`, `amazonLink`, `
|
|||||||
|
|
||||||
If `promotedTo` is already set, abort: "This find has already been promoted to <slug>."
|
If `promotedTo` is already set, abort: "This find has already been promoted to <slug>."
|
||||||
|
|
||||||
|
If the find is tobacco- or alcohol-related (wine, whisky, cocktail, bar, smoking items — a few legacy finds predate the exclusion), abort: the site no longer promotes either, so these never graduate to reviews, even on explicit slug argument — explain why instead.
|
||||||
|
|
||||||
### 2. Pick a hero asset
|
### 2. Pick a hero asset
|
||||||
|
|
||||||
Look at the external link and pick a hero — a screenshot, demo gif, or product photo from the maker's site. The find's own `hero.<ext>` is a valid fallback, but prefer a richer asset from the source when one exists (finds often carry low-res OG cards).
|
Look at the external link and pick a hero — a screenshot, demo gif, or product photo from the maker's site. The find's own `hero.<ext>` is a valid fallback, but prefer a richer asset from the source when one exists (finds often carry low-res OG cards).
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ Aim for 4-7 clusters. Each cluster should:
|
|||||||
|
|
||||||
If a cluster can't meet the hero floor, **hold it back** rather than pad it with misfits or write it thin — record it as deferred (theme + items + which lack heroes) and revisit when enough hero-bearing finds emerge.
|
If a cluster can't meet the hero floor, **hold it back** rather than pad it with misfits or write it thin — record it as deferred (theme + items + which lack heroes) and revisit when enough hero-bearing finds emerge.
|
||||||
|
|
||||||
|
**Ineligible: tobacco- and alcohol-related finds.** Legacy finds of this kind (wine, whisky, cocktail, bar items) stay published but must never be clustered into a new bundle. Exclude them from the pool up front and list them as "ineligible (alcohol/tobacco)" rather than uncovered.
|
||||||
|
|
||||||
Coverage check: after partitioning, every find should appear in at least one cluster (existing or new). If a find genuinely fits no theme, leave it uncovered and report it — don't pad a cluster with a misfit. Finds left homeless only because their cluster was deferred for the hero floor count as covered-pending — list them under the deferred cluster, not as uncovered.
|
Coverage check: after partitioning, every find should appear in at least one cluster (existing or new). If a find genuinely fits no theme, leave it uncovered and report it — don't pad a cluster with a misfit. Finds left homeless only because their cluster was deferred for the hero floor count as covered-pending — list them under the deferred cluster, not as uncovered.
|
||||||
|
|
||||||
### 3. Overlap rules
|
### 3. Overlap rules
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ Invoke from inside the `unique.rzen.dev` repo.
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
**Hard exclusion — no tobacco or alcohol.** The site does not promote either in any form. Drop any item whose point is consuming, preparing, serving, storing, or celebrating alcohol or tobacco: spirits, wine, beer, cocktail kits, barware, decanters, wine openers, home-bar and whisky gear; cigars, pipes, vapes, ashtrays, smoking accessories. This is categorical — no exception for beautiful design, craftsmanship, or gift appeal, and it overrides every other signal. Borderline cases (dual-use glassware, non-alcoholic "spirits", brewery-adjacent merch) get skipped too: when in doubt, skip.
|
||||||
|
|
||||||
Crucially: do **not** filter by "is it the best of the day." Capture broadly. Selection happens in the shortlist step, and editorial treatment later.
|
Crucially: do **not** filter by "is it the best of the day." Capture broadly. Selection happens in the shortlist step, and editorial treatment later.
|
||||||
|
|
||||||
## Procedure
|
## Procedure
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ Unattended runs never pause for confirmation — they publish, log to `daily-fin
|
|||||||
|
|
||||||
## Conventions that bite
|
## Conventions that bite
|
||||||
|
|
||||||
|
- **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 (May–July 2026) stay published and keep their existing bundle spots, but they're ineligible for anything new.
|
||||||
- Review heroes are auto-discovered from `src/content/reviews/<slug>/hero.<ext>` (`src/lib/hero.ts` glob) — name the file `hero.*`; no registration.
|
- 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.
|
- 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>/`.
|
- Find slugs are globally unique although folders are date-bucketed; URLs stay flat at `/find/<slug>/`.
|
||||||
|
|||||||
Reference in New Issue
Block a user