Skip to content

feat: reorganize into 5 clouds with workload tags and an Emerging & Unverified badge - #571

Merged
felixwidjaja merged 3 commits into
mainfrom
taxonomy-5-clouds
Nov 9, 2026
Merged

felixwidjaja merged 3 commits into
mainfrom
taxonomy-5-clouds

Conversation

@felixwidjaja

@felixwidjaja felixwidjaja commented Nov 9, 2026 •

Copy link
Copy Markdown
Member

Summary

Reorganizes the directory from 24 categories into five clouds, and adds a tag vocabulary for filtering.

Category Entries Definition (printed under each README heading)
Infrastructure Clouds 135 Raw capacity priced by resource unit. You bring the workload.
Workload Clouds 200 The provider owns a compute/storage-heavy workload end to end; one bill per unit of work.
Service Clouds 187 Building blocks you embed: identity, billing, comms, source control, security tooling.
Sovereign Clouds 10 Jurisdiction is the main reason to buy.
Vertical Clouds 1 Industry-specific, usage-priced (held to the same waterline test, so it starts small).

"Emerging & Unverified" is now a badge, not a category. It sits next to the score (* 🟡🔵 [Name](url) - ...). The 13 entries that were in that section now live in their real category.

Tags (stored as a trailing <!-- tags: a, b --> comment on the README bullet, so README.md stays the single source of truth):

  • Workload tags (only valid on Workload entries), five families: App, Data, AI, Agent, Build & Run.
  • Tags for every category: agent-native, open-source, owns-hardware, gpu, region:<code>, plus the derived unverified status.

What changed

  • Data: scripts/migrate_readme.py restructured the README (legacy → new) and wrote analysis/taxonomy-migration.csv, a per-entry review sheet of legacy → new category, a needs_review flag, and tags. It refuses to re-run on a migrated README.
  • Single source of truth: scripts/lib/taxonomy.py, mirrored in src/lib/taxonomy.ts; tests/test_taxonomy_sync.py fails on drift (categories, definitions, tags, redirects).
  • Parser: scripts/lib/entry_format.py is the shared parse/format for bullets. parse_readme_to_json.py now emits tags / unverified, and its output is byte-identical to before on a legacy README.
  • Pipeline (kept fail-open):
    • evaluate_submission.py: one shared prompt block + normalize_classification() across all four LLM paths. Returns category + tags; unknown tags are dropped, workload tags are dropped outside Workload, an invalid category falls back.
    • Graduation now clears the 🔵 badge (re-filing only if the category changes), with tags validated against the final category. audit_emerging_badges keeps the 🔵.
    • generate_llms.py, workflow comments, CLAUDE.md, CONTRIBUTING.md updated.
  • Site: category + tag filtering with faceted counts (every count reflects all the other active filters), a Tags fly-out next to Sort by, removable tag pills, and a 🔵 pill on cards. The 22 retired category URLs redirect to the new categories (base-path aware, verified in preview and production builds).

Please review

Category placement is heuristic. Entries from one-to-one legacy categories moved by rule; the split buckets (Databases, Observability, Dev Tooling, Security/Sovereignty, Comms, AI Assistants, Customer/Marketing) were classified by keyword rules and are flagged needs_review=True in the CSV. CURATED_OVERRIDES in scripts/lib/tag_rules.py holds hand-checked entries (Supabase, Baseten, Modal, Fal.ai, cloudscale.ch); add to it as you correct more.

Heads-up: open submission PRs

