# Generator Registry — The Daily Synthesis swarm

**Canonical inventory of every `*-gen/`, `*-factory/`, and `*-analyzer/` directory.** This is the single source of truth for "what exists, is it running, and does anything read its output?" Cross-referenced from the repo `CLAUDE.md`. Last reconciled **2026-08-17** — every job label in the scheduled table was diffed against `launchctl list` (see the note below the table). Prior full coherence pass: 2026-05-28.

There are **31 directories** (29 `*-gen`/`*-factory` + 2 `*-analyzer`). Of these, **20 are scheduled content agents** (19 with a loaded launchd job; `substack-gen` is staged, its schedule.toml blocks commented until go-live), 3 are infra jobs, 8 are dormant (code present, not scheduled), 1 is the shared library, and 5 are empty stubs. Two further steps are **riders** — daily work invoked from inside another job's script, invisible to `launchctl` and to schedule.toml (see below).

**Status legend**
- 🟢 **scheduled** — has a loaded launchd job; runs on a cadence; output consumed.
- 🟡 **dormant** — real code present, but **no loaded launchd job**. Sub-typed by whether output is consumed.
- 🔗 **rider** — real scheduled work with **no launchd job of its own**: invoked from inside another generator's shell script.
- 📚 **library** — shared code imported by other generators; not a content producer.
- ⬜ **stub** — empty directory (0 source files); placeholder for planned work.

Launchd jobs live in `~/Library/LaunchAgents/`. "Loaded?" reflects `launchctl list` on **2026-08-17**: 19 of the 20 rows below resolve to a loaded job. The two that did not when checked were `comic-gen` (row named the retired `com.brooklyn-comics.daily` — fixed above) and `substack-gen` (genuinely staged, not a drift).

---

## 🟢 Scheduled content agents (20 — 19 loaded, 1 staged)

