Three tiers, increasing in complexity. Each tier is a starting point — copy, then mutate to fit. The Tier 1 fixtures are mirrored in scripts/tests/fixtures/solution-dev/tier1/ and verified by npm run check-snippets so this page does not silently rot.
Future: when the em-service-template repo lands, these tiers collapse to cookiecutter gh:emergenceai/em-service-template --no-input solution_name=<your-name> tier=<1|2|3>. The inline scaffolds here are the bridge until that ships.
Every scaffold pins em-service to v0.0.16 (the version in em-service Chart as of 2026-05-14). Major em-service version bumps trigger a fixture refresh; npm run check-snippets (CI) fails if the inline snippets drift from the canonical fixtures.
Tier 1 — Minimal API service
Tier 2 — API + worker + own DB
Tier 3 — Agentic A2A solution
The simplest viable solution: one HTTP service, one image, JWT validation, env-injected secrets. Maps to the Quickstart shape with auth and secrets wired in.
Canonical copies of the eight files above live at scripts/tests/fixtures/solution-dev/tier1/. npm run check-snippets compares the inline snippets to the fixtures and fails if they drift.
Adds a worker component, a Postgres database, and Alembic migrations. Mirrors the Data Governance (em-data-readiness) shape.Below is the diff from Tier 1 — apply on top of Tier 1 to get Tier 2.
Reference implementation: see Data Governance overview — the em-data-readiness repo follows this exact pattern.
Adds an A2A agent component with LiteLLM and (optionally) a Prefect flow. Mirrors the Data Insights (em-talk2data) shape.Below is the diff from Tier 2.
em-talk2data is the canonical reference — see Data Insights overview for the full architecture (gateway service + insights agent + text2sql agent + LiteLLM via the same gateway pattern shown above).
The Tier 1 fixture files at scripts/tests/fixtures/solution-dev/tier1/ are the source of truth for the inline snippets above. Run npm run check-snippets to verify they match — CI runs this check on every PR.If you change Tier 1 inline content, update the fixtures (or vice versa), then re-run npm run check-snippets.