mainsequence-metatable 0.1.35.dev65__tar.gz → 0.1.36__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.35.dev65 → mainsequence_metatable-0.1.36}/.mainsequence/workflows/metatables-api.yaml +27 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0007-database-enforced-table-access.md +20 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +27 -22
- mainsequence_metatable-0.1.36/docs/adr/api/0023-daily-security-check.md +109 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/index.md +1 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/openapi.json +20 -20
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/reference.md +1 -1
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/releasing.md +10 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/hosted-runtime.md +23 -2
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/recovery-and-observability.md +10 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/reference/capabilities.md +1 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/reference/cli.md +1 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/security/index.md +15 -5
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/security/permissions.md +1 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/mkdocs.yml +1 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/SOURCES.txt +5 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/bootstrap.py +40 -3
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/security.py +29 -19
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/access.py +31 -10
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/contracts.py +2 -1
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/hosted_access.py +1 -1
- mainsequence_metatable-0.1.36/src/metatables/api/backend/backends/postgresql_access.py +675 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/sqlite_access.py +1 -1
- mainsequence_metatable-0.1.36/src/metatables/api/backend/integrations/security_check_job.py +39 -0
- mainsequence_metatable-0.1.36/src/metatables/api/backend/migrations/versions/0013_security_check.py +19 -0
- mainsequence_metatable-0.1.36/src/metatables/api/backend/operations/security_check.py +51 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/models.py +2 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/app.py +16 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_data_source_identity.py +2 -2
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_bootstrap.py +8 -8
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_storage_binding.py +21 -9
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_migration.py +2 -2
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/capabilities.json +11 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_catalog_contract.py +1 -1
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_sql_security.py +32 -15
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_runtime_upgrade.py +7 -5
- mainsequence_metatable-0.1.36/tests/permissions/test_deployment_security.py +402 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_incremental_security.py +118 -12
- mainsequence_metatable-0.1.36/tests/permissions/test_security_check.py +246 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/uv.lock +1 -1
- mainsequence_metatable-0.1.35.dev65/src/metatables/api/backend/backends/postgresql_access.py +0 -564
- mainsequence_metatable-0.1.35.dev65/tests/permissions/test_deployment_security.py +0 -304
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/discover-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/LICENSE +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0013-application-owned-migrations.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0016-impact-preflight.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0017-hosted-request-identity.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0018-table-search.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/assets/diagrams/namespace-access.svg +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/analysis.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/analyst/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/connection_count.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/mcp.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/access_map.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/caller.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/managed_finalize.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_search.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/batch_inspection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/connection_pool.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/operations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/bootstrap_timing.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/impact.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/documents.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/embeddings.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/index.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/ranking.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/text.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/worker.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/request_timing.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/runner.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/models.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/analyst/test_agent_surface.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/analyst/test_api_search.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/analyst/test_mcp.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/analyst/test_tools.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_caller_endpoint.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_hosted_agent.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_request_identity.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_schema_validation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_runtime_contract_compat.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_managed_finalize_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_managed_finalize_unchanged.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_migration_metadata_and_downgrade.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_remaining_client_routes.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_search_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_search_scale.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_batch_introspection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_connection_reuse.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_request_timing.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_serving_policy.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_access_map.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_table_queries.py +0 -0
- {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_workload_principals.py +0 -0
|
@@ -32,6 +32,9 @@ resources:
|
|
|
32
32
|
resources:
|
|
33
33
|
- key: metatables-analyst-agent
|
|
34
34
|
level: view
|
|
35
|
+
# The Admin's "Run security check now" starts the daily check (ADR 0023).
|
|
36
|
+
- key: check-security
|
|
37
|
+
level: edit
|
|
35
38
|
|
|
36
39
|
- key: metatables-analyst-agent
|
|
37
40
|
kind: harness_agent
|
|
@@ -76,6 +79,30 @@ resources:
|
|
|
76
79
|
- name: METATABLES_RUNTIME_DATABASE
|
|
77
80
|
level: view
|
|
78
81
|
|
|
82
|
+
# The full database security check, outside the deployment (ADR 0023). Not a
|
|
83
|
+
# workflow step: every push activates its image, and it skips while the
|
|
84
|
+
# database still awaits that image's system migrations.
|
|
85
|
+
- key: check-security
|
|
86
|
+
kind: job
|
|
87
|
+
spec:
|
|
88
|
+
name: MetaTables security check
|
|
89
|
+
execution_path: jobs/check_security.py
|
|
90
|
+
cpu_request: "1"
|
|
91
|
+
memory_request: "1"
|
|
92
|
+
max_runtime_seconds: 1800
|
|
93
|
+
automatic_redeployment:
|
|
94
|
+
enabled: true
|
|
95
|
+
tag_regex: null
|
|
96
|
+
task_schedule:
|
|
97
|
+
schedule:
|
|
98
|
+
type: crontab
|
|
99
|
+
# Daily at 03:00 UTC.
|
|
100
|
+
expression: "0 3 * * *"
|
|
101
|
+
access:
|
|
102
|
+
secrets:
|
|
103
|
+
- name: METATABLES_RUNTIME_DATABASE
|
|
104
|
+
level: view
|
|
105
|
+
|
|
79
106
|
execution:
|
|
80
107
|
steps:
|
|
81
108
|
image:
|
|
@@ -60,6 +60,26 @@
|
|
|
60
60
|
> full repair. An explicit admin repair remains a full sweep. A routine catalog
|
|
61
61
|
> update must not establish a new native baseline for unverified outside drift.
|
|
62
62
|
|
|
63
|
+
> Amendment (2026-10-15, [MetaTables #66](https://github.com/mainsequence-projects/MetaTables/issues/66)):
|
|
64
|
+
> On PostgreSQL/TimescaleDB, deployment and the admin repair compare what
|
|
65
|
+
> MetaTables' roles actually hold with the plan and change only what differs. One
|
|
66
|
+
> query reads those roles' attributes, memberships and grants on the database,
|
|
67
|
+
> on schemas and on relations the login owns or the plan names; table policies
|
|
68
|
+
> are read in one query as well. Statements go out in batches, one round trip
|
|
69
|
+
> each. This replaces the native-security fingerprint, which hashed every object
|
|
70
|
+
> the shared login owns and so changed with any application table, column, index
|
|
71
|
+
> or new data, and the full repair that revoked every grant and granted it back.
|
|
72
|
+
> TimescaleDB's internal schemas are never read or changed: chunks inherit their
|
|
73
|
+
> hypertable's grants. Schema `USAGE` and `CONNECT` are granted only where the
|
|
74
|
+
> login may grant them. Login passwords are set again only on credential
|
|
75
|
+
> rotation, failed login validation, pending or uninitialized state.
|
|
76
|
+
|
|
77
|
+
> Amendment (2026-10-15, [ADR 0023](0023-daily-security-check.md)): The full sweep
|
|
78
|
+
> no longer runs in every deployment's migration Job. It runs as a daily Job, which
|
|
79
|
+
> administrators can also start from the Admin; the admin repair that paused caller
|
|
80
|
+
> SQL is removed. A deployment runs it only on first setup or after system migrations,
|
|
81
|
+
> so grants changed outside MetaTables are repaired within a day.
|
|
82
|
+
|
|
63
83
|
> Amendment (2026-10-09): [ADR 0022](0022-concurrent-requests-and-connection-reuse.md)
|
|
64
84
|
> reuses login-role connections within a pod, only by the login role that opened them
|
|
65
85
|
> and never through `SET ROLE`; no session state carries over from one use to the next.
|
|
@@ -37,6 +37,11 @@ Every run executes the same steps:
|
|
|
37
37
|
next deployment. The conditional reconciliation amendment below replaces
|
|
38
38
|
unconditional rebuilding on every deployment.
|
|
39
39
|
|
|
40
|
+
[ADR 0023](0023-daily-security-check.md) (2026-10-15) narrows step 4: the Job sets
|
|
41
|
+
up the owner role, sets login passwords again after a rotation and applies pending
|
|
42
|
+
changes. It runs the full security check only on first setup or after system
|
|
43
|
+
migrations; a daily Job runs it otherwise.
|
|
44
|
+
|
|
40
45
|
The first deployment therefore initializes the database. A missing declaration
|
|
41
46
|
or Secret, an unreachable database or unmet prerequisites fail the Job and block
|
|
42
47
|
the rollout. The deployment workflow is the authority, so no admin caller is
|
|
@@ -62,9 +67,9 @@ resolve declaration and Secret
|
|
|
62
67
|
yes: fresh physical system-schema validation; preserve journal
|
|
63
68
|
no: existing Alembic execution and durable recovery; validate schema
|
|
64
69
|
-> reconcile runtime registration if changed
|
|
65
|
-
-> security-state lock; fresh
|
|
66
|
-
->
|
|
67
|
-
|
|
70
|
+
-> security-state lock; fresh login validation
|
|
71
|
+
-> fresh table-policy checks; compare the managed roles' actual grants with
|
|
72
|
+
the plan and apply only the differences; set passwords only when needed
|
|
68
73
|
-> commit; fresh registration/reference verification; release bootstrap lock
|
|
69
74
|
```
|
|
70
75
|
|
|
@@ -83,40 +88,40 @@ of unknown outcomes. A completed journal records its original execution; a
|
|
|
83
88
|
source-code change without new revisions does not reset that history. Schema
|
|
84
89
|
drift still blocks deployment and is not silently repaired by replaying Alembic.
|
|
85
90
|
|
|
86
|
-
On PostgreSQL/TimescaleDB
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
that could conceal a password change.
|
|
91
|
+
On PostgreSQL/TimescaleDB (amended 2026-10-15, [MetaTables #66](https://github.com/mainsequence-projects/MetaTables/issues/66)),
|
|
92
|
+
initialization reads what MetaTables' roles actually hold in one query: their
|
|
93
|
+
attributes, memberships, and grants on the database, on schemas and on the
|
|
94
|
+
relations the login owns or the plan names. It compares that with the plan and
|
|
95
|
+
sends only the differences, in batches. TimescaleDB's internal schemas are never
|
|
96
|
+
read or changed. The manifest keeps a domain-separated credential checksum and
|
|
97
|
+
the routine evidence. Fresh per-login authentication uses the configured TLS
|
|
98
|
+
material and a new connection, never a pooled session that could conceal a
|
|
99
|
+
password change.
|
|
96
100
|
The security-state row stays locked until commit to serialize with catalog
|
|
97
101
|
changes and caller admission.
|
|
98
102
|
|
|
99
103
|
All registered table policies are freshly checked even on the unchanged path.
|
|
104
|
+
(Superseded by [ADR 0023](0023-daily-security-check.md): an unchanged deployment no
|
|
105
|
+
longer checks table policies, compares grants or probes logins; the daily security
|
|
106
|
+
check does.)
|
|
100
107
|
Unchanged table owners and `PUBLIC` grants cause no ownership/revoke writes.
|
|
101
108
|
Policies and grant differences still apply when a trigger or catalog change
|
|
102
|
-
affects access.
|
|
103
|
-
|
|
104
|
-
|
|
109
|
+
affects access. Grants changed outside MetaTables are found by the comparison
|
|
110
|
+
and repaired. Credential rotation, pending/unready state or missing evidence sets
|
|
111
|
+
login passwords again; so do login authentication failures. Exhausted login connection capacity conservatively falls back
|
|
105
112
|
to the existing repair. libpq can omit SQLSTATE on a connection/authentication
|
|
106
113
|
failure; these ambiguous driver connection errors also require repair rather
|
|
107
|
-
than allowing a skip. Other probe failures fail deployment.
|
|
108
|
-
therefore performs one full repair to establish evidence, then converges.
|
|
114
|
+
than allowing a skip. Other probe failures fail deployment.
|
|
109
115
|
Explicit admin repair remains a full sweep; MySQL/SQL Server keep their existing
|
|
110
116
|
security initialization behavior.
|
|
111
117
|
|
|
112
118
|
The complete manifest is compared and persisted once, including backend fields;
|
|
113
|
-
reconciliation must not remove and then restore the routine fingerprint.
|
|
114
|
-
incremental changes cannot checkpoint unverified native drift as success. Failed
|
|
119
|
+
reconciliation must not remove and then restore the routine fingerprint. Failed
|
|
115
120
|
security work rolls back its catalog checkpoint and remains repairable on retry.
|
|
116
121
|
|
|
117
122
|
Named timings cover declaration/Secret resolution, bootstrap/security lock waits,
|
|
118
123
|
preflight, catalog/Alembic execution, system-schema validation, registration,
|
|
119
|
-
|
|
124
|
+
login authentication validation, routine repair, table
|
|
120
125
|
policies, roles/grants, credential-store setup, commit and final registration
|
|
121
126
|
verification. Each timing
|
|
122
127
|
reports completion/failure without connection strings, passwords, checksums or
|
|
@@ -125,7 +130,7 @@ reason, including first-run evidence establishment.
|
|
|
125
130
|
|
|
126
131
|
Focused verification uses disposable SQLite catalog transactions and recording
|
|
127
132
|
PostgreSQL adapters: unchanged deployments invoke no Alembic or catalog/journal
|
|
128
|
-
DML; unchanged
|
|
133
|
+
DML; an unchanged database emits no role/grant DDL or manifest UPDATE;
|
|
129
134
|
schema drift, interrupted/ambiguous recovery, credential rotation, permission
|
|
130
135
|
drift and failed repair remain checked. Live PostgreSQL/TimescaleDB validation is
|
|
131
136
|
separate from these non-container checks.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# ADR 0023: A daily security check instead of a sweep in every deployment
|
|
2
|
+
|
|
3
|
+
Status: Accepted.
|
|
4
|
+
|
|
5
|
+
Implementation status: implemented on development. Non-container tests pass; the
|
|
6
|
+
deployment, the first scheduled run and the container suites are pending.
|
|
7
|
+
|
|
8
|
+
Owner: this repository.
|
|
9
|
+
|
|
10
|
+
Related decisions: [ADR 0007](0007-database-enforced-table-access.md) (database roles
|
|
11
|
+
enforce table access), [ADR 0014](0014-main-sequence-release-jobs-and-production-migrations.md)
|
|
12
|
+
(the migration Job of every deployment) and
|
|
13
|
+
[ADR 0013](0013-application-owned-migrations.md) (application migrations).
|
|
14
|
+
|
|
15
|
+
## Context
|
|
16
|
+
|
|
17
|
+
Every deployment's migration Job ran the full security check. It compared every role,
|
|
18
|
+
membership, grant, table policy and routine MetaTables secures with the catalog's plan,
|
|
19
|
+
opened a fresh connection for every login role, and repaired what differed. It held the
|
|
20
|
+
security-state lock throughout, so callers' SQL waited. In development it took 135 s of
|
|
21
|
+
a 147 s migration step; in one run
|
|
22
|
+
([MetaTables #66](https://github.com/mainsequence-projects/MetaTables/issues/66)) it
|
|
23
|
+
took 25 minutes, close to the Job's 30-minute limit.
|
|
24
|
+
|
|
25
|
+
Most of that work repairs grants changed outside MetaTables. A deployment neither causes
|
|
26
|
+
them nor repairs them in time: drift made just after a deployment stays until the next
|
|
27
|
+
one, which in production can be weeks away. Drift the check cannot repair blocked the
|
|
28
|
+
release, even a release meant to fix it.
|
|
29
|
+
|
|
30
|
+
## Decision
|
|
31
|
+
|
|
32
|
+
The full check runs once a day as its own Job, and administrators can run it at any
|
|
33
|
+
time. A deployment does only what the new release needs.
|
|
34
|
+
|
|
35
|
+
### What a deployment does
|
|
36
|
+
|
|
37
|
+
The migration Job's security step:
|
|
38
|
+
|
|
39
|
+
1. sets up the owner role `mt_owner`, which normally changes nothing;
|
|
40
|
+
2. runs the full check on the first setup, and when the system migration heads differ
|
|
41
|
+
from the ones the last full check ran at. System migrations change catalog rows
|
|
42
|
+
without the hooks that keep grants in step. The heads are recorded with the check,
|
|
43
|
+
so nothing depends on a developer bumping a version number;
|
|
44
|
+
3. sets every login password again when the DataSource password was rotated;
|
|
45
|
+
4. applies pending changes.
|
|
46
|
+
|
|
47
|
+
Otherwise it sends nothing.
|
|
48
|
+
|
|
49
|
+
### The daily check
|
|
50
|
+
|
|
51
|
+
- The `check-security` Job of the API workflow (`jobs/check_security.py`, exactly
|
|
52
|
+
`metatables runtime check-security`) runs daily at 03:00 UTC. It is not a workflow
|
|
53
|
+
step; every push activates its image.
|
|
54
|
+
- It holds the bootstrap lock, so it waits for a running migration. It skips while the
|
|
55
|
+
database still awaits its image's system migrations, so a run that lands mid-rollout
|
|
56
|
+
never checks one release's catalog with another's rules. Any other state that is not
|
|
57
|
+
ready fails the run.
|
|
58
|
+
- It repairs whatever differs from the plan: the owner role, routines, table policies,
|
|
59
|
+
roles, memberships and grants, and the passwords of logins that fail a fresh login
|
|
60
|
+
probe. The probe runs before the security-state lock is taken.
|
|
61
|
+
- It never pauses caller SQL. A failed check rolls back what it changed.
|
|
62
|
+
- System migration `0013_security_check` records the last check on the security state:
|
|
63
|
+
what started it (`schedule` or `admin`), its outcome (`running`, `passed`, `repaired`
|
|
64
|
+
or `failed`), its times, and the statements it sent or its error code.
|
|
65
|
+
`GET /security/database-permissions/` returns it as `last_check`.
|
|
66
|
+
|
|
67
|
+
### Run it now
|
|
68
|
+
|
|
69
|
+
`POST /security/checks/` (administrators only) replaces `POST /security/reconcile/`,
|
|
70
|
+
which paused caller SQL during the repair and had to finish within the 300 s request
|
|
71
|
+
timeout. Hosted starts the Job with `--trigger admin` and answers 202; the API's
|
|
72
|
+
workload may run that Job (`level: edit`), one run at a time. Local runs the check in
|
|
73
|
+
the request. The Admin's Database permissions panel has **Run security check now** and
|
|
74
|
+
shows the last check.
|
|
75
|
+
|
|
76
|
+
### Access rule changes
|
|
77
|
+
|
|
78
|
+
A release that changes how MetaTables computes access reaches the database at the next
|
|
79
|
+
daily check, or right away when an administrator runs it after deploying. Access rules
|
|
80
|
+
are the plan (`plan()`), the table policy checks, the grant and revoke statements,
|
|
81
|
+
routine securing and the owner role. Pull requests that change them carry the
|
|
82
|
+
`access-rules` label, and release notes list them under "Access rule changes: run the
|
|
83
|
+
security check after deploying". A version constant in the code was rejected: when
|
|
84
|
+
someone forgets to bump it, the deployment skips the check silently.
|
|
85
|
+
|
|
86
|
+
## Consequences
|
|
87
|
+
|
|
88
|
+
- An unchanged deployment's security step reads the security state and the owner role
|
|
89
|
+
and sends nothing. It no longer grows with tables or users.
|
|
90
|
+
- Grants changed outside MetaTables are repaired within a day, whatever the release
|
|
91
|
+
cadence.
|
|
92
|
+
- Drift the check cannot repair fails the daily Job, not a release.
|
|
93
|
+
- The daily check still makes caller SQL wait while it holds the lock, once a day at
|
|
94
|
+
03:00 UTC. If that wait matters, the check can compute the differences before taking
|
|
95
|
+
the lock.
|
|
96
|
+
- Application migrations are unchanged: finalization checks only the tables it
|
|
97
|
+
finalizes (ADR 0013). A finalization waits for the daily check only if both run at
|
|
98
|
+
the same time.
|
|
99
|
+
|
|
100
|
+
## Verification
|
|
101
|
+
|
|
102
|
+
- `tests/permissions/test_deployment_security.py`: an unchanged deployment reads and
|
|
103
|
+
writes nothing; first setup and new system migration heads run the full check once;
|
|
104
|
+
a rotated password sets only passwords; pending changes apply; outside drift waits
|
|
105
|
+
for the check; the check probes logins before the lock and counts its repairs.
|
|
106
|
+
- `tests/permissions/test_security_check.py`: the recorded outcome, the Job's lock and
|
|
107
|
+
skip, and starting the Job or refusing to.
|
|
108
|
+
- `tests/auth/test_runtime_storage_binding.py`: Local runs the check in the request; a
|
|
109
|
+
failure is recorded and never pauses SQL.
|
|
@@ -40,6 +40,7 @@ decisions belong in the SDK repository and are linked as dependencies.
|
|
|
40
40
|
| [0017: Hosted caller identity through the SDK request identity](api/0017-hosted-request-identity.md) | Accepted; implemented for 0.1.21; hosted rollout verification pending | The hosted API installs the SDK request identity that the platform launcher requires; the SDK verifies each caller assertion once and admission reads `User.get_logged_user()`, including the caller's signed Teams and admin flag. Local keeps its loopback token admission. |
|
|
41
41
|
| [0018: Table search by meaning and columns](api/0018-table-search.md) | Accepted; implemented; container engine verification pending | One route ranks visible tables by BM25 keywords and a local English embedding model over a per-table document that includes columns, merges the rankings and returns `matched_columns`; the index refreshes on every metadata write. |
|
|
42
42
|
| [0022: Concurrent requests per pod and reused database connections](api/0022-concurrent-requests-and-connection-reuse.md) | Accepted; implemented on development; deployment and load verification pending | One number per pod sizes its threads, data-request admission, catalog pool and login-role connections; connections are reused only by the role that opened them, and maximum pods × 3T stays within the database's connection limit. |
|
|
43
|
+
| [0023: A daily security check instead of a sweep in every deployment](api/0023-daily-security-check.md) | Accepted; implemented on development; deployment and first scheduled run pending | A deployment sets up only what the new release needs; a daily Job, which administrators can also start, repairs whatever differs from the plan without pausing caller SQL and records its outcome. |
|
|
43
44
|
|
|
44
45
|
## Agents
|
|
45
46
|
|
|
@@ -7709,6 +7709,26 @@
|
|
|
7709
7709
|
]
|
|
7710
7710
|
}
|
|
7711
7711
|
},
|
|
7712
|
+
"/security/checks/": {
|
|
7713
|
+
"post": {
|
|
7714
|
+
"description": "Run the full security check now; caller SQL keeps running (ADR 0023).\n\nHosted starts the daily check Job and answers 202; its outcome appears in the\npermission state when it finishes. Local runs the check in this request.",
|
|
7715
|
+
"operationId": "run_security_check_now_security_checks__post",
|
|
7716
|
+
"responses": {
|
|
7717
|
+
"200": {
|
|
7718
|
+
"content": {
|
|
7719
|
+
"application/json": {
|
|
7720
|
+
"schema": {}
|
|
7721
|
+
}
|
|
7722
|
+
},
|
|
7723
|
+
"description": "Successful Response"
|
|
7724
|
+
}
|
|
7725
|
+
},
|
|
7726
|
+
"summary": "Run Security Check Now",
|
|
7727
|
+
"tags": [
|
|
7728
|
+
"Security"
|
|
7729
|
+
]
|
|
7730
|
+
}
|
|
7731
|
+
},
|
|
7712
7732
|
"/security/database-permissions/": {
|
|
7713
7733
|
"get": {
|
|
7714
7734
|
"description": "Read durable permission/admission state without resolving Secrets or repairing grants.",
|
|
@@ -7811,26 +7831,6 @@
|
|
|
7811
7831
|
]
|
|
7812
7832
|
}
|
|
7813
7833
|
},
|
|
7814
|
-
"/security/reconcile/": {
|
|
7815
|
-
"post": {
|
|
7816
|
-
"description": "Repair native grants; a failed repair leaves SQL admission disabled.",
|
|
7817
|
-
"operationId": "reconcile_database_permissions_security_reconcile__post",
|
|
7818
|
-
"responses": {
|
|
7819
|
-
"200": {
|
|
7820
|
-
"content": {
|
|
7821
|
-
"application/json": {
|
|
7822
|
-
"schema": {}
|
|
7823
|
-
}
|
|
7824
|
-
},
|
|
7825
|
-
"description": "Successful Response"
|
|
7826
|
-
}
|
|
7827
|
-
},
|
|
7828
|
-
"summary": "Reconcile Database Permissions",
|
|
7829
|
-
"tags": [
|
|
7830
|
-
"Security"
|
|
7831
|
-
]
|
|
7832
|
-
}
|
|
7833
|
-
},
|
|
7834
7834
|
"/security/resources/": {
|
|
7835
7835
|
"get": {
|
|
7836
7836
|
"operationId": "security_resources_security_resources__get",
|
|
@@ -63,10 +63,10 @@ These methods and paths are mounted by the current application. See the [OpenAPI
|
|
|
63
63
|
| GET | `/runtime-context/` | Runtime Context | 200 |
|
|
64
64
|
| POST | `/runtime-migrations/{lease_uid}/release/` | Release Migration | 200 |
|
|
65
65
|
| GET | `/security/access-history/` | Security History | 200 |
|
|
66
|
+
| POST | `/security/checks/` | Run Security Check Now | 200 |
|
|
66
67
|
| GET | `/security/database-permissions/` | Database Permission Status | 200 |
|
|
67
68
|
| POST | `/security/namespaces/` | Create Namespace | 201 |
|
|
68
69
|
| GET | `/security/principals/` | Principal Search | 200 |
|
|
69
|
-
| POST | `/security/reconcile/` | Reconcile Database Permissions | 200 |
|
|
70
70
|
| GET | `/security/resources/` | Security Resources | 200 |
|
|
71
71
|
| GET | `/table-update-runs/` | List Runs | 200 |
|
|
72
72
|
| POST | `/table-update-runs/` | Create Update Run | 201 |
|
{mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/releasing.md
RENAMED
|
@@ -31,6 +31,16 @@ Development releases are selected explicitly:
|
|
|
31
31
|
python -m pip install --pre mainsequence-metatable
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
+
## Access rule changes
|
|
35
|
+
|
|
36
|
+
A deployment does not apply a change to how MetaTables computes access; the daily
|
|
37
|
+
security check, or an administrator running it, does
|
|
38
|
+
([ADR 0023](../adr/api/0023-daily-security-check.md)). Access rules are `plan()`, the
|
|
39
|
+
table policy checks, the grant and revoke statements, routine securing and the owner
|
|
40
|
+
role in `src/metatables/api/backend/backends/`. Label a pull request that changes them
|
|
41
|
+
`access-rules`. `.github/release.yml` lists such pull requests under "Access rule
|
|
42
|
+
changes: run the security check after deploying" in the generated release notes.
|
|
43
|
+
|
|
34
44
|
## Release prerequisites
|
|
35
45
|
|
|
36
46
|
MetaTables and the Main Sequence SDK use the MIT License. Package metadata
|
|
@@ -144,8 +144,10 @@ the platform grants it on push. It:
|
|
|
144
144
|
database or ownership of the `metatables` schema, and `CREATE` on the default schema;
|
|
145
145
|
2. applies the system migrations;
|
|
146
146
|
3. registers the runtime DataSource, or updates its connection if the declaration changed;
|
|
147
|
-
4.
|
|
148
|
-
|
|
147
|
+
4. sets up database access as far as the new release needs: the owner role, login
|
|
148
|
+
passwords again after a rotation (per-User role passwords derive from the login
|
|
149
|
+
password), and pending changes. It runs the full security check only on first setup
|
|
150
|
+
or after system migrations; the daily security check covers the rest.
|
|
149
151
|
|
|
150
152
|
Any failure blocks the rollout. The Job prints `status` (`initialized`, `upgraded`
|
|
151
153
|
or `up_to_date`), `previous_revisions`, `revisions` and `data_source_uid`. A new
|
|
@@ -157,6 +159,25 @@ database server's SQLSTATE and message when the server answered. The
|
|
|
157
159
|
log, with passwords, tokens and connection-string credentials redacted. Settings
|
|
158
160
|
and API errors never carry driver text, which can include hosts and connection strings.
|
|
159
161
|
|
|
162
|
+
## Daily security check
|
|
163
|
+
|
|
164
|
+
The `check-security` Job (`jobs/check_security.py`, exactly
|
|
165
|
+
`metatables runtime check-security`) runs daily at 03:00 UTC
|
|
166
|
+
([ADR 0023](../adr/api/0023-daily-security-check.md)). It reads `configuration.yaml`
|
|
167
|
+
and the Secret like the migration Job, waits for a running migration, and skips while
|
|
168
|
+
the database still awaits its image's system migrations. It compares everything
|
|
169
|
+
MetaTables secures with the catalog's grants, repairs what differs, and records the
|
|
170
|
+
outcome, which the Admin's Database permissions panel shows. Caller SQL keeps running.
|
|
171
|
+
A failed check fails the Job run, changes nothing, and is recorded with its error code.
|
|
172
|
+
|
|
173
|
+
Run it from the Admin with **Run security check now**:
|
|
174
|
+
|
|
175
|
+
- after deploying a release whose notes list access rule changes;
|
|
176
|
+
- after changing grants, owners or roles directly in the database.
|
|
177
|
+
|
|
178
|
+
The API starts the Job (its workload has `edit` on `check-security`); a second request
|
|
179
|
+
while a run is pending or running is refused.
|
|
180
|
+
|
|
160
181
|
## API pods and Settings
|
|
161
182
|
|
|
162
183
|
API pods read the same declaration and Secret at startup and never run DDL. They
|
|
@@ -17,6 +17,16 @@ per-table finalization result, physical schema, provider identity, and registry
|
|
|
17
17
|
state. Reuse only a compatible registry resolved by physical identity. Preserve
|
|
18
18
|
Alembic's applied history; write new revisions for further changes.
|
|
19
19
|
|
|
20
|
+
## Failed security check
|
|
21
|
+
|
|
22
|
+
The daily security check ([ADR 0023](../adr/api/0023-daily-security-check.md)) records
|
|
23
|
+
a failure on the Admin's Database permissions panel with an error code, and its Job run
|
|
24
|
+
fails. Nothing it changed is kept, and caller SQL keeps running with the grants it
|
|
25
|
+
found. Read the `check-security` Job run log for the cause, fix it in the database, then
|
|
26
|
+
**Run security check now**. `sql_principal_permission_drift` means a MetaTables role
|
|
27
|
+
owns an object or holds an elevated attribute; reassign that object or remove the
|
|
28
|
+
attribute, because the check never does it.
|
|
29
|
+
|
|
20
30
|
## Deletion
|
|
21
31
|
|
|
22
32
|
Ordinary delete requires edit access and respects table and inbound
|
{mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/reference/capabilities.md
RENAMED
|
@@ -310,4 +310,5 @@ This inventory records the support status of public resource methods and CLI com
|
|
|
310
310
|
| `runtime status` | tested | visible | Read bootstrap and effective runtime state before or after initialization. |
|
|
311
311
|
| `runtime initialize` | tested | visible | Explicit Local API system migrations under current admin admission; Hosted answers 409 (the deployment migrates). |
|
|
312
312
|
| `runtime upgrade` | tested | visible | Deployment gate: verify, migrate and register the runtime database declared in configuration.yaml and its Environment Secret. |
|
|
313
|
+
| `runtime check-security` | tested | visible | The daily security check Job (ADR 0023): compare everything MetaTables secures with the plan, repair what differs and record the outcome; the Admin starts it with --trigger admin. |
|
|
313
314
|
| `admin repair` | tested | visible | Explicitly stage pinned source/dependencies; refuse replacement while in use. |
|
|
@@ -26,6 +26,7 @@ The list below contains visible leaf commands. Hidden aliases and unavailable co
|
|
|
26
26
|
| `metatables migrations revision` | --message/-m, --autogenerate, --provider, --rev-id, --head, --timeout, --ttl-seconds, --sqlalchemy-url, --json | Create a normal Alembic revision for the selected provider. |
|
|
27
27
|
| `metatables migrations scaffold` | --package, --namespace, --metadata, --module, --code-repository-root, --source-root, --base, --models, --alembic-version-name, --alembic-version-identifier, --alembic-version-schema, --alembic-version-table-name, --force, --json | Create a MetaTables migration package skeleton. |
|
|
28
28
|
| `metatables migrations upgrade` | target_revision, --provider, --timeout, --ttl-seconds, --json | Run the application's Alembic upgrade and finalize its catalog tables. |
|
|
29
|
+
| `metatables runtime check-security` | --trigger | Run the full database security check on the runtime database this deployment declares. |
|
|
29
30
|
| `metatables runtime initialize` | | Explicitly apply a Local API's system migrations; hosted deployments migrate their declared database. |
|
|
30
31
|
| `metatables runtime status` | | Read bootstrap state and effective runtime, including before initialization. |
|
|
31
32
|
| `metatables runtime upgrade` | | Verify, migrate and register the runtime database this deployment declares, before a rollout. |
|
{mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/security/index.md
RENAMED
|
@@ -148,15 +148,25 @@ grants. MySQL records durable pending work because its permission statements com
|
|
|
148
148
|
independently; it admits queries only after reconciliation succeeds.
|
|
149
149
|
|
|
150
150
|
The Admin Security page reads `GET /security/database-permissions/` to show caller
|
|
151
|
-
SQL admission, pending synchronization,
|
|
151
|
+
SQL admission, pending synchronization, policy coverage for active tables, and the
|
|
152
|
+
last security check.
|
|
152
153
|
This admin-only read does not repair permissions or resolve credential Secrets.
|
|
153
154
|
It reports durable catalog state; it does not audit native grants changed outside
|
|
154
155
|
MetaTables. SQLite uses a connection authorizer rather than database roles.
|
|
155
156
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
157
|
+
A security check compares everything MetaTables secures in the database with the
|
|
158
|
+
catalog's grants and repairs what differs, including grants changed directly in the
|
|
159
|
+
database. It runs daily at 03:00 UTC as the `check-security` Job of a hosted API's
|
|
160
|
+
workflow ([ADR 0023](../adr/api/0023-daily-security-check.md)). **Run security check
|
|
161
|
+
now** on the Admin Security page runs it at any time; the admin-only endpoint is
|
|
162
|
+
`POST /security/checks/`. Hosted starts the Job, Local runs the check in the request.
|
|
163
|
+
Queries keep running during a check, and a failed check changes nothing. The page
|
|
164
|
+
shows the last check: what started it, when, and whether it passed, repaired
|
|
165
|
+
something or failed with an error code.
|
|
166
|
+
|
|
167
|
+
Grants changed outside MetaTables are repaired within a day. A release that changes
|
|
168
|
+
how MetaTables computes access reaches the database at the next check; its release
|
|
169
|
+
notes say to run the check after deploying.
|
|
160
170
|
Client migration finalization refreshes the affected catalog contracts and SQL policies. Grant editing never requires a platform authentication change.
|
|
161
171
|
|
|
162
172
|
The API cancels work at its deadline and bounds fetched rows. PostgreSQL, MySQL
|
{mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/security/permissions.md
RENAMED
|
@@ -16,6 +16,7 @@ Organization admin status comes from the platform through the SDK.
|
|
|
16
16
|
| Configure, validate, disable, or remove DataSources | No | Yes |
|
|
17
17
|
| Select the runtime DataSource where supported | No | Yes |
|
|
18
18
|
| Initialize or upgrade MetaTables system tables in Local Settings (Hosted: the deployment's migration Job) | No | Yes |
|
|
19
|
+
| Run the database security check now (Hosted: it also runs daily) | No | Yes |
|
|
19
20
|
| Destroy a local runtime database through Settings | No | Yes |
|
|
20
21
|
| Change application-wide Settings and security policies | No | Yes |
|
|
21
22
|
| Manage grants across the application and recover orphaned tables | No | Yes |
|
|
@@ -86,6 +86,7 @@ nav:
|
|
|
86
86
|
- "0017: Hosted request identity": adr/api/0017-hosted-request-identity.md
|
|
87
87
|
- "0018: Table search": adr/api/0018-table-search.md
|
|
88
88
|
- "0022: Concurrent requests and connection reuse": adr/api/0022-concurrent-requests-and-connection-reuse.md
|
|
89
|
+
- "0023: Daily security check": adr/api/0023-daily-security-check.md
|
|
89
90
|
- Agents:
|
|
90
91
|
- "0019: MetaTables Analyst agent": adr/agent/0019-metatables-analyst-agent.md
|
|
91
92
|
- "0020: The Analyst reads as its requester": adr/agent/0020-analyst-reads-as-its-requester.md
|
|
@@ -46,6 +46,7 @@ docs/adr/api/0017-hosted-request-identity.md
|
|
|
46
46
|
docs/adr/api/0018-search-document-pipeline.svg
|
|
47
47
|
docs/adr/api/0018-table-search.md
|
|
48
48
|
docs/adr/api/0022-concurrent-requests-and-connection-reuse.md
|
|
49
|
+
docs/adr/api/0023-daily-security-check.md
|
|
49
50
|
docs/adr/client/0003-api-endpoint-resolution.md
|
|
50
51
|
docs/adr/client/0011-cli-local-development-with-managed-admin.md
|
|
51
52
|
docs/api/authentication-and-errors.md
|
|
@@ -312,6 +313,7 @@ src/metatables/api/backend/integrations/platform_principals.py
|
|
|
312
313
|
src/metatables/api/backend/integrations/run_logs.py
|
|
313
314
|
src/metatables/api/backend/integrations/runtime_binding.py
|
|
314
315
|
src/metatables/api/backend/integrations/runtime_data_sources.py
|
|
316
|
+
src/metatables/api/backend/integrations/security_check_job.py
|
|
315
317
|
src/metatables/api/backend/integrations/source_validation.py
|
|
316
318
|
src/metatables/api/backend/migrations/__init__.py
|
|
317
319
|
src/metatables/api/backend/migrations/env.py
|
|
@@ -328,6 +330,7 @@ src/metatables/api/backend/migrations/versions/0009_timescale_policies.py
|
|
|
328
330
|
src/metatables/api/backend/migrations/versions/0010_cascade_targets.py
|
|
329
331
|
src/metatables/api/backend/migrations/versions/0011_table_search.py
|
|
330
332
|
src/metatables/api/backend/migrations/versions/0012_table_creator.py
|
|
333
|
+
src/metatables/api/backend/migrations/versions/0013_security_check.py
|
|
331
334
|
src/metatables/api/backend/migrations/versions/__init__.py
|
|
332
335
|
src/metatables/api/backend/operations/__init__.py
|
|
333
336
|
src/metatables/api/backend/operations/bootstrap_migrations.py
|
|
@@ -339,6 +342,7 @@ src/metatables/api/backend/operations/import_relations.py
|
|
|
339
342
|
src/metatables/api/backend/operations/introspect_table.py
|
|
340
343
|
src/metatables/api/backend/operations/read_time_index.py
|
|
341
344
|
src/metatables/api/backend/operations/register_catalog.py
|
|
345
|
+
src/metatables/api/backend/operations/security_check.py
|
|
342
346
|
src/metatables/api/backend/persistence/__init__.py
|
|
343
347
|
src/metatables/api/backend/persistence/cascade.py
|
|
344
348
|
src/metatables/api/backend/persistence/catalog.py
|
|
@@ -583,6 +587,7 @@ tests/permissions/test_local_actor_membership.py
|
|
|
583
587
|
tests/permissions/test_migration_boundary.py
|
|
584
588
|
tests/permissions/test_namespace_grants.py
|
|
585
589
|
tests/permissions/test_security_api.py
|
|
590
|
+
tests/permissions/test_security_check.py
|
|
586
591
|
tests/permissions/test_table_body_filter.py
|
|
587
592
|
tests/permissions/test_table_grants.py
|
|
588
593
|
tests/permissions/test_table_queries.py
|
|
@@ -445,7 +445,8 @@ class RuntimeBootstrap:
|
|
|
445
445
|
from metatables.api.backend.backends.registry import backend_for
|
|
446
446
|
session.flush()
|
|
447
447
|
with bootstrap_phase("security_reconciliation"):
|
|
448
|
-
backend_for(replace(self.backend.source, uid=row.uid)).access.initialize(
|
|
448
|
+
backend_for(replace(self.backend.source, uid=row.uid)).access.initialize(
|
|
449
|
+
session, revisions=self.expected)
|
|
449
450
|
with bootstrap_phase("credential_store"):
|
|
450
451
|
credentials = bind_store(self.credential_store, session, user_uid)
|
|
451
452
|
if hasattr(credentials, "initialize"):
|
|
@@ -584,8 +585,9 @@ def deploy_runtime_database(user_uid):
|
|
|
584
585
|
"""The deployment gate: verify, migrate and register the declared runtime database.
|
|
585
586
|
|
|
586
587
|
The workflow's migration Job runs this from the candidate image before the
|
|
587
|
-
API rolls out, every time; any failure blocks the rollout.
|
|
588
|
-
|
|
588
|
+
API rolls out, every time; any failure blocks the rollout. It sets up access
|
|
589
|
+
only as far as the new release needs (a rotated password, pending changes, a
|
|
590
|
+
full check after system migrations); outside drift is the daily check's.
|
|
589
591
|
"""
|
|
590
592
|
from metatables.api.app.configuration import DEPLOYMENT_CONFIGURATION
|
|
591
593
|
from metatables.api.app.runtime import RuntimeConfig
|
|
@@ -605,6 +607,41 @@ def deploy_runtime_database(user_uid):
|
|
|
605
607
|
target.close()
|
|
606
608
|
|
|
607
609
|
|
|
610
|
+
def check_runtime_security(trigger="schedule"):
|
|
611
|
+
"""The daily security check Job, which the Admin can also start (ADR 0023).
|
|
612
|
+
|
|
613
|
+
It holds the bootstrap lock, so it waits for a running migration, and skips
|
|
614
|
+
while the declared database still awaits this image's migrations: a run that
|
|
615
|
+
lands mid-rollout never checks one release's catalog with another's rules.
|
|
616
|
+
Any other state that is not ready fails the run.
|
|
617
|
+
"""
|
|
618
|
+
from metatables.api.app.configuration import DEPLOYMENT_CONFIGURATION
|
|
619
|
+
from metatables.api.app.runtime import RuntimeConfig
|
|
620
|
+
from metatables.api.backend.backends.registry import backend_for
|
|
621
|
+
from metatables.api.backend.operations.security_check import run_security_check
|
|
622
|
+
target = RuntimeBootstrap(RuntimeConfig(local_mode=False, configuration_path=DEPLOYMENT_CONFIGURATION), None)
|
|
623
|
+
try:
|
|
624
|
+
candidate = target.initial_candidate()
|
|
625
|
+
if candidate is None:
|
|
626
|
+
raise BootstrapError(target.error)
|
|
627
|
+
target.configure(candidate, None, validate_schema=False, inspect_database=False)
|
|
628
|
+
engine = target.open_engine()
|
|
629
|
+
if engine is None:
|
|
630
|
+
return dict(status="skipped", reason="migration_required")
|
|
631
|
+
with target.backend.catalog.bootstrap_lock(engine):
|
|
632
|
+
target.inspect(validate_schema=False)
|
|
633
|
+
if target.status == "migration_required":
|
|
634
|
+
return dict(status="skipped", reason="migration_required")
|
|
635
|
+
if target.status != "ready":
|
|
636
|
+
raise BootstrapError(target.error or f"The runtime database is {target.status}.")
|
|
637
|
+
access = backend_for(replace(target.backend.source, uid=target.uid)).access
|
|
638
|
+
with bootstrap_phase("security_check"), target.factory() as session:
|
|
639
|
+
record = run_security_check(session, access, trigger=trigger, revisions=target.current)
|
|
640
|
+
return dict(status=record["outcome"], statements=record["statements"], revisions=sorted(target.current))
|
|
641
|
+
finally:
|
|
642
|
+
target.close()
|
|
643
|
+
|
|
644
|
+
|
|
608
645
|
router = APIRouter(prefix="/runtime-bootstrap", tags=["Runtime bootstrap"])
|
|
609
646
|
|
|
610
647
|
|