mainsequence-metatable 0.1.27.dev46__tar.gz → 0.1.27.dev47__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 (572) hide show
  1. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/client/metatables-migrations/SKILL.md +32 -8
  2. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/PKG-INFO +1 -1
  3. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0002-application-administration-and-table-ownership.md +39 -0
  4. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0007-database-enforced-table-access.md +6 -2
  5. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/deploy-application-migrations.md +57 -3
  6. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/security/ownership-and-sharing.md +12 -4
  7. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/security/permissions.md +2 -1
  8. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/pyproject.toml +1 -1
  9. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/mainsequence_metatable.egg-info/PKG-INFO +1 -1
  10. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/mainsequence_metatable.egg-info/SOURCES.txt +1 -0
  11. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_registration.py +3 -1
  12. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/domain/catalog_rules.py +10 -0
  13. mainsequence_metatable-0.1.27.dev47/src/metatables/api/backend/migrations/versions/0012_table_creator.py +42 -0
  14. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/register_catalog.py +62 -11
  15. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/catalog.py +1 -0
  16. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/models.py +2 -0
  17. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_runtime_bootstrap.py +8 -8
  18. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/catalog/test_migration.py +46 -8
  19. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_catalog_contract.py +4 -3
  20. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_remaining_client_routes.py +1 -1
  21. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/operations/test_register_catalog.py +114 -0
  22. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
  23. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
  24. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
  25. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
  26. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
  27. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
  28. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/discover-tables/SKILL.md +0 -0
  29. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
  30. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
  31. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
  32. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
  33. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
  34. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
  35. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/.mainsequence/workflows/metatables-api.yaml +0 -0
  36. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/LICENSE +0 -0
  37. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/MANIFEST.in +0 -0
  38. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/README.md +0 -0
  39. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/alembic.ini +0 -0
  40. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/api/metatables/main.py +0 -0
  41. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/compose.database-tests.yml +0 -0
  42. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
  43. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
  44. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +0 -0
  45. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
  46. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0004-approved-application-migrations.md +0 -0
  47. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
  48. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0006-historical-run-graphs.md +0 -0
  49. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
  50. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
  51. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
  52. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0009-shared-credential-store.md +0 -0
  53. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
  54. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
  55. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0013-application-owned-migrations.md +0 -0
  56. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
  57. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
  58. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0016-impact-preflight.md +0 -0
  59. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0017-hosted-request-identity.md +0 -0
  60. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
  61. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/api/0018-table-search.md +0 -0
  62. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
  63. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
  64. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/adr/index.md +0 -0
  65. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/api/authentication-and-errors.md +0 -0
  66. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/api/data-sources.md +0 -0
  67. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/api/openapi.json +0 -0
  68. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/api/overview.md +0 -0
  69. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/api/reference.md +0 -0
  70. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/api/tables-and-migrations.md +0 -0
  71. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/api/time-index-and-updates.md +0 -0
  72. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/assets/branding/metatables.svg +0 -0
  73. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/assets/diagrams/local-client-experience.svg +0 -0
  74. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/bounded-transfers.md +0 -0
  75. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/build-an-updater.md +0 -0
  76. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/define-and-migrate-tables.md +0 -0
  77. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/installation-and-connection.md +0 -0
  78. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/local-storage.md +0 -0
  79. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/query-and-mutate.md +0 -0
  80. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/quickstart.md +0 -0
  81. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/read-existing-time-index-tables.md +0 -0
  82. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/register-existing-tables.md +0 -0
  83. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/tutorial.md +0 -0
  84. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/client/upgrade-legacy-app.md +0 -0
  85. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/concepts/architecture.md +0 -0
  86. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/concepts/data-sources.md +0 -0
  87. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/concepts/identity-and-scope.md +0 -0
  88. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/concepts/permissions-namespaces-labels.md +0 -0
  89. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/concepts/runs-and-execution-graphs.md +0 -0
  90. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
  91. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/concepts/time-index-tables-and-updates.md +0 -0
  92. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/contributing/architecture-and-boundaries.md +0 -0
  93. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/contributing/database-backends.md +0 -0
  94. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/contributing/documentation.md +0 -0
  95. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/contributing/releasing.md +0 -0
  96. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/contributing/testing.md +0 -0
  97. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/README.md +0 -0
  98. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/__init__.py +0 -0
  99. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/bounded_reader.py +0 -0
  100. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/data_sources/README.md +0 -0
  101. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/data_sources/mssql.json +0 -0
  102. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/data_sources/mysql.json +0 -0
  103. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/data_sources/postgresql.json +0 -0
  104. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/data_sources/register.py +0 -0
  105. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/external_table.py +0 -0
  106. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/local_app/README.md +0 -0
  107. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/local_app/__init__.py +0 -0
  108. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/local_app/__main__.py +0 -0
  109. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/local_app/migrations/__init__.py +0 -0
  110. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/local_app/migrations/env.py +0 -0
  111. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/local_app/migrations/script.py.mako +0 -0
  112. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  113. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/local_app/tables.py +0 -0
  114. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/query.py +0 -0
  115. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/quickstart.py +0 -0
  116. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/reader.py +0 -0
  117. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/scripts/__init__.py +0 -0
  118. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/scripts/setup_metatables.py +0 -0
  119. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tables.py +0 -0
  120. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/README.md +0 -0
  121. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/__init__.py +0 -0
  122. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/__main__.py +0 -0
  123. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/data/README.md +0 -0
  124. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  125. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/frames.py +0 -0
  126. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/migrations/__init__.py +0 -0
  127. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/migrations/env.py +0 -0
  128. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/migrations/registry.py +0 -0
  129. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/migrations/script.py.mako +0 -0
  130. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
  131. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  132. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  133. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  134. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/operations.py +0 -0
  135. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/tables.py +0 -0
  136. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/tutorial/updaters.py +0 -0
  137. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/examples/updater.py +0 -0
  138. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/index.md +0 -0
  139. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/operations/catalog-migrations.md +0 -0
  140. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/operations/configuration.md +0 -0
  141. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/operations/hosted-runtime.md +0 -0
  142. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/operations/local-runtime.md +0 -0
  143. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/operations/recovery-and-observability.md +0 -0
  144. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/operations/run-history.md +0 -0
  145. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/operations/run-logs.md +0 -0
  146. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/reference/capabilities.md +0 -0
  147. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/reference/cli.md +0 -0
  148. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/reference/python.md +0 -0
  149. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/docs/security/index.md +0 -0
  150. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/mkdocs.yml +0 -0
  151. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/__init__.py +0 -0
  152. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/build_reference.py +0 -0
  153. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/check_boundaries.py +0 -0
  154. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/check_client_api_coverage.py +0 -0
  155. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/check_distribution_sources.py +0 -0
  156. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/check_docs.py +0 -0
  157. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/check_examples_debug.py +0 -0
  158. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/check_project.py +0 -0
  159. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/dev_release_version.py +0 -0
  160. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/test_databases.py +0 -0
  161. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/scripts/test_postgresql.py +0 -0
  162. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/setup.cfg +0 -0
  163. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
  164. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
  165. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
  166. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
  167. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/__init__.py +0 -0
  168. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/_admin_source.json +0 -0
  169. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/_build.py +0 -0
  170. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/_skill_bundle.py +0 -0
  171. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/analysis.py +0 -0
  172. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/analyst/__init__.py +0 -0
  173. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/__init__.py +0 -0
  174. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/__init__.py +0 -0
  175. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/auth/__init__.py +0 -0
  176. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/auth/boundary.py +0 -0
  177. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/auth/local_actor.py +0 -0
  178. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/bootstrap.py +0 -0
  179. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/configuration.py +0 -0
  180. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/credential_admin.py +0 -0
  181. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/development.py +0 -0
  182. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/development_client.py +0 -0
  183. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/error_logging.py +0 -0
  184. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/main.py +0 -0
  185. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/mcp.py +0 -0
  186. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/platform_cache.py +0 -0
  187. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/__init__.py +0 -0
  188. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/column_search.py +0 -0
  189. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/contract_validation.py +0 -0
  190. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/data_sources.py +0 -0
  191. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/managed_finalize.py +0 -0
  192. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/migration_connection.py +0 -0
  193. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/namespaces.py +0 -0
  194. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/run_logs.py +0 -0
  195. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/runtime_context.py +0 -0
  196. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/schema_graph.py +0 -0
  197. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/security.py +0 -0
  198. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_cascade.py +0 -0
  199. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_crud.py +0 -0
  200. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_delete.py +0 -0
  201. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_filter.py +0 -0
  202. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_import.py +0 -0
  203. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_introspection.py +0 -0
  204. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_patch.py +0 -0
  205. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_response.py +0 -0
  206. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_search.py +0 -0
  207. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_search_document.py +0 -0
  208. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_sql.py +0 -0
  209. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
  210. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/time_index_delete.py +0 -0
  211. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/time_index_reads.py +0 -0
  212. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/time_index_stats.py +0 -0
  213. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/timescale_policies.py +0 -0
  214. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_batch.py +0 -0
  215. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
  216. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_constants.py +0 -0
  217. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_crud.py +0 -0
  218. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_details.py +0 -0
  219. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_graph.py +0 -0
  220. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
  221. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_registration.py +0 -0
  222. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_runs.py +0 -0
  223. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/routes/update_statistics.py +0 -0
  224. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/runtime.py +0 -0
  225. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/runtime_control.py +0 -0
  226. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/runtime_database.py +0 -0
  227. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/source_passwords.py +0 -0
  228. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/app/transfer.py +0 -0
  229. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/__init__.py +0 -0
  230. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/__init__.py +0 -0
  231. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/access.py +0 -0
  232. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
  233. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
  234. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
  235. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
  236. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
  237. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
  238. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
  239. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
  240. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
  241. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
  242. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
  243. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
  244. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
  245. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
  246. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
  247. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
  248. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
  249. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
  250. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
  251. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
  252. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
  253. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/catalog.py +0 -0
  254. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
  255. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/catalog_types.py +0 -0
  256. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/contracts.py +0 -0
  257. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/hosted.py +0 -0
  258. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/hosted_access.py +0 -0
  259. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/migration_connection.py +0 -0
  260. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/native.py +0 -0
  261. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/operations.py +0 -0
  262. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/pages.py +0 -0
  263. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
  264. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/registry.py +0 -0
  265. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/relation_tables.py +0 -0
  266. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/relational.py +0 -0
  267. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
  268. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
  269. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/streaming.py +0 -0
  270. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/backends/timescale.py +0 -0
  271. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/contracts/__init__.py +0 -0
  272. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/contracts/relation_import.py +0 -0
  273. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
  274. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
  275. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/contracts/values.py +0 -0
  276. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/domain/__init__.py +0 -0
  277. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
  278. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/domain/index_statistics.py +0 -0
  279. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/domain/label_rules.py +0 -0
  280. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/domain/permission_rules.py +0 -0
  281. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/domain/update_constants.py +0 -0
  282. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/__init__.py +0 -0
  283. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
  284. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
  285. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/credential_store.py +0 -0
  286. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
  287. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
  288. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
  289. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
  290. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/run_logs.py +0 -0
  291. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
  292. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
  293. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/integrations/source_validation.py +0 -0
  294. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/__init__.py +0 -0
  295. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/env.py +0 -0
  296. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/script.py.mako +0 -0
  297. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
  298. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
  299. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
  300. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
  301. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
  302. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
  303. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
  304. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
  305. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
  306. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
  307. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
  308. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
  309. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/__init__.py +0 -0
  310. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
  311. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
  312. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/create_table.py +0 -0
  313. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
  314. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/import_relations.py +0 -0
  315. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/introspect_table.py +0 -0
  316. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/operations/read_time_index.py +0 -0
  317. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/__init__.py +0 -0
  318. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/cascade.py +0 -0
  319. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/database.py +0 -0
  320. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/grants.py +0 -0
  321. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/impact.py +0 -0
  322. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/labels.py +0 -0
  323. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/locking.py +0 -0
  324. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
  325. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/projections.py +0 -0
  326. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
  327. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
  328. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
  329. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
  330. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/table_queries.py +0 -0
  331. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/table_response.py +0 -0
  332. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/update_graph.py +0 -0
  333. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
  334. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/updates.py +0 -0
  335. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
  336. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
  337. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/search/__init__.py +0 -0
  338. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/search/documents.py +0 -0
  339. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/search/embeddings.py +0 -0
  340. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/search/index.py +0 -0
  341. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/search/ranking.py +0 -0
  342. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/search/text.py +0 -0
  343. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/backend/search/worker.py +0 -0
  344. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/metatables/__init__.py +0 -0
  345. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/metatables/configuration.yaml +0 -0
  346. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/api/metatables/main.py +0 -0
  347. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/cli/__init__.py +0 -0
  348. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/cli/admin_install.py +0 -0
  349. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/cli/app.py +0 -0
  350. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/cli/filters.py +0 -0
  351. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/cli/local.py +0 -0
  352. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/cli/migrations.py +0 -0
  353. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/cli/project.py +0 -0
  354. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/cli/skills.py +0 -0
  355. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/compiled_sql/__init__.py +0 -0
  356. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/compiled_sql/mssql.py +0 -0
  357. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/compiled_sql/v1.py +0 -0
  358. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/dtype_codec.py +0 -0
  359. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/endpoint.py +0 -0
  360. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/README.md +0 -0
  361. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/__init__.py +0 -0
  362. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/bounded_reader.py +0 -0
  363. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/data_sources/README.md +0 -0
  364. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/data_sources/mssql.json +0 -0
  365. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/data_sources/mysql.json +0 -0
  366. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/data_sources/postgresql.json +0 -0
  367. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/data_sources/register.py +0 -0
  368. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/external_table.py +0 -0
  369. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/local_app/README.md +0 -0
  370. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/local_app/__init__.py +0 -0
  371. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/local_app/__main__.py +0 -0
  372. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
  373. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/local_app/migrations/env.py +0 -0
  374. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
  375. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  376. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/local_app/tables.py +0 -0
  377. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/query.py +0 -0
  378. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/quickstart.py +0 -0
  379. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/reader.py +0 -0
  380. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/scripts/__init__.py +0 -0
  381. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/scripts/setup_metatables.py +0 -0
  382. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tables.py +0 -0
  383. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/README.md +0 -0
  384. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/__init__.py +0 -0
  385. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/__main__.py +0 -0
  386. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/data/README.md +0 -0
  387. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  388. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/frames.py +0 -0
  389. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
  390. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/migrations/env.py +0 -0
  391. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
  392. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
  393. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
  394. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  395. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  396. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  397. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/operations.py +0 -0
  398. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/tables.py +0 -0
  399. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/tutorial/updaters.py +0 -0
  400. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/examples/updater.py +0 -0
  401. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/future_registry.py +0 -0
  402. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/hashing.py +0 -0
  403. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/instrumentation.py +0 -0
  404. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/local_connection.py +0 -0
  405. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/local_files.py +0 -0
  406. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/local_run_logs.py +0 -0
  407. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/log_contract.py +0 -0
  408. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/__init__.py +0 -0
  409. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/alembic.py +0 -0
  410. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/connection.py +0 -0
  411. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/env.py +0 -0
  412. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/provider.py +0 -0
  413. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/registry.py +0 -0
  414. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/runner.py +0 -0
  415. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/scaffold.py +0 -0
  416. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/sqlite.py +0 -0
  417. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/templates/__init__.py +0 -0
  418. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/templates/env.py.mako +0 -0
  419. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/templates/script.py.mako +0 -0
  420. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/migrations/tls.py +0 -0
  421. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/models.py +0 -0
  422. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/pydantic_metadata.py +0 -0
  423. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/run_logging.py +0 -0
  424. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/runtime.py +0 -0
  425. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/runtime_context.py +0 -0
  426. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/runtime_contract.py +0 -0
  427. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/schema_names.py +0 -0
  428. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/sdk_compat.py +0 -0
  429. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/sqlalchemy_contracts.py +0 -0
  430. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/storage_layout_contract.py +0 -0
  431. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/time_index_table_refs.py +0 -0
  432. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/transfer.py +0 -0
  433. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/transfer_contract.py +0 -0
  434. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/transport.py +0 -0
  435. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/update_configuration_contract.py +0 -0
  436. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/updaters/__init__.py +0 -0
  437. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/updaters/configuration.py +0 -0
  438. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/updaters/dependencies.py +0 -0
  439. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/updaters/managers.py +0 -0
  440. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/updaters/namespacing.py +0 -0
  441. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/updaters/runner.py +0 -0
  442. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/updaters/updaters.py +0 -0
  443. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/updaters/utils.py +0 -0
  444. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/src/metatables/upload.py +0 -0
  445. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/analyst/test_agent_surface.py +0 -0
  446. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/analyst/test_api_search.py +0 -0
  447. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/analyst/test_mcp.py +0 -0
  448. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/analyst/test_tools.py +0 -0
  449. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_bootstrap_failure_cause.py +0 -0
  450. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_data_source_identity.py +0 -0
  451. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_development_client.py +0 -0
  452. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_hosted_agent.py +0 -0
  453. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_hosted_environment_target.py +0 -0
  454. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_local_mode.py +0 -0
  455. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_platform_fact_cache.py +0 -0
  456. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_request_identity.py +0 -0
  457. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_runtime_database.py +0 -0
  458. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_runtime_scaffold.py +0 -0
  459. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_runtime_selection.py +0 -0
  460. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_runtime_storage_binding.py +0 -0
  461. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/auth/test_source_passwords.py +0 -0
  462. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/catalog/test_catalog_foundation.py +0 -0
  463. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/catalog/test_contract_projection.py +0 -0
  464. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/catalog/test_database_config.py +0 -0
  465. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/catalog/test_index_statistics.py +0 -0
  466. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/conftest.py +0 -0
  467. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/capabilities.json +0 -0
  468. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/client_signatures.json +0 -0
  469. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/database_operations.json +0 -0
  470. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/test_bounded_transfer.py +0 -0
  471. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/test_compiler_runtime_source.py +0 -0
  472. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/test_relation_batching.py +0 -0
  473. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/test_relation_import.py +0 -0
  474. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/test_runtime_contract_compat.py +0 -0
  475. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/test_storage_layouts.py +0 -0
  476. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/contracts/test_table_contracts.py +0 -0
  477. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/Dockerfile +0 -0
  478. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/Dockerfile.dockerignore +0 -0
  479. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/__init__.py +0 -0
  480. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/conftest.py +0 -0
  481. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/provider/__init__.py +0 -0
  482. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/provider/env.py +0 -0
  483. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
  484. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_api_contract.py +0 -0
  485. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_application_migration.py +0 -0
  486. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_bootstrap_recovery.py +0 -0
  487. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_credential_catalog.py +0 -0
  488. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_physical_contract.py +0 -0
  489. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_relation_import.py +0 -0
  490. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_runtime_bootstrap.py +0 -0
  491. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_sql_security.py +0 -0
  492. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_backend/test_update_client.py +0 -0
  493. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_operations/test_physical_operations.py +0 -0
  494. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_operations/test_postgresql_operations.py +0 -0
  495. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/database_operations/test_runtime_and_temporal.py +0 -0
  496. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/documentation/test_project_checks.py +0 -0
  497. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_admin_installation.py +0 -0
  498. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_api_endpoint.py +0 -0
  499. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_application_owned_migrations.py +0 -0
  500. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_catalog_outage.py +0 -0
  501. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_client_api_contract.py +0 -0
  502. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_client_api_coverage.py +0 -0
  503. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_client_migration_scaffold.py +0 -0
  504. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_client_migration_tls.py +0 -0
  505. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_client_package.py +0 -0
  506. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_client_signatures.py +0 -0
  507. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_client_value_behaviors.py +0 -0
  508. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_data_source_registry.py +0 -0
  509. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_local_actor_client_api.py +0 -0
  510. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_local_cli_workflow.py +0 -0
  511. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_local_client_selection.py +0 -0
  512. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_managed_finalize_client_api.py +0 -0
  513. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_namespaces_admin_http.py +0 -0
  514. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_public_imports.py +0 -0
  515. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_run_graphs.py +0 -0
  516. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_run_logs.py +0 -0
  517. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_runtime_upgrade.py +0 -0
  518. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_sdk_local_startup.py +0 -0
  519. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_sqlite_runtime.py +0 -0
  520. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_delete_client_api.py +0 -0
  521. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_filter_client_api.py +0 -0
  522. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_introspection_client_api.py +0 -0
  523. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_patch_client_api.py +0 -0
  524. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_search_api.py +0 -0
  525. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_search_document_api.py +0 -0
  526. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_search_scale.py +0 -0
  527. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_stats_api.py +0 -0
  528. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_update_pipeline.py +0 -0
  529. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_table_updates_http.py +0 -0
  530. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_time_index_delete_client_api.py +0 -0
  531. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_time_index_reads_client_api.py +0 -0
  532. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_timescale_policies_client_api.py +0 -0
  533. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_update_batch_client_api.py +0 -0
  534. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
  535. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
  536. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
  537. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/e2e/test_update_registration_client_api.py +0 -0
  538. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/examples/test_documented_examples.py +0 -0
  539. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/examples/test_postgresql_examples.py +0 -0
  540. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/examples/test_setup_launch.py +0 -0
  541. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/examples/test_tutorial.py +0 -0
  542. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_credential_store.py +0 -0
  543. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_data_source_rules.py +0 -0
  544. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_local_data_sources.py +0 -0
  545. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_local_run_logs.py +0 -0
  546. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_postgresql_connection.py +0 -0
  547. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_postgresql_sql.py +0 -0
  548. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_postgresql_tables.py +0 -0
  549. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
  550. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_source_validation.py +0 -0
  551. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/integrations/test_sqlite_operations.py +0 -0
  552. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/labels/test_labels.py +0 -0
  553. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/operations/test_create_table_operation.py +0 -0
  554. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/operations/test_create_table_postgres.py +0 -0
  555. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/operations/test_physical_operation_journal.py +0 -0
  556. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/operations/test_search_documents.py +0 -0
  557. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/operations/test_timescale_policies.py +0 -0
  558. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/packaging/test_client_skills.py +0 -0
  559. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/packaging/test_dev_release_version.py +0 -0
  560. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/packaging/test_distribution_sources.py +0 -0
  561. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/packaging/test_editable_build.py +0 -0
  562. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/packaging/test_installed_distribution.py +0 -0
  563. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_governed_sql_scope.py +0 -0
  564. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_local_actor_membership.py +0 -0
  565. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_migration_boundary.py +0 -0
  566. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_namespace_grants.py +0 -0
  567. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_security_api.py +0 -0
  568. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_table_body_filter.py +0 -0
  569. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_table_grants.py +0 -0
  570. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_table_queries.py +0 -0
  571. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/tests/permissions/test_workload_principals.py +0 -0
  572. {mainsequence_metatable-0.1.27.dev46 → mainsequence_metatable-0.1.27.dev47}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: metatables-migrations
