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.
Files changed (598) hide show
  1. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.mainsequence/workflows/metatables-api.yaml +27 -0
  2. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/PKG-INFO +1 -1
  3. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0007-database-enforced-table-access.md +20 -0
  4. {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
  5. mainsequence_metatable-0.1.36/docs/adr/api/0023-daily-security-check.md +109 -0
  6. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/index.md +1 -0
  7. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/openapi.json +20 -20
  8. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/reference.md +1 -1
  9. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/releasing.md +10 -0
  10. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/hosted-runtime.md +23 -2
  11. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/recovery-and-observability.md +10 -0
  12. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/reference/capabilities.md +1 -0
  13. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/reference/cli.md +1 -0
  14. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/security/index.md +15 -5
  15. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/security/permissions.md +1 -0
  16. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/mkdocs.yml +1 -0
  17. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/pyproject.toml +1 -1
  18. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/PKG-INFO +1 -1
  19. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/SOURCES.txt +5 -0
  20. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/bootstrap.py +40 -3
  21. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/security.py +29 -19
  22. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/access.py +31 -10
  23. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/contracts.py +2 -1
  24. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/hosted_access.py +1 -1
  25. mainsequence_metatable-0.1.36/src/metatables/api/backend/backends/postgresql_access.py +675 -0
  26. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/sqlite_access.py +1 -1
  27. mainsequence_metatable-0.1.36/src/metatables/api/backend/integrations/security_check_job.py +39 -0
  28. mainsequence_metatable-0.1.36/src/metatables/api/backend/migrations/versions/0013_security_check.py +19 -0
  29. mainsequence_metatable-0.1.36/src/metatables/api/backend/operations/security_check.py +51 -0
  30. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/models.py +2 -0
  31. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/app.py +16 -0
  32. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_data_source_identity.py +2 -2
  33. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_bootstrap.py +8 -8
  34. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_storage_binding.py +21 -9
  35. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_migration.py +2 -2
  36. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/capabilities.json +11 -0
  37. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_catalog_contract.py +1 -1
  38. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_sql_security.py +32 -15
  39. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_runtime_upgrade.py +7 -5
  40. mainsequence_metatable-0.1.36/tests/permissions/test_deployment_security.py +402 -0
  41. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_incremental_security.py +118 -12
  42. mainsequence_metatable-0.1.36/tests/permissions/test_security_check.py +246 -0
  43. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/uv.lock +1 -1
  44. mainsequence_metatable-0.1.35.dev65/src/metatables/api/backend/backends/postgresql_access.py +0 -564
  45. mainsequence_metatable-0.1.35.dev65/tests/permissions/test_deployment_security.py +0 -304
  46. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
  47. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
  48. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
  49. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
  50. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
  51. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
  52. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/discover-tables/SKILL.md +0 -0
  53. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
  54. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
  55. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
  56. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
  57. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
  58. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
  59. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/LICENSE +0 -0
  60. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/MANIFEST.in +0 -0
  61. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/README.md +0 -0
  62. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/alembic.ini +0 -0
  63. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/api/metatables/main.py +0 -0
  64. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/compose.database-tests.yml +0 -0
  65. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
  66. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
  67. {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
  68. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
  69. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
  70. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0004-approved-application-migrations.md +0 -0
  71. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
  72. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0006-historical-run-graphs.md +0 -0
  73. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
  74. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
  75. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
  76. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0009-shared-credential-store.md +0 -0
  77. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
  78. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
  79. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0013-application-owned-migrations.md +0 -0
  80. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
  81. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0016-impact-preflight.md +0 -0
  82. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0017-hosted-request-identity.md +0 -0
  83. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
  84. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0018-table-search.md +0 -0
  85. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
  86. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
  87. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
  88. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/authentication-and-errors.md +0 -0
  89. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/data-sources.md +0 -0
  90. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/overview.md +0 -0
  91. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/tables-and-migrations.md +0 -0
  92. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/api/time-index-and-updates.md +0 -0
  93. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/assets/branding/metatables.svg +0 -0
  94. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/assets/diagrams/local-client-experience.svg +0 -0
  95. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/assets/diagrams/namespace-access.svg +0 -0
  96. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/bounded-transfers.md +0 -0
  97. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/build-an-updater.md +0 -0
  98. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/define-and-migrate-tables.md +0 -0
  99. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/deploy-application-migrations.md +0 -0
  100. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/installation-and-connection.md +0 -0
  101. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/local-storage.md +0 -0
  102. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/query-and-mutate.md +0 -0
  103. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/quickstart.md +0 -0
  104. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/read-existing-time-index-tables.md +0 -0
  105. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/register-existing-tables.md +0 -0
  106. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/tutorial.md +0 -0
  107. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/client/upgrade-legacy-app.md +0 -0
  108. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/architecture.md +0 -0
  109. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/data-sources.md +0 -0
  110. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/identity-and-scope.md +0 -0
  111. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/permissions-namespaces-labels.md +0 -0
  112. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/runs-and-execution-graphs.md +0 -0
  113. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
  114. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/concepts/time-index-tables-and-updates.md +0 -0
  115. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/architecture-and-boundaries.md +0 -0
  116. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/database-backends.md +0 -0
  117. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/documentation.md +0 -0
  118. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/contributing/testing.md +0 -0
  119. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/README.md +0 -0
  120. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/__init__.py +0 -0
  121. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/bounded_reader.py +0 -0
  122. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/README.md +0 -0
  123. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/mssql.json +0 -0
  124. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/mysql.json +0 -0
  125. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/postgresql.json +0 -0
  126. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/data_sources/register.py +0 -0
  127. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/external_table.py +0 -0
  128. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/README.md +0 -0
  129. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/__init__.py +0 -0
  130. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/__main__.py +0 -0
  131. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/migrations/__init__.py +0 -0
  132. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/migrations/env.py +0 -0
  133. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/migrations/script.py.mako +0 -0
  134. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  135. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/local_app/tables.py +0 -0
  136. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/query.py +0 -0
  137. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/quickstart.py +0 -0
  138. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/reader.py +0 -0
  139. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/scripts/__init__.py +0 -0
  140. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/scripts/setup_metatables.py +0 -0
  141. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tables.py +0 -0
  142. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/README.md +0 -0
  143. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/__init__.py +0 -0
  144. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/__main__.py +0 -0
  145. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/data/README.md +0 -0
  146. {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
  147. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/frames.py +0 -0
  148. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/__init__.py +0 -0
  149. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/env.py +0 -0
  150. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/registry.py +0 -0
  151. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/script.py.mako +0 -0
  152. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
  153. {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
  154. {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
  155. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  156. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/operations.py +0 -0
  157. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/tables.py +0 -0
  158. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/tutorial/updaters.py +0 -0
  159. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/examples/updater.py +0 -0
  160. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/index.md +0 -0
  161. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/catalog-migrations.md +0 -0
  162. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/configuration.md +0 -0
  163. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/local-runtime.md +0 -0
  164. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/run-history.md +0 -0
  165. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/operations/run-logs.md +0 -0
  166. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/reference/python.md +0 -0
  167. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/docs/security/ownership-and-sharing.md +0 -0
  168. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/__init__.py +0 -0
  169. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/build_reference.py +0 -0
  170. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_boundaries.py +0 -0
  171. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_client_api_coverage.py +0 -0
  172. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_distribution_sources.py +0 -0
  173. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_docs.py +0 -0
  174. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_examples_debug.py +0 -0
  175. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/check_project.py +0 -0
  176. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/dev_release_version.py +0 -0
  177. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/test_databases.py +0 -0
  178. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/scripts/test_postgresql.py +0 -0
  179. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/setup.cfg +0 -0
  180. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
  181. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
  182. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
  183. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
  184. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/__init__.py +0 -0
  185. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/_admin_source.json +0 -0
  186. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/_build.py +0 -0
  187. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/_skill_bundle.py +0 -0
  188. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/analysis.py +0 -0
  189. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/analyst/__init__.py +0 -0
  190. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/__init__.py +0 -0
  191. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/__init__.py +0 -0
  192. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/auth/__init__.py +0 -0
  193. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/auth/boundary.py +0 -0
  194. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/auth/local_actor.py +0 -0
  195. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/configuration.py +0 -0
  196. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/connection_count.py +0 -0
  197. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/credential_admin.py +0 -0
  198. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/development.py +0 -0
  199. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/development_client.py +0 -0
  200. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/error_logging.py +0 -0
  201. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/main.py +0 -0
  202. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/mcp.py +0 -0
  203. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/platform_cache.py +0 -0
  204. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/__init__.py +0 -0
  205. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/access_map.py +0 -0
  206. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/caller.py +0 -0
  207. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/column_search.py +0 -0
  208. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/contract_validation.py +0 -0
  209. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/data_sources.py +0 -0
  210. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/managed_finalize.py +0 -0
  211. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/migration_connection.py +0 -0
  212. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/namespaces.py +0 -0
  213. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/run_logs.py +0 -0
  214. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/runtime_context.py +0 -0
  215. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/schema_graph.py +0 -0
  216. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_cascade.py +0 -0
  217. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_crud.py +0 -0
  218. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_delete.py +0 -0
  219. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_filter.py +0 -0
  220. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_import.py +0 -0
  221. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_introspection.py +0 -0
  222. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_patch.py +0 -0
  223. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_registration.py +0 -0
  224. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_response.py +0 -0
  225. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_search.py +0 -0
  226. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_search_document.py +0 -0
  227. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_sql.py +0 -0
  228. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
  229. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/time_index_delete.py +0 -0
  230. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/time_index_reads.py +0 -0
  231. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/time_index_stats.py +0 -0
  232. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/timescale_policies.py +0 -0
  233. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_batch.py +0 -0
  234. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
  235. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_constants.py +0 -0
  236. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_crud.py +0 -0
  237. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_details.py +0 -0
  238. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_graph.py +0 -0
  239. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
  240. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_registration.py +0 -0
  241. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_runs.py +0 -0
  242. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/routes/update_statistics.py +0 -0
  243. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/runtime.py +0 -0
  244. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/runtime_control.py +0 -0
  245. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/runtime_database.py +0 -0
  246. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/source_passwords.py +0 -0
  247. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/app/transfer.py +0 -0
  248. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/__init__.py +0 -0
  249. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/__init__.py +0 -0
  250. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
  251. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
  252. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
  253. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
  254. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
  255. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
  256. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
  257. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
  258. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
  259. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
  260. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
  261. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
  262. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
  263. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
  264. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
  265. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
  266. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
  267. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
  268. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
  269. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
  270. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
  271. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/batch_inspection.py +0 -0
  272. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/catalog.py +0 -0
  273. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
  274. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/catalog_types.py +0 -0
  275. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/connection_pool.py +0 -0
  276. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/hosted.py +0 -0
  277. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/migration_connection.py +0 -0
  278. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/native.py +0 -0
  279. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/operations.py +0 -0
  280. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/pages.py +0 -0
  281. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/registry.py +0 -0
  282. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/relation_tables.py +0 -0
  283. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/relational.py +0 -0
  284. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
  285. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/streaming.py +0 -0
  286. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/backends/timescale.py +0 -0
  287. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/__init__.py +0 -0
  288. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/relation_import.py +0 -0
  289. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
  290. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
  291. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/contracts/values.py +0 -0
  292. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/__init__.py +0 -0
  293. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
  294. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
  295. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/index_statistics.py +0 -0
  296. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/label_rules.py +0 -0
  297. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/permission_rules.py +0 -0
  298. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/domain/update_constants.py +0 -0
  299. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/__init__.py +0 -0
  300. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
  301. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
  302. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/credential_store.py +0 -0
  303. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
  304. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
  305. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
  306. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
  307. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/run_logs.py +0 -0
  308. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
  309. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
  310. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/integrations/source_validation.py +0 -0
  311. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/__init__.py +0 -0
  312. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/env.py +0 -0
  313. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/script.py.mako +0 -0
  314. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
  315. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
  316. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
  317. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
  318. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
  319. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
  320. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
  321. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
  322. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
  323. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
  324. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
  325. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
  326. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
  327. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/__init__.py +0 -0
  328. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
  329. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/bootstrap_timing.py +0 -0
  330. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
  331. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/create_table.py +0 -0
  332. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
  333. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/import_relations.py +0 -0
  334. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/introspect_table.py +0 -0
  335. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/read_time_index.py +0 -0
  336. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/operations/register_catalog.py +0 -0
  337. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/__init__.py +0 -0
  338. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/cascade.py +0 -0
  339. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/catalog.py +0 -0
  340. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/database.py +0 -0
  341. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/grants.py +0 -0
  342. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/impact.py +0 -0
  343. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/labels.py +0 -0
  344. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/locking.py +0 -0
  345. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
  346. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/projections.py +0 -0
  347. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
  348. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
  349. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
  350. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
  351. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/table_queries.py +0 -0
  352. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/table_response.py +0 -0
  353. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/update_graph.py +0 -0
  354. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
  355. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/updates.py +0 -0
  356. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
  357. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
  358. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/__init__.py +0 -0
  359. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/documents.py +0 -0
  360. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/embeddings.py +0 -0
  361. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/index.py +0 -0
  362. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/ranking.py +0 -0
  363. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/text.py +0 -0
  364. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/backend/search/worker.py +0 -0
  365. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/metatables/__init__.py +0 -0
  366. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/metatables/configuration.yaml +0 -0
  367. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/metatables/main.py +0 -0
  368. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/api/request_timing.py +0 -0
  369. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/__init__.py +0 -0
  370. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/admin_install.py +0 -0
  371. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/filters.py +0 -0
  372. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/local.py +0 -0
  373. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/migrations.py +0 -0
  374. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/project.py +0 -0
  375. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/cli/skills.py +0 -0
  376. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/compiled_sql/__init__.py +0 -0
  377. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/compiled_sql/mssql.py +0 -0
  378. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/compiled_sql/v1.py +0 -0
  379. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/dtype_codec.py +0 -0
  380. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/endpoint.py +0 -0
  381. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/README.md +0 -0
  382. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/__init__.py +0 -0
  383. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/bounded_reader.py +0 -0
  384. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/README.md +0 -0
  385. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/mssql.json +0 -0
  386. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/mysql.json +0 -0
  387. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/postgresql.json +0 -0
  388. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/data_sources/register.py +0 -0
  389. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/external_table.py +0 -0
  390. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/README.md +0 -0
  391. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/__init__.py +0 -0
  392. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/__main__.py +0 -0
  393. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
  394. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/migrations/env.py +0 -0
  395. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
  396. {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
  397. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/local_app/tables.py +0 -0
  398. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/query.py +0 -0
  399. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/quickstart.py +0 -0
  400. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/reader.py +0 -0
  401. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/scripts/__init__.py +0 -0
  402. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/scripts/setup_metatables.py +0 -0
  403. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tables.py +0 -0
  404. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/README.md +0 -0
  405. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/__init__.py +0 -0
  406. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/__main__.py +0 -0
  407. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/data/README.md +0 -0
  408. {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
  409. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/frames.py +0 -0
  410. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
  411. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/env.py +0 -0
  412. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
  413. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
  414. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
  415. {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
  416. {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
  417. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  418. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/operations.py +0 -0
  419. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/tables.py +0 -0
  420. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/tutorial/updaters.py +0 -0
  421. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/examples/updater.py +0 -0
  422. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/future_registry.py +0 -0
  423. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/hashing.py +0 -0
  424. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/instrumentation.py +0 -0
  425. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/local_connection.py +0 -0
  426. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/local_files.py +0 -0
  427. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/local_run_logs.py +0 -0
  428. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/log_contract.py +0 -0
  429. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/__init__.py +0 -0
  430. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/alembic.py +0 -0
  431. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/connection.py +0 -0
  432. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/env.py +0 -0
  433. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/provider.py +0 -0
  434. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/registry.py +0 -0
  435. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/runner.py +0 -0
  436. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/scaffold.py +0 -0
  437. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/sqlite.py +0 -0
  438. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/templates/__init__.py +0 -0
  439. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/templates/env.py.mako +0 -0
  440. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/templates/script.py.mako +0 -0
  441. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/migrations/tls.py +0 -0
  442. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/models.py +0 -0
  443. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/pydantic_metadata.py +0 -0
  444. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/run_logging.py +0 -0
  445. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/runtime.py +0 -0
  446. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/runtime_context.py +0 -0
  447. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/runtime_contract.py +0 -0
  448. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/schema_names.py +0 -0
  449. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/sdk_compat.py +0 -0
  450. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/sqlalchemy_contracts.py +0 -0
  451. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/storage_layout_contract.py +0 -0
  452. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/time_index_table_refs.py +0 -0
  453. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/transfer.py +0 -0
  454. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/transfer_contract.py +0 -0
  455. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/transport.py +0 -0
  456. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/update_configuration_contract.py +0 -0
  457. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/__init__.py +0 -0
  458. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/configuration.py +0 -0
  459. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/dependencies.py +0 -0
  460. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/managers.py +0 -0
  461. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/namespacing.py +0 -0
  462. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/runner.py +0 -0
  463. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/updaters.py +0 -0
  464. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/updaters/utils.py +0 -0
  465. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/src/metatables/upload.py +0 -0
  466. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/analyst/test_agent_surface.py +0 -0
  467. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/analyst/test_api_search.py +0 -0
  468. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/analyst/test_mcp.py +0 -0
  469. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/analyst/test_tools.py +0 -0
  470. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_bootstrap_failure_cause.py +0 -0
  471. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_caller_endpoint.py +0 -0
  472. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_development_client.py +0 -0
  473. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_hosted_agent.py +0 -0
  474. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_hosted_environment_target.py +0 -0
  475. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_local_mode.py +0 -0
  476. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_platform_fact_cache.py +0 -0
  477. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_request_identity.py +0 -0
  478. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_database.py +0 -0
  479. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_scaffold.py +0 -0
  480. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_runtime_selection.py +0 -0
  481. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/auth/test_source_passwords.py +0 -0
  482. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_catalog_foundation.py +0 -0
  483. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_contract_projection.py +0 -0
  484. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_database_config.py +0 -0
  485. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_index_statistics.py +0 -0
  486. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/catalog/test_schema_validation.py +0 -0
  487. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/conftest.py +0 -0
  488. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/client_signatures.json +0 -0
  489. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/database_operations.json +0 -0
  490. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_bounded_transfer.py +0 -0
  491. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_compiler_runtime_source.py +0 -0
  492. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_relation_batching.py +0 -0
  493. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_relation_import.py +0 -0
  494. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_runtime_contract_compat.py +0 -0
  495. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_storage_layouts.py +0 -0
  496. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/contracts/test_table_contracts.py +0 -0
  497. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/Dockerfile +0 -0
  498. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/Dockerfile.dockerignore +0 -0
  499. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/__init__.py +0 -0
  500. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/conftest.py +0 -0
  501. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/provider/__init__.py +0 -0
  502. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/provider/env.py +0 -0
  503. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
  504. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_api_contract.py +0 -0
  505. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_application_migration.py +0 -0
  506. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_bootstrap_recovery.py +0 -0
  507. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_credential_catalog.py +0 -0
  508. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_physical_contract.py +0 -0
  509. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_relation_import.py +0 -0
  510. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_runtime_bootstrap.py +0 -0
  511. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_backend/test_update_client.py +0 -0
  512. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_operations/test_physical_operations.py +0 -0
  513. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_operations/test_postgresql_operations.py +0 -0
  514. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/database_operations/test_runtime_and_temporal.py +0 -0
  515. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/documentation/test_project_checks.py +0 -0
  516. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_admin_installation.py +0 -0
  517. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_api_endpoint.py +0 -0
  518. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_application_owned_migrations.py +0 -0
  519. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_catalog_outage.py +0 -0
  520. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_api_contract.py +0 -0
  521. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_api_coverage.py +0 -0
  522. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_migration_scaffold.py +0 -0
  523. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_migration_tls.py +0 -0
  524. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_package.py +0 -0
  525. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_signatures.py +0 -0
  526. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_client_value_behaviors.py +0 -0
  527. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_data_source_registry.py +0 -0
  528. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_local_actor_client_api.py +0 -0
  529. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_local_cli_workflow.py +0 -0
  530. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_local_client_selection.py +0 -0
  531. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_managed_finalize_client_api.py +0 -0
  532. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_managed_finalize_unchanged.py +0 -0
  533. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_migration_metadata_and_downgrade.py +0 -0
  534. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_namespaces_admin_http.py +0 -0
  535. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_public_imports.py +0 -0
  536. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_remaining_client_routes.py +0 -0
  537. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_run_graphs.py +0 -0
  538. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_run_logs.py +0 -0
  539. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_sdk_local_startup.py +0 -0
  540. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_sqlite_runtime.py +0 -0
  541. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_delete_client_api.py +0 -0
  542. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_filter_client_api.py +0 -0
  543. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_introspection_client_api.py +0 -0
  544. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_patch_client_api.py +0 -0
  545. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_search_api.py +0 -0
  546. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_search_document_api.py +0 -0
  547. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_search_scale.py +0 -0
  548. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_stats_api.py +0 -0
  549. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_update_pipeline.py +0 -0
  550. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_table_updates_http.py +0 -0
  551. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_time_index_delete_client_api.py +0 -0
  552. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_time_index_reads_client_api.py +0 -0
  553. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_timescale_policies_client_api.py +0 -0
  554. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_batch_client_api.py +0 -0
  555. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
  556. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
  557. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
  558. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/e2e/test_update_registration_client_api.py +0 -0
  559. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/examples/test_documented_examples.py +0 -0
  560. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/examples/test_postgresql_examples.py +0 -0
  561. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/examples/test_setup_launch.py +0 -0
  562. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/examples/test_tutorial.py +0 -0
  563. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_batch_introspection.py +0 -0
  564. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_connection_reuse.py +0 -0
  565. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_credential_store.py +0 -0
  566. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_data_source_rules.py +0 -0
  567. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_local_data_sources.py +0 -0
  568. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_local_run_logs.py +0 -0
  569. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_postgresql_connection.py +0 -0
  570. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_postgresql_sql.py +0 -0
  571. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_postgresql_tables.py +0 -0
  572. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
  573. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_request_timing.py +0 -0
  574. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_serving_policy.py +0 -0
  575. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_source_validation.py +0 -0
  576. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/integrations/test_sqlite_operations.py +0 -0
  577. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/labels/test_labels.py +0 -0
  578. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_create_table_operation.py +0 -0
  579. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_create_table_postgres.py +0 -0
  580. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_physical_operation_journal.py +0 -0
  581. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_register_catalog.py +0 -0
  582. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_search_documents.py +0 -0
  583. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/operations/test_timescale_policies.py +0 -0
  584. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_client_skills.py +0 -0
  585. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_dev_release_version.py +0 -0
  586. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_distribution_sources.py +0 -0
  587. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_editable_build.py +0 -0
  588. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/packaging/test_installed_distribution.py +0 -0
  589. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_access_map.py +0 -0
  590. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_governed_sql_scope.py +0 -0
  591. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_local_actor_membership.py +0 -0
  592. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_migration_boundary.py +0 -0
  593. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_namespace_grants.py +0 -0
  594. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_security_api.py +0 -0
  595. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_table_body_filter.py +0 -0
  596. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_table_grants.py +0 -0
  597. {mainsequence_metatable-0.1.35.dev65 → mainsequence_metatable-0.1.36}/tests/permissions/test_table_queries.py +0 -0
  598. {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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.35.dev65
3
+ Version: 0.1.36
4
4
  Summary: Main Sequence MetaTables Python client and standalone API
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: MIT
@@ -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 native security and login validation
66
- -> unchanged evidence? fresh table-policy checks; apply only grant differences
67
- otherwise: full security repair, including credential rotation
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, the existing private `SQLSecurityState.manifest` stores
87
- versioned native-security evidence and a domain-separated credential checksum,
88
- alongside roles, memberships, privileges and routine evidence. No schema revision
89
- is needed. Initialization compares fresh database evidence: role attributes and
90
- memberships; schema, relation, column, routine, database and default ACLs; owners,
91
- routine definitions and row-security policies. Table data and statistics are
92
- excluded. Declared schemas and grant-target tables are included even when the
93
- login has grant authority without owning them. Fresh per-login authentication
94
- uses the configured TLS material and a new connection, never a pooled session
95
- that could conceal a password change.
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. Native drift, credential rotation, pending/unready state or
103
- missing evidence invokes full repair. Login authentication failures likewise
104
- require repair. Exhausted login connection capacity conservatively falls back
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. An old installation
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. Ordinary
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
- native security and login authentication validation, routine repair, table
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 native security emits no role/grant DDL or manifest UPDATE;
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 |
@@ -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. reapplies database access setup. Per-User role passwords derive from the login
148
- password, so a rotated password reaches them.
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
@@ -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. |
@@ -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, and policy coverage for active tables.
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
- **Repair database permissions** on the Admin Security page re-establishes native
157
- permissions from catalog grants and rechecks physical safeguards. The corresponding
158
- admin-only endpoint is `POST /security/reconcile/`. Queries pause during repair.
159
- If permission repair fails, caller SQL stays disabled until repair succeeds.
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
@@ -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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence-metatable"
7
- version = "0.1.35.dev65"
7
+ version = "0.1.36"
8
8
  description = "Main Sequence MetaTables Python client and standalone API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.35.dev65
3
+ Version: 0.1.36
4
4
  Summary: Main Sequence MetaTables Python client and standalone API
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: MIT
@@ -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(session)
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. Access setup is
588
- freshly checked too; drift and rotated credentials are repaired as needed.
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