···4455## data sources
6677-a single `ingest` flow runs hourly on cron and fetches both data sources concurrently, then writes to DuckDB sequentially (same process = no single-writer lock contention). downstream flows (enrich, curate) are event-driven via deployment triggers — they only run when upstream completes.
77+a single `ingest` flow runs hourly on cron and fetches both data sources concurrently, then writes to DuckDB sequentially (same process = no single-writer lock contention). downstream flows (transform, brief) are event-driven via deployment triggers — they only run when upstream completes.
8899**github** — fetches notifications (issues + PRs) and open items authored by `zzstoatzz` via the search API. each issue is cached by repo+number for 24h. persists to `raw_github_issues`.
1010···1717 ├──► ingest ──► raw_github_issues ──┐
1818tangled PDS ─┘ (hourly) raw_tangled_items ──┤
1919 ▼
2020- enrich (dbt)
2020+ transform (dbt)
2121 [on ingest ✓]
2222 │
2323 ▼
···2626 │
2727 ┌──────────────┼──────────────┐
2828 ▼ ▼ ▼
2929- curate /api/cards.json +page.svelte
3030- [on enrich ✓] (SSR loader)
2929+ brief /api/cards.json +page.svelte
3030+ [on transform ✓] (SSR loader)
3131 │
3232 ▼
3333 briefing.json ──► /api/briefing.json
···3939|---|---|---|
4040| `diagnostics` | cron `*/5 * * * *` | prints system info — canary for worker health |
4141| `ingest` | cron `0 * * * *` | fetches github notifications + authored items and tangled.org items concurrently, persists both to DuckDB sequentially |
4242-| `enrich` | on `ingest` completion | dbt build: staging → enrichment → mart. concurrency limit 1. runs under python 3.13 (dbt-core compat) |
4343-| `curate` | on `enrich` completion | loads top 200 scored items, sends to claude haiku 4.5 via pydantic-ai, writes `briefing.json`. cached by items content hash (skips LLM when data unchanged) |
4242+| `transform` | on `ingest` completion | dbt build: staging → scoring → mart. concurrency limit 1. runs under python 3.13 (dbt-core compat) |
4343+| `brief` | on `transform` completion | loads top 200 scored items, sends to claude haiku 4.5 via pydantic-ai, writes `briefing.json`. cached by items content hash (skips LLM when data unchanged) |
4444| `cleanup` | cron `0 2 * * 0` | deletes old terminal flow runs (completed, failed, cancelled, crashed) older than 30 days |
45454646all flows run in the `kubernetes-pool` work pool. code is pulled at runtime via `git clone` from tangled.sh (github fallback). deps install via `uv run --with 'my-prefect-server @ git+...'`. deployments are registered by CI on every push to main.
···61616262## curation
63636464-the `curate` flow fires automatically when `enrich` completes (via deployment trigger). it:
6464+the `brief` flow fires automatically when `transform` completes (via deployment trigger). it:
656566661. snapshots DuckDB to `/tmp` (bypass exclusive flock)
67672. loads top 200 items from `hub_action_items`