| Dir | launchd job | Schedule | Purpose | Output | Frontend / downstream consumer |
|-----|-------------|----------|---------|--------|-------------------------------|
| `paper-gen` | `com.papers.daily` | 6:00 AM | arXiv research digest | `papers/` + `arxiv_papers` (Qdrant) | `papers.html` |
| `watchdog-gen` | `com.watchdog.periodic` | every 4h | swarm health monitor | `data/system-health.json` + `swarm-state/` | `status.html` |
| `funding-gen` | `com.funding.daily` | 7:00 AM | startup funding rounds | `funding/` + `funding_rounds` (Qdrant) | `funding.html` |
| `comic-gen` | `com.comic-mac-pollo.daily` / `.comic-disruption` / `.comic-solidarity` / `.comic-bentham` | 00:00 / 02:00 / 04:00 / 13:30 | 4 comic series, one staggered job each — `com.brooklyn-comics.daily` (all four back-to-back at 7 AM) was UNLOADED after it heat-soaked the GPU until renders went 20min → 5h. Distribution is decoupled: `com.comic-distribute.daily` (10:00) + `-pm` (18:00) | `comics/` | `index.html`, comics pages |
| `signal-gen` | `com.signals.daily` | 8:00 AM | cross-system signals | `signals/` + `unified_signals` (Qdrant) | `signals.html`, digest |
| `field-notes-gen` | `com.field-notes.daily` | 8:30 AM | 1-paragraph editor's note | `blog-posts/field-notes-*.md` | blog, zine |
| `blog-gen` | `com.blog.daily` | 9:00 AM | daily editorial (The Synthesist) | `blog-posts/` | `editorial-archive.html`, zine |
| `science-factory` | `com.jboren.sciencefactory` | 10:00 AM | research campaigns (code in `scripts/science-factory/*.ts`) | `science-factory/` | `science-factory.html` |
| `comic-analyzer` | `com.comic-analyzer.daily` | 12:00 PM | comic quality analysis | `analyzer-state/` | `comic-gen` (recs) |
| `cover-gen` | `com.cover.daily` | 9:20 AM | daily cover plate: the day's three signals converging on one through-line, as SVG assembled from day-shape/funding/digest/frontmatter. Pure stdlib + one headless-Chrome raster. Every figure carries `{source, path, transform}` and is re-verified by `scripts/ci/check-cover-provenance.py` | `covers/{date}.{json,svg}`, `-share.{svg,png}`, `latest.*` | `index.html` hero + `og:image`/`twitter:image` |
| `crossref-gen` | `com.crossref.daily` | 12:30 PM | cross-domain connections (≥2 evidence spans) | `connections/` + blackboard votes | `connections.html` |
| `quality-gen` | `com.quality.daily` | 1:00 PM | quality scores + recommendations | `quality-state/recommendations/` (blackboard) | `blog-gen` (acts); 18 others read |
| `blog-analyzer` | `com.blog-analyzer.daily` | daily | blog-specific quality recs | blackboard recs | `blog-gen` |
| `trend-gen` | `com.trends.daily` | 1:30 PM | rising/falling/emerging topics | `trends/` + blackboard votes | `trends.html` |
| `digest-gen` | `com.digest.daily` | 2:00 PM | daily front-page curation | `digest/` + RSS | `index.html` (digest section), `digest/feed.xml` — no standalone `digest.html` since 2026-03-29 |
| `capture-gen` | `com.capture.daily` | 2:45 PM | golden-path capture (reads the day's committed JSON, stdlib text dedup + benchmark leak-check) | `data/golden-paths.jsonl` | backstage (training corpus / golden-path flywheel) |
| `market-gen` | `com.market.premarket` / `.midday` / `.afterclose` | 3×/day | stocks, SEC filings, insider trades, ML signals | `market/` + market Qdrant collections | `market.html`, `stocks.html`, `sec-filings.html`, `insider-trades.html`, `trading-signals.html`, `prediction-markets.html` |
| `recap-gen` | `com.recap.weekly` | Sun 3:00 PM | weekly best-of | `recap/` + RSS | `recap.html` |
| `substack-gen` | `com.substack-assemble.weekly` / `-publish` | Sun 4:30 PM / Mon 7:30 AM | **STAGED (2026-07-18, awaiting go-live)** — weekly email edition assembled from recap + editorials + comic-of-week; Playwright publisher w/ staged-issue manual fallback; Substack IS the email channel (docs/runbooks/substack-setup.md; schedule.toml blocks commented until go-live) | `substack-gen/staging/` | Substack publication |
| `archive-gen` | `com.archive.daily` | 11:30 PM | catalog all content | `archive/` | `archive.html` |

> **Distribution channel notes (2026-07-18):** comic X-posting expanded to `--platform all` — YouTube Shorts + Instagram Reels clients are BUILT and inert until credentials land (`docs/runbooks/{youtube,instagram}-setup.md`). **TikTok is explicitly deferred** until Shorts+Reels show signal: its Content Posting API requires an app audit (weeks; posts locked SELF_ONLY until cleared), disproportionate pre-traction — the same daily MP4 uploads unchanged whenever revisited. Discord + iMessage channel sends retired 2026-07-17 (were no-op: no webhook/recipients).

> Also installed: `com.bentham-marshall.part2` (the *Bentham & Marshall* show-pitch comic, a limited series under `show-pitch/`, outside the daily swarm) and the infra jobs below.

## ⚙️ Infrastructure jobs (not content generators)

| Job | Schedule | Purpose |
|-----|----------|---------|
| `com.gateway` | always-on | local-only swarm Control UI at `127.0.0.1:18789` (`gateway/`) |
| `com.publication-context.daily` | 2:15 PM | builds + commits `/pocketagent-context.json` (`scripts/ci/generate_publication_context.sh`) |
| `com.zeroclaw.ollama-keepalive` | — | keeps a local Ollama model warm for ZeroClaw synthesis |
| `com.flywheel.weekly` | SUN 23:45 | weekly golden-path retrain + **gated** promote of the in-browser tool-router (`scripts/finetune/weekly/`); chains the existing finetune toolchain (aggregate → cosine-leak → MLX SFT → eval → `flywheel.js` gate → snapshot → promote). Confirm-gated by default (`FLYWHEEL_AUTO_PROMOTE=1` for hands-off); atomic, reversible pointer flip → `promoted-pointer.json` + leaderboard rows |

---

## 🔗 Rider steps — scheduled, but inside another job's script

These run daily and publish real output, yet appear in **no** `launchctl list`,
**no** `factory/schedule.toml` entry, and **no** factory DAG node. Riding is a
deliberate, reasonable choice — a 2-second pure-function script does not need its
own launchd job — but it means the usual "is it running?" checks cannot see them,
and both are invoked behind `|| true` so even a hard failure is silent by design.

`scripts/ci/check-rider-jobs.py` (in `verify.sh`) asserts each is still invoked by
its host, so tidying the line out of the host script fails the build instead of
quietly stopping the work.

| Step | Host job | Purpose | Output | Consumer | Staleness alarm |
|------|----------|---------|--------|----------|-----------------|
| `scripts/graph-gen/generate_constellations.sh` | `com.archive.daily` (11:30 PM) | citation graph: every arXiv paper cited **more than once**, and the posts citing them. Pure function of `blog-posts/*.md`, fixed-seed layout, byte-identical per build | `data/citation-constellations{,-preview,-lookup}.json` | `constellations.html`, homepage "What We Keep Coming Back To" | watchdog-gen: `corpusThrough` vs newest post, alarms at >2d |
| daily-logs + flywheel-status publish | `com.archive.daily` (11:30 PM) | commits `daily-logs/` (the swarm's fifth memory layer) and `data/flywheel-status.json`, neither of which their own writers ever commit | `daily-logs/`, `data/flywheel-status.json` | `blog-gen` (yesterday's log), PocketAgent bundle, `/factory.html` | — |

## 🟡 Dormant — code present, NOT scheduled

### Should be scheduled (live frontend consumer, output is stale)
| Dir | Purpose | Output | Consumer | Note |
|-----|---------|--------|----------|------|
| `idea-gen` | clusters papers/signals/funding into concept nodes | `ideas/data.json` | `ideas.html`, `scripts/zeroclaw/zeroclaw-skills.js` | plist at `idea-gen/com.idea.daily.plist` but **not installed** → output stale since 2026-05-16. **Action: load** (WS-3). |
| `combinator-gen` | turns the idea graph into buildable proposals | `proposals/latest.json` | `proposals.html` | plist at `combinator-gen/com.combinator.daily.plist` but **not installed** → stale. **Action: load** (WS-3). |

### Dormant but output IS consumed — keep, do NOT archive
*(Verified 2026-05-28: the earlier audit mislabeled `taste-gen`/`tool-inventory-gen` as orphaned. They are live producers for the now-scheduled `combinator-gen`.)*
| Dir | Purpose | Output | Consumer |
|-----|---------|--------|----------|
| `tarot-gen` | generative tarot decks (mflux) | `tarot-decks/{cosmic-void,neon-arcana,enchanted-botanical}/` | `tarot.html` (renders card images by path) |
| `familiar-brain-gen` | trains the DQN policy for the Neural Familiar creature (SB3 → safetensors/JSON) | `familiar-brain-gen/state/models/policy_v1.*` | `scripts/neural-familiar/policy.js` |
| `taste-gen` | trains the taste-scorer model (`eschaton-taste-scorer-v1`) | HF model + `combinator-gen/models/taste-scorer/head_v1.json` | `combinator-gen` (TasteClient proposal scoring) + `scripts/zeroclaw` taste scorer |
| `tool-inventory-gen` | builds a vector inventory of the site's tools | `tool-inventory-gen/tool-inventory-state/inventory_with_vectors.json` | **`combinator-gen/chain_composer.py`** (`compose_chain`) — runtime dep of the scheduled combinator (gracefully skipped if missing) |

### Dormant + unconsumed
| Dir | Purpose | Output | Status |
|-----|---------|--------|--------|
| `zine-gen` | (intended) zine assembler | writes JSON + archive output | unscheduled, **no frontend consumer** (`/zine/` is served by `zine/index.html`, not this). Real code (2 tracked files) — archive candidate, pending a "retire vs finish" call. |
| `youtube-gen` | YouTube distribution pipeline | `youtube-gen/youtube-state/` | `/youtube/` 0× in shipped HTML. **Local-only — 0 files tracked in git** (not in the repo); nothing to archive. |

---

## 📚 Shared library (1)

| Dir | Role |
|-----|------|
| `unified-gen` | The swarm's shared Python package — `config.py`, `qdrant_client.py`, `embedding_service.py`, `llm_service.py`, `cosmic_service.py`, `blackboard.py`, `daily_log.py`. **Imported by ~46 files.** Not a content generator. |

---

## ⬜ Empty stubs (5) — planned, not built

`meme-gen`, `merch-gen`, `social-gen`, `video-gen`, `review-gen` — each contains **0 source files**. Referenced as future monetization pipes in earlier docs and a monetization skill set, but no code exists. Converted to `STUB.md` markers in the 2026-05-28 coherence pass and dropped from the active swarm count and `deskhub/desk-registry.json`.

> Note: subscriber delivery that *does* exist lives in `channels/` (email/telegram active; discord/imessage **retired 2026-07-17** — never configured, no webhook/recipients, so both no-opped daily; removed from `channels/run_all.sh`, module files kept on disk), not in `social-gen`.

---

## Maintenance

When you add, schedule, retire, or stub a generator: update this table **and** `deskhub/desk-registry.json` in the same change. The repo `CLAUDE.md` intro and Dark-Factory-pipeline sections point here for the count rather than hard-coding a number.