8 open submission PRs target the old category headings (e.g. #568 boxd → "Infrastructure Clouds", #531 CloudGPU → "GPU & AI Compute Clouds"). They will conflict with this change and need their entries re-filed under the new categories after merge. Vercel and STACKIT (named in the brief, not yet listed) should be submitted after merge so the updated evaluator handles them.

Not in this PR

  • public/clouds.json / llms*.txt are regenerated by deploy-pages.yml; I didn't commit them.
  • Per-category pages (/categories/<slug>/) don't have the tag filter yet.
  • parse_readme_to_json still treats a bullet with no score badge as 3/3 (unchanged from before); the README-edit helpers now reject such bullets.

Test plan

  • python3 -m pytest tests — 234 passed (new: taxonomy sync, entry format, tag rules, classification/normalization, migration, graduation tags, redirects)
  • npm run build (production) and a preview-mode build — redirects resolve correctly in both
  • astro check 0 errors, ESLint clean, Prettier clean on changed files
  • Parser output byte-identical to main on the legacy README
  • Browser-checked (headless): category + tag filtering, faceted counts, ?tags= deep links, fly-out open/close, mobile width (no horizontal scroll)
  • Reviewer: skim analysis/taxonomy-migration.csv for misplaced entries (filter needs_review=True)
  • Reviewer: confirm the 🔵 badge, the AI Assistants / Customer-Marketing decision, and the nosql-timeseries tag with Jacob
  • After merge: rebase or re-file the 8 open submission PRs, then file Vercel and STACKIT submissions

🤖 Generated with Claude Code

felixwidjaja and others added 2 commits November 9, 2026 14:52
…y format

Additive and backward-compatible: parser emits tags/unverified when present
and is byte-identical on the current README. Evaluator and README migration
follow in the next PR.
…nverified badge

Replace the 24 legacy categories with Notable's five clouds (Infrastructure,
Workload, Sovereign, Service, Vertical) and add a tag vocabulary: five Workload
families (App, Data, AI, Agent, Build & Run) that only apply to Workload entries,
plus cross-cutting tags (agent-native, open-source, owns-hardware, gpu, region:*)
valid on every category.

"Emerging & Unverified" is no longer a category: it is a 🔵 badge shown next to
the 🟢/🟡 score, so those 13 entries now live in their real category.

README / data
- scripts/migrate_readme.py restructures the README (legacy -> new, with a review
  CSV at analysis/taxonomy-migration.csv); refuses to re-run on a migrated README.
- Tags live in a trailing `<!-- tags: ... -->` comment; scripts/lib/entry_format.py
  is the shared parser/formatter. parse_readme_to_json emits `tags`/`unverified`
  and is byte-identical on legacy READMEs.
- scripts/lib/taxonomy.py is the source of truth, mirrored in src/lib/taxonomy.ts
  (drift is caught by tests/test_taxonomy_sync.py).
- Keyword rules in scripts/lib/tag_rules.py plus CURATED_OVERRIDES for hand-checked
  entries (Supabase, Baseten, Modal, Fal.ai, cloudscale.ch).

Pipeline
- evaluate_submission.py: single shared prompt block and normalize_classification()
  for all four LLM paths; returns category + tags (fail-open: unknown tags dropped,
  workload tags dropped outside Workload, invalid category falls back).
- Graduation now clears the 🔵 badge (re-filing only if the category changes), with
  tags validated against the final category. audit_emerging_badges keeps the 🔵.
- generate_llms.py and the workflow comments use the new taxonomy.

Site
- Category + tag filtering on the homepage with faceted counts, a Tags fly-out next
  to Sort by, removable tag pills, and a 🔵 pill on cards.
- Retired category pages redirect to the new categories (base-path aware).

Docs: CLAUDE.md and CONTRIBUTING.md describe the new taxonomy, entry format and
graduation flow.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
AriaEdo
AriaEdo previously approved these changes Nov 9, 2026
ronggur
ronggur previously approved these changes Nov 9, 2026
@felixwidjaja
felixwidjaja dismissed stale reviews from ronggur and AriaEdo via aa3659d November 9, 2026 16:11
@felixwidjaja
felixwidjaja merged commit 24b1e5d into main Nov 9, 2026
4 checks passed
@felixwidjaja
felixwidjaja deleted the taxonomy-5-clouds branch November 9, 2026 16:48
felixwidjaja added a commit that referenced this pull request Nov 10, 2026
Re-filed under the five-cloud taxonomy (#571).
felixwidjaja added a commit that referenced this pull request Nov 10, 2026
Re-filed under the five-cloud taxonomy (#571).
felixwidjaja added a commit that referenced this pull request Nov 10, 2026
Re-filed under the five-cloud taxonomy (#571).
felixwidjaja added a commit that referenced this pull request Nov 10, 2026
Re-filed under the five-cloud taxonomy (#571).
felixwidjaja added a commit that referenced this pull request Nov 10, 2026
Re-filed under the five-cloud taxonomy (#571).
felixwidjaja added a commit that referenced this pull request Nov 10, 2026
Re-filed under the five-cloud taxonomy (#571).
felixwidjaja added a commit that referenced this pull request Nov 10, 2026
Re-filed under the five-cloud taxonomy (#571).
felixwidjaja added a commit that referenced this pull request Nov 10, 2026
Re-filed under the five-cloud taxonomy (#571).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants