mainsequence-metatable 0.1.31.dev59__tar.gz → 0.1.31.dev60__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0007-database-enforced-table-access.md +9 -0
- mainsequence_metatable-0.1.31.dev60/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +183 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/mainsequence_metatable.egg-info/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/mainsequence_metatable.egg-info/SOURCES.txt +2 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/bootstrap.py +88 -65
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/access.py +11 -4
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +13 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/catalog.py +2 -1
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/postgresql_access.py +143 -22
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/bootstrap_migrations.py +19 -3
- mainsequence_metatable-0.1.31.dev60/src/metatables/api/backend/operations/bootstrap_timing.py +19 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_data_source_identity.py +3 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_runtime_upgrade.py +112 -5
- mainsequence_metatable-0.1.31.dev60/tests/permissions/test_deployment_security.py +304 -0
- mainsequence_metatable-0.1.31.dev59/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -98
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/discover-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/LICENSE +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0013-application-owned-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0016-impact-preflight.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0017-hosted-request-identity.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0018-table-search.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/adr/index.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/api/openapi.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/api/reference.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/assets/diagrams/namespace-access.svg +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/operations/hosted-runtime.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/reference/capabilities.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/security/index.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/mkdocs.yml +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/analysis.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/analyst/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/connection_count.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/mcp.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/access_map.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/caller.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/managed_finalize.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_search.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/batch_inspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/connection_pool.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/contracts.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/hosted_access.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/impact.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/models.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/search/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/search/documents.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/search/embeddings.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/search/index.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/search/ranking.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/search/text.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/backend/search/worker.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/api/request_timing.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/runner.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/models.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/analyst/test_agent_surface.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/analyst/test_api_search.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/analyst/test_mcp.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/analyst/test_tools.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_caller_endpoint.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_hosted_agent.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_request_identity.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/catalog/test_schema_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/capabilities.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/test_runtime_contract_compat.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_sql_security.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_managed_finalize_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_managed_finalize_unchanged.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_remaining_client_routes.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_search_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_search_scale.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_batch_introspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_connection_reuse.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_request_timing.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_serving_policy.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_access_map.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_incremental_security.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_table_queries.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/tests/permissions/test_workload_principals.py +0 -0
- {mainsequence_metatable-0.1.31.dev59 → mainsequence_metatable-0.1.31.dev60}/uv.lock +0 -0
|
@@ -51,6 +51,15 @@
|
|
|
51
51
|
> are when grants changed outside MetaTables are repaired, not on every catalog
|
|
52
52
|
> change. MySQL and SQL Server keep the full sweep on every change.
|
|
53
53
|
|
|
54
|
+
> Amendment (2026-10-10): [ADR 0014](0014-main-sequence-release-jobs-and-production-migrations.md#conditional-system-bootstrap-2026-10-10-amendment)
|
|
55
|
+
> replaces the unconditional deployment sweep on PostgreSQL/TimescaleDB with
|
|
56
|
+
> fresh native-security and login validation under the security-state lock.
|
|
57
|
+
> Every deployment still checks table policies. Unchanged security evidence uses
|
|
58
|
+
> incremental grant application and one conditional write of the complete
|
|
59
|
+
> manifest; drift, credential rotation, pending state or missing evidence retains
|
|
60
|
+
> full repair. An explicit admin repair remains a full sweep. A routine catalog
|
|
61
|
+
> update must not establish a new native baseline for unverified outside drift.
|
|
62
|
+
|
|
54
63
|
> Amendment (2026-10-09): [ADR 0022](0022-concurrent-requests-and-connection-reuse.md)
|
|
55
64
|
> reuses login-role connections within a pod, only by the login role that opened them
|
|
56
65
|
> and never through `SET ROLE`; no session state carries over from one use to the next.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# ADR 0014: System migrations in the deployment workflow
|
|
2
|
+
|
|
3
|
+
Date: 2026-10-02
|
|
4
|
+
|
|
5
|
+
Status: Accepted. Implemented on `development`; hosted verification pending.
|
|
6
|
+
Amended 2026-10-03 ([MetaTables #13](https://github.com/mainsequence-projects/MetaTables/issues/13)): the Job reads the declared runtime database itself
|
|
7
|
+
and initializes it on the first deployment.
|
|
8
|
+
|
|
9
|
+
Owners: MetaTables API. Main Sequence owns Job execution, images, deployment and
|
|
10
|
+
platform authentication.
|
|
11
|
+
|
|
12
|
+
Related: [ADR 0001: Runtime storage and bootstrap](0001-unified-api-storage-and-local-sqlite.md),
|
|
13
|
+
[ADR 0008: Database workflows and recovery](0008-mysql-mssql-table-workflows.md) and
|
|
14
|
+
[ADR 0013: Application-owned migrations](0013-application-owned-migrations.md).
|
|
15
|
+
|
|
16
|
+
## Context
|
|
17
|
+
|
|
18
|
+
Main Sequence deploys the hosted API from `.mainsequence/workflows/metatables-api.yaml`.
|
|
19
|
+
Settings runs system migrations inside the running API, and that API can only
|
|
20
|
+
apply the revisions it ships. A release's new revisions must be applied before
|
|
21
|
+
its API serves.
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
### The Job prepares the declared database (amended 2026-10-03)
|
|
26
|
+
|
|
27
|
+
The Job no longer reads the running API. `metatables runtime upgrade` loads
|
|
28
|
+
`runtime_database` from the candidate image's `configuration.yaml` and the
|
|
29
|
+
Environment Secret it names ([ADR 0001](0001-unified-api-storage-and-local-sqlite.md)).
|
|
30
|
+
Every run executes the same steps:
|
|
31
|
+
|
|
32
|
+
1. Check that the login can secure the database (ADR 0007 prerequisites).
|
|
33
|
+
2. Apply the system migrations.
|
|
34
|
+
3. Register the runtime DataSource, or update its connection to the declaration.
|
|
35
|
+
4. Freshly validate access setup and repair changes. Per-User role passwords
|
|
36
|
+
derive from the login password, so a rotated password reaches them on the
|
|
37
|
+
next deployment. The conditional reconciliation amendment below replaces
|
|
38
|
+
unconditional rebuilding on every deployment.
|
|
39
|
+
|
|
40
|
+
The first deployment therefore initializes the database. A missing declaration
|
|
41
|
+
or Secret, an unreachable database or unmet prerequisites fail the Job and block
|
|
42
|
+
the rollout. The deployment workflow is the authority, so no admin caller is
|
|
43
|
+
required. A new runtime DataSource records the Job's SDK user as its creator.
|
|
44
|
+
The Job prints `initialized`, `upgraded` or `up_to_date` with the revisions.
|
|
45
|
+
|
|
46
|
+
Settings' **Run MetaTables migrations** and `metatables runtime initialize` remain
|
|
47
|
+
for Local mode only. The original decision follows. The amendment supersedes
|
|
48
|
+
steps 1–2, the skip rules and the Settings initialization paragraph.
|
|
49
|
+
|
|
50
|
+
### Conditional system bootstrap (2026-10-10 amendment)
|
|
51
|
+
|
|
52
|
+
An unchanged deployment remains a validation gate, but does not restart completed
|
|
53
|
+
work or rewrite an identical catalog/security projection. This concerns the
|
|
54
|
+
MetaTables **system** Job, separate from application-provider finalization in
|
|
55
|
+
[ADR 0013](0013-application-owned-migrations.md).
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
resolve declaration and Secret
|
|
59
|
+
-> bootstrap lock
|
|
60
|
+
-> fresh history, recovery and runtime-binding checks
|
|
61
|
+
-> current heads + completed journal?
|
|
62
|
+
yes: fresh physical system-schema validation; preserve journal
|
|
63
|
+
no: existing Alembic execution and durable recovery; validate schema
|
|
64
|
+
-> reconcile runtime registration if changed
|
|
65
|
+
-> security-state lock; fresh native security and login validation
|
|
66
|
+
-> unchanged evidence? fresh table-policy checks; apply only grant differences
|
|
67
|
+
otherwise: full security repair, including credential rotation
|
|
68
|
+
-> commit; fresh registration/reference verification; release bootstrap lock
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Hosted configuration defers database inspection to the authoritative preflight
|
|
72
|
+
inside the bootstrap lock. The local path retains its pre-lock check, so an old
|
|
73
|
+
store cannot be replaced or a new file created before compatibility is checked.
|
|
74
|
+
Registration/reference validation is read again after commit under the lock;
|
|
75
|
+
it does not repeat schema reflection or the already verified migration history.
|
|
76
|
+
Startup and explicit activation continue their existing fresh checks.
|
|
77
|
+
|
|
78
|
+
Matching Alembic heads alone are insufficient. Only a **completed** progress
|
|
79
|
+
journal allows skipping Alembic and journal writes, after fresh schema validation.
|
|
80
|
+
A missing journal is established through the existing path. An incomplete
|
|
81
|
+
journal retains plan/binding checks, acknowledged-step recovery and rejection
|
|
82
|
+
of unknown outcomes. A completed journal records its original execution; a
|
|
83
|
+
source-code change without new revisions does not reset that history. Schema
|
|
84
|
+
drift still blocks deployment and is not silently repaired by replaying Alembic.
|
|
85
|
+
|
|
86
|
+
On PostgreSQL/TimescaleDB, the existing private `SQLSecurityState.manifest` stores
|
|
87
|
+
versioned native-security evidence and a domain-separated credential checksum,
|
|
88
|
+
alongside roles, memberships, privileges and routine evidence. No schema revision
|
|
89
|
+
is needed. Initialization compares fresh database evidence: role attributes and
|
|
90
|
+
memberships; schema, relation, column, routine, database and default ACLs; owners,
|
|
91
|
+
routine definitions and row-security policies. Table data and statistics are
|
|
92
|
+
excluded. Declared schemas and grant-target tables are included even when the
|
|
93
|
+
login has grant authority without owning them. Fresh per-login authentication
|
|
94
|
+
uses the configured TLS material and a new connection, never a pooled session
|
|
95
|
+
that could conceal a password change.
|
|
96
|
+
The security-state row stays locked until commit to serialize with catalog
|
|
97
|
+
changes and caller admission.
|
|
98
|
+
|
|
99
|
+
All registered table policies are freshly checked even on the unchanged path.
|
|
100
|
+
Unchanged table owners and `PUBLIC` grants cause no ownership/revoke writes.
|
|
101
|
+
Policies and grant differences still apply when a trigger or catalog change
|
|
102
|
+
affects access. Native drift, credential rotation, pending/unready state or
|
|
103
|
+
missing evidence invokes full repair. Login authentication failures likewise
|
|
104
|
+
require repair. Exhausted login connection capacity conservatively falls back
|
|
105
|
+
to the existing repair. libpq can omit SQLSTATE on a connection/authentication
|
|
106
|
+
failure; these ambiguous driver connection errors also require repair rather
|
|
107
|
+
than allowing a skip. Other probe failures fail deployment. An old installation
|
|
108
|
+
therefore performs one full repair to establish evidence, then converges.
|
|
109
|
+
Explicit admin repair remains a full sweep; MySQL/SQL Server keep their existing
|
|
110
|
+
security initialization behavior.
|
|
111
|
+
|
|
112
|
+
The complete manifest is compared and persisted once, including backend fields;
|
|
113
|
+
reconciliation must not remove and then restore the routine fingerprint. Ordinary
|
|
114
|
+
incremental changes cannot checkpoint unverified native drift as success. Failed
|
|
115
|
+
security work rolls back its catalog checkpoint and remains repairable on retry.
|
|
116
|
+
|
|
117
|
+
Named timings cover declaration/Secret resolution, bootstrap/security lock waits,
|
|
118
|
+
preflight, catalog/Alembic execution, system-schema validation, registration,
|
|
119
|
+
native security and login authentication validation, routine repair, table
|
|
120
|
+
policies, roles/grants, credential-store setup, commit and final registration
|
|
121
|
+
verification. Each timing
|
|
122
|
+
reports completion/failure without connection strings, passwords, checksums or
|
|
123
|
+
driver exception text. Successful security setup logs the selected path and its
|
|
124
|
+
reason, including first-run evidence establishment.
|
|
125
|
+
|
|
126
|
+
Focused verification uses disposable SQLite catalog transactions and recording
|
|
127
|
+
PostgreSQL adapters: unchanged deployments invoke no Alembic or catalog/journal
|
|
128
|
+
DML; unchanged native security emits no role/grant DDL or manifest UPDATE;
|
|
129
|
+
schema drift, interrupted/ambiguous recovery, credential rotation, permission
|
|
130
|
+
drift and failed repair remain checked. Live PostgreSQL/TimescaleDB validation is
|
|
131
|
+
separate from these non-container checks.
|
|
132
|
+
|
|
133
|
+
### Original decision (2026-10-02)
|
|
134
|
+
|
|
135
|
+
The deployment workflow upgrades the runtime from the candidate image before the
|
|
136
|
+
rollout:
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
candidate image -> migrate-system Job -> API deployment
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
A failed upgrade blocks the rollout.
|
|
143
|
+
|
|
144
|
+
The Job, `jobs/migrate_system.py`, runs `metatables runtime upgrade`:
|
|
145
|
+
|
|
146
|
+
1. Find the Environment's MetaTables API the same way the client does.
|
|
147
|
+
2. Read `GET /runtime-context/` as an organization admin. For admins,
|
|
148
|
+
`bootstrap.candidate` is the Settings DataSource's public configuration with
|
|
149
|
+
its Secret references; the Secrets are resolved through the SDK.
|
|
150
|
+
3. Apply this package's system migrations through the shared bootstrap operation:
|
|
151
|
+
backend lock, progress recovery, runtime registration, access setup and
|
|
152
|
+
verification. A runtime already at the current revision is left untouched.
|
|
153
|
+
|
|
154
|
+
The command acts only on an active runtime. With no API deployment or no active
|
|
155
|
+
runtime yet, it succeeds without DDL. The Environment's DataSource is set
|
|
156
|
+
through the deployed API, so if it is set the command migrates when necessary;
|
|
157
|
+
if it is not, it skips migrations and the API deploys. An API release that the
|
|
158
|
+
workflow created but has never deployed counts as no API deployment, so the
|
|
159
|
+
first run deploys the API. A non-admin identity or an unreadable
|
|
160
|
+
context fails before DDL. When it registers the runtime DataSource, it records
|
|
161
|
+
the Job identity's user UID as the creator.
|
|
162
|
+
|
|
163
|
+
Settings' **Run MetaTables migrations** and `metatables runtime initialize` keep
|
|
164
|
+
initializing a newly selected DataSource: the API serving them is the deployed
|
|
165
|
+
revision and runs its own migrations, so there is no version skew. API startup
|
|
166
|
+
stays inspection-only.
|
|
167
|
+
|
|
168
|
+
Both targets declare `automatic_redeployment` with `tag_regex: null`, so every
|
|
169
|
+
eligible commit runs the graph. Package publication stays in GitHub Actions.
|
|
170
|
+
|
|
171
|
+
The upgrade owns only `metatables.api.backend.migrations` and
|
|
172
|
+
`metatables_catalog_version`. Application providers keep their own histories
|
|
173
|
+
under ADR 0013.
|
|
174
|
+
|
|
175
|
+
## Consequences
|
|
176
|
+
|
|
177
|
+
- The previous API keeps serving during the upgrade, so each schema change must
|
|
178
|
+
stay compatible with the previous release. Coordination with its writes is not
|
|
179
|
+
defined yet.
|
|
180
|
+
- An upgrade followed by a failed deployment leaves the database upgraded. There
|
|
181
|
+
is no automatic downgrade.
|
|
182
|
+
- The workflow runs only when the platform receives the branch's commit.
|
|
183
|
+
Verification in a hosted Environment is pending.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mainsequence-metatable"
|
|
7
|
-
version = "0.1.31.
|
|
7
|
+
version = "0.1.31.dev60"
|
|
8
8
|
description = "Main Sequence MetaTables Python client and standalone API"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -332,6 +332,7 @@ src/metatables/api/backend/migrations/versions/0012_table_creator.py
|
|
|
332
332
|
src/metatables/api/backend/migrations/versions/__init__.py
|
|
333
333
|
src/metatables/api/backend/operations/__init__.py
|
|
334
334
|
src/metatables/api/backend/operations/bootstrap_migrations.py
|
|
335
|
+
src/metatables/api/backend/operations/bootstrap_timing.py
|
|
335
336
|
src/metatables/api/backend/operations/catalog_schema.py
|
|
336
337
|
src/metatables/api/backend/operations/create_table.py
|
|
337
338
|
src/metatables/api/backend/operations/finalize_managed.py
|
|
@@ -575,6 +576,7 @@ tests/packaging/test_distribution_sources.py
|
|
|
575
576
|
tests/packaging/test_editable_build.py
|
|
576
577
|
tests/packaging/test_installed_distribution.py
|
|
577
578
|
tests/permissions/test_access_map.py
|
|
579
|
+
tests/permissions/test_deployment_security.py
|
|
578
580
|
tests/permissions/test_governed_sql_scope.py
|
|
579
581
|
tests/permissions/test_incremental_security.py
|
|
580
582
|
tests/permissions/test_local_actor_membership.py
|
|
@@ -34,6 +34,7 @@ from metatables.api.backend.integrations.credential_store import (
|
|
|
34
34
|
)
|
|
35
35
|
from metatables.api.backend.integrations.local_workspace import _bind_file, _read_marker
|
|
36
36
|
from metatables.api.backend.integrations.runtime_binding import RuntimeStorageBinding
|
|
37
|
+
from metatables.api.backend.operations.bootstrap_timing import bootstrap_phase
|
|
37
38
|
from metatables.api.backend.persistence.database import (
|
|
38
39
|
create_catalog_engine,
|
|
39
40
|
migration_config,
|
|
@@ -234,7 +235,7 @@ class RuntimeBootstrap:
|
|
|
234
235
|
self.reader = None
|
|
235
236
|
self.resources.close()
|
|
236
237
|
|
|
237
|
-
def configure(self, body, owner, *, validate_schema=True):
|
|
238
|
+
def configure(self, body, owner, *, validate_schema=True, inspect_database=True):
|
|
238
239
|
# Validate public configuration before replacing the current candidate.
|
|
239
240
|
values = RuntimeSourceInput.model_validate(body).model_dump(mode="json")
|
|
240
241
|
kind = values["class_type"]
|
|
@@ -272,7 +273,8 @@ class RuntimeBootstrap:
|
|
|
272
273
|
self.candidate, self.owner = values, owner
|
|
273
274
|
self.active, self.uid = False, None
|
|
274
275
|
self.status, self.error, self.current = "unconfigured", None, []
|
|
275
|
-
|
|
276
|
+
if inspect_database:
|
|
277
|
+
self.inspect(validate_schema=validate_schema)
|
|
276
278
|
|
|
277
279
|
def open_engine(self, *, create=False):
|
|
278
280
|
from metatables.api.backend.backends.registry import backend_for_engine
|
|
@@ -332,34 +334,7 @@ class RuntimeBootstrap:
|
|
|
332
334
|
validate_system_schema,
|
|
333
335
|
)
|
|
334
336
|
validate_system_schema(connection, self.backend.catalog)
|
|
335
|
-
|
|
336
|
-
row = session.scalar(select(DataSource).where(DataSource.is_runtime.__eq__(True)))
|
|
337
|
-
if row is None:
|
|
338
|
-
self.status = "registration_required"
|
|
339
|
-
with engine.connect() as connection:
|
|
340
|
-
self.require_prerequisites(connection)
|
|
341
|
-
elif not self.matches(row):
|
|
342
|
-
if self.config.local_mode:
|
|
343
|
-
self.status = "incompatible"
|
|
344
|
-
self.error = "The stored runtime DataSource does not match this connection."
|
|
345
|
-
else:
|
|
346
|
-
# The declaration is authoritative; the deployment updates the record.
|
|
347
|
-
self.status = "registration_required"
|
|
348
|
-
self.error = "The runtime database declaration changed. The next deployment updates its registration."
|
|
349
|
-
else:
|
|
350
|
-
binding = RuntimeStorageBinding(str(engine.url), self.workspace, row.uid, self.candidate["configuration"])
|
|
351
|
-
for registered in session.scalars(select(DataSource)):
|
|
352
|
-
binding.validate_source(registered)
|
|
353
|
-
for model in (MetaTable, PhysicalOperation):
|
|
354
|
-
query = select(model.uid).where(model.data_source_uid != row.uid)
|
|
355
|
-
if model is MetaTable:
|
|
356
|
-
query = query.where(MetaTable.management_mode != "external_registered")
|
|
357
|
-
if session.scalar(query.limit(1)):
|
|
358
|
-
raise BootstrapError("Managed runtime catalog references another DataSource.")
|
|
359
|
-
if session.scalar(select(MetaTable.uid).where(~MetaTable.data_source_uid.in_(select(DataSource.uid))).limit(1)):
|
|
360
|
-
raise BootstrapError("MetaTable references an unregistered DataSource.")
|
|
361
|
-
self.uid = row.uid
|
|
362
|
-
self.status = "ready"
|
|
337
|
+
self.inspect_registration()
|
|
363
338
|
except (BootstrapError, CatalogConfigurationError) as exc:
|
|
364
339
|
logger.warning("Runtime database is incompatible", exc_info=True)
|
|
365
340
|
self.status, self.error = "incompatible", str(exc)
|
|
@@ -375,6 +350,39 @@ class RuntimeBootstrap:
|
|
|
375
350
|
logger.info("Runtime database inspection took %.3fs (status %s, schema validated: %s)",
|
|
376
351
|
perf_counter() - started, self.status, validate_schema)
|
|
377
352
|
|
|
353
|
+
def inspect_registration(self):
|
|
354
|
+
"""Fresh binding and reference checks, without repeating schema/history reads."""
|
|
355
|
+
self.error = None
|
|
356
|
+
engine = self.engine
|
|
357
|
+
with self.factory() as session:
|
|
358
|
+
row = session.scalar(select(DataSource).where(DataSource.is_runtime.__eq__(True)))
|
|
359
|
+
if row is None:
|
|
360
|
+
self.status = "registration_required"
|
|
361
|
+
with engine.connect() as connection:
|
|
362
|
+
self.require_prerequisites(connection)
|
|
363
|
+
elif not self.matches(row):
|
|
364
|
+
if self.config.local_mode:
|
|
365
|
+
self.status = "incompatible"
|
|
366
|
+
self.error = "The stored runtime DataSource does not match this connection."
|
|
367
|
+
else:
|
|
368
|
+
# The declaration is authoritative; the deployment updates the record.
|
|
369
|
+
self.status = "registration_required"
|
|
370
|
+
self.error = "The runtime database declaration changed. The next deployment updates its registration."
|
|
371
|
+
else:
|
|
372
|
+
binding = RuntimeStorageBinding(str(engine.url), self.workspace, row.uid, self.candidate["configuration"])
|
|
373
|
+
for registered in session.scalars(select(DataSource)):
|
|
374
|
+
binding.validate_source(registered)
|
|
375
|
+
for model in (MetaTable, PhysicalOperation):
|
|
376
|
+
query = select(model.uid).where(model.data_source_uid != row.uid)
|
|
377
|
+
if model is MetaTable:
|
|
378
|
+
query = query.where(MetaTable.management_mode != "external_registered")
|
|
379
|
+
if session.scalar(query.limit(1)):
|
|
380
|
+
raise BootstrapError("Managed runtime catalog references another DataSource.")
|
|
381
|
+
if session.scalar(select(MetaTable.uid).where(~MetaTable.data_source_uid.in_(select(DataSource.uid))).limit(1)):
|
|
382
|
+
raise BootstrapError("MetaTable references an unregistered DataSource.")
|
|
383
|
+
self.uid = row.uid
|
|
384
|
+
self.status = "ready"
|
|
385
|
+
|
|
378
386
|
def require_prerequisites(self, connection):
|
|
379
387
|
# Before any setup DDL: a database the login cannot secure must never be
|
|
380
388
|
# half-initialized. A registered runtime may hold external objects.
|
|
@@ -401,42 +409,55 @@ class RuntimeBootstrap:
|
|
|
401
409
|
try:
|
|
402
410
|
# Check before creating a file or scope marker: an earlier local
|
|
403
411
|
# store must remain untouched even when this target is absent.
|
|
404
|
-
self.
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
412
|
+
if self.config.local_mode:
|
|
413
|
+
with bootstrap_phase("local_preflight"):
|
|
414
|
+
self.inspect(validate_schema=False)
|
|
415
|
+
if self.status not in {"migration_required", "registration_required", "ready"}:
|
|
416
|
+
raise BootstrapError(self.error or "The selected database cannot be migrated.")
|
|
417
|
+
with ExitStack() as locks:
|
|
418
|
+
with bootstrap_phase("lock_wait"):
|
|
419
|
+
locks.enter_context(self.migration_lock())
|
|
420
|
+
with bootstrap_phase("locked_preflight"):
|
|
421
|
+
self.inspect(validate_schema=False)
|
|
409
422
|
if self.status not in {"migration_required", "registration_required", "ready"}:
|
|
410
423
|
raise BootstrapError(self.error or "The selected database cannot be migrated.")
|
|
424
|
+
previous = sorted(self.current)
|
|
411
425
|
self.status = "migrating"
|
|
412
|
-
|
|
426
|
+
with bootstrap_phase("catalog_migrations"):
|
|
427
|
+
upgrade_catalog(self.engine)
|
|
413
428
|
# The registry is used only after Alembic created/upgraded it.
|
|
414
429
|
with self.factory() as session:
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
if
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
430
|
+
with bootstrap_phase("runtime_registration"):
|
|
431
|
+
row = session.scalar(select(DataSource).where(DataSource.is_runtime.__eq__(True)))
|
|
432
|
+
if row is None:
|
|
433
|
+
if session.scalar(select(DataSource.uid).where(DataSource.is_default.__eq__(True))):
|
|
434
|
+
raise BootstrapError("An existing default requires explicit reconciliation before runtime registration.")
|
|
435
|
+
row = DataSource(uid=self.workspace.data_source.uid if self.workspace else uuid4(),
|
|
436
|
+
created_by_user_uid=user_uid, **self.candidate, is_runtime=True,
|
|
437
|
+
is_default=True, status="AVAILABLE", storage_access_mode="read_write")
|
|
438
|
+
session.add(row)
|
|
439
|
+
elif not self.matches(row):
|
|
440
|
+
if self.config.local_mode:
|
|
441
|
+
raise BootstrapError("The existing runtime registration cannot be replaced by this configuration or caller.")
|
|
442
|
+
# Same database, new declared connection (host, login Secret, TLS).
|
|
443
|
+
row.class_type, row.configuration = self.candidate["class_type"], self.candidate["configuration"]
|
|
444
|
+
row.is_default, row.status, row.storage_access_mode = True, "AVAILABLE", "read_write"
|
|
445
|
+
from metatables.api.backend.backends.registry import backend_for
|
|
446
|
+
session.flush()
|
|
447
|
+
with bootstrap_phase("security_reconciliation"):
|
|
448
|
+
backend_for(replace(self.backend.source, uid=row.uid)).access.initialize(session)
|
|
449
|
+
with bootstrap_phase("credential_store"):
|
|
450
|
+
credentials = bind_store(self.credential_store, session, user_uid)
|
|
451
|
+
if hasattr(credentials, "initialize"):
|
|
452
|
+
credentials.initialize()
|
|
453
|
+
with bootstrap_phase("registration_commit"):
|
|
454
|
+
session.commit()
|
|
436
455
|
# upgrade_catalog already verified the complete system schema.
|
|
437
456
|
# Recheck registration before releasing the lock, without
|
|
438
457
|
# repeating every table/column/index/constraint lookup.
|
|
439
|
-
self.
|
|
458
|
+
self.current = list(self.expected)
|
|
459
|
+
with bootstrap_phase("registration_verification"):
|
|
460
|
+
self.inspect_registration()
|
|
440
461
|
if self.status != "ready":
|
|
441
462
|
raise BootstrapError(self.error or "Migration finished but the runtime is not ready.")
|
|
442
463
|
except (BootstrapError, CatalogConfigurationError) as exc:
|
|
@@ -462,6 +483,7 @@ class RuntimeBootstrap:
|
|
|
462
483
|
self.error = (f"MetaTables migration or registration failed ({cause}). The runtime was not activated; "
|
|
463
484
|
"inspect the database before retrying. The log has the full error.")
|
|
464
485
|
raise BootstrapError(self.error) from None
|
|
486
|
+
return previous
|
|
465
487
|
|
|
466
488
|
def persist_selection(self):
|
|
467
489
|
from metatables.api.app.runtime_control import write_state
|
|
@@ -563,18 +585,19 @@ def deploy_runtime_database(user_uid):
|
|
|
563
585
|
|
|
564
586
|
The workflow's migration Job runs this from the candidate image before the
|
|
565
587
|
API rolls out, every time; any failure blocks the rollout. Access setup is
|
|
566
|
-
|
|
588
|
+
freshly checked too; drift and rotated credentials are repaired as needed.
|
|
567
589
|
"""
|
|
568
590
|
from metatables.api.app.configuration import DEPLOYMENT_CONFIGURATION
|
|
569
591
|
from metatables.api.app.runtime import RuntimeConfig
|
|
570
592
|
target = RuntimeBootstrap(RuntimeConfig(local_mode=False, configuration_path=DEPLOYMENT_CONFIGURATION), None)
|
|
571
593
|
try:
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
594
|
+
with bootstrap_phase("candidate_resolution"):
|
|
595
|
+
candidate = target.initial_candidate()
|
|
596
|
+
if candidate is None:
|
|
597
|
+
raise BootstrapError(target.error)
|
|
598
|
+
target.configure(candidate, user_uid, validate_schema=False, inspect_database=False)
|
|
599
|
+
with bootstrap_phase("deployment_migration"):
|
|
600
|
+
previous = target.migrate(user_uid)
|
|
578
601
|
revisions = sorted(target.current)
|
|
579
602
|
status = "initialized" if not previous else "upgraded" if previous != revisions else "up_to_date"
|
|
580
603
|
return dict(status=status, previous_revisions=previous, revisions=revisions, data_source_uid=str(target.uid))
|
|
@@ -312,11 +312,13 @@ class DatabaseAccess:
|
|
|
312
312
|
memberships.add((login, role("team", team, write)))
|
|
313
313
|
return dict(roles=roles, memberships=sorted(memberships), privileges=sorted(privileges))
|
|
314
314
|
|
|
315
|
-
def reconcile(self, session, *, inspect_objects=False, tables=None):
|
|
315
|
+
def reconcile(self, session, *, inspect_objects=False, tables=None, full=None):
|
|
316
316
|
"""Mirror the catalog into database grants.
|
|
317
317
|
|
|
318
|
-
``inspect_objects``
|
|
319
|
-
role
|
|
318
|
+
``inspect_objects`` inspects every policy and, by default, rebuilds every
|
|
319
|
+
role, repairing grants changed outside MetaTables. A backend that has
|
|
320
|
+
freshly verified native security may explicitly choose ``full=False``
|
|
321
|
+
while retaining the fresh policy sweep.
|
|
320
322
|
Otherwise only the policies ``tables`` can affect are inspected, and an
|
|
321
323
|
incremental backend applies only the grants that changed.
|
|
322
324
|
"""
|
|
@@ -328,7 +330,12 @@ class DatabaseAccess:
|
|
|
328
330
|
elif tables:
|
|
329
331
|
self.refresh_policies(session, tables=self.policy_scope(session, tables))
|
|
330
332
|
desired = self.plan(session)
|
|
331
|
-
|
|
333
|
+
full = inspect_objects if full is None else full
|
|
334
|
+
self.apply(session, desired, state.manifest, full=full)
|
|
335
|
+
self.save_manifest(session, state, desired)
|
|
336
|
+
|
|
337
|
+
def save_manifest(self, session, state, desired):
|
|
338
|
+
"""Persist the complete backend manifest once, only if it changed."""
|
|
332
339
|
# JSON loads arrays as lists, while plan() builds tuples. Compare the
|
|
333
340
|
# persisted representation so equal grants do not rewrite security state.
|
|
334
341
|
if json.dumps(state.manifest, sort_keys=True) != json.dumps(desired, sort_keys=True):
|
|
@@ -118,6 +118,19 @@ def _owned_connection(connect, params, settings):
|
|
|
118
118
|
return connection, close
|
|
119
119
|
|
|
120
120
|
|
|
121
|
+
def validate_login(settings, user, password):
|
|
122
|
+
"""Authenticate afresh: a pooled connection cannot detect password drift."""
|
|
123
|
+
import psycopg
|
|
124
|
+
|
|
125
|
+
params = dict(host=settings.host, port=settings.port, dbname=settings.database_name,
|
|
126
|
+
user=user, password=password, sslmode=settings.ssl_mode, connect_timeout=5)
|
|
127
|
+
connection, close = _owned_connection(psycopg.connect, params, settings)
|
|
128
|
+
try:
|
|
129
|
+
connection.execute("SELECT 1", prepare=False)
|
|
130
|
+
finally:
|
|
131
|
+
close()
|
|
132
|
+
|
|
133
|
+
|
|
121
134
|
@contextmanager
|
|
122
135
|
def login_session(settings, user, password, *, prepare):
|
|
123
136
|
"""A psycopg connection as ``user``, reused only under the same login (ADR 0022).
|
|
@@ -73,7 +73,8 @@ class PostgreSQLCatalog:
|
|
|
73
73
|
def initialize_namespace(self, connection):
|
|
74
74
|
if connection.exec_driver_sql("SELECT to_regclass('public.metatables_catalog_version')").scalar():
|
|
75
75
|
raise CatalogConfigurationError("Earlier development catalogs must be recreated through Settings.")
|
|
76
|
-
connection.exec_driver_sql("
|
|
76
|
+
if not connection.exec_driver_sql("SELECT to_regnamespace('metatables')").scalar():
|
|
77
|
+
connection.exec_driver_sql("CREATE SCHEMA IF NOT EXISTS metatables")
|
|
77
78
|
|
|
78
79
|
def unique_constraints(self, inspector, table, schema=None):
|
|
79
80
|
return inspector.get_unique_constraints(table, schema=schema)
|