site: topics axis + per-source indexes

Topics — the curated subscription layer: 18-value controlled vocabulary
in src/lib/topics.ts, enum-enforced by the content schema on finds and
reviews so unattended runs can't drift it. /topics/ index +
/topics/<t>/ pages with finds first-class alongside reviews, per-topic
RSS feeds that include finds (unlike category/tag feeds), "By topic"
section on /feeds/, Topics footer link and llms.txt section, dev-shim
coverage for the new feed URLs. daily-finds and build-review skills now
classify at capture/graduation time; "giftable" is a tag, never a
topic.

Per-source indexes: /sources/<slug>/ lists every review and find from a
source (catalog ∪ names in content, so retired sources resolve);
find/review colophons link "(more from this source)"; /sources/ cards
link "everything from this source →"; sub-3-item pages noindexed.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
This commit is contained in:
2026-07-12 19:39:11 -04:00
parent be7263b912
commit 9e5fce1eb0
21 changed files with 695 additions and 14 deletions
+1
View File
@@ -19,6 +19,7 @@ Unattended runs never pause for confirmation — they publish, log to `daily-fin
- 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.