3
- description: "Create and evolve managed application tables through Alembic migration providers with the installed MetaTables Python client. Covers provider scope and placement, scaffolding, revision authoring, local execution, the deployment-workflow migration Job for hosted runtimes, and reservation or finalization failures. Excludes API catalog migrations, client-library implementation, API/server changes and repository tooling."
3
+ description: "Create and evolve managed application tables through Alembic migration providers with the installed MetaTables Python client. Covers provider scope and placement, scaffolding, revision authoring, local execution, the deployment-workflow migration Job for hosted runtimes, the Team that owns an application's tables in each Environment, and reservation or finalization failures. Excludes API catalog migrations, client-library implementation, API/server changes and repository tooling."
4
4
  ---
5
5
 
6
6
  # MetaTables client application migrations
@@ -50,11 +50,21 @@ migrations. Read `docs/client/deploy-application-migrations.md`.
50
50
  1. **Develop locally.** Author the revision and apply it to verified local SQLite
51
51
  with the [local development skill](../metatables-local-development/SKILL.md).
52
52
  2. **Commit the revision with the code that needs it.**
53
- 3. **Deploy.** The application's `.mainsequence/workflows/` file declares a
53
+ 3. **Give a Team the tables.** Before the first hosted migration in each
54
+ Environment, the application's tables need an owning Team: one platform Team
55
+ per Environment (for example `ledger-development`), whose members are the
56
+ migration Job's workload User and the workload User of every resource that
57
+ reads or writes the tables. An Organization admin creates the application's
58
+ namespace in that Environment and grants the Team Writer on it. Tell the user
59
+ these steps; they are made in the platform and in MetaTables Security, not in
60
+ the repository.
61
+ 4. **Deploy.** The application's `.mainsequence/workflows/` file declares a
54
62
  migration Job that calls `upgrade_application` for each provider, in
