# canned-prompts service The hosted registry and index (`CANP-WP-0006`). Product ownership lives here alongside the specification and the reference CLI; deployment and operation will belong to `rapp-canned-prompts` once there is an image digest to pin. This service **hosts** packages. It does not execute them — `INTENT.md`'s deliberate boundary holds, so rendering stays deterministic and a `derive` default remains a declaration the service does not satisfy. `reference/` is deliberately untouched by this. It is the format's conformance witness and stays dependency-light; the service is a separate consumer of the same package semantics. ## Stack FastAPI, SQLAlchemy, Alembic, PostgreSQL — matching `state-hub` and `sbom-nexus`. ```bash cd service uv venv && uv pip install -e ".[dev]" .venv/bin/python -m pytest -q export CANNED_PROMPTS_DATABASE_URL=postgresql+psycopg://... .venv/bin/alembic upgrade head .venv/bin/uvicorn canned_prompts_service.api:create_app --factory ``` `CANNED_PROMPTS_DATABASE_URL` has **no default**. A service that silently falls back to a local database when its real one is misconfigured is worse than one that refuses to start. ## Health surface `RailianceAppDeploymentGuide.md` requires unauthenticated `/healthz` and `/readyz`; `/state/health` matches the rest of the fleet. | Endpoint | Answers | Fails when | |---|---|---| | `/healthz` | is the process up | never — deliberately checks nothing else, so a database blip does not restart pods | | `/readyz` | can it serve | no database configured, unreachable, or schema not migrated | | `/state/health` | fleet-shaped status | same as `/readyz`, reported as `degraded` | Connectivity and schema are checked separately. Both mean not-ready, but they send an operator to different places — credentials and network, or an unrun migration — so collapsing them into one message would send people to the wrong one. ## Tenancy Every table holding owned data carries a `tenant` key from migration `0001`, per `business-app-service-contract_v0.1` § 1.3. The service is deployed single-tenant today; the key is present so a later consolidation is a data copy rather than a rewrite, and no query may assume it is the only tenant (§ 1.4). Uniqueness is `(tenant, registry, package_id, version)` — registry-scoped because identity is (§ 3.2), and tenant-scoped so two tenants may legitimately hold the same id. ## Schema | Table | Holds | |---|---| | `package_versions` | one immutable `:@`, its manifest, and indexed discovery fields | | `package_files` | the package's files as content, not parsed into rows | | `index_entries` | how a version arrived here (§ 20.3): source, method, `included_at` never overwritten, `last_seen_at` | ## Status `CANP-WP-0006` T01 and T02 are done: skeleton, health surface, tenant-keyed schema and migration `0001`. The read API, publish API, HTTP registry client and container image (T03–T06) are not built yet.