v0.5.0 — Creator-onboarding lands, plus a tier rename, plus seven portal fixes
9 new MCP tools, one new GitHub-issue-gated publish flow, a clean tier vocabulary, and a portal that finally stops lying about itself. Notes from the recipes_2005 sprint.
Recipes v0.5.0 — Creator-onboarding lands
This is the biggest single sprint Recipes has shipped since the public catalog opened. One PR is rarely a story. Nine PRs across three repos, all merged in a 4-hour window, are a story.
Headline numbers:
- 9 new MCP tools (14 → 23)
- 2 new database tables (
skill_publish_requests, no-orphan-fleet schema) - 62 skill rows renamed from
cook→proandoperator→pro_plus - 115 portal pages built; 8 docs pages expanded from stubs to full guides; 2 new docs pages
- 40+ new tests
If you’re an agent author, you probably care about the first three changes. If you’re a portal visitor, you probably care about the last three. If you’re building on the API: the new endpoints are all 100% backward compatible.
What changed for creators
Until today, publishing a skill required either:
- Building a multipart tarball locally with
recipes publish(which silently 422’d on any input mismatch and didn’t surface useful errors), OR - Pasting JSON into the WebUI
/publishform (which was hardcoded to fail in two different ways).
Both paths needed an ed25519 keypair, a SKILL.md, a tarball, a signature, and the wits to assemble all four correctly. Documentation claimed “24-hour review by the Recipes team” — there was no such thing.
The new path is one MCP call:
recipes_publish_request(
slug="my-awesome-skill",
content="<full SKILL.md text>",
version="1.0.0",
tier="pro",
is_public=True,
references=[{"path": "refs/api.md", "content": "..."}],
)
What happens behind the scenes:
- The tool runs the same quality gate the multipart
/api/skills/_publishroute runs. High-severity findings — leaked secrets, AGPL contamination, malformed YAML frontmatter — short-circuit before anyone reviews. You see the findings, not us. - If the gate passes, a labelled GitHub issue opens in
wisechef-ai/recipes-apiwith your slug, version, sha256, content preview, and any warnings the gate flagged. We review. - When we add the
approvedlabel, a GitHub Action takes over. It generates an ephemeral ed25519 keypair, packs the tarball with your content and references, calls the existing multipart_publishroute with the platform signing key, and reports back on the issue. The skill goes live.
This mirrors the GitHub-dispatch pattern already used by recipes_feedback, recipes_request_recipe, recipes_report_skill_error, and recipes_propose_skill_patch. Zero new infrastructure — we wrapped an existing helper. CLA, audit trail, no creator-side cryptographic juggling.
The old multipart route still works. recipes publish from the CLI still works. The MCP path is the new default; the rest is fallback.
What changed for cookbook owners
Three new MCP tool families:
Sharing: recipes_share_create / list / revoke / rotate. Mint a cbt_* token scoped to one cookbook, hand it to another agent, revoke when done. Returns ready-to-paste Hermes YAML and Claude Desktop JSON config blocks.
Fleet: recipes_fleet_create / subscribe / sync / list. The Fleet and FleetSubscription tables had been in the schema since Phase E but nothing read them. Now they’re wired. Make a fleet, subscribe cookbooks to channels (stable / beta), send recipes_fleet_sync over an x-fleet-key header to have every agent pull updates atomically. The middleware checks rec_fleet_* prefix, scopes the request to the fleet, runs the same install pipeline as a regular user.
Installation portability: the CLI now respects RECIPES_INSTALL_DIR and a --install-dir flag on install / sync / list / update. Stack-agnostic. Claude Desktop, Codex, Cursor — no more symlink dances.
What changed for portal visitors
Adam, walking the homepage yesterday, found four bugs in twenty minutes.
- The “Creators” nav link pointed to
/creators, which 302-redirected to/referrals. Two hops. Wasted. - The
/referralspage checked/api/auth/meclient-side and flipped one element when you were logged in. The other eight CTAs still said “Sign up for free” to authenticated users. - The integration platforms section used emoji as logos. ⚙️ for OpenClaw AND for Zed. 🪟 (a window pane) for Claude Desktop. Whatever 🜲 is for Hermes.
- The “Pro skills spotlight” was a hardcoded list of four skills. One of them —
web-scraper-pro— didn’t exist in the catalog. Click-through returned 404.
All four shipped fixed today:
- Nav points directly at
/referrals./creatorskeeps the 302 compat-redirect for external link survivors. /referralsdoes a server-side session check at Astro page-render time and shows a real dashboard (referral code, click count, conversion count, MRR earned) to authenticated users. Anonymous visitors still see the signup pitch.- Ten real SVG logos replace the emoji.
- The spotlight is now a live
/api/skills/search?tier=pro&is_public=true&page_size=4&sort=install_count_descquery with a fallback array of verified-existing slugs for offline-build resilience.
Bonus fix in the same sprint: the homepage carousel had been frozen at the moment of the last git push origin main. Astro’s static site generation fetched /api/carousel/today at module-load time and baked the result into the HTML. The cron filled tomorrow’s slate daily, the page never updated. Now the fetch happens client-side on page load, so the carousel reflects today’s slate every time.
What changed for tier semantics
The DB had been carrying four tier labels: free, cook, operator, studio. The portal, Stripe, and all human-facing documentation called them free, pro, pro_plus. Both vocabularies were live simultaneously. Stripe-paying customers saw “Pro” in checkout and “cook” in API responses.
Today:
- A new migration renames
cook→proandoperator→pro_pluson every live skill row. - The recipify default tier for newly-created skills is
pro(wascook). No more drift on new inserts. - TIER_RANK in
app/access_routes.pycollapses to{'free': 1, 'pro': 2, 'pro_plus': 3}plus a 30-day READ alias forcook/operator/studioso existing integrations keep working through 2026-06-10.
What broke (and got fixed in the same window)
Two regressions surfaced during Phase K verification on production:
-
The
/api/skills/search?tier=profilter returned 0 results despite the DB having 52prorows. Three call sites were still mappingpro→cookfor the DB query — left over from when the DB column was literally calledcook. Inverted tocook→pro(so legacy callers still work). Tests added. -
The alembic migration test suite had been silently failing for weeks. Investigation revealed three real bugs in the migration chain: a missing bootstrap migration for six tables that were created out-of-band before alembic existed, a
try/except CREATE EXTENSION vectorthat left Postgres transactions in an aborted state on non-pgvector hosts, and a SQLite-only test fixture that couldn’t validate Postgres-only DDL at all. New test suite runs the full chain against real Postgres on every PR. The hidden bugs are now load-bearing tested.
Coverage
Local pytest: 1641 passing, coverage gate (--cov-fail-under=85) still GREEN.
Acknowledgements
The whole sprint ran on a 10× budget extension Adam authorised for “boil the ocean.” Eight subagent worktrees in parallel, Sonnet 4-6 on the heavy phases, Haiku 4-5 on the mechanical ones, Opus on planning and merge orchestration. Wall-clock from kickoff to v0.5.0 tag: about 4 hours. Realistic spend: $210.
Full plan-doc, with verified evidence per phase, lives in the Obsidian vault under projects/recipes/2026-05-20-recipes-2005-execution-plan.md. Reconciliation note (cost-vs-projection, what went wrong, what to retune for next sprint) at 2026-05-20-recipes-2005-execution-reconciliation.md.
Next sprint: recipes_2006_legacy_cleanup. Drop the cook / operator / studio aliases after the 30-day deprecation window. June 10.