master
47665927ab
feat(authority): seed default + installation tenants via migration (SPRINT_20260422_005)
...
Closes the bootstrap gap two parallel QA agents surfaced on 2026-04-22:
fresh Authority DBs lacked the `default` tenant row so setup-wizard admin
creation failed with users_tenant_id_fkey and /connect/token returned
invalid_grant. Fix is on the migration path per AGENTS.md §2.7; the init
script stays seeds-only as established in SPRINT_20260422_003.
- New embedded migration 003_seed_default_tenants.sql performs
`INSERT ... ON CONFLICT (tenant_id) DO NOTHING` for `default` and
`installation`. Numeric prefix (not S-prefix) so the migration runner's
Startup category auto-applies it; S-prefix files route to Seed category
which is intentionally manual-only per
StartupMigrationHost.cs:158.
- `default` is strictly required (Authority's
StandardPluginBootstrapper.DefaultTenantId; /internal/users bootstrap
inserts under this FK). `installation` is not Authority-FK-referenced
today but matches the empirical workaround both QA agents converged on
and serves as defense for cross-service inserts that join
authority.tenants.tenant_id.
Fresh-volume verification (docs/qa/authority-default-tenant-20260422/):
1. docker compose down -v (20 volumes removed incl. compose_postgres-data)
2. docker compose up -d — 62 containers, Authority healthy in ~15s.
3. Startup log: applying 001 (144ms) → 002 (13ms) → 003 (7ms).
authority.tenants contains default + installation.
4. POST /api/v1/setup/sessions → 201; database/valkey/migrations prereqs
ran; admin/execute with admin/Admin@Stella2026! → 200 "Bootstrap
administrator 'admin' ensured successfully."
5. POST /connect/token (password, stellaops-cli, ui.admin openid) → 200
+ JWT carrying role=admin, stellaops:tenant=default.
6. docker compose restart authority → "Database is up to date for
Authority." Clean no-op.
Docs: docs/modules/authority/architecture.md §1.1 "Seeded bootstrap
tenants (migration-owned)". Cross-link added to the archived prior
sprint's Decisions & Risks so the lineage is traceable.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-22 17:41:23 +03:00
..
2026-03-05 03:54:22 +02:00
2026-03-05 03:54:22 +02:00
2026-03-05 18:15:30 +02:00
2026-04-01 00:16:32 +03:00
2026-04-22 16:06:39 +03:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-03-08 21:41:38 +02:00
2026-03-08 21:41:38 +02:00
2026-03-08 21:41:38 +02:00
2026-04-06 09:58:33 +03:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-19 22:07:11 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 07:22:34 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-20 23:32:20 +02:00
2026-02-21 09:45:32 +02:00
2026-02-21 09:45:32 +02:00
2026-02-21 09:45:32 +02:00
2026-02-21 09:45:32 +02:00
2026-02-21 09:45:32 +02:00
2026-02-21 09:45:32 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-22 19:27:54 +02:00
2026-02-22 19:27:54 +02:00
2026-02-24 23:29:36 +02:00
2026-02-22 19:27:54 +02:00
2026-02-22 19:27:54 +02:00
2026-02-22 19:27:54 +02:00
2026-02-22 19:27:54 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-22 19:27:54 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-23 15:30:50 +02:00
2026-02-25 18:19:22 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-24 23:29:36 +02:00
2026-02-25 18:19:22 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-23 15:30:50 +02:00
2026-02-24 23:29:36 +02:00
2026-02-25 01:24:07 +02:00
2026-02-24 23:29:36 +02:00
2026-02-24 23:29:36 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 01:24:07 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-02-25 18:19:22 +02:00
2026-03-05 18:15:30 +02:00
2026-03-05 18:15:30 +02:00
2026-03-08 00:16:35 +02:00
2026-03-08 00:16:35 +02:00
2026-03-08 10:23:49 +02:00
2026-03-08 08:50:38 +02:00
2026-03-08 08:50:38 +02:00
2026-03-08 15:37:13 +02:00
2026-03-08 15:32:17 +02:00
2026-03-08 15:33:25 +02:00
2026-03-08 15:19:53 +02:00
2026-03-08 15:27:23 +02:00
2026-03-08 15:34:26 +02:00
2026-03-08 15:27:54 +02:00
2026-03-08 15:34:51 +02:00
2026-03-08 15:28:20 +02:00
2026-03-08 15:28:45 +02:00
2026-03-08 15:29:13 +02:00
2026-03-08 08:06:06 +02:00
2026-03-08 15:29:46 +02:00
2026-03-08 15:13:32 +02:00
2026-03-08 08:06:06 +02:00
2026-03-08 08:06:06 +02:00
2026-03-08 08:50:38 +02:00
2026-03-08 08:06:06 +02:00
2026-03-08 08:06:06 +02:00
2026-03-08 08:06:06 +02:00
2026-03-08 01:35:18 +02:00
2026-03-08 15:26:30 +02:00
2026-03-07 18:48:35 +02:00
2026-03-08 08:06:06 +02:00
2026-03-07 19:44:25 +02:00
2026-03-08 08:06:06 +02:00
2026-03-07 20:31:32 +02:00
2026-03-07 21:43:55 +02:00
2026-03-08 08:06:06 +02:00
2026-03-08 08:06:06 +02:00
2026-03-07 23:25:13 +02:00
2026-03-08 00:02:02 +02:00
2026-03-08 08:06:06 +02:00
2026-03-08 02:23:07 +02:00
2026-03-08 02:23:07 +02:00
2026-03-08 02:23:07 +02:00
2026-03-08 02:23:07 +02:00
2026-03-08 00:14:57 +02:00
2026-03-08 00:14:57 +02:00
2026-03-08 02:23:43 +02:00
2026-03-08 02:23:58 +02:00
2026-03-08 02:16:20 +02:00
2026-03-08 14:30:12 +02:00
2026-03-08 14:29:33 +02:00
2026-03-08 03:12:01 +02:00
2026-03-08 13:33:21 +02:00
2026-03-08 13:33:21 +02:00
2026-03-08 08:18:51 +02:00
2026-03-08 09:33:05 +02:00
2026-03-08 10:12:13 +02:00
2026-03-08 10:47:19 +02:00
2026-03-08 11:12:42 +02:00
2026-03-08 10:47:19 +02:00
2026-03-08 11:17:05 +02:00
2026-03-08 11:54:57 +02:00
2026-03-08 12:41:09 +02:00
2026-03-08 11:50:34 +02:00
2026-03-08 16:27:51 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-08 20:23:37 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 23:42:30 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-10 17:13:58 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-15 14:20:43 +02:00
2026-03-15 14:20:43 +02:00
2026-03-15 14:20:43 +02:00
2026-03-15 14:20:43 +02:00
2026-03-15 14:20:43 +02:00
2026-03-15 14:33:34 +02:00
2026-03-15 14:34:58 +02:00
2026-03-15 14:49:54 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 02:04:59 +02:00
2026-03-16 19:21:53 +02:00
2026-03-16 23:42:30 +02:00
2026-03-16 19:21:53 +02:00
2026-03-16 19:21:53 +02:00
2026-03-16 21:37:21 +02:00
2026-03-16 23:05:50 +02:00
2026-03-18 00:04:38 +02:00
2026-03-18 00:04:38 +02:00
2026-03-18 00:04:38 +02:00
2026-03-30 17:23:52 +03:00
2026-04-01 10:35:53 +03:00
2026-03-30 17:23:52 +03:00
2026-03-30 17:23:52 +03:00
2026-03-31 23:26:24 +03:00
2026-03-30 17:23:52 +03:00
2026-04-01 14:16:10 +03:00
2026-04-01 14:16:10 +03:00
2026-04-01 14:29:58 +03:00
2026-03-30 17:23:52 +03:00
2026-04-01 03:59:48 +03:00
2026-04-01 14:16:10 +03:00
2026-03-30 17:23:52 +03:00
2026-04-01 10:35:53 +03:00
2026-04-01 10:35:53 +03:00
2026-04-01 00:31:38 +03:00
2026-04-01 10:35:53 +03:00
2026-04-01 10:35:53 +03:00
2026-03-31 23:44:40 +03:00
2026-04-01 19:02:12 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 09:58:33 +03:00
2026-04-06 08:53:50 +03:00
2026-04-13 21:56:27 +03:00
2026-04-15 11:28:39 +03:00
2026-04-13 22:14:30 +03:00
2026-04-13 21:56:27 +03:00
2026-04-22 16:03:02 +03:00
2026-04-22 16:03:02 +03:00
2026-04-13 21:56:27 +03:00
2026-04-13 22:14:30 +03:00
2026-04-15 11:28:39 +03:00
2026-04-13 21:56:27 +03:00
2026-04-15 11:26:32 +03:00
2026-04-15 11:26:32 +03:00
2026-04-15 11:26:32 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-15 11:27:31 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-16 16:23:54 +03:00
2026-04-19 14:47:26 +03:00
2026-04-16 16:23:54 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:51:18 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 14:49:33 +03:00
2026-04-19 14:47:26 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-19 14:47:26 +03:00
2026-04-19 15:00:59 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:05:11 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:21:35 +03:00
2026-04-22 17:12:53 +03:00
2026-04-22 17:19:51 +03:00
2026-04-22 16:06:39 +03:00
2026-04-22 16:05:11 +03:00
2026-04-22 16:04:38 +03:00
2026-04-22 17:41:23 +03:00
2026-04-22 16:28:33 +03:00
2026-04-22 17:41:23 +03:00