mainsequence-metatable 0.1.17.dev29__tar.gz → 0.1.18.dev30__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 (539) hide show
  1. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-meta-tables/SKILL.md +2 -2
  2. {mainsequence_metatable-0.1.17.dev29/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.18.dev30}/PKG-INFO +1 -1
  3. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0002-application-administration-and-table-ownership.md +8 -0
  4. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0007-database-enforced-table-access.md +28 -14
  5. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0016-impact-preflight.md +26 -21
  6. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/index.md +1 -1
  7. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/security/index.md +5 -3
  8. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/security/permissions.md +55 -1
  9. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/pyproject.toml +1 -1
  10. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
  11. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/SOURCES.txt +0 -1
  12. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/access.py +0 -57
  13. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/hosted.py +0 -23
  14. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/hosted_access.py +2 -4
  15. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/sqlite_access.py +0 -4
  16. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +1 -1
  17. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/impact.py +13 -50
  18. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/models.py +1 -1
  19. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/models.py +1 -1
  20. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_sql_security.py +21 -29
  21. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_remaining_client_routes.py +5 -13
  22. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/uv.lock +1 -1
  23. mainsequence_metatable-0.1.17.dev29/tests/permissions/test_cascade_writes.py +0 -49
  24. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
  25. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
  26. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
  27. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
  28. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.mainsequence/workflows/metatables-api.yaml +0 -0
  29. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/LICENSE +0 -0
  30. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/MANIFEST.in +0 -0
  31. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/README.md +0 -0
  32. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/alembic.ini +0 -0
  33. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/api/metatables/main.py +0 -0
  34. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/compose.database-tests.yml +0 -0
  35. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
  36. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0004-approved-application-migrations.md +0 -0
  37. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
  38. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0006-historical-run-graphs.md +0 -0
  39. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
  40. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
  41. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
  42. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0009-shared-credential-store.md +0 -0
  43. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
  44. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
  45. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0013-application-owned-migrations.md +0 -0
  46. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
  47. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
  48. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
  49. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
  50. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/authentication-and-errors.md +0 -0
  51. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/data-sources.md +0 -0
  52. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/openapi.json +0 -0
  53. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/overview.md +0 -0
  54. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/reference.md +0 -0
  55. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/tables-and-migrations.md +0 -0
  56. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/time-index-and-updates.md +0 -0
  57. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/assets/branding/metatables.svg +0 -0
  58. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/assets/diagrams/local-client-experience.svg +0 -0
  59. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/bounded-transfers.md +0 -0
  60. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/build-an-updater.md +0 -0
  61. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/define-and-migrate-tables.md +0 -0
  62. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/deploy-application-migrations.md +0 -0
  63. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/installation-and-connection.md +0 -0
  64. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/local-storage.md +0 -0
  65. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/query-and-mutate.md +0 -0
  66. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/quickstart.md +0 -0
  67. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/read-existing-time-index-tables.md +0 -0
  68. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/register-existing-tables.md +0 -0
  69. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/tutorial.md +0 -0
  70. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/upgrade-legacy-app.md +0 -0
  71. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/architecture.md +0 -0
  72. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/data-sources.md +0 -0
  73. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/identity-and-scope.md +0 -0
  74. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/permissions-namespaces-labels.md +0 -0
  75. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/runs-and-execution-graphs.md +0 -0
  76. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
  77. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/time-index-tables-and-updates.md +0 -0
  78. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/architecture-and-boundaries.md +0 -0
  79. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/database-backends.md +0 -0
  80. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/documentation.md +0 -0
  81. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/releasing.md +0 -0
  82. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/testing.md +0 -0
  83. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/README.md +0 -0
  84. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/__init__.py +0 -0
  85. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/bounded_reader.py +0 -0
  86. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/README.md +0 -0
  87. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/mssql.json +0 -0
  88. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/mysql.json +0 -0
  89. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/postgresql.json +0 -0
  90. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/register.py +0 -0
  91. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/external_table.py +0 -0
  92. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/README.md +0 -0
  93. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/__init__.py +0 -0
  94. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/__main__.py +0 -0
  95. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/migrations/__init__.py +0 -0
  96. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/migrations/env.py +0 -0
  97. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/migrations/script.py.mako +0 -0
  98. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  99. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/tables.py +0 -0
  100. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/query.py +0 -0
  101. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/quickstart.py +0 -0
  102. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/reader.py +0 -0
  103. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/scripts/__init__.py +0 -0
  104. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/scripts/setup_metatables.py +0 -0
  105. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tables.py +0 -0
  106. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/README.md +0 -0
  107. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/__init__.py +0 -0
  108. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/__main__.py +0 -0
  109. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/data/README.md +0 -0
  110. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  111. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/frames.py +0 -0
  112. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/__init__.py +0 -0
  113. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/env.py +0 -0
  114. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/registry.py +0 -0
  115. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/script.py.mako +0 -0
  116. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
  117. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  118. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  119. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  120. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/operations.py +0 -0
  121. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/tables.py +0 -0
  122. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/updaters.py +0 -0
  123. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/updater.py +0 -0
  124. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/index.md +0 -0
  125. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/catalog-migrations.md +0 -0
  126. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/configuration.md +0 -0
  127. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/hosted-runtime.md +0 -0
  128. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/local-runtime.md +0 -0
  129. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/recovery-and-observability.md +0 -0
  130. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/run-history.md +0 -0
  131. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/run-logs.md +0 -0
  132. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/reference/capabilities.md +0 -0
  133. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/reference/cli.md +0 -0
  134. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/reference/python.md +0 -0
  135. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/security/ownership-and-sharing.md +0 -0
  136. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/mkdocs.yml +0 -0
  137. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/__init__.py +0 -0
  138. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/build_reference.py +0 -0
  139. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_boundaries.py +0 -0
  140. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_client_api_coverage.py +0 -0
  141. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_distribution_sources.py +0 -0
  142. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_docs.py +0 -0
  143. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_examples_debug.py +0 -0
  144. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_project.py +0 -0
  145. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/dev_release_version.py +0 -0
  146. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/test_databases.py +0 -0
  147. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/test_postgresql.py +0 -0
  148. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/setup.cfg +0 -0
  149. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
  150. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
  151. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
  152. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
  153. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/__init__.py +0 -0
  154. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/_admin_source.json +0 -0
  155. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/_build.py +0 -0
  156. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/_skill_bundle.py +0 -0
  157. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/__init__.py +0 -0
  158. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/__init__.py +0 -0
  159. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/auth/__init__.py +0 -0
  160. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/auth/boundary.py +0 -0
  161. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/auth/caller_assertions.py +0 -0
  162. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/auth/local_actor.py +0 -0
  163. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/bootstrap.py +0 -0
  164. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/configuration.py +0 -0
  165. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/credential_admin.py +0 -0
  166. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/development.py +0 -0
  167. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/development_client.py +0 -0
  168. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/error_logging.py +0 -0
  169. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/main.py +0 -0
  170. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/platform_cache.py +0 -0
  171. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/__init__.py +0 -0
  172. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/column_search.py +0 -0
  173. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/contract_validation.py +0 -0
  174. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/data_sources.py +0 -0
  175. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/managed_finalize.py +0 -0
  176. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/migration_connection.py +0 -0
  177. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/namespaces.py +0 -0
  178. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/run_logs.py +0 -0
  179. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/runtime_context.py +0 -0
  180. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/schema_graph.py +0 -0
  181. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/security.py +0 -0
  182. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_cascade.py +0 -0
  183. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_crud.py +0 -0
  184. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_delete.py +0 -0
  185. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_filter.py +0 -0
  186. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_import.py +0 -0
  187. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_introspection.py +0 -0
  188. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_patch.py +0 -0
  189. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_registration.py +0 -0
  190. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_response.py +0 -0
  191. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_search_document.py +0 -0
  192. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_sql.py +0 -0
  193. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
  194. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/time_index_delete.py +0 -0
  195. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/time_index_reads.py +0 -0
  196. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/time_index_stats.py +0 -0
  197. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/timescale_policies.py +0 -0
  198. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_batch.py +0 -0
  199. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
  200. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_constants.py +0 -0
  201. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_crud.py +0 -0
  202. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_details.py +0 -0
  203. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_graph.py +0 -0
  204. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
  205. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_registration.py +0 -0
  206. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_runs.py +0 -0
  207. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_statistics.py +0 -0
  208. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/runtime.py +0 -0
  209. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/runtime_control.py +0 -0
  210. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/runtime_database.py +0 -0
  211. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/source_passwords.py +0 -0
  212. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/transfer.py +0 -0
  213. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/__init__.py +0 -0
  214. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/__init__.py +0 -0
  215. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
  216. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
  217. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
  218. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
  219. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
  220. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
  221. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
  222. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
  223. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
  224. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
  225. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
  226. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
  227. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
  228. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
  229. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
  230. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
  231. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
  232. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
  233. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
  234. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
  235. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
  236. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/catalog.py +0 -0
  237. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
  238. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/catalog_types.py +0 -0
  239. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/contracts.py +0 -0
  240. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/migration_connection.py +0 -0
  241. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/native.py +0 -0
  242. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/operations.py +0 -0
  243. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/pages.py +0 -0
  244. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
  245. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/registry.py +0 -0
  246. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/relation_tables.py +0 -0
  247. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/relational.py +0 -0
  248. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
  249. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/streaming.py +0 -0
  250. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/timescale.py +0 -0
  251. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/__init__.py +0 -0
  252. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/relation_import.py +0 -0
  253. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
  254. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
  255. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/values.py +0 -0
  256. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/__init__.py +0 -0
  257. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
  258. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
  259. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/index_statistics.py +0 -0
  260. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/label_rules.py +0 -0
  261. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/permission_rules.py +0 -0
  262. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/update_constants.py +0 -0
  263. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/__init__.py +0 -0
  264. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
  265. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
  266. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/credential_store.py +0 -0
  267. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
  268. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
  269. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
  270. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
  271. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/run_logs.py +0 -0
  272. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
  273. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
  274. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/source_validation.py +0 -0
  275. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/__init__.py +0 -0
  276. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/env.py +0 -0
  277. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/script.py.mako +0 -0
  278. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
  279. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
  280. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
  281. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
  282. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
  283. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
  284. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
  285. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
  286. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
  287. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
  288. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/__init__.py +0 -0
  289. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
  290. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
  291. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/create_table.py +0 -0
  292. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
  293. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/import_relations.py +0 -0
  294. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/introspect_table.py +0 -0
  295. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/read_time_index.py +0 -0
  296. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/register_catalog.py +0 -0
  297. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/search_documents.py +0 -0
  298. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/__init__.py +0 -0
  299. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/cascade.py +0 -0
  300. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/catalog.py +0 -0
  301. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/database.py +0 -0
  302. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/grants.py +0 -0
  303. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/labels.py +0 -0
  304. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/locking.py +0 -0
  305. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
  306. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/projections.py +0 -0
  307. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
  308. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
  309. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
  310. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
  311. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/table_queries.py +0 -0
  312. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/table_response.py +0 -0
  313. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/update_graph.py +0 -0
  314. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
  315. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/updates.py +0 -0
  316. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
  317. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
  318. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/metatables/__init__.py +0 -0
  319. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/metatables/configuration.yaml +0 -0
  320. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/metatables/main.py +0 -0
  321. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/__init__.py +0 -0
  322. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/admin_install.py +0 -0
  323. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/app.py +0 -0
  324. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/filters.py +0 -0
  325. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/local.py +0 -0
  326. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/migrations.py +0 -0
  327. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/project.py +0 -0
  328. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/skills.py +0 -0
  329. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/compiled_sql/__init__.py +0 -0
  330. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/compiled_sql/mssql.py +0 -0
  331. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/compiled_sql/v1.py +0 -0
  332. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/dtype_codec.py +0 -0
  333. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/endpoint.py +0 -0
  334. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/README.md +0 -0
  335. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/__init__.py +0 -0
  336. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/bounded_reader.py +0 -0
  337. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/README.md +0 -0
  338. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/mssql.json +0 -0
  339. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/mysql.json +0 -0
  340. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/postgresql.json +0 -0
  341. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/register.py +0 -0
  342. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/external_table.py +0 -0
  343. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/README.md +0 -0
  344. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/__init__.py +0 -0
  345. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/__main__.py +0 -0
  346. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
  347. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/migrations/env.py +0 -0
  348. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
  349. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  350. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/tables.py +0 -0
  351. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/query.py +0 -0
  352. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/quickstart.py +0 -0
  353. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/reader.py +0 -0
  354. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/scripts/__init__.py +0 -0
  355. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/scripts/setup_metatables.py +0 -0
  356. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tables.py +0 -0
  357. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/README.md +0 -0
  358. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/__init__.py +0 -0
  359. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/__main__.py +0 -0
  360. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/data/README.md +0 -0
  361. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  362. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/frames.py +0 -0
  363. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
  364. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/env.py +0 -0
  365. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
  366. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
  367. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
  368. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  369. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  370. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  371. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/operations.py +0 -0
  372. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/tables.py +0 -0
  373. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/updaters.py +0 -0
  374. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/updater.py +0 -0
  375. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/future_registry.py +0 -0
  376. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/hashing.py +0 -0
  377. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/instrumentation.py +0 -0
  378. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/local_connection.py +0 -0
  379. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/local_files.py +0 -0
  380. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/local_run_logs.py +0 -0
  381. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/log_contract.py +0 -0
  382. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/__init__.py +0 -0
  383. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/alembic.py +0 -0
  384. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/connection.py +0 -0
  385. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/env.py +0 -0
  386. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/provider.py +0 -0
  387. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/registry.py +0 -0
  388. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/runner.py +0 -0
  389. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/scaffold.py +0 -0
  390. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/sqlite.py +0 -0
  391. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/templates/__init__.py +0 -0
  392. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/templates/env.py.mako +0 -0
  393. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/templates/script.py.mako +0 -0
  394. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/tls.py +0 -0
  395. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/pydantic_metadata.py +0 -0
  396. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/run_logging.py +0 -0
  397. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/runtime.py +0 -0
  398. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/runtime_context.py +0 -0
  399. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/runtime_contract.py +0 -0
  400. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/schema_names.py +0 -0
  401. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/sdk_compat.py +0 -0
  402. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/sqlalchemy_contracts.py +0 -0
  403. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/storage_layout_contract.py +0 -0
  404. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/time_index_table_refs.py +0 -0
  405. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/transfer.py +0 -0
  406. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/transfer_contract.py +0 -0
  407. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/transport.py +0 -0
  408. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/update_configuration_contract.py +0 -0
  409. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/__init__.py +0 -0
  410. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/configuration.py +0 -0
  411. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/dependencies.py +0 -0
  412. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/managers.py +0 -0
  413. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/namespacing.py +0 -0
  414. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/runner.py +0 -0
  415. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/updaters.py +0 -0
  416. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/utils.py +0 -0
  417. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/upload.py +0 -0
  418. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_bootstrap_failure_cause.py +0 -0
  419. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_caller_assertions.py +0 -0
  420. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_data_source_identity.py +0 -0
  421. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_development_client.py +0 -0
  422. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_hosted_environment_target.py +0 -0
  423. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_local_mode.py +0 -0
  424. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_platform_fact_cache.py +0 -0
  425. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_bootstrap.py +0 -0
  426. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_database.py +0 -0
  427. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_scaffold.py +0 -0
  428. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_selection.py +0 -0
  429. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_storage_binding.py +0 -0
  430. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_source_passwords.py +0 -0
  431. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_catalog_foundation.py +0 -0
  432. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_contract_projection.py +0 -0
  433. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_database_config.py +0 -0
  434. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_index_statistics.py +0 -0
  435. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_migration.py +0 -0
  436. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/conftest.py +0 -0
  437. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/capabilities.json +0 -0
  438. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/client_signatures.json +0 -0
  439. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/database_operations.json +0 -0
  440. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_bounded_transfer.py +0 -0
  441. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_compiler_runtime_source.py +0 -0
  442. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_relation_batching.py +0 -0
  443. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_relation_import.py +0 -0
  444. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_storage_layouts.py +0 -0
  445. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_table_contracts.py +0 -0
  446. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/Dockerfile +0 -0
  447. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/Dockerfile.dockerignore +0 -0
  448. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/__init__.py +0 -0
  449. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/conftest.py +0 -0
  450. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/provider/__init__.py +0 -0
  451. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/provider/env.py +0 -0
  452. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
  453. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_api_contract.py +0 -0
  454. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_application_migration.py +0 -0
  455. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_bootstrap_recovery.py +0 -0
  456. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_catalog_contract.py +0 -0
  457. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_credential_catalog.py +0 -0
  458. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_physical_contract.py +0 -0
  459. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_relation_import.py +0 -0
  460. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_runtime_bootstrap.py +0 -0
  461. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_update_client.py +0 -0
  462. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_operations/test_physical_operations.py +0 -0
  463. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_operations/test_postgresql_operations.py +0 -0
  464. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_operations/test_runtime_and_temporal.py +0 -0
  465. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/documentation/test_project_checks.py +0 -0
  466. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_admin_installation.py +0 -0
  467. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_api_endpoint.py +0 -0
  468. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_application_owned_migrations.py +0 -0
  469. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_catalog_outage.py +0 -0
  470. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_api_contract.py +0 -0
  471. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_api_coverage.py +0 -0
  472. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_migration_scaffold.py +0 -0
  473. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_migration_tls.py +0 -0
  474. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_package.py +0 -0
  475. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_signatures.py +0 -0
  476. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_value_behaviors.py +0 -0
  477. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_data_source_registry.py +0 -0
  478. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_local_actor_client_api.py +0 -0
  479. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_local_cli_workflow.py +0 -0
  480. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_local_client_selection.py +0 -0
  481. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_managed_finalize_client_api.py +0 -0
  482. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_namespaces_admin_http.py +0 -0
  483. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_public_imports.py +0 -0
  484. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_run_graphs.py +0 -0
  485. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_run_logs.py +0 -0
  486. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_runtime_transition.py +0 -0
  487. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_runtime_upgrade.py +0 -0
  488. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_sdk_local_startup.py +0 -0
  489. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_sqlite_runtime.py +0 -0
  490. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_delete_client_api.py +0 -0
  491. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_filter_client_api.py +0 -0
  492. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_introspection_client_api.py +0 -0
  493. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_patch_client_api.py +0 -0
  494. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_search_document_api.py +0 -0
  495. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_stats_api.py +0 -0
  496. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_update_pipeline.py +0 -0
  497. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_updates_http.py +0 -0
  498. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_time_index_delete_client_api.py +0 -0
  499. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_time_index_reads_client_api.py +0 -0
  500. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_timescale_policies_client_api.py +0 -0
  501. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_batch_client_api.py +0 -0
  502. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
  503. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
  504. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
  505. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_registration_client_api.py +0 -0
  506. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/examples/test_documented_examples.py +0 -0
  507. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/examples/test_postgresql_examples.py +0 -0
  508. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/examples/test_setup_launch.py +0 -0
  509. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/examples/test_tutorial.py +0 -0
  510. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_credential_store.py +0 -0
  511. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_data_source_rules.py +0 -0
  512. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_local_data_sources.py +0 -0
  513. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_local_run_logs.py +0 -0
  514. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_postgresql_connection.py +0 -0
  515. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_postgresql_sql.py +0 -0
  516. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_postgresql_tables.py +0 -0
  517. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
  518. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_source_validation.py +0 -0
  519. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_sqlite_operations.py +0 -0
  520. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/labels/test_labels.py +0 -0
  521. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_create_table_operation.py +0 -0
  522. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_create_table_postgres.py +0 -0
  523. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_physical_operation_journal.py +0 -0
  524. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_register_catalog.py +0 -0
  525. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_search_documents.py +0 -0
  526. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_timescale_policies.py +0 -0
  527. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_client_skills.py +0 -0
  528. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_dev_release_version.py +0 -0
  529. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_distribution_sources.py +0 -0
  530. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_editable_build.py +0 -0
  531. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_installed_distribution.py +0 -0
  532. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_governed_sql_scope.py +0 -0
  533. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_local_actor_membership.py +0 -0
  534. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_migration_boundary.py +0 -0
  535. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_namespace_grants.py +0 -0
  536. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_security_api.py +0 -0
  537. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_table_body_filter.py +0 -0
  538. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_table_grants.py +0 -0
  539. {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_table_queries.py +0 -0
@@ -143,8 +143,8 @@ Before a destructive action, or to show impact in an application UI, call
143
143
  The API returns whether the caller may run it, every blocker, and a graph of
144
144
  affected tables, foreign-key effects and reading updates; render that result
145
145
  rather than re-deriving foreign-key or permission rules in the client. Cascading
146
- foreign keys are allowed, but write on a table requires write on every table its
147
- cascades modify; a cascade into an unregistered table makes the parent read-only.
146
+ foreign keys are allowed. Write on a table depends only on its own grants; the
147
+ cascade effects in the result are information, never a reason the action is blocked.
148
148
 
149
149
  On a TimescaleDB DataSource, time-index tables are hypertables. Their compression
150
150
  and retention policies are set only through `TimeIndexMetaTable.set_timescale_policies`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.17.dev29
3
+ Version: 0.1.18.dev30
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
@@ -6,6 +6,14 @@
6
6
  > conflicting application-migration execution and credential restrictions;
7
7
  > governed API operations and MetaTables system migrations remain separate.
8
8
 
9
+ > Amendment (2026-10-03): "Cascades" below means the confirmed cascade delete,
10
+ > which drops referencing tables and so needs Writer access to every table it
11
+ > drops. Foreign-key row actions (`CASCADE`, `SET NULL`, `SET DEFAULT`) are
12
+ > different: the referencing table's own foreign key authorizes them, so a caller
13
+ > who changes a referenced row needs no access to the referencing tables, and
14
+ > tables that reference a table never change who may write it
15
+ > ([ADR 0007](0007-database-enforced-table-access.md), amended 2026-10-03).
16
+
9
17
 
10
18
  Date: 2026-09-29
11
19
 
@@ -14,14 +14,23 @@
14
14
  > `metatables` schema and tables in the DataSource's default schema; it need not
15
15
  > own the database.
16
16
 
17
- > Amendment (2026-10-03): Cascading foreign keys are allowed. The database runs
18
- > `CASCADE`, `SET NULL` and `SET DEFAULT` actions as the table owner, so a role
19
- > keeps write on a table only while every login reaching it can also write each
20
- > table those actions modify, following chains of cascades. A cascade into an
21
- > unregistered table leaves the parent read-only. Registration and reconciliation
22
- > record each table's cascade targets; nothing inspects submitted queries. This
23
- > replaces the rule that foreign keys must use `restrict` or `no action`, which the
24
- > implementation applied on every engine, not only where the explorer is enabled.
17
+ > Amendment (2026-10-03): Cascading foreign keys are allowed, and write on a table
18
+ > depends only on that table's own grants. A foreign key's `CASCADE`, `SET NULL` or
19
+ > `SET DEFAULT` action belongs to the referencing table: whoever controls that
20
+ > table's schema decided what happens to its rows when the referenced row changes.
21
+ > A caller who deletes or re-keys a referenced row therefore needs no access to
22
+ > the referencing tables, however long the chain, and no table that references
23
+ > another ever changes who may write it. This withdraws three rules:
24
+ >
25
+ > - foreign keys must use `restrict` or `no action`, which the implementation
26
+ > applied on every engine, not only where the explorer is enabled;
27
+ > - the MySQL and SQL Server check that refused writes whose cascades reached
28
+ > other tables (`unscoped_cascade_denied`);
29
+ > - an interim development change that removed write on a table from callers who
30
+ > could not write every table referencing it.
31
+ >
32
+ > Reconciliation still records each table's cascade targets, but only so the
33
+ > [impact pre-flight](0016-impact-preflight.md) can show their effects.
25
34
 
26
35
 
27
36
  Date: 2026-09-29
@@ -159,8 +168,8 @@ The API removes every check of what the SQL means:
159
168
  statement the role lacks privileges for.
160
169
  - No declared table scope. A request names only its DataSource.
161
170
  - No checks for views, triggers or cascades before query execution. Registration
162
- and schema management establish and preserve the safeguards and foreign-key
163
- rule below, without inspecting each submitted query.
171
+ and schema management establish and preserve the safeguards below, without
172
+ inspecting each submitted query.
164
173
  - One statement per request comes from the extended query protocol, and row limits
165
174
  from fetching at most `max_rows` rows, not from rewriting the query.
166
175
 
@@ -202,8 +211,9 @@ client.
202
211
  - Any role can see the names, columns and row counts of every table in PostgreSQL's
203
212
  system catalogs, but not their data. MetaTables accepts this where the explorer
204
213
  is enabled. Role names are opaque, because table permissions are visible too.
205
- - Databases run foreign-key cascades as the table owner. Write on a table
206
- requires write on every table its cascades modify (amendment 2026-10-03).
214
+ - Databases run foreign-key cascades as the table owner. The referencing table's
215
+ own foreign key authorizes them, so they need no access from the caller
216
+ (amendment 2026-10-03). SQLite is the exception described below.
207
217
  - Heavy queries still consume resources. Per-role connection limits, time limits
208
218
  and, optionally, a read replica bound them.
209
219
 
@@ -214,6 +224,10 @@ runtimes: reads on the caller's Reader and Writer tables, writes on Writer table
214
224
  only, and nothing else, including catalog tables, schema changes, transaction
215
225
  control and `PRAGMA`. The callback responds to SQLite's own authorization events
216
226
  inside the backend adapter; the API does not parse the query to infer its access.
227
+ SQLite also asks it about the reads and writes of foreign-key actions, which it
228
+ cannot tell apart from the caller's own. A local delete or key update on a
229
+ referenced table therefore fails unless the caller can access every referencing
230
+ table.
217
231
 
218
232
  ### Engine-specific enforcement
219
233
 
@@ -283,8 +297,8 @@ and [MySQL implicit commits](https://dev.mysql.com/doc/refman/8.4/en/implicit-co
283
297
  - The DataSource login needs `CREATEROLE` and the right to create the `metatables`
284
298
  schema; it does not need to own the database.
285
299
  - Physical table names become visible to explorer users.
286
- - Cascading foreign keys narrow write access to callers who can write the whole
287
- cascade; a cascade into an unregistered table makes its parent read-only.
300
+ - Cascading foreign keys are allowed. Tables that reference a table never change
301
+ who may write it.
288
302
  - Team membership reaches the database at the pace of the existing one-hour
289
303
  platform-fact cache.
290
304
 
@@ -1,5 +1,11 @@
1
1
  # ADR 0016: Impact pre-flight for cascades and deletes
2
2
 
3
+ > Amendment (2026-10-03): Cascade effects are information, never blockers. An
4
+ > earlier version of this ADR reported a cascade into an unregistered table or a
5
+ > table the caller could not write as a blocker, and computed `can_write` after
6
+ > removing write from such callers. Both are withdrawn with that rule
7
+ > ([ADR 0007](0007-database-enforced-table-access.md), amended 2026-10-03).
8
+
3
9
  Date: 2026-10-03
4
10
 
5
11
  Status: Accepted.
@@ -14,17 +20,18 @@ own their UIs.
14
20
 
15
21
  Related decisions: [ADR 0001](0001-unified-api-storage-and-local-sqlite.md) (the SDK
16
22
  makes no access decisions of its own), [ADR 0002](0002-application-administration-and-table-ownership.md)
17
- (cascades need access to every affected table) and [ADR 0007](0007-database-enforced-table-access.md)
18
- (amended 2026-10-03: write requires write on every cascade target).
23
+ (the confirmed cascade delete needs access to every table it drops) and
24
+ [ADR 0007](0007-database-enforced-table-access.md) (amended 2026-10-03: tables that
25
+ reference a table never change who may write it).
19
26
 
20
27
  ## Context
21
28
 
22
- Cascading foreign keys are now allowed. A caller keeps write on a table only while
23
- they can write every table its `CASCADE`, `SET NULL` and `SET DEFAULT` actions
24
- modify. A project that builds its own UI needs to show, before acting, which
25
- tables a delete or key update reaches, what happens to each, and why a write is
26
- or is not available. Before this decision, a caller could only try the action
27
- and read the error.
29
+ Cascading foreign keys are now allowed, and write on a table depends only on its
30
+ own grants. A delete or key update can still reach many tables through their
31
+ `CASCADE`, `SET NULL` and `SET DEFAULT` actions. A project that builds its own UI
32
+ needs to show, before acting, which tables an action reaches, what happens to
33
+ each, and whether the action is available. Before this decision, a caller could
34
+ only try the action and read the error.
28
35
 
29
36
  ## Decision
30
37
 
@@ -59,23 +66,21 @@ The response is a graph rooted at the table:
59
66
  with no names.
60
67
 
61
68
  Each node lists its `effects` (`drop`, `delete`, `update`, `input_changed`) and
62
- the caller's `can_write`. For row actions, `can_write` is the database
63
- privilege after cascade narrowing, computed by the same function the
64
- reconciler uses. For `drop_table`, it is the edit grant the drop requires.
69
+ the caller's `can_write`. For row actions, `can_write` is the caller's write on
70
+ that table: its grants, and whether the table and DataSource accept writes.
71
+ Tables that reference it never change it. For `drop_table`, it is the edit
72
+ grant the drop requires.
65
73
  - **Edges**: each edge points from the dependent to what it depends on, as in
66
74
  the schema graph. Edges are classified by effect: `cascade_delete`,
67
75
  `cascade_update`, `set_null`, `set_default`, `restrict` (fails while
68
76
  referencing rows exist), `drop`, and `reads`.
69
77
  - **Verdict**: `allowed` and every blocker, each with a code and the node it
70
- concerns:
71
- - `cascade_target_unregistered`
72
- - `cascade_target_not_writable`
73
- - `table_not_writable`
74
- - `writes_unsupported`
75
- - `data_source_read_only`
76
- - `retained_referencing_table`
77
- - `alembic_protection`
78
- - `deletion_protected`
78
+ concerns. A row action is blocked only by the table itself:
79
+ `table_not_writable`, `writes_unsupported` or `data_source_read_only`. Cascade
80
+ effects are information, never blockers, because the referencing table's own
81
+ foreign key authorizes them. `drop_table` keeps the confirmed delete's
82
+ blockers: `table_not_writable` (for every table it drops),
83
+ `retained_referencing_table`, `alembic_protection` and `deletion_protected`.
79
84
 
80
85
  `delete-with-cascade` runs the same planner (`persistence/impact.py`) and refuses
81
86
  with its first blocker's status and message, so a preview and the confirmed
@@ -91,7 +96,7 @@ every rule at execution time.
91
96
  | Need | Today |
92
97
  | --- | --- |
93
98
  | `on_update` in the catalog | `MetaTableForeignKey` and contracts carry only `on_delete`; contracts reject `set default`. Row-action edges use the physical actions, which are complete. |
94
- | Effective write in table responses | `permissions.write` reflects catalog grants and can say yes when cascade narrowing says no. Callers should use the pre-flight. |
99
+ | SQLite runtimes | MetaTables' authorizer also checks the reads and writes of foreign-key actions, so a local delete or key update on a referenced table fails unless the caller can access every referencing table ([ADR 0007](0007-database-enforced-table-access.md)). The pre-flight does not report this. |
95
100
  | Plain delete | `DELETE /meta-tables/{uid}/` still answers 409 without listing references. |
96
101
  | Contract changes | No `change_contract` action; a PATCH that would invalidate an incoming key fails with a text message. |
97
102
  | Schema and update graphs | `get_schema_graph` returns an untyped dict; `update-graph` has no client method. |
@@ -36,4 +36,4 @@ decisions belong in the SDK repository and are linked as dependencies.
36
36
  | [0013: Application-owned migrations](api/0013-application-owned-migrations.md) | Accepted and implemented | Application-side Alembic, environment database authority, API catalog integration and separate system migrations. |
37
37
  | [0014: System migrations in the deployment workflow](api/0014-main-sequence-release-jobs-and-production-migrations.md) | Accepted; implemented on development; hosted verification pending | A Main Sequence Job verifies, migrates and registers the declared runtime database from the candidate image before each API rollout, including the first. |
38
38
  | [0015: TimescaleDB compression and retention policies](api/0015-timescale-compression-and-retention-policies.md) | Accepted; implemented on branch; TimescaleDB verification pending | Time-index tables on TimescaleDB become hypertables; Writers set compression and retention through the API/Admin; Timescale keeps the jobs, and the Admin shows their status. |
39
- | [0016: Impact pre-flight for cascades and deletes](api/0016-impact-preflight.md) | Accepted; implemented; container engine verification pending | `get_impact` returns what a row delete, key update or table drop reaches, every blocker and the caller's effective write, from the planner the confirmed delete runs; projects render it in their own UIs. |
39
+ | [0016: Impact pre-flight for cascades and deletes](api/0016-impact-preflight.md) | Accepted; implemented; container engine verification pending | `get_impact` returns what a row delete, key update or table drop reaches, every blocker and whether the caller may write each table, from the planner the confirmed delete runs; cascade effects never block. Projects render it in their own UIs. |
@@ -23,6 +23,7 @@ deployment's migration Job does so for its declared runtime database.
23
23
  | Application Settings and global Security admission | MetaTables, using the trusted platform admin fact |
24
24
  | Sharing, lifecycle and schema admission | The MetaTables API |
25
25
  | Data access during SQL execution | Database roles and privileges; SQLite engine authorizer locally |
26
+ | What happens to rows that reference a changed row | The referencing table's foreign key, chosen by whoever controls its schema |
26
27
  | Showing permitted actions and access explanations | The Admin UI and Python client, using API decisions |
27
28
 
28
29
  MetaTables does not maintain another Organization or Environment policy model.
@@ -128,9 +129,10 @@ statement classification or function allowlist. The database enforces access in
128
129
  joins, CTEs, subqueries and permitted invoker routines. Database permissions are
129
130
  established during setup and schema changes. Catalog tables remain inaccessible,
130
131
  views cannot be registered, elevated routines cannot confer owner access, and
131
- triggered writes are restricted by the engine's policy. A table with cascading
132
- foreign keys is writable only by callers who can write every table the cascade
133
- modifies.
132
+ triggered writes are restricted by the engine's policy. Cascading foreign keys are
133
+ allowed: a referencing table's own foreign key decides what happens to its rows, so
134
+ tables that reference a table never change who may write it. See
135
+ [foreign keys and cascades](permissions.md#foreign-keys-and-cascades).
134
136
 
135
137
  PostgreSQL stores the catalog in `metatables` and owns managed tables through a
136
138
  non-login owner role. User, Team and namespace grants become database privileges
@@ -60,7 +60,10 @@ Permissions follow the resources actually affected:
60
60
  - A query needs Reader access to every table it reads and Writer access to every
61
61
  table it changes. Supplying an authorized table UID does not authorize arbitrary
62
62
  SQL against other tables.
63
- - A cascade needs Writer access to every affected table. Migration connection
63
+ - A confirmed cascade delete needs Writer access to every table it drops. A
64
+ foreign-key action (`CASCADE`, `SET NULL`, `SET DEFAULT`) needs no access to the
65
+ referencing tables: their own foreign keys authorize it (see
66
+ [Foreign keys and cascades](#foreign-keys-and-cascades)). Migration connection
64
67
  admission checks all provider catalog tables, including their registry. The
65
68
  resulting direct connection is governed by database privileges, not table grants.
66
69
  - An updater needs Writer access to its output and Reader access to its inputs.
@@ -81,6 +84,57 @@ drop the externally owned physical relation. Application system tables and grant
81
84
  records cannot be edited as ordinary API table data. Direct migration access uses
82
85
  the environment login's privileges; its restrictions are the environment operator's responsibility.
83
86
 
87
+ ## Foreign keys and cascades
88
+
89
+ **Write on a table depends only on that table's own grants.** Tables that
90
+ reference it, directly or through any chain of foreign keys, never add or remove
91
+ access to it.
92
+
93
+ A foreign key belongs to the referencing table. Whoever controls that table's
94
+ schema chooses its action, and so decides what happens to their own rows when a
95
+ referenced row is deleted or its key changes:
96
+
97
+ | Action on the referencing table | What happens to its rows |
98
+ | --- | --- |
99
+ | `CASCADE` | Deleted with the referenced row, or re-keyed with it |
100
+ | `SET NULL` / `SET DEFAULT` | Their reference is cleared or reset |
101
+ | `RESTRICT` / `NO ACTION` | The database refuses the change while they exist |
102
+
103
+ A caller who changes a referenced row therefore needs no access to the
104
+ referencing tables. The database applies each referencing table's action as part
105
+ of that write; MetaTables adds no check of its own. PostgreSQL runs these actions
106
+ as the referencing table's owner.
107
+
108
+ | Operation on a referenced table | Access required |
109
+ | --- | --- |
110
+ | Insert rows, or update columns no foreign key references | Writer on the table |
111
+ | Delete rows, or update referenced key columns | Writer on the table; each referencing table's action then applies |
112
+ | Drop the table with the confirmed cascade delete | Writer on the table and on every referencing table it drops |
113
+
114
+ For example, Alice owns `assets`. Carol's `details` table references `assets`
115
+ with `ON DELETE CASCADE`. Alice's Writers can still insert, update and delete
116
+ assets without any access to `details`. When they delete an asset, the database
117
+ deletes Carol's rows for it, because Carol's foreign key says so. If Carol wants
118
+ her rows kept, she uses `RESTRICT` or `NO ACTION`, and the database then refuses
119
+ to delete assets her rows still reference. Dropping `assets` with the confirmed
120
+ cascade delete would drop `details` too, so it needs Writer access to both.
121
+
122
+ Referencing another owner's table is a commitment: its Writers' deletes and key
123
+ updates apply your foreign key's action to your rows.
124
+
125
+ **Seeing the effects first.** `table.get_impact(action=...)` (or
126
+ `GET /meta-tables/{uid}/impact/`) lists every table a row delete, key update or
127
+ table drop reaches and what happens to each. Cascade effects are information,
128
+ never a reason the action is blocked. Tables you cannot view appear as opaque
129
+ nodes. See [ADR 0016](../adr/api/0016-impact-preflight.md).
130
+
131
+ **SQLite limitation.** In a local SQLite runtime, MetaTables' authorizer is also
132
+ asked about the reads and writes that foreign-key actions make, and it cannot
133
+ tell them apart from the caller's own. A delete or key update on a referenced
134
+ table therefore fails unless the caller can access every referencing table.
135
+ PostgreSQL does not have this limitation; MySQL and SQL Server are pending
136
+ verification against their containers.
137
+
84
138
  ## Choosing the right page
85
139
 
86
140
  A Writer uses the table page for data, schema, updater, deletion, and sharing
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence-metatable"
7
- version = "0.1.17.dev29"
7
+ version = "0.1.18.dev30"
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.17.dev29
3
+ Version: 0.1.18.dev30
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
@@ -526,7 +526,6 @@ tests/packaging/test_dev_release_version.py
526
526
  tests/packaging/test_distribution_sources.py
527
527
  tests/packaging/test_editable_build.py
528
528
  tests/packaging/test_installed_distribution.py
529
- tests/permissions/test_cascade_writes.py
530
529
  tests/permissions/test_governed_sql_scope.py
531
530
  tests/permissions/test_local_actor_membership.py
532
531
  tests/permissions/test_migration_boundary.py
@@ -87,9 +87,6 @@ class DatabaseAccess:
87
87
  deleted or their keys updated, as (schema, table, on_delete, on_update)."""
88
88
  raise NotImplementedError
89
89
 
90
- def relation_key(self, schema, table):
91
- return schema, table
92
-
93
90
  def refresh_policies(self, session):
94
91
  tables = list(
95
92
  session.scalars(
@@ -191,15 +188,6 @@ class DatabaseAccess:
191
188
  memberships.add((login, role("user", principal.user_uid, write)))
192
189
  for team in principal.teams:
193
190
  memberships.add((login, role("team", team, write)))
194
- cascades = {
195
- self.relation_key(p.schema_name or "main", p.table_name): {
196
- self.relation_key(t["schema"], t["table"]) for t in p.cascade_targets or ()
197
- }
198
- for p in policies.values()
199
- }
200
- privileges = restrict_cascading_writes(
201
- roles, memberships, privileges, cascades, key=self.relation_key
202
- )
203
191
  return dict(roles=roles, memberships=sorted(memberships), privileges=sorted(privileges))
204
192
 
205
193
  def reconcile(self, session, *, inspect_objects=False):
@@ -310,51 +298,6 @@ def referential_action(value):
310
298
  return str(value).strip().lower().replace("_", " ")
311
299
 
312
300
 
313
- def restrict_cascading_writes(roles, memberships, privileges, cascades, key=lambda *r: r):
314
- """Keep a write grant only while every login reaching it may write what its cascades modify.
315
-
316
- Databases run foreign-key actions as the table owner, so a cascade into a
317
- table the caller cannot write would bypass that table's grants (ADR 0007).
318
- Unregistered targets are writable by nobody. Revocations repeat until stable
319
- because a withdrawn grant can invalidate another table's cascade.
320
- """
321
- parents = {}
322
- for member, parent in memberships:
323
- parents.setdefault(member, set()).add(parent)
324
- reach = {}
325
- for login in (name for name, definition in roles.items() if definition["login"]):
326
- reached, frontier = {login}, [login]
327
- while frontier:
328
- for parent in parents.get(frontier.pop(), ()):
329
- if parent not in reached:
330
- reached.add(parent)
331
- frontier.append(parent)
332
- reach[login] = reached
333
- privileges = set(privileges)
334
- while True:
335
- writes = {}
336
- for name, schema, table, allowed in privileges:
337
- if allowed:
338
- writes.setdefault(name, set()).add(key(schema, table))
339
- effective = {
340
- login: set().union(*(writes.get(name, ()) for name in reached))
341
- for login, reached in reach.items()
342
- }
343
- denied = {
344
- entry
345
- for entry in privileges
346
- if entry[3]
347
- and any(
348
- entry[0] in reached
349
- and not cascades.get(key(*entry[1:3]), set()) <= effective[login]
350
- for login, reached in reach.items()
351
- )
352
- }
353
- if not denied:
354
- return privileges
355
- privileges = (privileges - denied) | {(*entry[:3], False) for entry in denied}
356
-
357
-
358
301
  def install_session_security(session, resolver):
359
302
  """Attach the runtime resolver to a catalog unit of work, not to global auth."""
360
303
  session.info["sql_security_resolver"] = resolver
@@ -319,17 +319,6 @@ class MySQLCatalog(HostedCatalog):
319
319
  ).scalar()
320
320
  if trigger:
321
321
  raise SQLExecutionError(code="triggered_sql_write_unsupported")
322
- affected = connection.execute(
323
- sa.text(
324
- "SELECT CONSTRAINT_SCHEMA, TABLE_NAME "
325
- "FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE UNIQUE_CONSTRAINT_SCHEMA=:schema "
326
- "AND REFERENCED_TABLE_NAME=:table AND (DELETE_RULE IN ('CASCADE','SET NULL') "
327
- "OR UPDATE_RULE IN ('CASCADE','SET NULL'))"
328
- ),
329
- {"schema": schema, "table": table},
330
- ).all()
331
- if any((s, n) not in writable for s, n in affected):
332
- raise SQLExecutionError(code="unscoped_cascade_denied")
333
322
 
334
323
 
335
324
  class MSSQLCatalog(HostedCatalog):
@@ -492,15 +481,3 @@ class MSSQLCatalog(HostedCatalog):
492
481
  {"uid": row.object_id},
493
482
  ).scalar():
494
483
  raise SQLExecutionError(code="triggered_sql_write_unsupported")
495
- affected = connection.execute(
496
- sa.text(
497
- "SELECT s.name, t.name FROM sys.foreign_keys f "
498
- "JOIN sys.tables t ON t.object_id=f.parent_object_id JOIN sys.schemas s ON s.schema_id=t.schema_id "
499
- "WHERE f.referenced_object_id=:uid AND (f.delete_referential_action>0 OR f.update_referential_action>0)"
500
- ),
501
- {"uid": row.object_id},
502
- ).all()
503
- if any(
504
- (s, n) not in writable and ("public", n) not in writable for s, n in affected
505
- ):
506
- raise SQLExecutionError(code="unscoped_cascade_denied")
@@ -57,13 +57,11 @@ class HostedAccess(DatabaseAccess):
57
57
  self.backend.tables.relations.validate_runtime_view(connection, schema, table.physical_table_name)
58
58
  return False
59
59
  # Existing adapter inspection runs once here, never during caller SQL.
60
- # Cascade targets are in scope: plan() narrows write to callers who can write them.
61
- relation = (schema, table.physical_table_name)
62
60
  try:
63
61
  self.backend.catalog.validate_relations(
64
62
  connection,
65
- {relation},
66
- {relation} | {target[:2] for target in self.cascade_targets(connection, table)},
63
+ {(schema, table.physical_table_name)},
64
+ {(schema, table.physical_table_name)},
67
65
  )
68
66
  except SQLExecutionError as exc:
69
67
  if exc.code == "triggered_sql_write_unsupported":
@@ -75,10 +75,6 @@ class SQLiteAccess(DatabaseAccess):
75
75
  )
76
76
  return targets
77
77
 
78
- def relation_key(self, schema, table):
79
- # One database; the authorizer matches table names only.
80
- return table
81
-
82
78
  def apply(self, session, desired, previous):
83
79
  # The immutable grant snapshot is installed on each dedicated connection.
84
80
  return None
@@ -1,4 +1,4 @@
1
- """Record cascade targets so write grants follow foreign-key actions (ADR 0007)."""
1
+ """Record each table's cascade targets for the impact pre-flight (ADR 0016)."""
2
2
 
3
3
  import sqlalchemy as sa
4
4
  from alembic import op
@@ -13,7 +13,6 @@ from uuid import UUID
13
13
  from sqlalchemy import select
14
14
  from sqlalchemy.orm import Session
15
15
 
16
- from metatables.api.backend.backends.access import restrict_cascading_writes
17
16
  from metatables.api.backend.domain.catalog_rules import CatalogInvariantError
18
17
  from metatables.api.backend.domain.permission_rules import TrustedActorFacts
19
18
  from metatables.api.backend.persistence.grants import GrantRepository
@@ -178,29 +177,13 @@ class _Graph:
178
177
  .where(MetaTable.data_source_uid == root.data_source_uid)
179
178
  )
180
179
  }
181
- self.database_writable = self._database_writable()
182
-
183
- def _database_writable(self):
184
- """The caller's write after cascade narrowing; same rule as plan() (ADR 0007)."""
185
- uids = {policy.table_uid for policy in self.policies.values()}
186
- editable = self.planner._uids(uids, edit=True)
187
- privileges = {
188
- ("caller", key, None, True)
189
- for key, policy in self.policies.items()
180
+ # A table's write is its own grant; foreign keys that reference it never change it.
181
+ editable = self.planner._uids({policy.table_uid for policy in self.policies.values()}, edit=True)
182
+ self.writable = {
183
+ policy.table_uid
184
+ for policy in self.policies.values()
190
185
  if self.read_write and policy.writable and policy.table_uid in editable
191
186
  }
192
- cascades = {
193
- key: {self.key(t["schema"], t["table"]) for t in policy.cascade_targets or ()}
194
- for key, policy in self.policies.items()
195
- }
196
- kept = restrict_cascading_writes(
197
- {"caller": {"login": "caller"}},
198
- [],
199
- privileges,
200
- cascades,
201
- key=lambda key, _: key,
202
- )
203
- return {self.policies[key].table_uid for _, key, _, allowed in kept if allowed}
204
187
 
205
188
  def load(self, uids) -> None:
206
189
  missing = set(uids) - set(self.tables)
@@ -238,7 +221,7 @@ class _Graph:
238
221
  "physical_schema": table.physical_schema,
239
222
  "physical_table_name": table.physical_table_name,
240
223
  "effects": [],
241
- "can_write": table.uid in self.database_writable,
224
+ "can_write": table.uid in self.writable,
242
225
  }
243
226
 
244
227
  def relation(self, schema: str, table: str, effect: str) -> str:
@@ -310,16 +293,10 @@ class _Graph:
310
293
  continue
311
294
  child_key = self.key(target["schema"], target["table"])
312
295
  row_effect = "delete" if effect == "cascade_delete" else "update"
296
+ # The referencing table's own foreign key authorizes these effects.
313
297
  child = self.policies.get(child_key)
314
298
  if child is None:
315
299
  child_id = self.relation(target["schema"], target["table"], row_effect)
316
- self.blockers.append(
317
- Blocker(
318
- "cascade_target_unregistered",
319
- "A foreign-key action modifies a table MetaTables does not manage.",
320
- child_id,
321
- )
322
- )
323
300
  else:
324
301
  affected.add(child.table_uid)
325
302
  child_id = self.table(child.table_uid, row_effect)
@@ -346,27 +323,13 @@ class _Graph:
346
323
  edge = self._edge(key.source_table_uid, key.target_table_uid, "foreign_key", "restrict")
347
324
  edge.update(name=key.name, on_delete=key.on_delete)
348
325
  self.edges.append(edge)
349
- editable = self.planner._uids(affected, edit=True)
350
- for uid in sorted(affected, key=str):
351
- node_id = self.table(uid)
352
- policy = policies.get(uid)
353
- if uid not in editable:
354
- code, message = "table_not_writable", "You cannot write an affected table."
355
- elif policy is None or not policy.writable:
356
- code, message = "writes_unsupported", "An affected table does not accept writes."
357
- elif uid not in self.database_writable and uid != self.root.uid:
358
- code, message = "cascade_target_not_writable", "A cascade reaches a table you cannot write."
359
- else:
360
- continue
361
- self.blockers.append(Blocker(code, message, node_id))
362
- if self.root.uid not in self.database_writable and not self.blockers:
363
- # Write is all-or-nothing: another action of this table's keys may reach further.
326
+ if not self.planner._uids({self.root.uid}, edit=True):
364
327
  self.blockers.append(
365
- Blocker(
366
- "cascade_target_not_writable",
367
- "Another foreign-key action on this table reaches a table you cannot write.",
368
- root_id,
369
- )
328
+ Blocker("table_not_writable", "You cannot write this table.", root_id)
329
+ )
330
+ elif root_policy is None or not root_policy.writable:
331
+ self.blockers.append(
332
+ Blocker("writes_unsupported", "This table does not accept writes.", root_id)
370
333
  )
371
334
 
372
335
  def readers(self) -> None:
@@ -105,7 +105,7 @@ class SQLTablePolicy(Base):
105
105
  table_name: Mapped[str] = mapped_column(String(255), nullable=False)
106
106
  writable: Mapped[bool] = mapped_column(Boolean, nullable=False)
107
107
  # {schema, table, on_delete, on_update} per foreign key whose actions modify
108
- # another table; see restrict_cascading_writes and the impact pre-flight.
108
+ # another table; read by the impact pre-flight (ADR 0016).
109
109
  cascade_targets: Mapped[list | None] = mapped_column(JSON, default=list)
110
110
 
111
111
 
@@ -1138,7 +1138,7 @@ class MetaTableImpactNode(BasePydanticModel):
1138
1138
  )
1139
1139
  can_write: bool | None = Field(
1140
1140
  default=None,
1141
- description="The caller's effective write, after cascade narrowing; None for updates.",
1141
+ description="Whether the caller may write this table; None for updates.",
1142
1142
  )
1143
1143
 
1144
1144