matrx-orm 3.1.237__tar.gz → 3.1.239__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 (446) hide show
  1. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/.gitignore +5 -0
  2. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/PKG-INFO +2 -2
  3. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/extended.py +41 -4
  4. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/flush.py +20 -11
  5. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/reads.py +51 -7
  6. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/pyproject.toml +2 -2
  7. matrx_orm-3.1.239/tests/level1/test_fetch_on_init_holds_whole_table.py +116 -0
  8. matrx_orm-3.1.239/tests/session/test_a_grouped_update_writes_only_each_rows_own_fields.py +36 -0
  9. matrx_orm-3.1.239/tests/session/test_pending_insert_honors_operator_filters.py +65 -0
  10. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/AGENTS.md +0 -0
  11. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/BASE_CLASS_METHODS.md +0 -0
  12. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/CHANGELOG.md +0 -0
  13. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/CLAUDE.md +0 -0
  14. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/MODEL_API.md +0 -0
  15. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/README.md +0 -0
  16. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/database/orm/extended/managers/ai_model_base.py +0 -0
  17. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/docs/migrations.md +0 -0
  18. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/FEATURE.md +0 -0
  19. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/MODULE_README.md +0 -0
  20. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/__init__.py +0 -0
  21. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/MODULE_README.md +0 -0
  22. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/__init__.py +0 -0
  23. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/async_postgresql.py +0 -0
  24. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/base_adapter.py +0 -0
  25. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
  26. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/supabase_adapter.py +0 -0
  27. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/admin/FEATURE.md +0 -0
  28. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/admin/__init__.py +0 -0
  29. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/admin/router.py +0 -0
  30. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/__init__.py +0 -0
  31. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/auth.py +0 -0
  32. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/config.py +0 -0
  33. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/handlers.py +0 -0
  34. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/protocol.py +0 -0
  35. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/server.py +0 -0
  36. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/associations.py +0 -0
  37. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/cache_debug.py +0 -0
  38. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/catalog.py +0 -0
  39. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/catalog_sql.py +0 -0
  40. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/MODULE_README.md +0 -0
  41. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/__init__.py +0 -0
  42. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/postgres_connection.py +0 -0
  43. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/postgrest.py +0 -0
  44. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/supabase_auth.py +0 -0
  45. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/supabase_config.py +0 -0
  46. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/supabase_manager.py +0 -0
  47. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/EXTENDED-TASK.md +0 -0
  48. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/FEATURE.md +0 -0
  49. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/MODULE_README.md +0 -0
  50. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
  51. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/TASKS.md +0 -0
  52. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/__init__.py +0 -0
  53. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/admin_lane.py +0 -0
  54. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/async_db_manager.py +0 -0
  55. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/base.py +0 -0
  56. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/config.py +0 -0
  57. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/connections.py +0 -0
  58. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/db_function.py +0 -0
  59. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/diagnostics.py +0 -0
  60. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/expressions.py +0 -0
  61. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/fields.py +0 -0
  62. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/foreign_session_state.py +0 -0
  63. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/introspection.py +0 -0
  64. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/listen.py +0 -0
  65. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/loop_filters.py +0 -0
  66. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/model_dto.py +0 -0
  67. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/model_view.py +0 -0
  68. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/one_database.py +0 -0
  69. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/paginator.py +0 -0
  70. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/pool_maintenance.py +0 -0
  71. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/pool_watch.py +0 -0
  72. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/pooler_role.py +0 -0
  73. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/pydantic_bridge.py +0 -0
  74. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/read_write.py +0 -0
  75. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/registry.py +0 -0
  76. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/relations.py +0 -0
  77. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/resilience.py +0 -0
  78. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/rls_session.py +0 -0
  79. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/session_context.py +0 -0
  80. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/signals.py +0 -0
  81. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/statement_ceiling.py +0 -0
  82. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/tls.py +0 -0
  83. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/transaction.py +0 -0
  84. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/types.py +0 -0
  85. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/write_queue.py +0 -0
  86. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/write_retry.py +0 -0
  87. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/entity.py +0 -0
  88. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/error_handling.py +0 -0
  89. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/exceptions.py +0 -0
  90. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/extended/__init__.py +0 -0
  91. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/extended/app_error_handler.py +0 -0
  92. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/identity_rule.py +0 -0
  93. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/local_sqlite.py +0 -0
  94. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/middleware/__init__.py +0 -0
  95. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/middleware/base.py +0 -0
  96. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/MODULE_README.md +0 -0
  97. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/__init__.py +0 -0
  98. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/cli.py +0 -0
  99. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/ddl.py +0 -0
  100. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/diff.py +0 -0
  101. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/executor.py +0 -0
  102. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/integration.py +0 -0
  103. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/loader.py +0 -0
  104. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/operations.py +0 -0
  105. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/state.py +0 -0
  106. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/table_filter.py +0 -0
  107. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/no_org_assignment.py +0 -0
  108. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/FEATURE.md +0 -0
  109. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/MODULE_README.md +0 -0
  110. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/__init__.py +0 -0
  111. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/bulk_update_values.py +0 -0
  112. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/catalog_select.py +0 -0
  113. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/conflict.py +0 -0
  114. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/conflict_writes.py +0 -0
  115. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/create.py +0 -0
  116. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/db_functions.py +0 -0
  117. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/delete.py +0 -0
  118. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/dynamic_admin.py +0 -0
  119. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/dynamic_crud.py +0 -0
  120. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/graph_walk.py +0 -0
  121. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/latest_rows.py +0 -0
  122. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/queue_claim.py +0 -0
  123. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/read.py +0 -0
  124. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/relational_backfill.py +0 -0
  125. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/staging_load.py +0 -0
  126. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/update.py +0 -0
  127. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/platform_access.py +0 -0
  128. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/platform_db.py +0 -0
  129. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/py.typed +0 -0
  130. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/pytest_lock_guard.py +0 -0
  131. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/pytest_plugin.py +0 -0
  132. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/MODULE_README.md +0 -0
  133. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/__init__.py +0 -0
  134. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/db_objects.py +0 -0
  135. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
  136. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
  137. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/FEATURE.md +0 -0
  138. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/MODULE_README.md +0 -0
  139. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/__init__.py +0 -0
  140. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/builder.py +0 -0
  141. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/executor.py +0 -0
  142. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/resources/__init__.py +0 -0
  143. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
  144. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
  145. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/FEATURE.md +0 -0
  146. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/MODULE_README.md +0 -0
  147. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/__init__.py +0 -0
  148. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/code_handler.py +0 -0
  149. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/codegen_writer.py +0 -0
  150. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/columns.py +0 -0
  151. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/common.py +0 -0
  152. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/diff_preview.py +0 -0
  153. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
  154. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/excluded_targets.py +0 -0
  155. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/generator.py +0 -0
  156. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
  157. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
  158. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
  159. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
  160. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/package_wiring.py +0 -0
  161. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/relationships.py +0 -0
  162. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/runner.py +0 -0
  163. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/schema.py +0 -0
  164. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/schema_manager.py +0 -0
  165. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/tables.py +0 -0
  166. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/views.py +0 -0
  167. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/FEATURE.md +0 -0
  168. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/__init__.py +0 -0
  169. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/attachments.py +0 -0
  170. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/backup_restore.py +0 -0
  171. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/crypto.py +0 -0
  172. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/host_authorization.py +0 -0
  173. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/items.py +0 -0
  174. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/model.py +0 -0
  175. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
  176. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/native_enable.py +0 -0
  177. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/native_lifecycle.py +0 -0
  178. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/native_passkeys.py +0 -0
  179. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/native_source.py +0 -0
  180. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/org_service.py +0 -0
  181. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/org_vault_gate.py +0 -0
  182. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/service.py +0 -0
  183. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/vault_history.py +0 -0
  184. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/README.md +0 -0
  185. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/__init__.py +0 -0
  186. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/coalesce.py +0 -0
  187. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/dag.py +0 -0
  188. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/errors.py +0 -0
  189. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/fallback.py +0 -0
  190. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/lifecycle.py +0 -0
  191. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/managed.py +0 -0
  192. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/op.py +0 -0
  193. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/session.py +0 -0
  194. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/telemetry.py +0 -0
  195. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/MODULE_README.md +0 -0
  196. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/__init__.py +0 -0
  197. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/executor.py +0 -0
  198. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/queries.py +0 -0
  199. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/registry.py +0 -0
  200. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/types.py +0 -0
  201. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/utils.py +0 -0
  202. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/state.py +0 -0
  203. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/utils/__init__.py +0 -0
  204. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/utils/sql_utils.py +0 -0
  205. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/utils/type_converters.py +0 -0
  206. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/write_actor.py +0 -0
  207. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/scripts/git-branches.sh +0 -0
  208. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/scripts/publish.sh +0 -0
  209. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/scripts/release.sh +0 -0
  210. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/MODULE_README.md +0 -0
  211. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/__init__.py +0 -0
  212. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/conftest.py +0 -0
  213. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/MODULE_README.md +0 -0
  214. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/__init__.py +0 -0
  215. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_adapter_registry.py +0 -0
  216. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_admin_db_columns.py +0 -0
  217. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_admin_response_rendering.py +0 -0
  218. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_admin_search_negation.py +0 -0
  219. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_admin_search_sentinels.py +0 -0
  220. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_advisory_lock.py +0 -0
  221. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_agent_message.py +0 -0
  222. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_api_auth.py +0 -0
  223. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_api_config.py +0 -0
  224. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_api_handlers.py +0 -0
  225. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_api_protocol.py +0 -0
  226. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_array_agg_order_by.py +0 -0
  227. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_association_trigger_actor_naming.py +0 -0
  228. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_associations.py +0 -0
  229. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_associations_wiring.py +0 -0
  230. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_borrowed_role_never_reaches_server_calls.py +0 -0
  231. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_bulk_hydration_offload.py +0 -0
  232. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_bulk_update_by_pk.py +0 -0
  233. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
  234. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_cache_debug.py +0 -0
  235. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_call_function.py +0 -0
  236. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_case_when.py +0 -0
  237. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_catalog.py +0 -0
  238. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_column_scoped_writes.py +0 -0
  239. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_committed_row_guard.py +0 -0
  240. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_composite_pk_filter.py +0 -0
  241. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_composite_pk_write_paths.py +0 -0
  242. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_config.py +0 -0
  243. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_conflict_target.py +0 -0
  244. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_conflict_writes.py +0 -0
  245. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_connection_codecs.py +0 -0
  246. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_connection_poison_guard.py +0 -0
  247. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_connection_primitives.py +0 -0
  248. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_count_composite_distinct.py +0 -0
  249. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_count_limit_param_leak.py +0 -0
  250. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_db_function_field.py +0 -0
  251. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_ddl_generator.py +0 -0
  252. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_deadlock_retry.py +0 -0
  253. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_derived_table.py +0 -0
  254. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_dirty_tracking.py +0 -0
  255. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_dynamic_crud.py +0 -0
  256. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_exceptions.py +0 -0
  257. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
  258. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_expression_primitives.py +0 -0
  259. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_fields.py +0 -0
  260. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
  261. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_fk_cycle_resolution.py +0 -0
  262. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_from_alias.py +0 -0
  263. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_fts.py +0 -0
  264. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_func_expression_args.py +0 -0
  265. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_graph_walk.py +0 -0
  266. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_having_annotate_alias.py +0 -0
  267. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
  268. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_introspect_rls_policies.py +0 -0
  269. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_join_and_aggregate.py +0 -0
  270. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_latest_rows.py +0 -0
  271. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_listen_notify.py +0 -0
  272. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_local_sqlite.py +0 -0
  273. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_lock_contention_retry.py +0 -0
  274. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_managed_write_guard.py +0 -0
  275. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_matrx_entity.py +0 -0
  276. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_migration_diff_types.py +0 -0
  277. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_migration_loader.py +0 -0
  278. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_model_instance.py +0 -0
  279. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_model_meta.py +0 -0
  280. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_optimistic_concurrency.py +0 -0
  281. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_order_by_expression.py +0 -0
  282. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_org_assignment_inventory.py +0 -0
  283. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_orm_banners_are_client_safe.py +0 -0
  284. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_parameter_name_hydration.py +0 -0
  285. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_patch_jsonb_path.py +0 -0
  286. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_percentile_cont.py +0 -0
  287. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_persisted_count.py +0 -0
  288. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_person_scoped_session_bypasses_shared_cache.py +0 -0
  289. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pool_create_never_wedges.py +0 -0
  290. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pool_holder_census.py +0 -0
  291. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pool_loop_recreation.py +0 -0
  292. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pool_maintenance.py +0 -0
  293. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_postgrest_filters.py +0 -0
  294. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pydantic_bridge.py +0 -0
  295. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_query_builder.py +0 -0
  296. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_query_error_detail.py +0 -0
  297. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_query_executor_sql.py +0 -0
  298. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_query_timeout.py +0 -0
  299. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
  300. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_queue_claim.py +0 -0
  301. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_read_connection_retry.py +0 -0
  302. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_read_write_declared.py +0 -0
  303. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_registry.py +0 -0
  304. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_registry_multi_database.py +0 -0
  305. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_registry_multi_schema.py +0 -0
  306. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_relational_backfill.py +0 -0
  307. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_relations.py +0 -0
  308. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_resilience.py +0 -0
  309. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_rls_session_scope.py +0 -0
  310. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_schema_exists.py +0 -0
  311. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_session_advisory_lock.py +0 -0
  312. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_standalone_write_session_context.py +0 -0
  313. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_state_cache.py +0 -0
  314. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_subquery_filter_raw.py +0 -0
  315. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_subquery_in_filter.py +0 -0
  316. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_subquery_nested_expressions.py +0 -0
  317. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_supabase_auth.py +0 -0
  318. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_supabase_config.py +0 -0
  319. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_tls.py +0 -0
  320. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_transaction_database_identity.py +0 -0
  321. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_transaction_gucs_one_round_trip.py +0 -0
  322. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_transaction_pool_release_sends_nothing.py +0 -0
  323. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_typed_join_projection.py +0 -0
  324. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_typed_predicates.py +0 -0
  325. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_update_case_expression.py +0 -0
  326. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_update_subquery.py +0 -0
  327. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_update_with_rebase.py +0 -0
  328. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_upsert_default_leak.py +0 -0
  329. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_upsert_with_conflict.py +0 -0
  330. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_values_jsonb_decode.py +0 -0
  331. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_watched_lifecycle.py +0 -0
  332. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_write_queue_deadline.py +0 -0
  333. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_write_retry_semantics.py +0 -0
  334. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/MODULE_README.md +0 -0
  335. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/__init__.py +0 -0
  336. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/conftest.py +0 -0
  337. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_bulk_ops.py +0 -0
  338. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_cache_integration.py +0 -0
  339. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_crud.py +0 -0
  340. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_foreign_keys.py +0 -0
  341. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_m2m.py +0 -0
  342. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_manager.py +0 -0
  343. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_migrations_live.py +0 -0
  344. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_query_execution.py +0 -0
  345. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_schema_diff.py +0 -0
  346. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/verify_committed_row_guard_pg17.py +0 -0
  347. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/live_pooler_role.py +0 -0
  348. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/native_source_cases.py +0 -0
  349. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/native_source_oracle.rs +0 -0
  350. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/.env.example +0 -0
  351. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/README.md +0 -0
  352. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/__init__.py +0 -0
  353. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/generate.py +0 -0
  354. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/generated/.gitkeep +0 -0
  355. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/matrx_orm.yaml +0 -0
  356. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/test_schema_generation.py +0 -0
  357. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/.env.example +0 -0
  358. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/README.md +0 -0
  359. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/__init__.py +0 -0
  360. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/client_example.py +0 -0
  361. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/client_example.ts +0 -0
  362. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/client_supabase_example.py +0 -0
  363. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/server.py +0 -0
  364. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/entity_tests.py +0 -0
  365. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_base_generation.py +0 -0
  366. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_composite_pk_fk_generation.py +0 -0
  367. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_composite_unique_generation.py +0 -0
  368. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_dto_identity_generation.py +0 -0
  369. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_entity_capability_generation.py +0 -0
  370. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_enum_ordering.py +0 -0
  371. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_excluded_fk_targets.py +0 -0
  372. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_generate_schema.py +0 -0
  373. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_junction_analysis.py +0 -0
  374. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_multi_schema_output.py +0 -0
  375. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_schema_analysis.py +0 -0
  376. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_sql_expression_defaults.py +0 -0
  377. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_table_relationships_query.py +0 -0
  378. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_view_generation.py +0 -0
  379. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_array_default_parsing.py +0 -0
  380. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_enum_array_column.py +0 -0
  381. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_focused_generation_plan.py +0 -0
  382. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_host_models_aggregator.py +0 -0
  383. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_never_filter_columns.py +0 -0
  384. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/__init__.py +0 -0
  385. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/conftest.py +0 -0
  386. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_a_failed_capture_still_names_the_failure.py +0 -0
  387. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_cache_no_downgrade.py +0 -0
  388. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_capture_poison_proof.py +0 -0
  389. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_coalesce.py +0 -0
  390. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_dag.py +0 -0
  391. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_disk_spill_fallback.py +0 -0
  392. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_flush_individual_fallback.py +0 -0
  393. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_governed_write.py +0 -0
  394. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_managed.py +0 -0
  395. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_op_enqueue_site.py +0 -0
  396. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_reads.py +0 -0
  397. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_record_error_bounded_insert.py +0 -0
  398. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_record_error_storm.py +0 -0
  399. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_session.py +0 -0
  400. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_spill_guard_plugin.py +0 -0
  401. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_tests_never_write_live_system_error.py +0 -0
  402. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_backend_handed_over_mid_transaction_never_takes_our_writes.py +0 -0
  403. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_bulk_cache_never_stalls_the_loop.py +0 -0
  404. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_keyword_column_refuses_generation.py +0 -0
  405. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_list_of_uuids_binds_as_uuid_array.py +0 -0
  406. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_read_only_backend_never_refuses_our_writes.py +0 -0
  407. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_sealed_field_shows_no_character_of_its_value.py +0 -0
  408. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_array_arg_element_type.py +0 -0
  409. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_attachment_mutation_serialization.py +0 -0
  410. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_backup_alias_conflict.py +0 -0
  411. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_backup_history_restore.py +0 -0
  412. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_backup_restore_live.py +0 -0
  413. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_call_function_as.py +0 -0
  414. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_call_function_none_mode.py +0 -0
  415. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_composite_fk_is_not_a_column_fk.py +0 -0
  416. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_database_name_alias.py +0 -0
  417. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_db_functions.py +0 -0
  418. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_dsn_password_masking.py +0 -0
  419. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_dynamic_select_unregistered.py +0 -0
  420. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_first_asks_the_database_for_one_row.py +0 -0
  421. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_foreign_session_state.py +0 -0
  422. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_immutable_insert_or_exact_verify.py +0 -0
  423. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_keyed_digest.py +0 -0
  424. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_model_cls_refactor.py +0 -0
  425. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_enable.py +0 -0
  426. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_lifecycle.py +0 -0
  427. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_lifecycle_fences.py +0 -0
  428. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_passkey_receipts.py +0 -0
  429. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_source.py +0 -0
  430. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_no_blocking_asyncpg_tls.py +0 -0
  431. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_one_database.py +0 -0
  432. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_order_by_desc_nulls_last.py +0 -0
  433. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_org_vault_gate.py +0 -0
  434. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_package_wiring_views.py +0 -0
  435. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_pooler_role_guard.py +0 -0
  436. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_secret_audit_names_its_organization.py +0 -0
  437. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_secrets_battery.py +0 -0
  438. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_secrets_minting_keys.py +0 -0
  439. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_shared_lock_guard.py +0 -0
  440. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_sql_param_casts.py +0 -0
  441. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_state_cache_sweeps_stale.py +0 -0
  442. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_statement_ceiling_warning.py +0 -0
  443. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_sync_twins_guard.py +0 -0
  444. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_update_result_truthiness.py +0 -0
  445. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_user_visible_lookup.py +0 -0
  446. {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_vault_aggregate_recovery_stateful.py +0 -0
@@ -355,3 +355,8 @@ apps/shared/zz-proof-*/
355
355
 
356
356
  # tsup writes this temp file while it builds a config; never commit it
357
357
  tsup.config.bundled_*.mjs
358
+
359
+ # db/tests/test_provision_pull.py writes a projection for a spec row it ALWAYS rolls back;
360
+ # if the test is interrupted before its scrub, a sweep commit must never pick it up
361
+ # (2026-10-19: one was swept in and failed 5 aidream releases with identity.token.taken).
362
+ db/migrations/*_provision_provision_pull_selftest.sql
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: matrx-orm
3
- Version: 3.1.237
3
+ Version: 3.1.239
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
@@ -26,7 +26,7 @@ Requires-Dist: asyncpg>=0.31.0
26
26
  Requires-Dist: cbor2<7,>=6.1.3
27
27
  Requires-Dist: cryptography>=43.0
28
28
  Requires-Dist: gitpython>=3.1.40
29
- Requires-Dist: matrx-utils>=2.0.78
29
+ Requires-Dist: matrx-utils>=2.0.79
30
30
  Requires-Dist: psycopg-pool>=3.2.5
31
31
  Requires-Dist: psycopg[binary]>=3.2.5
32
32
  Requires-Dist: python-dotenv>=1.0
@@ -36,6 +36,9 @@ class BaseManager(Generic[ModelT]):
36
36
  # for that manager. Has no effect when Pydantic is not installed.
37
37
  validate_input: bool = True
38
38
 
39
+ # Knob: hard ceiling for fetch-on-init (rows). Reaching it raises; never truncates.
40
+ fetch_on_init_max_rows: int = 50_000
41
+
39
42
  def __init__(
40
43
  self,
41
44
  model: type[ModelT],
@@ -1744,6 +1747,43 @@ class BaseManager(Generic[ModelT]):
1744
1747
 
1745
1748
  run_sync(self._auto_fetch_on_init_async())
1746
1749
 
1750
+ async def _fetch_whole_table(self) -> list[ModelT]:
1751
+ """Return EVERY row of the table, never a truncated prefix.
1752
+
1753
+ ``fetch_on_init_limit`` is the PAGE SIZE (a knob), not a cap: a
1754
+ fetch-on-init cache that claims to hold the table must hold all of it
1755
+ (2026-10 defect: a 300 cap silently dropped 84 of 384 ai.model_definition
1756
+ rows). Single-PK tables page by keyset (``pk > last``); composite-PK
1757
+ tables page by offset over a full-PK order. Past
1758
+ ``fetch_on_init_max_rows`` the fetch RAISES (loud at boot) instead of
1759
+ continuing with partial data — switch such a manager to load-on-miss.
1760
+ """
1761
+ page = int(self.fetch_on_init_limit)
1762
+ pks = list(self.model._meta.primary_keys or ["id"])
1763
+ ceiling = int(self.fetch_on_init_max_rows)
1764
+ rows: list[ModelT] = []
1765
+ last: Any = None
1766
+ while True:
1767
+ qb = self.model.filter()
1768
+ if len(pks) == 1:
1769
+ if last is not None:
1770
+ qb = qb.filter(**{f"{pks[0]}__gt": last})
1771
+ qb = qb.order_by(pks[0]).limit(page)
1772
+ else:
1773
+ qb = qb.order_by(*pks).limit(page).offset(len(rows))
1774
+ batch = await qb.all()
1775
+ rows.extend(batch)
1776
+ if len(rows) > ceiling:
1777
+ raise RuntimeError(
1778
+ f"[{self.model.__name__}] fetch-on-init exceeded fetch_on_init_max_rows="
1779
+ f"{ceiling}; this table is too large to cache whole — make the manager "
1780
+ "load-on-miss (fetch_on_init_limit=0) or raise the knob deliberately."
1781
+ )
1782
+ if len(batch) < page:
1783
+ return rows
1784
+ if len(pks) == 1:
1785
+ last = getattr(batch[-1], pks[0])
1786
+
1747
1787
  async def _auto_fetch_on_init_async(self) -> None:
1748
1788
  """Fetch items on initialization (async version with full DTO support)."""
1749
1789
  if int(self.fetch_on_init_limit) <= 0:
@@ -1751,7 +1791,7 @@ class BaseManager(Generic[ModelT]):
1751
1791
 
1752
1792
  start_time = time.perf_counter()
1753
1793
 
1754
- items = await self.model.filter().limit(self.fetch_on_init_limit).all()
1794
+ items = await self._fetch_whole_table()
1755
1795
  initialized_items: list[ModelT] = []
1756
1796
  for item in items:
1757
1797
  result = await self._initialize_item_runtime(item)
@@ -1797,9 +1837,6 @@ class BaseManager(Generic[ModelT]):
1797
1837
  color="red",
1798
1838
  )
1799
1839
 
1800
- if count >= (self.fetch_on_init_limit - 5):
1801
- self._trigger_limit_reached_warning(count, initialized_items)
1802
-
1803
1840
  if not warnings_suppressed and count > warning_limit_threshold:
1804
1841
  self._trigger_fetch_warnings(count, initialized_items, warning_limit_threshold)
1805
1842
 
@@ -168,13 +168,17 @@ async def _execute_group(
168
168
  pks = getattr(meta, "primary_keys", None) if meta else None
169
169
  pk_field = pks[0] if pks else ops[0].pk_field
170
170
 
171
- # Union of all payload keys across this group — bulk_update wants
172
- # ONE fields list applied to all instances. Per-row, matrx-orm's
173
- # bulk_update skips None values, so clearing a field via this path
174
- # is unsupported (acceptable for our use cases).
175
- all_fields: list[str] = sorted({key for op in ops for key in op.payload.keys()})
176
-
177
- instances = []
171
+ # bulk_update applies ONE fields list to every instance it is given,
172
+ # reading each field off the instance. A stub carries the Model's
173
+ # Python DEFAULT in every column its op never set, so a single call
174
+ # with the UNION of the group's keys wrote those defaults over real
175
+ # values (PB-08: a completed chat.tool_call row reset to
176
+ # status='pending', output_type='text', output_chars=0 because the
177
+ # parallel call's completion flushed in the same group). One call per
178
+ # distinct field set: every row writes exactly the fields its op set.
179
+ # Per-row, bulk_update skips None values, so clearing a field via this
180
+ # path is unsupported (acceptable for our use cases).
181
+ by_fields: dict[tuple[str, ...], list[object]] = {}
178
182
  for op in ops:
179
183
  kwargs = {pk_field: op.pk_value}
180
184
  kwargs.update(op.payload)
@@ -184,10 +188,15 @@ async def _execute_group(
184
188
  # entry and blank every other column for the TTL (this is the bug
185
189
  # that made a saved conversation read back with no organization_id
186
190
  # on its next turn). See matrx_orm.state.mark_partial.
187
- instances.append(mark_partial(model_cls(**kwargs), kwargs))
188
-
189
- await model_cls.bulk_update(instances, fields=all_fields)
190
- return len(instances)
191
+ fields = tuple(sorted(op.payload.keys()))
192
+ by_fields.setdefault(fields, []).append(mark_partial(model_cls(**kwargs), kwargs))
193
+
194
+ written = 0
195
+ for fields, instances in by_fields.items():
196
+ if fields:
197
+ await model_cls.bulk_update(instances, fields=list(fields))
198
+ written += len(instances)
199
+ return written
191
200
 
192
201
  if op_type == "delete":
193
202
  meta = getattr(model_cls, "_meta", None)
@@ -179,19 +179,63 @@ def merge_pending_with_db_one(
179
179
  def _matches_simple_filter(payload: dict[str, Any], filters: dict[str, Any]) -> bool:
180
180
  """Return True if `payload` matches every (field, value) in `filters`.
181
181
 
182
- Only literal-equality filters supported. Anything with operator
183
- suffixes (``foo__lt``, ``foo__in``, etc.) is treated as "unknown" and
184
- we say "the payload matches" — letting the DB result be authoritative
185
- rather than dropping a potentially-valid pending row. This is the
186
- safe direction (false positive is correctable on next flush; false
187
- negative is a missed read).
182
+ Literal equality, plus the operators that can be judged exactly on an
183
+ in-memory payload: ``in`` / ``nin`` / ``not_in`` / ``ne`` / ``isnull`` and
184
+ ordered comparisons on comparable values. Only an operator that cannot be
185
+ judged here (JSON paths, text search, a field the payload does not carry)
186
+ answers "might match".
187
+
188
+ "Might match" for EVERY operator was a lie with a victim: an ``exists()``
189
+ asking "is a run live on conversation X?" (``id__in=[…],
190
+ status__in=['pending','processing']``) answered yes for ANY conversation
191
+ while the caller's own request INSERT was pending in its Session, so a
192
+ finished helper was steered instead of continued and never answered
193
+ (PB-08, conversation 6e3f85a3…, 2026-10-19).
188
194
  """
189
195
  for key, expected in filters.items():
190
196
  if "__" in key:
191
- # Operator-suffixed filter — skip the check; treat as "might match."
197
+ field, _, op = key.rpartition("__")
198
+ verdict = _judge_operator(payload, field, op, expected)
199
+ if verdict is False:
200
+ return False
192
201
  continue
193
202
  if key not in payload:
194
203
  return False
195
204
  if payload[key] != expected:
196
205
  return False
197
206
  return True
207
+
208
+
209
+ def _same(a: Any, b: Any) -> bool:
210
+ """Equality that treats a uuid and its string as the same value."""
211
+ return a == b or (a is not None and b is not None and str(a) == str(b))
212
+
213
+
214
+ def _judge_operator(payload: dict[str, Any], field: str, op: str, expected: Any) -> bool | None:
215
+ """True / False when the operator can be judged on ``payload``; None = cannot."""
216
+ if not field or "__" in field or field not in payload:
217
+ return None
218
+ value = payload[field]
219
+ if op == "isnull":
220
+ return (value is None) == bool(expected)
221
+ if op in ("in", "nin", "not_in"):
222
+ if isinstance(expected, (str, bytes)) or not hasattr(expected, "__iter__"):
223
+ return None
224
+ member = any(_same(value, e) for e in expected)
225
+ return member if op == "in" else not member
226
+ if op == "ne":
227
+ return not _same(value, expected)
228
+ if op in ("gt", "gte", "lt", "lte"):
229
+ if value is None or expected is None:
230
+ return None
231
+ try:
232
+ if op == "gt":
233
+ return value > expected
234
+ if op == "gte":
235
+ return value >= expected
236
+ if op == "lt":
237
+ return value < expected
238
+ return value <= expected
239
+ except TypeError:
240
+ return None
241
+ return None
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "matrx-orm"
3
- version = "3.1.237"
3
+ version = "3.1.239"
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.78",
44
+ "matrx-utils>=2.0.79",
45
45
  "pyyaml>=6.0.3",
46
46
  "python-dotenv>=1.0",
47
47
  "cryptography>=43.0",
@@ -0,0 +1,116 @@
1
+ """A fetch-on-init cache holds the WHOLE table or fails loudly — never a silent prefix.
2
+
3
+ Pins the 2026-10 defect: fetch_on_init_limit=300 on a 384-row table loaded 300
4
+ rows and only printed a banner. Plus a census of every fetch-on-init manager.
5
+ """
6
+
7
+ import re
8
+ from pathlib import Path
9
+
10
+ import pytest
11
+ from matrx_orm.core.base import Model, ModelMeta
12
+ from matrx_orm.core.extended import BaseManager
13
+ from matrx_orm.core.fields import CharField, IntegerField
14
+ from matrx_orm.core.registry import ModelRegistry
15
+
16
+
17
+ @pytest.fixture(autouse=True)
18
+ def _clean_registry():
19
+ ModelRegistry.clear()
20
+ yield
21
+ ModelRegistry.clear()
22
+
23
+
24
+ class _FakeQB:
25
+ def __init__(self, rows, pk):
26
+ self.rows, self.pk = rows, pk
27
+ self._gt = None
28
+ self._limit = None
29
+ self._offset = 0
30
+
31
+ def filter(self, **kw):
32
+ for k, v in kw.items():
33
+ assert k == f"{self.pk}__gt"
34
+ self._gt = v
35
+ return self
36
+
37
+ def order_by(self, *a):
38
+ return self
39
+
40
+ def limit(self, n):
41
+ self._limit = n
42
+ return self
43
+
44
+ def offset(self, n):
45
+ self._offset = n
46
+ return self
47
+
48
+ async def all(self):
49
+ rows = sorted(self.rows, key=lambda r: getattr(r, self.pk))
50
+ if self._gt is not None:
51
+ rows = [r for r in rows if getattr(r, self.pk) > self._gt]
52
+ rows = rows[self._offset :]
53
+ return rows[: self._limit] if self._limit is not None else rows
54
+
55
+
56
+ def _manager(n, limit, max_rows=None):
57
+ M = ModelMeta(
58
+ "BigTable",
59
+ (Model,),
60
+ {"id": IntegerField(primary_key=True), "name": CharField(), "_table_name": "big", "_database": "t"},
61
+ )
62
+ rows = [M(id=i, name=str(i)) for i in range(n)]
63
+ M.filter = classmethod(lambda cls, **kw: _FakeQB(rows, "id"))
64
+
65
+ class Mgr(BaseManager):
66
+ async def _initialize_runtime_data(self, item):
67
+ pass
68
+
69
+ if max_rows is not None:
70
+ Mgr.fetch_on_init_max_rows = max_rows
71
+ return Mgr(M, fetch_on_init_limit=limit)
72
+
73
+
74
+ @pytest.mark.asyncio
75
+ async def test_more_rows_than_limit_are_all_loaded():
76
+ mgr = _manager(n=387, limit=300)
77
+ await mgr._auto_fetch_on_init_async()
78
+ assert len(mgr._active_items) == 387
79
+
80
+
81
+ @pytest.mark.asyncio
82
+ async def test_exact_multiple_of_page_size_loads_all():
83
+ mgr = _manager(n=600, limit=300)
84
+ await mgr._auto_fetch_on_init_async()
85
+ assert len(mgr._active_items) == 600
86
+
87
+
88
+ @pytest.mark.asyncio
89
+ async def test_ceiling_raises_instead_of_partial():
90
+ mgr = _manager(n=50, limit=10, max_rows=30)
91
+ with pytest.raises(RuntimeError, match="fetch_on_init_max_rows"):
92
+ await mgr._auto_fetch_on_init_async()
93
+
94
+
95
+ # ---- census: every fetch-on-init manager, its limit, and its recorded size class ----
96
+ # size class = the largest table the limit is expected to cover per page; the page size
97
+ # is a knob only, because the loader pages through the whole table.
98
+ CENSUS = {
99
+ # file (relative to aidream/packages): (page size, table, size class)
100
+ "matrx-ai/matrx_ai/db/ai_models/_ai_model_manager_orm.py": (300, "ai.model_definition", "hundreds"),
101
+ }
102
+
103
+
104
+ def test_census_lists_every_fetch_on_init_manager():
105
+ root = Path(__file__).resolve().parents[3] # aidream/packages
106
+ found = {}
107
+ for pkg in root.iterdir():
108
+ for f in pkg.rglob("*.py"):
109
+ if "/tests/" in str(f) or f.name.startswith("test_") or "/node_modules/" in str(f):
110
+ continue
111
+ for m in re.finditer(r"fetch_on_init_limit\s*=\s*([1-9]\d*)", f.read_text(errors="ignore")):
112
+ found[str(f.relative_to(root))] = int(m.group(1))
113
+ assert found == {k: v[0] for k, v in CENSUS.items()}, (
114
+ "A new fetch-on-init manager appeared (or a limit changed): add it to CENSUS with its "
115
+ "table and size class."
116
+ )
@@ -0,0 +1,36 @@
1
+ """A flushed UPDATE group writes, for each row, only the fields that row's op set.
2
+
3
+ PB-08 defect 58 (conversation 6e3f85a3…, 2026-10-19): two parallel ``agent``
4
+ calls flushed their ``chat.tool_call`` UPDATEs in one group. The flush handed
5
+ ``bulk_update`` ONE field list — the union of every op's keys — and a stub
6
+ instance per row whose untouched columns held the Model's Python defaults. Tidewell's
7
+ row, whose op never set ``status``, got ``status='pending'``,
8
+ ``output_type='text'``, ``output_chars=0``, ``execution_events=[]`` written over
9
+ its completed values (version 4, same ``updated_at`` as Ares's row), and no
10
+ sweep ever finalized a ``pending`` row.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import pytest
16
+ from matrx_orm.session import Session
17
+
18
+
19
+ @pytest.mark.asyncio
20
+ async def test_each_row_is_updated_with_only_its_own_fields(FakeMessage) -> None:
21
+ async with Session() as s:
22
+ s.defer_update(
23
+ FakeMessage,
24
+ "ares",
25
+ {"status": "completed", "output": "{}", "output_type": "json", "output_chars": 2},
26
+ )
27
+ s.defer_update(FakeMessage, "tidewell", {"message_id": "msg-1"})
28
+
29
+ written: dict[str, set[str]] = {}
30
+ for instances, fields in FakeMessage._bulk_update_calls:
31
+ for inst in instances:
32
+ written.setdefault(inst.id, set()).update(fields)
33
+ assert written.get("tidewell") == {"message_id"}, (
34
+ f"row 'tidewell' was written fields it never set: {sorted(written.get('tidewell', set()))}"
35
+ )
36
+ assert written.get("ares") == {"status", "output", "output_type", "output_chars"}
@@ -0,0 +1,65 @@
1
+ """A pending INSERT joins a read only when it matches the read's operator filters.
2
+
3
+ PB-08 defects 56/57 (conversation 6e3f85a3…, 2026-10-19): ``send_message`` to a
4
+ helper that had FINISHED answered ``delivered_to_running_agent``, and the steer
5
+ row stayed ``pending`` forever. The "is it running?" read is
6
+ ``user_request.exists(id__in=[<the helper's request>], status__in=['pending',
7
+ 'processing'])``. It ran inside the lead's own turn, whose own ``user_request``
8
+ INSERT was still pending in the Session, and the pending-aware merger treated
9
+ every operator-suffixed filter as "might match" — so the lead's own
10
+ unflushed request answered "yes, a run is live" for any conversation at all.
11
+
12
+ Operators the merger can evaluate exactly (in / nin / not_in / ne / isnull, and
13
+ ordered comparisons on comparable values) are evaluated; only a truly unknown
14
+ operator keeps the "might match" answer.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import uuid
20
+
21
+ from matrx_orm.session.op import make_insert
22
+ from matrx_orm.session.reads import merge_pending_with_db
23
+
24
+ OWN = str(uuid.uuid4())
25
+ HELPERS = str(uuid.uuid4())
26
+
27
+
28
+ def _pending_own_request(model):
29
+ return [make_insert(model, {"id": OWN, "status": "processing"})]
30
+
31
+
32
+ def test_an_in_filter_on_another_id_does_not_match_a_pending_insert(FakeMessage) -> None:
33
+ result = merge_pending_with_db(
34
+ [],
35
+ _pending_own_request(FakeMessage),
36
+ {"id__in": [HELPERS], "status__in": ["pending", "processing"]},
37
+ )
38
+ assert result == [], "a pending row matched an id__in filter that does not name it"
39
+
40
+
41
+ def test_an_in_filter_naming_the_pending_row_matches(FakeMessage) -> None:
42
+ result = merge_pending_with_db(
43
+ [],
44
+ _pending_own_request(FakeMessage),
45
+ {"id__in": [uuid.UUID(OWN)], "status__in": ["pending", "processing"]},
46
+ )
47
+ assert [r["id"] for r in result] == [OWN]
48
+
49
+
50
+ def test_status_in_excludes_a_pending_row_in_another_status(FakeMessage) -> None:
51
+ pending = [make_insert(FakeMessage, {"id": OWN, "status": "completed"})]
52
+ assert merge_pending_with_db([], pending, {"status__in": ["pending", "processing"]}) == []
53
+
54
+
55
+ def test_ne_nin_and_isnull_are_evaluated(FakeMessage) -> None:
56
+ pending = [make_insert(FakeMessage, {"id": OWN, "status": "running", "deleted_at": None})]
57
+ assert merge_pending_with_db([], pending, {"status__ne": "running"}) == []
58
+ assert merge_pending_with_db([], pending, {"status__nin": ["running"]}) == []
59
+ assert merge_pending_with_db([], pending, {"deleted_at__isnull": False}) == []
60
+ assert len(merge_pending_with_db([], pending, {"deleted_at__isnull": True})) == 1
61
+
62
+
63
+ def test_an_unknown_operator_still_might_match(FakeMessage) -> None:
64
+ pending = [make_insert(FakeMessage, {"id": OWN, "title": "x"})]
65
+ assert len(merge_pending_with_db([], pending, {"title__json_path": "$.a"})) == 1
File without changes
File without changes
File without changes
File without changes
File without changes