docs(changelog): record T-8 — the tenant registry

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-19 17:31:43 +02:00
co-authored by Claude Sonnet 5
parent 99ee994023
commit d32caabe92
+20
View File
@@ -9,6 +9,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- **The tenant registry** (`src/domains/tenants/`, core-api T-8 / workspace
D-73) - `tenants` and `tenant_consumers` (migration 007), and
`TenantsService.require_tenant`, the one enforcement point Book's and
Scribe's own `_require_tenant` now delegate to instead of checking only
presence: a tenant that is not in the table is 403 `tenant_unknown`, one
marked `suspended` is 403 `tenant_suspended`, and an Office caller whose
consumer holds no grant in that tenant is 403 `consumer_not_granted` -
closing the gap where a typo'd `tatlock_user` claim opened a fresh, empty
namespace rather than being refused. Every existing `owner_tenant` column
(`book_records`, `book_tenant_counters`, `scribe_addresses`,
`scribe_messages`, `scribe_mailbox_entries`) now carries a foreign key to
`tenants.id` (`ON DELETE RESTRICT`). Migration 007 seeds the two tenants
in use today - `jpmschweitzer` (household) and `llm_tester` (test) - both
granted to `office-claude`, the only Office consumer configured in
Authentik. Read-only this round: `GET /tenants/me` answers the caller's
own tenant and its granted consumers (the cheap "am I allowed here"
probe); `GET /tenants` answers every tenant for a `tatlock`/`scheduler`
caller or a list of one for a tenant-bearing caller, never revealing
another tenant's existence. No write routes - provisioning a tenant is
later (workspace T-195).
- **The Scribe** (`src/domains/scribe/`) - the household's message bus
(dossier core-api T-5 / workspace D-66, D-68, D-73): `register`/`list`
addresses, `send`, `mailbox`, `history`, `find`, `mark`, `tag`/`untag`, all