ADR-010: Templates stay independent for v1 (no unified "Workshop Templates" catalog)
Status
Proposed — 2026-05-25. Pending operator review on QUESTIONS R1.
Date
2026-05-25
Context
By the end of this spec set, the platform will have at least five "template-like" catalogs / starter sets:
- Mission Templates — already on develop. In-repo TS constants at
packages/agent/src/missions/mission-template.config.ts; surfaced viaTemplateCatalogServiceon/templatespage. - Website / Work Templates — already on develop. Same
TemplateCatalogService; users can fork. - Skill catalog — proposed in features/skills/spec.md. In-repo MD files at
apps/api/src/skills/catalog/<slug>/<slug>.md. - Agent templates — proposed in features/UX-DESIGN-agents-skills-tasks.md §4.1. Stored in a separate community repo
ever-works/agents— one folder per template withagent.yml+SOUL.md+AGENTS.md+HEARTBEAT.md+TOOLS.md. ~6 starters at launch (CEO, CTO, Researcher, PR-Reviewer, Editor, Designer); community can PR more. See ADR-011 for why this diverges from Skill catalog's in-monorepo posture. - Task templates — proposed in features/task-tracking/spec.md §5.4, deferred. 3 starters envisioned (bug-report, pr-review, weekly-status).
This pattern emerged organically as each feature shipped its own catalog. The natural architectural question: should we unify them under a single "Workshop Templates" registry?
Pros of unifying:
- Single mental model for users browsing for starters.
- One UI surface (
/templatesalready has tabs by kind via TemplatesCatalog kind-switch, recent PR W) — could host all five. - Shared lifecycle: versioning, installed-vs-available pattern, "Update available" prompt.
- Shared catalog repo path (potentially out-of-monorepo if the Skill catalog grows past 1k entries).
Cons of unifying:
- Each kind has different semantics: Mission Templates are FORKED (cloned repo), Skills are INSTALLED (copied bytes), Agents are SCAFFOLDED (copied files into existing repo), Task templates are PREFILLED (form pre-population). Forcing them through one interface either (a) creates an awkward union type that handles all four poorly, or (b) collapses real differences.
- Mission Templates and Work Templates already share infra; adding 3 more kinds means a larger refactor.
- Each catalog has a different governance model: Mission Templates are curated by Ever Works team; Skills will likely accept community PRs; Agent starters are platform-controlled.
Decision
For v1: independent services per catalog kind. Each kind has its primary home on its feature page (/agents, /skills, /tasks), where the user discovers, picks, and manages templates of that kind. The /templates page is a BONUS unified-browse view that shows all kinds via a kind-selector — for users who want one place to scan everything. Both surfaces read from the same per-kind backend services; the per-feature page is the primary path.
Per operator instruction (round 7):
"ADR-010-templates-stay-independent-for-v1.md seems correct as we want separate / independent templates. We do want also to show all of them on Templates page, but it's just a bonus, while each of those types of templates also will exists in other places in UI / UX flows etc."
Per operator instruction (round 6):
"Such Templates can be all managed on 'Templates' page, yes. I.e. I would prefer there to add selector for many different types of templates. However, also it's best to have ability to manage separately Agent templates on Agents page, same as Skills templates (catalog) on Skills page and so on. So it's fine to have in few places."
Concrete arrangement
Backend services — independent per kind:
TemplateCatalogService(existing) — Mission + Work Templates.AgentTemplateService(new) — clones + cachesever-works/agents; copies a chosen template into a Mission/Work repo or DB-inline storage.SkillsFacadeService+"Ever Works Skills"plugin (per ADR-012) — Skill catalog comes from the plugin, which readsever-works/skills.TasksFacadeService+"Ever Works Task Tracker"plugin (per ADR-013) — Task templates come fromever-works/tasks, bundled into the first-party tracker plugin.
Frontend surfaces — per-feature page is primary; /templates page is the bonus all-in-one view:
- Primary surfaces (each feature page owns its template browsing):
/agentspage — "Browse templates" section surfacing Agent templates fromAgentTemplateService. Also shown inline in the create-Agent dialog./skillspage — surfaces the Skill catalog fromSkillsFacadeService. The natural place users go to install/manage skills./taskspage / New Task dialog — surfaces Task templates fromTasksFacadeService.- Existing
/missions/newflow — already lists Mission Templates (no change).
- Bonus surface (
/templatespage) — unified hub with a kind-selector (Mission / Work / Agent / Skill / Task). Switches the visible kind via tab/dropdown; each tab calls the relevant backend service. Convenient for users who want one place to scan everything; not the discovery path we optimize for.
Implementation cost is small: shared <TemplatesBrowser kind="..." /> React component used by both primary and bonus surfaces.
Why this isn't "unified into one entity"
The DB-level union into a single WorkshopTemplate table is still rejected. The frontend hub + per-feature pages read from the same per-kind backend services — they don't share a storage shape. The UI is convergent; the data is not. This avoids the half-typed-column anti-pattern from ADR-009 §3.3.
Consequences
Positive
- Each catalog evolves at its own pace. Skills can sprout a contribution PR template without affecting Mission Templates' fork workflow.
- No premature abstraction. Avoids a
BaseTemplateinterface that's never quite right for all four. - Smaller v1 surface. No new "/workshop" page; no new entity table.
- Each feature spec stays self-contained. Easier review.
Negative
- No "browse all templates" experience. A user looking for "ways to start" hits 3 different pages. Mitigated by: each surface CTAs to the most relevant first; cross-links between them.
- Some duplication of UX patterns. "Installed / Available" appears in
/templates,/skills,/plugins. Mitigated by: extracting a shared<CatalogGrid>component if patterns truly converge. - Future consolidation will be a refactor. Not free.
Mitigations
- All four catalog services expose a similar minimal interface (
list(),getById(id),install(id)) so a v2 unifier can wrap them without invasive changes. - The
/templatespage's tab strip is structured so adding a "Skills" or "Agents" tab later is a small UI change.
Alternatives Considered
1. Unify into one WorkshopTemplate table from day one
Rejected. Discriminator-union pattern (per ADR-009 §3.3) tends to produce half-typed columns nobody fully uses. Mission Templates and Skills have ~zero shared columns once we strip kind.
2. Ship Mission + Work + Skill via the existing TemplateCatalogService; keep Agent starters + Task templates separate
Rejected for v1. Mid-strategy. Either commit fully (option 1) or stay independent. Mixing draws complexity without payoff.
3. No catalog for Agents — users always start from blank
Rejected. The wow-moment design (UX-DESIGN §1) depends on starters. Without them, first-Agent setup is too high-friction.
Related
- ADR-007: Skill catalog in-monorepo (parallel decision for one of the catalogs).
features/UX-DESIGN-agents-skills-tasks.md§4.1`.- Mission Templates:
packages/agent/src/missions/mission-template.config.ts. - Existing
/templatespage:apps/web/src/components/templates/TemplatesCatalog.tsx.