Rewrite the tenant-table and schema-bootstrap comments to the generic,
standalone-honcho rationale an external reader needs, dropping
deployment-specific detail. Comment-only; no behavior change.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Rename Tenant.app_name -> legacy_app_name so the incumbent per-tenant name never
collides with a shared pool's app_name (which is a single shared value for all
pooled tenants). It's the value that keeps a tenant's external vector-store
namespace stable when the tenant moves onto a shared backend.
- Apply the agent-comment-marker convention (# ai: / # region ai) across the
tenant_id schema, the bootstrap script, and its test: the why (receipts,
anti-prior gotchas) is foldable-marked; short docstrings carry the what.
Comments/docstrings + one column rename only; the bootstrap integration test
stays green (no behavioral change).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Move the shared-schema bootstrap out of the Alembic chain into a standalone
script (scripts/bootstrap_shared_schema.py). As a chained revision it collided
with the per-tenant history on `alembic upgrade head` (DuplicateTable) and would
have run on existing single-tenant instances via init_db(). It is now run
explicitly against the fresh shared DB; the migration track owns provisioning.
- Run the bootstrap in AUTOCOMMIT so 1000+ partition creations plus composite FKs
don't exhaust max_locks_per_transaction in a single transaction.
- Derive the partitioned-table set from the models instead of hand-listing it
(a hand list drifts and yields a partitioned parent with zero partitions).
- message_embeddings: index (message_id, tenant_id) since message_id lookups are
cross-tenant; restore the composite workspaces FK for parity with peer tables.
- messages: ix_messages_peer_lookup = (tenant_id, workspace_name, peer_name,
created_at) to serve the peer-history query without a sort.
- QueueItem.__repr__: include tenant_id.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>