diff --git a/.claude/skills/daily-pipeline/SKILL.md b/.claude/skills/daily-pipeline/SKILL.md index 5f3ba84..f28f1bc 100644 --- a/.claude/skills/daily-pipeline/SKILL.md +++ b/.claude/skills/daily-pipeline/SKILL.md @@ -46,7 +46,7 @@ Stage: the new find folders, `daily-finds.log.md`, `candidate-sources.md`, and ` Enforce `EDITORIAL.md` (the voice charter: concise, to the point, inspiring delight) on everything stages 1–3 wrote. The point is fresh eyes — the author of a piece is the worst person to cut it — so run this as a **subagent** (sonnet) that did not write the copy: - Scope: find bodies, bundle blurb/intro, review bodies, subtitles and descriptions created or modified this run. Nothing older. -- The subagent gets `EDITORIAL.md` plus the file list, and edits prose only — never facts, names, prices, links, claims, or structural frontmatter (wording of `subtitle`/`description`/`blurb` is fair game). Word budgets in the charter are the hard lines. +- The subagent gets `EDITORIAL.md` plus the file list, and edits prose only — never facts, names, prices, links, claims, or structural frontmatter (wording of `subtitle`/`description`/`blurb` is fair game). Word budgets in the charter are the hard lines. Use the canonical brief in `TEAM.md` ("The copy editor's brief") verbatim, substituting the file list. - Review the diff in the main session before committing; revert any edit that changed meaning or lost the delight it was supposed to sharpen. **Commit** (only when something changed): `site: copy edit — pieces tightened`. diff --git a/TEAM.md b/TEAM.md new file mode 100644 index 0000000..cae48a5 --- /dev/null +++ b/TEAM.md @@ -0,0 +1,64 @@ +# The unique.rzen.dev editorial team + +The site is produced by a virtual editorial team — a set of roles, each implemented as a stage of the daily pipeline with its own prompt. There is no standing multi-agent org: roles run as stages (some as subagents) inside one unattended daily session, conducted by `/daily-pipeline`. + +## Operating model + +- **Publish, then veto.** The team never pauses for confirmation. It applies the house rules, publishes, logs every judgment call to `daily-finds.log.md`, and reports a digest; the user reviews after the fact and vetoes by revert. +- **Scheduled.** A lab CI job (`claude-unique-daily`, laptop runner) launches the session in this checkout each day; a downstream job deploys `main` after a successful run. +- **One commit per stage**, so any stage is individually revertable. `content:` for capture, `site:` for everything user-visible. +- **User-only duties:** vetting `candidate-sources.md` nominees into `sources.json`, and scheduling. + +## Roster + +Each role's prompt is its skill file — the canonical, version-controlled text. Don't duplicate prompt content here; edit the skill. + +| Role | Stage | Prompt lives at | Notes | +|---|---|---|---| +| **Researcher / author** | 1 — capture | `.claude/skills/daily-finds/SKILL.md` | Sweeps `sources.json`, writes find files + hero images, ranks the shortlist (≤12), nominates new sources. Fans out to scanner/writer subagents on large sweeps; shortlist ranking stays in the main session. | +| **Curator** | 2 — bundle | `.claude/skills/build-bundle/SKILL.md`, `.claude/skills/cluster-bundles/SKILL.md` | Themes finds into bundles (the pool's discovery vehicle). Enforces the hero floor; holds themes that can't meet it. `cluster-bundles` is the batch variant when the backlog passes ~25. | +| **Reviewer** | 3 — reviews | `.claude/skills/build-review/SKILL.md` | Graduates 2–4 shortlist finds to full reviews. Fact-check against the product's own site is mandatory unattended — it substitutes for the human eye. | +| **Copy editor** | 4 — copy edit | Brief below (referenced from `daily-pipeline` stage 4); mandate: `EDITORIAL.md` | A fresh-eyes **sonnet subagent** that did not write the day's copy. Prose only; diff reviewed by the conductor before commit. | +| **Editor-in-chief (picker)** | 5 — pick of the day | `.claude/skills/daily-pipeline/SKILL.md` §5 | Explicit pick decision every run — front page must be uncontroversial; keeping the current pick is a decision that gets a stated reason. | +| **Conductor** | 0, 6–7 | `.claude/skills/daily-pipeline/SKILL.md` | Preflight, verify (`npm run build` gate), push, digest. Owns all judgment calls and the digest the user actually reads. | + +## House rules (bind every role) + +1. **`EDITORIAL.md`** — the voice charter: concise, to the point, inspiring delight *through specificity*; word budgets per copy type (finds 40–90 words; reviews 250–450, ceiling 600, ~800 only for story-led subjects; bundle blurb one sentence). Budgets are ceilings, not targets. +2. **No tobacco or alcohol content** — categorical, at every stage: never captured, never bundled, never graduated. Legacy alcohol finds (May–July 2026) stay published but are ineligible for anything new. +3. **Hero floor** — a bundle ships with ≥2 hero-bearing items (aim ~4; more for 7–8-item grids). Under-floor themes are held and logged, except the weekly catch, which widens instead of holding. +4. **Front-page safety** — the pick of the day is never anything that could read as endorsing harm (weapons, danger, disturbing media), regardless of its quality as a review. +5. **Repo conventions** — see `CLAUDE.md` ("Conventions that bite"): topics vocabulary, source name matching, Amazon link canonical form, slug uniqueness. + +## The copy editor's brief + +The one prompt not stored as a skill. The conductor spawns the stage-4 subagent (model: sonnet) with this brief, substituting the day's file list: + +> You are the copy editor for unique.rzen.dev. Read `EDITORIAL.md` first — it is your entire mandate: concise, to the point, inspiring delight through specificity, within the word budgets it sets. +> +> Edit the prose of these files, all written earlier today: ``. +> +> Rules: +> - Prose only. Never change facts, names, prices, links, or claims, and never add a claim the author didn't make. In frontmatter, only the wording of `subtitle`, `description`, and `blurb` may change. +> - Enforce the word budgets as hard lines. When a piece is over budget, cut the weakest material — don't compress every sentence into mush. +> - When in doubt between two cuts, keep the one that delights. +> - Leave files that are already clean untouched. +> +> Return a list of files you changed with a one-line note on what you did to each, and name any file you left alone. + +The conductor reviews the resulting diff before committing (`site: copy edit — pieces tightened`), reverting any edit that changed meaning. + +## A day in the life + +``` +0 Preflight git status, read log tail, skip capture if already run today +1 Capture content: YYYY-MM-DD capture run — N finds across M productive sources +2 Bundle site: bundle — (or weekly catch / cluster run / held) +3 Reviews site: review — <Name> (graduates from find) × 2–4 +4 Copy edit site: copy edit — N pieces tightened (skipped if clean) +5 Pick of the day site: pick of the day — <Name> (only when changed) +6 Verify + push npm run build must pass; push; CI deploys +7 Digest the one artifact the user reads — includes an Attention line +``` + +Degrade gracefully: a stage that fails or yields nothing is noted in the digest and the chain continues — only a red build blocks the push.