Genericity Matrix
Summary
This page states precisely what is reusable as-is, what is a template to adapt, and what is app-specific and must be authored. Use it to scope a new build.
Reusable as-is (do not rewrite)
| Area | Artifact |
|---|---|
| Layering & dependency rule | the package layout and import rules |
| Composition root | the init.py shape, idempotency, get_svc overloading |
| Web edge | OpenAPIFirstApp bootstrap, handler-name = operationId, thin handlers |
| CRUD slice | the four-file pattern (model / ports-db / ports-service / converters) |
| Generic CRUD service | the base service adaptor |
| Repository factory | base / populating / cached selection |
| Worker | the poll loop, backoff, retry, status machine |
| Progress bus | the bus port + in-memory adapter + streaming endpoint |
| Human-in-the-loop | the durable pause + question document + resolve endpoint + resume map |
| Infra adaptors | HTTP cache decorator, KV store port, LLM pool scaffold |
| Testing | integration harness with fakes, fixture-parity pattern |
| Docs | GSDFC + generated stubs + MCP bundle pipeline |
Template to adapt (copy, then change names)
| Artifact | Change |
|---|---|
pyproject.toml |
project name, dependencies |
Dockerfile / docker-compose.yaml |
service name, ports, services |
.env.example |
connection strings, provider keys |
openapi.yaml |
every path/schema/operationId |
scripts/ |
seed and operator tasks |
App-specific (must be authored)
| Artifact | Why |
|---|---|
| Resource models | the business shape |
| Repository populate/cache rules | the relationships |
| Service business logic | domain behaviour |
| Pipeline families (if any) | the transformation graph |
| Pattern/rule resources | data-driven policy |
| Fixtures & golden outputs | test data |
The two axes
Everything app-specific reduces to two axes:
- Resource model — the set of resources, their fields, relationships, and the OpenAPI contract.
- Pipeline family — only if inputs require multi-step transformation.
If you can specify those two axes, the rest of the app follows mechanically.