matrx-orm 3.1.135__tar.gz → 3.1.136__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 (365) hide show
  1. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/CLAUDE.md +1 -0
  2. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/PKG-INFO +2 -2
  3. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/__init__.py +8 -0
  4. matrx_orm-3.1.136/matrx_orm/core/session_context.py +94 -0
  5. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/transaction.py +17 -0
  6. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/loader.py +9 -8
  7. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/common.py +16 -5
  8. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/package_wiring.py +10 -8
  9. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/runner.py +13 -3
  10. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/pyproject.toml +2 -2
  11. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/.gitignore +0 -0
  12. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/AGENTS.md +0 -0
  13. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/BASE_CLASS_METHODS.md +0 -0
  14. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/MODEL_API.md +0 -0
  15. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/README.md +0 -0
  16. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/database/orm/extended/managers/ai_model_base.py +0 -0
  17. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/docs/migrations.md +0 -0
  18. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/FEATURE.md +0 -0
  19. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/MODULE_README.md +0 -0
  20. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/MODULE_README.md +0 -0
  21. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/__init__.py +0 -0
  22. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/async_postgresql.py +0 -0
  23. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/base_adapter.py +0 -0
  24. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/postgresql.py +0 -0
  25. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
  26. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/supabase_adapter.py +0 -0
  27. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/admin/FEATURE.md +0 -0
  28. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/admin/__init__.py +0 -0
  29. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/admin/router.py +0 -0
  30. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/__init__.py +0 -0
  31. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/auth.py +0 -0
  32. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/config.py +0 -0
  33. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/handlers.py +0 -0
  34. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/protocol.py +0 -0
  35. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/server.py +0 -0
  36. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/associations.py +0 -0
  37. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/cache_debug.py +0 -0
  38. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/catalog.py +0 -0
  39. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/catalog_sql.py +0 -0
  40. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/MODULE_README.md +0 -0
  41. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/__init__.py +0 -0
  42. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/postgres_connection.py +0 -0
  43. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/postgrest.py +0 -0
  44. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/supabase_auth.py +0 -0
  45. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/supabase_config.py +0 -0
  46. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/supabase_manager.py +0 -0
  47. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/EXTENDED-TASK.md +0 -0
  48. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/FEATURE.md +0 -0
  49. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/MODULE_README.md +0 -0
  50. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
  51. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/TASKS.md +0 -0
  52. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/__init__.py +0 -0
  53. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/async_db_manager.py +0 -0
  54. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/base.py +0 -0
  55. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/config.py +0 -0
  56. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/connections.py +0 -0
  57. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/db_function.py +0 -0
  58. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/diagnostics.py +0 -0
  59. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/expressions.py +0 -0
  60. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/extended.py +0 -0
  61. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/fields.py +0 -0
  62. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/introspection.py +0 -0
  63. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/listen.py +0 -0
  64. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/loop_filters.py +0 -0
  65. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/model_dto.py +0 -0
  66. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/model_view.py +0 -0
  67. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/one_database.py +0 -0
  68. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/paginator.py +0 -0
  69. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/pool_maintenance.py +0 -0
  70. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/pool_watch.py +0 -0
  71. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/pooler_role.py +0 -0
  72. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/pydantic_bridge.py +0 -0
  73. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/registry.py +0 -0
  74. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/relations.py +0 -0
  75. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/resilience.py +0 -0
  76. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/rls_session.py +0 -0
  77. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/signals.py +0 -0
  78. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/tls.py +0 -0
  79. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/types.py +0 -0
  80. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/write_queue.py +0 -0
  81. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/entity.py +0 -0
  82. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/error_handling.py +0 -0
  83. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/exceptions.py +0 -0
  84. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/extended/__init__.py +0 -0
  85. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/extended/app_error_handler.py +0 -0
  86. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/identity_rule.py +0 -0
  87. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/local_sqlite.py +0 -0
  88. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/middleware/__init__.py +0 -0
  89. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/middleware/base.py +0 -0
  90. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/MODULE_README.md +0 -0
  91. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/__init__.py +0 -0
  92. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/cli.py +0 -0
  93. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/ddl.py +0 -0
  94. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/diff.py +0 -0
  95. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/executor.py +0 -0
  96. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/integration.py +0 -0
  97. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/operations.py +0 -0
  98. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/state.py +0 -0
  99. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/table_filter.py +0 -0
  100. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/FEATURE.md +0 -0
  101. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/MODULE_README.md +0 -0
  102. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/__init__.py +0 -0
  103. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/bulk_update_values.py +0 -0
  104. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/catalog_select.py +0 -0
  105. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/conflict.py +0 -0
  106. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/conflict_writes.py +0 -0
  107. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/create.py +0 -0
  108. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/db_functions.py +0 -0
  109. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/delete.py +0 -0
  110. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/dynamic_admin.py +0 -0
  111. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/dynamic_crud.py +0 -0
  112. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/graph_walk.py +0 -0
  113. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/latest_rows.py +0 -0
  114. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/queue_claim.py +0 -0
  115. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/read.py +0 -0
  116. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/relational_backfill.py +0 -0
  117. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/staging_load.py +0 -0
  118. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/update.py +0 -0
  119. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/platform_access.py +0 -0
  120. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/platform_db.py +0 -0
  121. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/py.typed +0 -0
  122. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/pytest_plugin.py +0 -0
  123. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/MODULE_README.md +0 -0
  124. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/__init__.py +0 -0
  125. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/db_objects.py +0 -0
  126. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
  127. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
  128. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/FEATURE.md +0 -0
  129. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/MODULE_README.md +0 -0
  130. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/__init__.py +0 -0
  131. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/builder.py +0 -0
  132. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/executor.py +0 -0
  133. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/FEATURE.md +0 -0
  134. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/MODULE_README.md +0 -0
  135. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/__init__.py +0 -0
  136. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/code_handler.py +0 -0
  137. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/codegen_writer.py +0 -0
  138. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/columns.py +0 -0
  139. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/diff_preview.py +0 -0
  140. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
  141. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/generator.py +0 -0
  142. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
  143. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
  144. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
  145. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
  146. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/relationships.py +0 -0
  147. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/schema.py +0 -0
  148. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/schema_manager.py +0 -0
  149. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/tables.py +0 -0
  150. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/views.py +0 -0
  151. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/FEATURE.md +0 -0
  152. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/__init__.py +0 -0
  153. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/attachments.py +0 -0
  154. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/crypto.py +0 -0
  155. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/host_authorization.py +0 -0
  156. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/items.py +0 -0
  157. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/model.py +0 -0
  158. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/org_service.py +0 -0
  159. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/service.py +0 -0
  160. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/README.md +0 -0
  161. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/__init__.py +0 -0
  162. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/coalesce.py +0 -0
  163. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/dag.py +0 -0
  164. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/errors.py +0 -0
  165. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/fallback.py +0 -0
  166. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/flush.py +0 -0
  167. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/lifecycle.py +0 -0
  168. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/managed.py +0 -0
  169. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/op.py +0 -0
  170. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/reads.py +0 -0
  171. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/session.py +0 -0
  172. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/telemetry.py +0 -0
  173. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/MODULE_README.md +0 -0
  174. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/__init__.py +0 -0
  175. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/executor.py +0 -0
  176. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/queries.py +0 -0
  177. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/registry.py +0 -0
  178. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/types.py +0 -0
  179. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/utils.py +0 -0
  180. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/state.py +0 -0
  181. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/utils/__init__.py +0 -0
  182. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/utils/sql_utils.py +0 -0
  183. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/utils/type_converters.py +0 -0
  184. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/scripts/git-branches.sh +0 -0
  185. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/scripts/publish.sh +0 -0
  186. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/scripts/release.sh +0 -0
  187. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/MODULE_README.md +0 -0
  188. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/__init__.py +0 -0
  189. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/conftest.py +0 -0
  190. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/MODULE_README.md +0 -0
  191. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/__init__.py +0 -0
  192. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_adapter_registry.py +0 -0
  193. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_admin_db_columns.py +0 -0
  194. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_admin_response_rendering.py +0 -0
  195. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_admin_search_negation.py +0 -0
  196. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_admin_search_sentinels.py +0 -0
  197. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_advisory_lock.py +0 -0
  198. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_agent_message.py +0 -0
  199. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_api_auth.py +0 -0
  200. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_api_config.py +0 -0
  201. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_api_handlers.py +0 -0
  202. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_api_protocol.py +0 -0
  203. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_array_agg_order_by.py +0 -0
  204. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_associations.py +0 -0
  205. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_associations_wiring.py +0 -0
  206. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_bulk_hydration_offload.py +0 -0
  207. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_bulk_update_by_pk.py +0 -0
  208. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
  209. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_cache_debug.py +0 -0
  210. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_call_function.py +0 -0
  211. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_case_when.py +0 -0
  212. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_catalog.py +0 -0
  213. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_composite_pk_filter.py +0 -0
  214. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_composite_pk_write_paths.py +0 -0
  215. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_config.py +0 -0
  216. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_conflict_target.py +0 -0
  217. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_conflict_writes.py +0 -0
  218. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_connection_codecs.py +0 -0
  219. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_connection_poison_guard.py +0 -0
  220. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_connection_primitives.py +0 -0
  221. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_count_composite_distinct.py +0 -0
  222. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_db_function_field.py +0 -0
  223. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_ddl_generator.py +0 -0
  224. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_derived_table.py +0 -0
  225. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_dirty_tracking.py +0 -0
  226. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_dynamic_crud.py +0 -0
  227. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_exceptions.py +0 -0
  228. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
  229. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_expression_primitives.py +0 -0
  230. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_fields.py +0 -0
  231. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
  232. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_from_alias.py +0 -0
  233. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_fts.py +0 -0
  234. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_func_expression_args.py +0 -0
  235. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_graph_walk.py +0 -0
  236. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_having_annotate_alias.py +0 -0
  237. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
  238. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_introspect_rls_policies.py +0 -0
  239. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_join_and_aggregate.py +0 -0
  240. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_latest_rows.py +0 -0
  241. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_listen_notify.py +0 -0
  242. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_local_sqlite.py +0 -0
  243. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_managed_write_guard.py +0 -0
  244. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_matrx_entity.py +0 -0
  245. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_migration_diff_types.py +0 -0
  246. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_migration_loader.py +0 -0
  247. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_model_instance.py +0 -0
  248. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_model_meta.py +0 -0
  249. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_optimistic_concurrency.py +0 -0
  250. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_order_by_expression.py +0 -0
  251. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_parameter_name_hydration.py +0 -0
  252. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_patch_jsonb_path.py +0 -0
  253. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_persisted_count.py +0 -0
  254. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_pool_holder_census.py +0 -0
  255. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_pool_loop_recreation.py +0 -0
  256. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_pool_maintenance.py +0 -0
  257. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_postgrest_filters.py +0 -0
  258. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_pydantic_bridge.py +0 -0
  259. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_query_builder.py +0 -0
  260. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_query_error_detail.py +0 -0
  261. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_query_executor_sql.py +0 -0
  262. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_query_timeout.py +0 -0
  263. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
  264. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_queue_claim.py +0 -0
  265. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_read_connection_retry.py +0 -0
  266. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_registry.py +0 -0
  267. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_registry_multi_database.py +0 -0
  268. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_registry_multi_schema.py +0 -0
  269. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_relational_backfill.py +0 -0
  270. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_relations.py +0 -0
  271. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_resilience.py +0 -0
  272. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_rls_session_scope.py +0 -0
  273. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_schema_exists.py +0 -0
  274. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_session_advisory_lock.py +0 -0
  275. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_state_cache.py +0 -0
  276. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_subquery_filter_raw.py +0 -0
  277. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_subquery_in_filter.py +0 -0
  278. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_subquery_nested_expressions.py +0 -0
  279. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_supabase_auth.py +0 -0
  280. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_supabase_config.py +0 -0
  281. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_tls.py +0 -0
  282. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_typed_join_projection.py +0 -0
  283. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_typed_predicates.py +0 -0
  284. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_update_case_expression.py +0 -0
  285. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_update_subquery.py +0 -0
  286. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_update_with_rebase.py +0 -0
  287. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_upsert_default_leak.py +0 -0
  288. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_upsert_with_conflict.py +0 -0
  289. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_values_jsonb_decode.py +0 -0
  290. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_watched_lifecycle.py +0 -0
  291. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_write_queue_deadline.py +0 -0
  292. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_write_retry_semantics.py +0 -0
  293. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/MODULE_README.md +0 -0
  294. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/__init__.py +0 -0
  295. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/conftest.py +0 -0
  296. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_bulk_ops.py +0 -0
  297. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_cache_integration.py +0 -0
  298. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_crud.py +0 -0
  299. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_foreign_keys.py +0 -0
  300. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_m2m.py +0 -0
  301. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_manager.py +0 -0
  302. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_migrations_live.py +0 -0
  303. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_query_execution.py +0 -0
  304. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_schema_diff.py +0 -0
  305. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/live_pooler_role.py +0 -0
  306. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/.env.example +0 -0
  307. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/README.md +0 -0
  308. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/__init__.py +0 -0
  309. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/generate.py +0 -0
  310. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/generated/.gitkeep +0 -0
  311. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/matrx_orm.yaml +0 -0
  312. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/test_schema_generation.py +0 -0
  313. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/.env.example +0 -0
  314. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/README.md +0 -0
  315. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/__init__.py +0 -0
  316. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/client_example.py +0 -0
  317. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/client_example.ts +0 -0
  318. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/client_supabase_example.py +0 -0
  319. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/server.py +0 -0
  320. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/entity_tests.py +0 -0
  321. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_base_generation.py +0 -0
  322. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_composite_pk_fk_generation.py +0 -0
  323. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_composite_unique_generation.py +0 -0
  324. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_dto_identity_generation.py +0 -0
  325. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_entity_capability_generation.py +0 -0
  326. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_enum_ordering.py +0 -0
  327. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_generate_schema.py +0 -0
  328. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_junction_analysis.py +0 -0
  329. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_multi_schema_output.py +0 -0
  330. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_schema_analysis.py +0 -0
  331. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_sql_expression_defaults.py +0 -0
  332. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_table_relationships_query.py +0 -0
  333. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_view_generation.py +0 -0
  334. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema_builder/test_array_default_parsing.py +0 -0
  335. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema_builder/test_focused_generation_plan.py +0 -0
  336. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema_builder/test_host_models_aggregator.py +0 -0
  337. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/__init__.py +0 -0
  338. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/conftest.py +0 -0
  339. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_cache_no_downgrade.py +0 -0
  340. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_capture_poison_proof.py +0 -0
  341. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_coalesce.py +0 -0
  342. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_dag.py +0 -0
  343. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_disk_spill_fallback.py +0 -0
  344. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_flush_individual_fallback.py +0 -0
  345. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_governed_write.py +0 -0
  346. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_managed.py +0 -0
  347. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_op_enqueue_site.py +0 -0
  348. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_reads.py +0 -0
  349. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_record_error_bounded_insert.py +0 -0
  350. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_record_error_storm.py +0 -0
  351. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_session.py +0 -0
  352. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_spill_guard_plugin.py +0 -0
  353. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_array_arg_element_type.py +0 -0
  354. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_database_name_alias.py +0 -0
  355. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_db_functions.py +0 -0
  356. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_dynamic_select_unregistered.py +0 -0
  357. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_keyed_digest.py +0 -0
  358. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_model_cls_refactor.py +0 -0
  359. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_no_blocking_asyncpg_tls.py +0 -0
  360. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_one_database.py +0 -0
  361. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_pooler_role_guard.py +0 -0
  362. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_secrets_battery.py +0 -0
  363. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_secrets_minting_keys.py +0 -0
  364. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_sql_param_casts.py +0 -0
  365. {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_sync_twins_guard.py +0 -0
@@ -52,6 +52,7 @@ Every table that becomes a Model needs row identity: a single-column primary key
52
52
  - **Schema builder** (`matrx_orm.schema_builder`): code generation for Python + TypeScript type definitions from the DB schema. Postgres **VIEWs** are emitted as **read-only `Model` classes** into the same schema models file (on by default; per-entry `output.include_views: false` opts a schema out, `output.exclude_views: [...]` skips individual views). View models get no manager/DTO/base-class/auto_config (views are not writable), synthesize `_primary_keys` from an `id` column (else the first column, for cache-key/`load_by_id` only), and emit plain typed fields with **no `ForeignKey`** (views carry no FK metadata — nothing cross-schema to resolve). Never hand-write a view model again.
53
53
  - **Secrets battery** (`matrx_orm.secrets_battery`): the ONE canonical user-credential vault — `users.user_secrets` CRUD + the platform's single Fernet primitive, keyed by `CREDENTIALS_ENCRYPTION_KEY`. Any package: `configure_secrets(db_config_name=...)` once, then `await require_user_secret(user_id, key)`. No package ever calls another service to resolve a credential. Contract: [`matrx_orm/secrets_battery/FEATURE.md`](matrx_orm/secrets_battery/FEATURE.md).
54
54
  - **Polymorphic associations** (`matrx_orm.associations`): `EntityRegistry` (token→Model) + `Associations` — a registry-driven, **access-gated** edge engine over a host's polymorphic edge table. Every `source→target` hop is org-scoped *and* each resolved endpoint is re-authorized against the ACTOR (fail-closed, screams on a genuine leak), so a hop can't widen access past what the actor may reach. 🚨 **The gate is `access_check` (wire `matrx_orm.platform_access_check` → `iam.has_access_for`), NEVER an org-column comparison** — a person belongs to several orgs on purpose, so org-equality denies her own data across her own workspaces (2026-08-30 incident) while granting any co-member of a private row. The edge's `org_id` is a TENANCY stamp, not a permission. Org-equality survives only for UNATTENDED writes (no actor) as an integrity guard, and **system vocabulary is exempt entirely** (existence still required): a model generated with `_rls_variant="system"` is platform-shared dictionary data (seo.keyword/topic) every tenant legitimately links to. Hardcodes no table names — the host wires its own edge + token-registry models.
55
+ - **The host's declared session context** (`matrx_orm.core.session_context`): `configure_session_context(provider)` once at startup, and every **top-level** `transaction()` — including the one `rls_session` opens, before it drops to the restricted role — emits whatever the provider returns as transaction-local GUCs. This is how an application-level declaration reaches Postgres at all: a GUC set outside a transaction has no meaning, so the BEGIN is the only place it can land. aidream wires it to its provenance declaration (`app.actor_tier` / `app.actor_system`, read by `platform.actor_tier()`, the history capture and the tier rule). A nested entry is a savepoint inside a transaction that already carries them and emits nothing — and a write made **outside** any transaction carries no declaration at all, which is why a single-row write that must record its author still opens one. No provider configured ⇒ no GUCs (standalone behaviour unchanged); a provider that raises fails the transaction loudly rather than committing rows with a false provenance.
55
56
  - **The platform access policy** (`matrx_orm.platform_access`): `platform_access_check(actor, token, id, level)` → `iam.has_access_for`. The ONE answer to "may this actor touch this row?", shared with RLS and the file-access gate. Fails closed. Never re-derive it from `organization_id` or `created_by` — both are strict subsets that deny legitimate access.
56
57
 
57
58
  Public API is defined explicitly in `matrx_orm/__init__.py` (100+ exports). Treat changes there as semver-breaking.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: matrx-orm
3
- Version: 3.1.135
3
+ Version: 3.1.136
4
4
  Summary: Async-first PostgreSQL ORM with bidirectional migrations, schema introspection, many-to-many relationships, and built-in state caching
5
5
  Project-URL: Homepage, https://github.com/AI-Matrix-Engine/aidream-current
6
6
  Project-URL: Repository, https://github.com/AI-Matrix-Engine/aidream-current
@@ -25,7 +25,7 @@ Requires-Python: >=3.13
25
25
  Requires-Dist: asyncpg>=0.31.0
26
26
  Requires-Dist: cryptography>=43.0
27
27
  Requires-Dist: gitpython>=3.1.40
28
- Requires-Dist: matrx-utils>=2.0.35
28
+ Requires-Dist: matrx-utils>=2.0.36
29
29
  Requires-Dist: psycopg-pool>=3.2.5
30
30
  Requires-Dist: psycopg[binary]>=3.2.5
31
31
  Requires-Dist: python-dotenv>=1.0
@@ -240,6 +240,11 @@ from .core.registry import (
240
240
  )
241
241
  from .core.relations import ManyToManyField
242
242
  from .core.rls_session import rls_session
243
+ from .core.session_context import (
244
+ SessionContextProvider,
245
+ configure_session_context,
246
+ session_context_gucs,
247
+ )
243
248
  from .core.signals import (
244
249
  Signal,
245
250
  post_create,
@@ -632,6 +637,9 @@ __all__ = [
632
637
  "transaction",
633
638
  "acquire_connection",
634
639
  "set_local_guc",
640
+ "SessionContextProvider",
641
+ "configure_session_context",
642
+ "session_context_gucs",
635
643
  "advisory_xact_lock",
636
644
  "try_advisory_xact_lock",
637
645
  "advisory_lock",
@@ -0,0 +1,94 @@
1
+ """The host's DECLARED session context — GUCs every transaction opens with.
2
+
3
+ Some facts about a block of work are known by the application and readable only
4
+ by the database: *which tier of actor* is authoring these writes, for instance.
5
+ Postgres learns them through transaction-local GUCs (``set_config(..., true)``),
6
+ and a GUC set outside a transaction has no meaning — so the ONE place that can
7
+ reliably apply them is the moment this package opens a transaction.
8
+
9
+ The host declares a provider once at startup::
10
+
11
+ from matrx_orm import configure_session_context
12
+ configure_session_context(lambda: {"app.actor_tier": "ai", "app.actor_system": "x"})
13
+
14
+ and from then on every TOP-LEVEL ``transaction()`` (which includes the one
15
+ ``rls_session`` opens, before it drops to the restricted role) emits whatever
16
+ the provider returns at that instant. A savepoint (nested transaction) emits
17
+ nothing: it is already inside the transaction the GUCs were set on.
18
+
19
+ Why a provider and not a value: what is true changes per task — the provider is
20
+ normally a ContextVar read, so a block that declares "an AI is writing this"
21
+ affects exactly the work inside it and nothing running beside it.
22
+
23
+ The package NEVER imports the host: no provider configured ⇒ no GUCs, which is
24
+ exactly how matrx-orm behaves standalone. A provider that raises is a host bug
25
+ and it surfaces — the transaction fails loudly rather than silently committing
26
+ writes whose provenance is a lie.
27
+ """
28
+
29
+ from __future__ import annotations
30
+
31
+ import re
32
+ from collections.abc import Callable, Mapping
33
+ from typing import Any
34
+
35
+ # Same shape matrx_orm.core.transaction.set_local_guc accepts.
36
+ _GUC_NAME_RE = re.compile(r"^[a-z_][a-z0-9_.]*$")
37
+
38
+ SessionContextProvider = Callable[[], Mapping[str, str] | None]
39
+
40
+ _provider: SessionContextProvider | None = None
41
+
42
+
43
+ def configure_session_context(provider: SessionContextProvider | None) -> None:
44
+ """Bind (or with ``None``, unbind) the host's session-context provider.
45
+
46
+ Call once at startup, alongside the other package ``configure_*`` calls.
47
+ ``provider`` is invoked on every top-level transaction open and must return
48
+ a mapping of GUC name → value (or ``None`` / ``{}`` for "nothing to say").
49
+ """
50
+ global _provider
51
+ if provider is not None and not callable(provider):
52
+ raise TypeError("configure_session_context(provider) requires a callable or None")
53
+ _provider = provider
54
+
55
+
56
+ def session_context_gucs() -> dict[str, str]:
57
+ """The GUCs to set on a transaction being opened right now.
58
+
59
+ Empty when no provider is configured. Raises when a configured provider
60
+ returns something unusable — a malformed declaration is a host defect, and
61
+ writing rows with a wrong (or absent) provenance stamp is worse than a loud
62
+ failure at BEGIN.
63
+ """
64
+ provider = _provider
65
+ if provider is None:
66
+ return {}
67
+ declared = provider()
68
+ if not declared:
69
+ return {}
70
+ if not isinstance(declared, Mapping):
71
+ raise TypeError(
72
+ "the session-context provider must return a mapping of GUC name → value; "
73
+ f"got {type(declared).__name__}"
74
+ )
75
+ out: dict[str, str] = {}
76
+ for name, value in declared.items():
77
+ if not isinstance(name, str) or not _GUC_NAME_RE.match(name):
78
+ raise ValueError(f"invalid session-context GUC name: {name!r}")
79
+ out[name] = "" if value is None else str(value)
80
+ return out
81
+
82
+
83
+ async def apply_session_context(connection: Any) -> None:
84
+ """Emit the declared GUCs on ``connection`` (already inside a BEGIN)."""
85
+ for name, value in session_context_gucs().items():
86
+ await connection.execute("SELECT set_config($1, $2, true)", name, value)
87
+
88
+
89
+ __all__ = [
90
+ "SessionContextProvider",
91
+ "apply_session_context",
92
+ "configure_session_context",
93
+ "session_context_gucs",
94
+ ]
@@ -249,6 +249,23 @@ class TransactionContext:
249
249
  ) from e
250
250
  self._conn_token = _active_connection.set(conn)
251
251
  self._depth_token = _savepoint_depth.set(0)
252
+ # THE HOST'S DECLARED SESSION CONTEXT (provenance and friends). A
253
+ # transaction-local GUC only has meaning inside a transaction, so
254
+ # this — the moment one opens — is the only place a declaration made
255
+ # in application code can reach Postgres. Set while still the
256
+ # privileged role: `rls_session` opens through here and drops to the
257
+ # restricted role afterwards. Nested entries are savepoints inside a
258
+ # transaction that already carries them, so they emit nothing.
259
+ from matrx_orm.core.session_context import apply_session_context
260
+
261
+ try:
262
+ await apply_session_context(conn)
263
+ except Exception as e:
264
+ await self.__aexit__(type(e), e, e.__traceback__)
265
+ raise DatabaseError(
266
+ message=f"Failed to apply the declared session context: {e}",
267
+ details={"database": self.database},
268
+ ) from e
252
269
  return self
253
270
 
254
271
  async def __aexit__(
@@ -2,7 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import importlib.util
6
5
  import re
7
6
  from dataclasses import dataclass
8
7
  from pathlib import Path
@@ -124,15 +123,17 @@ class MigrationLoader:
124
123
 
125
124
  def _load_module(self, filepath: Path, name: str) -> Any:
126
125
  """Dynamically import a migration file as a module."""
127
- spec = importlib.util.spec_from_file_location(f"matrx_migrations.{name}", filepath)
128
- if spec is None or spec.loader is None:
126
+ from matrx_utils.module_loading import ProviderModuleRefused, load_module_from_path
127
+
128
+ # Only "no such file" / "refused" become MigrationError; an error the
129
+ # migration raises while executing propagates raw, exactly as before.
130
+ try:
131
+ return load_module_from_path(filepath, module_name=f"matrx_migrations.{name}")
132
+ except (FileNotFoundError, ProviderModuleRefused) as exc:
129
133
  raise MigrationError(
130
134
  migration=name,
131
- original_error=f"Could not load migration file: {filepath}",
132
- )
133
- module = importlib.util.module_from_spec(spec)
134
- spec.loader.exec_module(module)
135
- return module
135
+ original_error=f"Could not load migration file: {filepath} ({exc})",
136
+ ) from exc
136
137
 
137
138
  def _validate_graph(self) -> None:
138
139
  """Ensure all declared dependencies exist."""
@@ -117,15 +117,26 @@ class GenerationOutputOverrides:
117
117
 
118
118
 
119
119
  # Central debug configuration for the entire schema builder.
120
- # Values can be overridden at runtime by run_schema_generation() from the yaml
121
- # debug section, or by setting env vars MATRX_DEBUG, MATRX_VERBOSE, MATRX_INFO.
120
+ #
121
+ # Values are set at runtime by run_schema_generation(), from its `info=` /
122
+ # `debug=` / `verbose=` arguments when given and otherwise from the yaml `debug`
123
+ # section. The defaults below are OFF, which is what every deployed and local
124
+ # run already produced: run_schema_generation() has always overwritten all three
125
+ # unconditionally, so the retired env vars could only ever have spoken to a
126
+ # direct importer.
127
+ #
128
+ # They were MATRX_INFO / MATRX_DEBUG / MATRX_VERBOSE until 2026-09-11. USD-5
129
+ # (Arman, 2026-09-10): "Never an env var. Env values are only for secrets, not
130
+ # for controlling behavior." Those three names are also generic enough to be set
131
+ # in a shell for something else entirely and silently turn a code generator
132
+ # chatty — the exact machine-disagrees-with-machine failure the law names.
122
133
  DEBUG_CONFIG = {
123
134
  "tables": [],
124
135
  "columns": [],
125
136
  "base_type": [],
126
- "info": os.getenv("MATRX_INFO", "").lower() in ("1", "true"),
127
- "debug": os.getenv("MATRX_DEBUG", "").lower() in ("1", "true"),
128
- "verbose": os.getenv("MATRX_VERBOSE", "").lower() in ("1", "true"),
137
+ "info": False,
138
+ "debug": False,
139
+ "verbose": False,
129
140
  }
130
141
 
131
142
  # Names a generated model class can NEVER take, because the models file imports
@@ -41,7 +41,6 @@ Manifest schema (``DB_REQUIREMENTS`` dict in the package's manifest file):
41
41
  from __future__ import annotations
42
42
 
43
43
  import ast
44
- import importlib.util
45
44
  import os
46
45
  import re
47
46
  from dataclasses import dataclass, field
@@ -149,13 +148,16 @@ def _load_manifest(manifest_abs: Path) -> dict[str, Any]:
149
148
  import) so no package __init__ side effects run during generation."""
150
149
  if not manifest_abs.is_file():
151
150
  raise PackageWiringError(f"package_wiring: manifest not found: {manifest_abs}")
152
- spec = importlib.util.spec_from_file_location(
153
- f"_pkg_wiring_manifest_{manifest_abs.stem}", manifest_abs
154
- )
155
- if spec is None or spec.loader is None:
156
- raise PackageWiringError(f"package_wiring: cannot load manifest: {manifest_abs}")
157
- mod = importlib.util.module_from_spec(spec)
158
- spec.loader.exec_module(mod)
151
+ from matrx_utils.module_loading import ProviderModuleRefused, load_module_from_path
152
+
153
+ try:
154
+ mod = load_module_from_path(
155
+ manifest_abs, module_name=f"_pkg_wiring_manifest_{manifest_abs.stem}"
156
+ )
157
+ except (FileNotFoundError, ProviderModuleRefused) as exc:
158
+ raise PackageWiringError(
159
+ f"package_wiring: cannot load manifest: {manifest_abs} ({exc})"
160
+ ) from exc
159
161
  req = getattr(mod, "DB_REQUIREMENTS", None)
160
162
  if not isinstance(req, dict):
161
163
  raise PackageWiringError(
@@ -112,6 +112,9 @@ def run_schema_generation(
112
112
  *,
113
113
  only_schemas: set[str] | None = None,
114
114
  models_only: bool = False,
115
+ info: bool | None = None,
116
+ debug: bool | None = None,
117
+ verbose: bool | None = None,
115
118
  ) -> None:
116
119
  """
117
120
  Read a matrx_orm.yaml config file, register all databases, apply debug
@@ -168,10 +171,17 @@ def run_schema_generation(
168
171
  # -------------------------------------------------------------------------
169
172
  # Debug settings
170
173
  # -------------------------------------------------------------------------
174
+ # An explicit argument wins over the yaml, so a generate.py can expose
175
+ # --info/--debug/--verbose on its own command line for one run without
176
+ # editing the committed config. These were MATRX_INFO/MATRX_DEBUG/
177
+ # MATRX_VERBOSE until 2026-09-11 (USD-5): a caller's argument, never the
178
+ # environment.
171
179
  debug_cfg = cfg.get("debug", {})
172
- DEBUG_CONFIG["info"] = bool(debug_cfg.get("info", False))
173
- DEBUG_CONFIG["debug"] = bool(debug_cfg.get("debug", False))
174
- DEBUG_CONFIG["verbose"] = bool(debug_cfg.get("verbose", False))
180
+ DEBUG_CONFIG["info"] = bool(debug_cfg.get("info", False)) if info is None else info
181
+ DEBUG_CONFIG["debug"] = bool(debug_cfg.get("debug", False)) if debug is None else debug
182
+ DEBUG_CONFIG["verbose"] = (
183
+ bool(debug_cfg.get("verbose", False)) if verbose is None else verbose
184
+ )
175
185
 
176
186
  # -------------------------------------------------------------------------
177
187
  # Output config — all paths come from .env only, never from the yaml.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "matrx-orm"
3
- version = "3.1.135"
3
+ version = "3.1.136"
4
4
  description = "Async-first PostgreSQL ORM with bidirectional migrations, schema introspection, many-to-many relationships, and built-in state caching"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -41,7 +41,7 @@ dependencies = [
41
41
  "gitpython>=3.1.40",
42
42
  "psycopg[binary]>=3.2.5",
43
43
  "psycopg-pool>=3.2.5",
44
- "matrx-utils>=2.0.35",
44
+ "matrx-utils>=2.0.36",
45
45
  "pyyaml>=6.0.3",
46
46
  "python-dotenv>=1.0",
47
47
  "cryptography>=43.0",
File without changes
File without changes
File without changes
File without changes