55
- dependency order, from the candidate image. Every deployed resource that reads
56
- or writes the tables (FastAPI, `harness_agent` and others) has a deploy step
57
- with `needs: [migrate]`. A failed migration blocks the rollout.
63
+ dependency order, from the candidate image. The Job and every resource that
64
+ uses MetaTables declare `access.branches: [{repository: MetaTables, level: view}]`.
65
+ Every deployed resource that reads or writes the tables (FastAPI,
66
+ `harness_agent` and others) has a deploy step with `needs: [migrate]`. A failed
67
+ migration blocks the rollout.
58
68
 
59
69
  Rules:
60
70
 
@@ -69,6 +79,12 @@ Rules:
69
79
  during and after a failed rollout. Add first; drop or rename in a later release.
70
80
  - Redeploying an older image does not roll back the schema. Downgrade is never a
71
81
  deployment step.
82
+ - Tables belong to the Team, never to one workload User. Workload Users change
83
+ with each Environment and each recreated Job; a new one needs Team membership
84
+ only. Do not ask for direct table grants to a workload User, and do not run the
85
+ Job as an Organization admin to get around a refusal.
86
+ - Every table a provider registers goes in the Team's namespace. A table
87
+ registered in a namespace the caller already writes gets no grant of its own.
72
88
 
