# Remedy — Roadmap
Local sequencing for the petitgen-ltd/remedy repo. The company-level roadmap is at Petitgen ROADMAP admin/docs/petitgen/ROADMAP.md. This file breaks Wave 1 into implementation milestones.
# Wave 1a — Spec freeze + core library
Exit: remedy fmt and remedy lint round-trip an authored .remedy folder, remedy-core parses and validates every key in SPEC.md, and the JSON Schema at schemas/remedy.schema.json is the single source of truth both consume.
- Freeze SPEC.md v0. Close open questions in
docs/decisions/. - Write JSON Schema →
schemas/remedy.schema.json. - Scaffold pnpm workspace with
packages/remedy-core/andpackages/remedy-cli/. - Implement
remedy-core: parse, validate against schema, resolve sub-remedies, surface unknown roles. - Implement
remedy fmt— canonical key order, idempotent. - Implement
remedy lint— schema errors + unembedded-text warnings + unknown-step-verb warnings. - Golden tests against
examples/hello-world/andexamples/timebill-invoice/stubs.
# Wave 1b — Build + embeddings
Exit: remedy build examples/timebill-invoice/ produces a valid .remedy.compiled.json with nomic-embed-text vectors on a machine with only Ollama installed — no cloud calls.
- Ollama client in
remedy-core: model probe, embed call, error handling. - Source-hash cache so unchanged text is not re-embedded.
remedy buildwires parse → schema-validate → embed → serialise.- Fallback adapter for
openai:text-embedding-3-smallbehindREMEDY_EMBED_MODEL. remedy diff— feature-level diff over compiled artifacts.
# Wave 1c — MCP + first dogfood
Exit: TimeBill’s invoice run exists as ~/Projects/Petitgen/time-bill/.remedy with at least three features. Claude Code invokes remedy build / remedy lint via MCP inside that folder.
remedy-mcp: exposefmt,lint,build,run,diffas MCP tools.- Resource endpoints: list remedies under cwd, read a feature’s compiled form.
.mcp.jsondrop-in for any Remedy folder.- Author TimeBill’s intake as
examples/timebill-invoice/first, then migrate in-place intotime-bill/. - Collect friction into
complaints/— any spec gap becomes a.complaint.
# Wave 1d — Desktop app (Tauri, Mac)
Exit: Remedy.app DMG signed for Sebastien’s Mac. Opens a .remedy folder, shows the feature graph (xyflow), live-lints on save, runs remedy build on demand, surfaces the compiled artifact.
- Tauri 2 scaffold in
packages/remedy-desktop/. - Embed the existing
remedy-webUI (salvaged fromComplaintery/code/remedy-web) as the app webview. - IPC: webview → Rust → spawn
remedy-clias sidecar; stream stdout/stderr. - File watcher: re-lint and re-build on
.remedychange. - Secrets bridge to Infisical (read-only for v0).
- Mac code signing + notarisation.
# Wave 1e — remedy.build web surface
Exit: remedy.build serves the public spec, a searchable browser of public example Remedies, and app.remedy.build boots the same editor the Desktop app uses, sign-in via Zitadel.
- Astro site at
packages/remedy-web/(mirrorspetitgen-site/conventions). - Public routes:
/landing,/specrenders SPEC.md,/examples. - App routes under
app.remedy.build(Vite + React, same UI as Desktop). - Zitadel auth for the app.
- Cloudflare Pages deploy.
- DNS wired (
remedy.build→ apex;app.remedy.build→ app).
# Wave 2 — Marketplace + Morphee
Kicks in once Wave 1 exits. Tracked in the company ROADMAP; this repo imports those tasks when they land.
- Marketplace registry reading
marketplace:blocks. - GitLab group auto-spawn on publish.
- Morphee adapter stub.
- Second and third dogfoods (Credential Graph, Admin-as-Remedy).
# Parallelism
Waves 1a → 1c are strictly sequential. Waves 1d and 1e can start in parallel once 1c exits, because both consume remedy-core and don’t block each other.
# Out of scope for this repo
- Provisioning customer tenants (handled by Admin + Coolify).
- Xero payouts (handled by Admin).
- Zitadel org setup (handled by Admin’s ops runbooks).
# Open items gating Wave 1
- npm scope
@petitgenclaimed (org owner action). - Local Ollama running on Sebastien’s Mac (
ollama pull nomic-embed-text). - Apple Developer ID for Mac code signing (Wave 1d blocker only).
- Cloudflare zone for
remedy.build(Wave 1e blocker only).