mainsequence-metatable 0.1.31.dev59__tar.gz → 0.1.31.dev60__tar.gz

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