73
89
  ## Source and runtime context
74
90
 
@@ -205,8 +221,15 @@ Read `docs/operations/recovery-and-observability.md`.
205
221
  another install overwrote it. Move the provider as the
206
222
  [legacy upgrade skill](../metatables-upgrade-legacy-app/SKILL.md) describes;
207
223
  do not edit files in `site-packages`.
208
- - If reservation fails, compare provider scope and physical identities before
209
- changing code. Do not create a second catalog row for the same table.
224
+ - If reservation fails with `namespace_not_writable` or `table_not_editable`
225
+ (403), the caller lacks Writer through the owning Team. Add the
226
+ `caller_user_uid` from the error to the Team with Writer on the namespace, or,
227
+ when the namespace or Team is missing, set them up as in step 3. A table
228
+ registered before the Team existed may have only a retired workload User as
229
+ Writer; an Organization admin grants the Team Writer on its namespace. Do not
230
+ change code or physical names to get around it.
231
+ - If reservation fails otherwise, compare provider scope and physical identities
232
+ before changing code. Do not create a second catalog row for the same table.
210
233
  - If Alembic succeeds but finalization fails, physical DDL may already be
211
234
  committed. Inspect every per-table result and the actual schema before
212
235
  retrying.
@@ -220,5 +243,6 @@ Read `docs/operations/recovery-and-observability.md`.
220
243
 
221
244
  Verify provider scope and placement, revision content, the selected environment
222
245
  connection, repeat execution, and final active bindings. Check that the deployment
223
- workflow runs the migration Job before every resource that uses the tables. Report
246
+ workflow runs the migration Job before every resource that uses the tables, and
247
+ that each Environment has its owning Team with the Job's workload User. Report
224
248
  separately what was checked offline and what was exercised against a configured API.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.27.dev46
3
+ Version: 0.1.27.dev47
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
@@ -344,6 +344,42 @@ their own workload Users, which need to be granted like people.
344
344
  `reads_as_caller()`, the User `search` filter, `managed_by_caller`,
345
345
  `workload_name` and Team members that may be workload Users.
346
346
 
347
+ ### Amendment: Teams own application tables (2026-10-09)
348
+
349
+ Since platform ADR-0048 every Job, release and Agent runs as its own workload
350
+ User. Each Environment, and each recreated Job, has a new one. A table's creator
351
+ grant tied the table to the workload User that first registered it, so the next
352
+ identity of the same application could not re-register its own tables
353
+ ([#43](https://github.com/mainsequence-projects/MetaTables/issues/43)).
354
+
355
+ - **A Team owns an application's tables.** Before an application's first
356
+ migration in an Environment, an Organization admin creates its namespace and
357
+ grants Writer on it to a platform Team. The application's migration Job and
358
+ every workload User that reads or writes its tables are members of that Team.
359
+ Use one Team per Environment, so that one Environment's workloads are not
360
+ Writers in another. A new workload User needs Team membership only; the tables
361
+ keep their owner.
362
+ - **No creator grant under a namespace Writer.** Registering a new table into a
363
+ namespace where the caller is already a Writer, directly or through a Team, adds
364
+ no creator grant: the namespace's Writers control the table. Otherwise the
365
+ creator still receives Writer, including an admin registering into a namespace
366
+ where they have no grant, so no table starts without a Writer.
367
+ - **Creator attribution is a column.** `meta_table.created_by_user_uid` records
368
+ who registered each table and grants nothing. System migration
369
+ `0012_table_creator` adds it and fills it from each table's first self-granted
370
+ Writer in the grant history.
371
+ - **Refusals say how to recover.** Registration refusals are 403s with a `code`:
372
+ `table_not_editable` for an existing table the caller cannot edit,
373
+ `namespace_not_writable` for a namespace that is missing or that the caller
374
+ cannot write. Both name the caller's User UID and the recovery: add it to the
375
+ Team with Writer on the namespace, or ask an Organization admin. The table's
376
+ namespace is named when the caller requested it or can read the table; its
377
+ Writers are listed only when the caller can read the table.
378
+
379
+ Tables whose only Writer is a replaced identity are recovered the same way: an
380
+ admin grants the application's Team Writer on their namespace. There is no admin
381
+ bypass and no automatic adoption.
382
+
347
383
  ## Superseded behavior and preserved boundaries
348
384
 
349
385
  This decision supersedes ADR 0001's pending-runtime configurator/existing-source
@@ -397,6 +433,9 @@ schema baseline/recreation policy remains governed by ADR 0001.
397
433
  resources through counts, search, lineage, or error details.
398
434
  - A Writer can grant/revoke Reader and Writer access only on tables they control.
399
435
  Re-registering an existing table never grants the caller ownership.
436
+ - A new member of the Team with Writer on an application's namespace registers and
437
+ migrates that application's existing tables; a caller outside it is refused with
438
+ a recovery path that reveals nothing it cannot read.
400
439
  - Team changes and namespace revocation/moves change effective access under the
401
440
  documented freshness rules; independent grants remain visible and effective.
402
441
  - Non-admins cannot manage DataSources, runtime selection, system migrations,
@@ -299,8 +299,12 @@ and [MySQL implicit commits](https://dev.mysql.com/doc/refman/8.4/en/implicit-co
299
299
  - Physical table names become visible to explorer users.
300
300
  - Cascading foreign keys are allowed. Tables that reference a table never change
301
301
  who may write it.
302
- - Team membership reaches the database at the pace of the existing one-hour
303
- platform-fact cache.
302
+ - Team membership reaches the database on the caller's next query. Each SQL
303
+ admission compares the caller's current Teams with the ones its role was last
304
+ given and reconciles the roles first when they differ. A hosted caller's Teams
305
+ come from its signed assertion on every request
306
+ ([ADR 0017](0017-hosted-request-identity.md), 2026-10-05 amendment); only the
307
+ developer's own facts in Local and developer mode are cached for up to an hour.
304
308
 
305
309
  ## Implementation
306
310
 
@@ -15,10 +15,13 @@ before anything that uses the tables rolls out. See
15
15
  [Local storage](local-storage.md).
16
16
  2. **Commit the revision with the code that needs it.** Applied revisions are
17
17
  immutable; every later schema change is a new revision.
18
- 3. **Deploy.** The application's workflow runs its migration Job from the
18
+ 3. **Give a Team the tables.** Before the first hosted migration in each
19
+ Environment, set up the Team that owns the application's tables
20
+ ([below](#give-the-job-access-through-a-team)).
21
+ 4. **Deploy.** The application's workflow runs its migration Job from the
19
22
  candidate image, then deploys the resources that read or write the tables.
20
23
 
21
- Hosted runtimes are migrated only by step 3. Do not run `metatables migrations
24
+ Hosted runtimes are migrated only by step 4. Do not run `metatables migrations
22
25
  upgrade` or `downgrade` against a hosted API from a developer machine or agent
23
26
  session. Do not migrate at application startup either: several pods would race,
24
27
  and a failure would not stop the rollout.
@@ -78,6 +81,56 @@ Give every other deployed resource that reads or writes the tables, such as a
78
81
  `harness_agent`, its own deploy step with `needs: [migrate]`. Validate the file
79
82
  against the branch's workflow template before committing it.
80
83
 
84
+ ## Give the Job access through a Team
85
+
86
+ The Job runs as its own workload User, and each Environment, and each recreated
87
+ Job, has a new one. A table owned by one workload User is lost to the next, so the
88
+ application's tables belong to a platform Team instead:
89
+
90
+ 1. **Create one Team per Environment** for the application, for example
91
+ `ledger-development` and `ledger-production`. A shared Team would make one
92
+ Environment's workloads Writers in another.
93
+ 2. **Add the workload Users.** Add the migration Job's workload User, and the
94
+ workload User of every resource that reads or writes the tables (FastAPI
95
+ release, Agent, other Jobs). Each resource's `workload_user_uid` names it.
96
+ 3. **Grant the Team the namespace.** An Organization admin creates the
97
+ application's namespace in that Environment's MetaTables, under
98
+ **Security**, or with `POST /security/namespaces/`, and grants the Team Writer
99
+ on it (`PUT /namespaces/{uid}/permissions`). Every table registered in the
100
+ namespace inherits the grant.
101
+
102
+ The Job also needs platform `view` on the Environment's `metatables` release and
103
+ its branch to discover the API; declare it on the Job:
104
+
105
+ ```yaml
106
+ - key: migrate-ledger
107
+ kind: job
108
+ spec:
109
+ name: Ledger migrations
110
+ execution_path: jobs/migrate_ledger.py
111
+ access:
112
+ branches:
113
+ - repository: MetaTables
114
+ level: view
115
+ ```
116
+
117
+ Team membership takes effect on the workload's next request, in the catalog and in
118
+ the database. When a workload User changes, add the new one to the Team; nothing
119
+ in MetaTables changes. A table registered in a namespace the caller already
120
+ writes gets no grant of its own, so the Team stays its only owner.
121
+
122
+ ### When registration is refused
123
+
124
+ - **`namespace_not_writable`**: the namespace does not exist in this Environment,
125
+ or the caller is not its Writer. Do steps 1 to 3 for the `caller_user_uid` the
126
+ error names.
127
+ - **`table_not_editable`**: the table is already registered and the caller is not
128
+ its Writer. Add the `caller_user_uid` to the Team with Writer on the table's
129
+ namespace. When the table was registered before the Team existed, its only
130
+ Writer may be a workload User that no longer runs: an Organization admin
131
+ grants the Team Writer on the namespace, and the table inherits it. The error
132
+ lists the table's Writers when the caller can read the table.
133
+
81
134
  ## What the Job guarantees
82
135
 
83
136
  - It runs on every deployment. A database already at head is left unchanged and
@@ -89,7 +142,8 @@ against the branch's workflow template before committing it.
89
142
  - The Job finds the Environment's MetaTables API the same way any client does
90
143
  ([installation and connection](installation-and-connection.md)). That API must
91
144
  be deployed with its system migrations applied; otherwise the Job fails. Its
92
- SDK user needs the same API access a developer needs to run the provider.
145
+ workload User needs Writer on the application's namespace through the Team
146
+ above.
93
147
 
94
148
  ## Keep each release compatible with the previous one
95
149
 
@@ -2,15 +2,23 @@
2
2
 
3
3
  ## Ownership is Writer access
4
4
 
5
- The creator receives Writer access when a new table is registered. A Writer can
6
- grant Reader or Writer access to other platform Users and Teams, change a direct
7
- grant, or revoke it. Readers cannot change grants.
5
+ The creator receives Writer access when a new table is registered, unless the
6
+ table's namespace already makes the creator a Writer, directly or through a Team.
7
+ Then the namespace's Writers control the table and no creator grant is added. A
8
+ Writer can grant Reader or Writer access to other platform Users and Teams, change
9
+ a direct grant, or revoke it. Readers cannot change grants.
8
10
 
9
11
  Several principals can be Writers. The original creator has no permanent
10
- permission separate from grants: creator attribution records who created the
12
+ permission separate from grants: `created_by_user_uid` records who created the
11
13
  table, while effective access determines who controls it now. Organization admins
12
14
  can restore access when no Writer remains.
13
15
 
16
+ Deployed Jobs, releases and Agents run as their own workload Users, which change
17
+ with each Environment and each recreated Job. Give an application's tables to a
18
+ Team instead: grant the Team Writer on the application's namespace and make the
19
+ workload Users members. See
20
+ [Migrate in the deployment workflow](../client/deploy-application-migrations.md#give-the-job-access-through-a-team).
21
+
14
22
  ## One central table-access model
15
23
 
16
24
  `MetaTableGrant` is the foundation of the central access model. Each direct grant
@@ -22,7 +22,8 @@ Organization admin status comes from the platform through the SDK.
22
22
 
23
23
  Creation checks the selected DataSource's storage access mode and the table's
24
24
  lifecycle requirements. The table and its creator's Writer grant are recorded
25
- together. Re-registering an existing table cannot give another caller ownership.
25
+ together, unless the namespace already makes the creator a Writer. Re-registering
26
+ an existing table cannot give another caller ownership.
26
27
 
27
28
  Initial runtime setup must check the platform admin fact before the application
28
29
  grant tables exist. Configuring a pending database does not make the first caller
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence-metatable"
7
- version = "0.1.27.dev46"
7
+ version = "0.1.27.dev47"
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.27.dev46
3
+ Version: 0.1.27.dev47
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
@@ -320,6 +320,7 @@ src/metatables/api/backend/migrations/versions/0008_upload_receipts.py
320
320
  src/metatables/api/backend/migrations/versions/0009_timescale_policies.py
321
321
  src/metatables/api/backend/migrations/versions/0010_cascade_targets.py
322
322
  src/metatables/api/backend/migrations/versions/0011_table_search.py
323
+ src/metatables/api/backend/migrations/versions/0012_table_creator.py
323
324
  src/metatables/api/backend/migrations/versions/__init__.py
324
325
  src/metatables/api/backend/operations/__init__.py
325
326
  src/metatables/api/backend/operations/bootstrap_migrations.py
@@ -25,7 +25,7 @@ from metatables.api.backend.backends.operations import (
25
25
  from metatables.api.backend.backends.timescale import TimescaleError, convert_time_index_table
26
26
  from metatables.api.backend.contracts.storage_layouts import StorageLayoutValidationError
27
27
  from metatables.api.backend.contracts.table_contracts import ContractValidationError
28
- from metatables.api.backend.domain.catalog_rules import CatalogInvariantError
28
+ from metatables.api.backend.domain.catalog_rules import CatalogAccessError, CatalogInvariantError
29
29
  from metatables.api.backend.domain.data_source_rules import DataSourceAdmissionError
30
30
  from metatables.api.backend.domain.permission_rules import TrustedActorFacts
31
31
  from metatables.api.backend.integrations.runtime_data_sources import DataSourceIntegrationError
@@ -164,6 +164,8 @@ def _failure(session, exc, *, item=None):
164
164
  cause = exc
165
165
  if isinstance(exc, HTTPException):
166
166
  status, detail, cause = exc.status_code, exc.detail, exc.__cause__
167
+ elif isinstance(exc, CatalogAccessError):
168
+ status, detail = 403, exc.detail
167
169
  elif isinstance(exc, DataSourceAdmissionError):
168
170
  # Contract rejections name the offending column or index, as contract validation does.
169
171
  status = exc.status_code
@@ -14,6 +14,15 @@ class CatalogInvariantError(ValueError):
14
14
  """A proposed catalog transition violates a MetaTables invariant."""
15
15
 
16
16
 
17
+ class CatalogAccessError(CatalogInvariantError):
18
+ """The caller lacks the Writer access a registration needs; ``detail`` says how to recover."""
19
+
20
+ def __init__(self, code: str, message: str, **context):
21
+ super().__init__(message)
22
+ self.code = code
23
+ self.detail = {"code": code, "message": message, **context}
24
+
25
+
17
26
  @dataclass(frozen=True)
18
27
  class TimeIndexSpec:
19
28
  time_index_name: str
@@ -51,6 +60,7 @@ class TableRegistration:
51
60
  migration_namespace: str | None = None
52
61
  migration_provider_key: str | None = None
53
62
  time_index: TimeIndexSpec | None = None
63
+ created_by_user_uid: UUID | None = None
54
64
 
55
65
  @property
56
66
  def kind(self) -> str:
@@ -0,0 +1,42 @@
1
+ """Record who registered each table, now that a namespace Writer gets no creator grant (ADR 0002)."""
2
+
3
+ import sqlalchemy as sa
4
+ from alembic import op
5
+
6
+ revision = "0012_table_creator"
7
+ down_revision = "0011_table_search"
8
+ branch_labels = None
9
+ depends_on = None
10
+
11
+
12
+ def upgrade():
13
+ with op.batch_alter_table("meta_table") as batch:
14
+ batch.add_column(sa.Column("created_by_user_uid", sa.Uuid(), nullable=True))
15
+ # Until now the creator's own Writer grant was the only record of who registered
16
+ # a table: take the earliest grant a User gave itself on each table.
17
+ audit = sa.table(
18
+ "grant_audit", sa.column("target_kind"), sa.column("target_uid", sa.Uuid()),
19
+ sa.column("principal_kind"), sa.column("principal_uid", sa.Uuid()),
20
+ sa.column("previous_access"), sa.column("new_access"),
21
+ sa.column("actor_user_uid", sa.Uuid()), sa.column("created_at"),
22
+ )
23
+ meta_table = sa.table("meta_table", sa.column("uid", sa.Uuid()), sa.column("created_by_user_uid", sa.Uuid()))
24
+ connection = op.get_bind()
25
+ creators = {}
26
+ for target_uid, actor_uid in connection.execute(
27
+ sa.select(audit.c.target_uid, audit.c.actor_user_uid).where(
28
+ audit.c.target_kind == "table", audit.c.principal_kind == "user",
29
+ audit.c.principal_uid == audit.c.actor_user_uid,
30
+ audit.c.previous_access.is_(None), audit.c.new_access == "writer",
31
+ ).order_by(audit.c.created_at.desc())
32
+ ):
33
+ creators[target_uid] = actor_uid
34
+ for target_uid, actor_uid in creators.items():
35
+ connection.execute(
36
+ meta_table.update().where(meta_table.c.uid == target_uid).values(created_by_user_uid=actor_uid)
37
+ )
38
+
39
+
40
+ def downgrade():
41
+ with op.batch_alter_table("meta_table") as batch:
42
+ batch.drop_column("created_by_user_uid")
@@ -11,6 +11,7 @@ from sqlalchemy.orm import Session
11
11
 
12
12
  from metatables.api.backend.contracts.table_contracts import normalize_table_contract
13
13
  from metatables.api.backend.domain.catalog_rules import (
14
+ CatalogAccessError,
14
15
  CatalogInvariantError,
15
16
  TableRegistration,
16
17
  TimeIndexSpec,
@@ -70,6 +71,38 @@ def time_index_spec_from_contract(
70
71
  DESCRIPTIVE_COLUMN_FIELDS = ("label", "description", "logical_name")
71
72
 
72
73
 
74
+ def not_editable(session: Session, table: MetaTable, *, actor: TrustedActorFacts,
75
+ requested_namespace: str | None) -> CatalogAccessError:
76
+ """Refuse re-registration with a recovery path, revealing only what the caller may read.
77
+
78
+ The table's namespace is named when the caller asked for it or can read the
79
+ table; its Writers only when the caller can read the table (ADR 0002).
80
+ """
81
+ grants = GrantRepository(session)
82
+ caller = str(actor.user_uid)
83
+ readable = actor.is_admin or grants.may_access_table(table_uid=table.uid, actor=actor)
84
+ namespace = session.get(Namespace, table.namespace_uid) if table.namespace_uid else None
85
+ context = {"caller_user_uid": caller}
86
+ if namespace is not None and (readable or namespace.name == requested_namespace):
87
+ context["namespace"] = namespace.name
88
+ recovery = f"Add {caller} to the Team with Writer on namespace {namespace.name!r}"
89
+ elif readable and namespace is None:
90
+ recovery = f"Ask a Writer of the table to grant {caller} Writer"
91
+ else:
92
+ recovery = f"Add {caller} to a Team with Writer on the table or its namespace"
93
+ if readable:
94
+ context["writers"] = [
95
+ {key: item[key] for key in ("principal_kind", "principal_uid", "source")}
96
+ for item in grants.contributions(table=table) if item["access_level"] == "writer"
97
+ ]
98
+ return CatalogAccessError(
99
+ "table_not_editable",
100
+ f"The table is already registered and caller {caller} is not its Writer. "
101
+ f"{recovery}, or ask an admin.",
102
+ **context,
103
+ )
104
+
105
+
73
106
  def update_descriptive_metadata(session: Session, table: MetaTable, *, payload: Mapping[str, Any],
74
107
  contract: Mapping[str, Any], actor: TrustedActorFacts) -> None:
75
108
  """Copy non-empty descriptions, labels and column metadata from a registration request.
@@ -188,7 +221,9 @@ def register_catalog_entry(
188
221
  ).with_for_update())
189
222
  if existing is not None:
190
223
  if not GrantRepository(session).may_access_table(table_uid=existing.uid, actor=actor, edit=True):
191
- raise CatalogInvariantError("MetaTable is not editable")
224
+ requested = payload.get("namespace")
225
+ raise not_editable(session, existing, actor=actor, requested_namespace=(
226
+ requested.strip().lower() if isinstance(requested, str) else None))
192
227
  if existing.management_mode != management_mode or (existing.kind == "time_index") != time_indexed:
193
228
  raise CatalogInvariantError("Existing MetaTable has incompatible kind or management mode")
194
229
  if time_index_spec is not None:
@@ -205,10 +240,22 @@ def register_catalog_entry(
205
240
  namespace_uid: UUID | None = None
206
241
  namespace_name = payload.get("namespace")
207
242
  repository = CatalogRepository(session)
243
+ namespace_writer = False
208
244
  if isinstance(namespace_name, str) and namespace_name.strip():
209
245
  namespace = session.scalar(select(Namespace).where(Namespace.name == namespace_name.strip().lower()))
210
- if not actor.is_admin and (namespace is None or not GrantRepository(session).may_assign_namespace(namespace_uid=namespace.uid, actor=actor)):
211
- raise CatalogInvariantError("Writer access to the destination namespace is required")
246
+ namespace_writer = namespace is not None and session.scalar(select(Namespace.uid).where(
247
+ Namespace.uid == namespace.uid,
248
+ GrantRepository.namespace_access_predicate(actor, edit=True))) is not None
249
+ if not actor.is_admin and not namespace_writer:
250
+ caller = str(actor.user_uid)
251
+ raise CatalogAccessError(
252
+ "namespace_not_writable",
253
+ f"Namespace {namespace_name.strip().lower()!r} does not exist in this Environment or "
254
+ f"caller {caller} is not its Writer. Ask an admin to create the namespace "
255
+ f"and grant Writer to the Team that owns the application's tables, then add {caller} "
256
+ "to that Team.",
257
+ caller_user_uid=caller, namespace=namespace_name.strip().lower(),
258
+ )
212
259
  namespace, _ = repository.get_or_create_namespace(
213
260
  name=namespace_name,
214
261
  )
@@ -231,20 +278,24 @@ def register_catalog_entry(
231
278
  migration_namespace=alembic.get("migration_namespace"),
232
279
  migration_provider_key=alembic.get("provider_key"),
233
280
  time_index=time_index_spec,
281
+ created_by_user_uid=actor.user_uid,
234
282
  )
235
283
  table = repository.register_table(registration)
236
284
  table.protect_from_deletion = (
237
285
  table.protect_from_deletion
238
286
  or bool(payload.get("protect_from_deletion", False))
239
287
  )
240
- GrantRepository(session).set_table_grant(
241
- table_uid=table.uid,
242
- principal_kind="user",
243
- principal_uid=actor.user_uid,
244
- can_view=True,
245
- can_edit=True,
246
- granted_by_user_uid=actor.user_uid,
247
- )
288
+ if not namespace_writer:
289
+ # A namespace Writer, typically the application's Team, already controls the
290
+ # table; a creator grant would outlive the workload User that made it (ADR 0002).
291
+ GrantRepository(session).set_table_grant(
292
+ table_uid=table.uid,
293
+ principal_kind="user",
294
+ principal_uid=actor.user_uid,
295
+ can_view=True,
296
+ can_edit=True,
297
+ granted_by_user_uid=actor.user_uid,
298
+ )
248
299
  labels = payload.get("labels") or []
249
300
  if not isinstance(labels, list):
250
301
  raise CatalogInvariantError("labels must be a list")
@@ -137,6 +137,7 @@ class CatalogRepository:
137
137
  migration_package=registration.migration_package,
138
138
  migration_namespace=registration.migration_namespace,
139
139
  migration_provider_key=registration.effective_migration_provider_key(),
140
+ created_by_user_uid=registration.created_by_user_uid,
140
141
  )
141
142
  self.session.add(table)
142
143
  self.session.flush()
@@ -226,6 +226,8 @@ class MetaTable(Base):
226
226
  Uuid(as_uuid=True), ForeignKey("meta_table.uid", ondelete="SET NULL")
227
227
  )
228
228
  alembic_revision: Mapped[str | None] = mapped_column(String(255))
229
+ # Attribution only; it grants nothing (ADR 0002, 2026-10-09 amendment).
230
+ created_by_user_uid: Mapped[UUID | None] = mapped_column(Uuid(as_uuid=True))
229
231
  created_at: Mapped[datetime] = mapped_column(
230
232
  DateTime(timezone=True), nullable=False, default=utc_now
231
233
  )
@@ -229,8 +229,8 @@ def test_migration_comparison_does_not_initialize_a_missing_database(bootstrap_c
229
229
  monkeypatch.setattr(boot, "upgrade_catalog", lambda engine: pytest.fail("Reading migration status must not migrate"))
230
230
  descriptor = client.get("/runtime-context/").json()["bootstrap"]
231
231
  assert descriptor["current_revisions"] == []
232
- assert descriptor["required_revisions"] == ["0011_table_search"]
233
- assert descriptor["pending_revisions"] == ["0001_initial", "0002_security_model", "0003_run_log_capture", "0004_historical_run_graphs", "0005_database_access", "0006_local_credentials", "0007_external_relation_names", "0008_upload_receipts", "0009_timescale_policies", "0010_cascade_targets", "0011_table_search"]
232
+ assert descriptor["required_revisions"] == ["0012_table_creator"]
233
+ assert descriptor["pending_revisions"] == ["0001_initial", "0002_security_model", "0003_run_log_capture", "0004_historical_run_graphs", "0005_database_access", "0006_local_credentials", "0007_external_relation_names", "0008_upload_receipts", "0009_timescale_policies", "0010_cascade_targets", "0011_table_search", "0012_table_creator"]
234
234
  assert descriptor["migration_status"] == "pending"
235
235
  assert not path.exists()
236
236
 
@@ -240,14 +240,14 @@ def test_migration_comparison_reads_database_changes_after_activation(bootstrap_
240
240
  client, _, _ = bootstrap_client
241
241
  assert client.post("/runtime-bootstrap/migrate/").status_code == 200
242
242
  manager = client.app.state.runtime.bootstrap
243
- assert manager.current == ["0011_table_search"]
243
+ assert manager.current == ["0012_table_creator"]
244
244
  with manager.engine.begin() as connection:
245
245
  connection.exec_driver_sql("UPDATE metatables_catalog_version SET version_num='0001_initial'")
246
246
  monkeypatch.setattr(boot, "upgrade_catalog", lambda engine: pytest.fail("Refreshing must not migrate"))
247
247
  descriptor = client.get("/runtime-context/").json()["bootstrap"]
248
248
  assert descriptor["current_revisions"] == ["0001_initial"]
249
- assert descriptor["required_revisions"] == ["0011_table_search"]
250
- assert descriptor["pending_revisions"] == ["0002_security_model", "0003_run_log_capture", "0004_historical_run_graphs", "0005_database_access", "0006_local_credentials", "0007_external_relation_names", "0008_upload_receipts", "0009_timescale_policies", "0010_cascade_targets", "0011_table_search"]
249
+ assert descriptor["required_revisions"] == ["0012_table_creator"]
250
+ assert descriptor["pending_revisions"] == ["0002_security_model", "0003_run_log_capture", "0004_historical_run_graphs", "0005_database_access", "0006_local_credentials", "0007_external_relation_names", "0008_upload_receipts", "0009_timescale_policies", "0010_cascade_targets", "0011_table_search", "0012_table_creator"]
251
251
  assert descriptor["migration_status"] == "pending"
252
252
  assert descriptor["active"] is True
253
253
 
@@ -265,14 +265,14 @@ def test_migration_comparison_reads_new_files_without_restarting(bootstrap_clien
265
265
  original = Path(boot.migration_config().get_main_option("script_location"))
266
266
  shutil.copytree(original / "versions", root / "versions")
267
267
  (root / "versions/0007_pending.py").write_text(
268
- "revision = '0007_pending'\ndown_revision = '0011_table_search'\n"
268
+ "revision = '0007_pending'\ndown_revision = '0012_table_creator'\n"
269
269
  "branch_labels = None\ndepends_on = None\n")
270
270
  configuration = Config()
271
271
  configuration.set_main_option("script_location", str(root))
272
272
  monkeypatch.setattr(boot, "migration_config", lambda: configuration)
273
273
  monkeypatch.setattr(boot, "upgrade_catalog", lambda engine: pytest.fail("Reading files must not migrate"))
274
274
  descriptor = client.get("/runtime-context/").json()["bootstrap"]
275
- assert descriptor["current_revisions"] == ["0011_table_search"]
275
+ assert descriptor["current_revisions"] == ["0012_table_creator"]
276
276
  assert descriptor["required_revisions"] == ["0007_pending"]
277
277
  assert descriptor["pending_revisions"] == ["0007_pending"]
278
278
  assert descriptor["migration_status"] == "pending"
@@ -299,7 +299,7 @@ def test_migration_comparison_reports_unknown_revision_and_read_failures(bootstr
299
299
  assert response.status_code == 200
300
300
  descriptor = response.json()["bootstrap"]
301
301
  assert descriptor["migration_status"] == "unavailable"
302
- assert descriptor["required_revisions"] == ["0011_table_search"]
302
+ assert descriptor["required_revisions"] == ["0012_table_creator"]
303
303
  assert descriptor["migration_error"]
304
304
  assert "private password" not in response.text
305
305