matrx-orm 3.1.257__tar.gz → 3.1.259__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.
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/PKG-INFO +1 -1
- matrx_orm-3.1.259/docs/attachment-concurrency.md +28 -0
- matrx_orm-3.1.259/docs/index.md +10 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/FEATURE.md +19 -46
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/native_enable.py +9 -5
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/pyproject.toml +1 -1
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_native_enable.py +62 -10
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/.gitignore +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/AGENTS.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/CHANGELOG.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/CLAUDE.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/MODEL_API.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/docs/migrations.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/FEATURE.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/admin_lane.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/foreign_session_state.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/pool_watch.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/read_write.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/session_context.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/statement_ceiling.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/core/write_retry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/no_org_assignment.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/pytest_lock_guard.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/resources/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/excluded_targets.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/attachments.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/backup_restore.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/host_authorization.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/items.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/native_lifecycle.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/native_passkeys.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/native_source.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/org_vault_gate.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/use_stamp.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/secrets_battery/vault_history.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/matrx_orm/write_actor.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/scripts/release.sh +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/scripts/verify_wheel.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/conftest.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_association_trigger_actor_naming.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_borrowed_role_never_reaches_server_calls.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_column_scoped_writes.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_committed_row_guard.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_count_limit_param_leak.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_deadlock_retry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_fetch_on_init_holds_whole_table.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_fk_cycle_resolution.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_guarded_read_never_reruns_empty.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_lock_contention_retry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_mutation_receipt_locator.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_org_assignment_inventory.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_orm_banners_are_client_safe.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_percentile_cont.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_person_scoped_session_bypasses_shared_cache.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_pool_create_never_wedges.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_pool_holder_census.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_read_write_declared.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_registry_reads_outside_the_person_session.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_relational_backfill.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_resilience_policy.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_row_lock_modes.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_standalone_write_session_context.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_sync_pool_declares_read_write.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_transaction_database_identity.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_transaction_gucs_one_round_trip.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_transaction_isolation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_transaction_pool_release_sends_nothing.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_transaction_top_level_cleanup.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_wheel_contents.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/level2/verify_committed_row_guard_pg17.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/native_source_cases.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/native_source_oracle.rs +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_excluded_fk_targets.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema_builder/test_enum_array_column.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/schema_builder/test_never_filter_columns.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_a_failed_capture_still_names_the_failure.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_a_grouped_update_writes_only_each_rows_own_fields.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_pending_insert_honors_operator_filters.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_record_error_group_open.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/session/test_tests_never_write_live_system_error.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_a_backend_handed_over_mid_transaction_never_takes_our_writes.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_a_bulk_cache_never_stalls_the_loop.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_a_failed_use_stamp_never_fails_the_read.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_a_keyword_column_refuses_generation.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_a_list_of_uuids_binds_as_uuid_array.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_a_read_only_backend_never_refuses_our_writes.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_a_sealed_field_shows_no_character_of_its_value.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_attachment_mutation_serialization.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_backup_alias_conflict.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_backup_history_restore.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_backup_restore_live.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_backup_restore_ordering.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_call_function_as.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_call_function_none_mode.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_composite_fk_is_not_a_column_fk.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_dsn_password_masking.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_first_asks_the_database_for_one_row.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_foreign_session_state.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_immutable_insert_or_exact_verify.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_instance_update_runs_expressions.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_jsonb_postgres_illegal_text.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_native_lifecycle.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_native_lifecycle_fences.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_native_passkey_receipts.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_native_source.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_order_by_desc_nulls_last.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_org_vault_gate.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_package_wiring_views.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_platform_access_strict.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_secret_audit_names_its_organization.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_secrets_battery.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_secrets_minting_keys.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_shared_lock_guard.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_state_cache_sweeps_stale.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_statement_ceiling_warning.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_sync_twins_guard.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_update_result_truthiness.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_user_visible_lookup.py +0 -0
- {matrx_orm-3.1.257 → matrx_orm-3.1.259}/tests/test_vault_aggregate_recovery_stateful.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: matrx-orm
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.259
|
|
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
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Reference
|
|
3
|
+
title: Credential attachment concurrency verification
|
|
4
|
+
description: Real-router race probe for parent-held attachment mutation and byte materialization.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Credential attachment concurrency verification
|
|
8
|
+
|
|
9
|
+
Use the real Vault router and auth provider as `admin@admin.com`, with an
|
|
10
|
+
isolated agent-owned session and a new item stamped with this run's `test_run_id`.
|
|
11
|
+
Never reuse another run's item or touch the owner's credentials.
|
|
12
|
+
|
|
13
|
+
1. Pause an attachment request after it takes the parent lock but before its
|
|
14
|
+
child write. Release it first: it must return 201. The following item delete
|
|
15
|
+
must return 204, and a fresh router list must have no live child.
|
|
16
|
+
2. Reverse the schedule: pause the attachment request before parent-lock
|
|
17
|
+
acquisition, complete the item delete, then release the request. It must
|
|
18
|
+
refuse and leave no live child.
|
|
19
|
+
3. Repeat both schedules with download and trusted resolve paused before byte
|
|
20
|
+
materialization. No child bytes may escape after the winning deletion.
|
|
21
|
+
4. Remove each run-owned disposable item through the canonical cascade, archive
|
|
22
|
+
retained run-owned fixtures and independently verify no live test records
|
|
23
|
+
remain. End and verify rejection of the owned session; close only this run's
|
|
24
|
+
browser/process resources and clear any owned clipboard content.
|
|
25
|
+
|
|
26
|
+
This probe complements the focused serialization guards; offline source tests do
|
|
27
|
+
not establish live concurrency acceptance. Pending product acceptance belongs in
|
|
28
|
+
the [Vault register](../../../common-docs/projects/credential-sharing-browser-login/REGISTER.md).
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Reference
|
|
3
|
+
title: matrx-orm verification and migration guides
|
|
4
|
+
description: Focused package operating guides.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Package guides
|
|
8
|
+
|
|
9
|
+
- [Migrations](migrations.md)
|
|
10
|
+
- [Credential attachment concurrency verification](attachment-concurrency.md)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# matrx-orm secrets battery — the ONE credential vault
|
|
2
2
|
|
|
3
|
-
> Cross-repo plan (implementation authority): `/Users/armanisadeghi/code/common-docs/systems/account/vault-secrets/FEATURE.md` — read it before expanding credential storage or package resolution in any repository.
|
|
3
|
+
> Cross-repo plan (implementation authority): `/Users/armanisadeghi/code/common-docs/systems/account/vault-secrets/FEATURE.md` — read it before expanding credential storage or package resolution in any repository.
|
|
4
4
|
|
|
5
5
|
**One table, one key, everywhere.** Every platform credential — personal AND
|
|
6
6
|
organizational — lives in `users.user_secrets` (Fernet-encrypted). Every package
|
|
@@ -40,9 +40,8 @@ Installed migration 1047 requires exact keys, typed identifiers and timestamp,
|
|
|
40
40
|
locked original ownership, and exactly one manifest and one changed component
|
|
41
41
|
bound to the locked active personal password field. Organization-owned history refuses until the host supplies the
|
|
42
42
|
grant/offboarding parent-lock contract. Capture, list/reveal, and restore are
|
|
43
|
-
backend capabilities for this bounded personal-password chain.
|
|
44
|
-
|
|
45
|
-
ledger and exact live validator bodies. The physical history timestamp remains
|
|
43
|
+
backend capabilities for this bounded personal-password chain. The physical
|
|
44
|
+
history timestamp remains
|
|
46
45
|
the destination audit time, while authenticated backup source dates are retained
|
|
47
46
|
separately when the installed contract supports them.
|
|
48
47
|
|
|
@@ -82,7 +81,7 @@ ownership/shape helper and does not decrypt.
|
|
|
82
81
|
|
|
83
82
|
**Native source admission (`native_source.py`).** `validate_native_source` is the server reader of the provider's exact source-v1 byte format; Rust remains the encoder and authenticator. It requires an explicit positive source-size limit, preserves nullable names and bytes, rejects duplicate/noncanonical JSON and COSE, and derives public metadata only after maintained P-256 key-pair validation. The result is provider-custody data, never a response model or generic field. `repr` and fixed failures omit material. `scripts/check_native_source_parity.py --rust-core <native-vault-provider/core>` compares the real compiled Rust reader against the server corpus; no mocked oracle. This prerequisite adds no creator, materializer, database row or native readiness.
|
|
84
83
|
|
|
85
|
-
**Native lifecycle component (`native_lifecycle.py`).** The shared coordinator must supply locked parent/child projections from the exported field constants, current host management authority and its active transaction. Inspection locks the exact native metadata child; component delete/restore mutate only that child's tombstone and lifecycle. Deletion accepts active and restored-quarantined sources; recovery compares aware ISO manifest timestamps to database timestamps, then parses the already-validated manifest instant only at the typed native restore mutation boundary. Personal metadata provenance is enforced by the database guard, never inferred from the request scope. The item delete/restore coordinator invokes these operations for exact v2 native manifests, preserves auxiliary components and replay identity, and restores inactive quarantine.
|
|
84
|
+
**Native lifecycle component (`native_lifecycle.py`).** The shared coordinator must supply locked parent/child projections from the exported field constants, current host management authority and its active transaction. Inspection locks the exact native metadata child; component delete/restore mutate only that child's tombstone and lifecycle. Deletion accepts active and restored-quarantined sources; recovery compares aware ISO manifest timestamps to database timestamps, then parses the already-validated manifest instant only at the typed native restore mutation boundary. Personal metadata provenance is enforced by the database guard, never inferred from the request scope. The item delete/restore coordinator invokes these operations for exact v2 native manifests, preserves auxiliary components and replay identity, and restores inactive quarantine. Contract: [native lifecycle](../../../../common-docs/projects/credential-sharing-browser-login/REGISTER.md).
|
|
86
85
|
|
|
87
86
|
**`inject_into_sandbox=true` REQUIRES an env alias — refused otherwise.** A
|
|
88
87
|
container environment is a NAME→value map, so a field with `key IS NULL` has
|
|
@@ -98,8 +97,7 @@ alone, each loud:
|
|
|
98
97
|
2. **Resolution scream** — `_keyed_for_sandbox` logs an ERROR naming the row ids
|
|
99
98
|
and skips them, so anything that got in around layer 1 is visible.
|
|
100
99
|
3. **DB CHECK** `user_secrets_sandbox_injection_needs_key` (migration 0265) makes
|
|
101
|
-
the state unrepresentable
|
|
102
|
-
database stops manufacturing violations on keyless inserts.
|
|
100
|
+
the state unrepresentable. The column default is `false`.
|
|
103
101
|
|
|
104
102
|
Item surface: `create_credential_item` · `create_credential_bundle` (item + N
|
|
105
103
|
fields, ONE transaction) · `get/list/update/delete_credential_item` (delete =
|
|
@@ -111,7 +109,7 @@ soft, atomic across item + fields + grants) · `add_credential_field` ·
|
|
|
111
109
|
· `set_item_grants` · `list_granted_credential_items` ·
|
|
112
110
|
`transfer_credential_item` (owner flip, no value copy, references survive) ·
|
|
113
111
|
`fork_credential_item` (independent copy) · `resolve_legacy_env_key` (compat
|
|
114
|
-
read that SCREAMS in logs
|
|
112
|
+
read that SCREAMS in logs for legacy env-key access).
|
|
115
113
|
|
|
116
114
|
Attachment surface (`attachments.py`): add/list/get/update metadata/replace/
|
|
117
115
|
soft-delete; `reveal_credential_attachment` is the audited human download and
|
|
@@ -136,16 +134,7 @@ parent-delete helper deliberately takes no second parent lock because its caller
|
|
|
136
134
|
already owns it; fork still locks its source parent and copies only its stable
|
|
137
135
|
snapshot.
|
|
138
136
|
|
|
139
|
-
|
|
140
|
-
Through the real Vault router and auth provider, create an admin-owned item and
|
|
141
|
-
pause the attachment request after it takes its parent lock but before its child
|
|
142
|
-
write. Releasing it first must return 201; the following item delete returns
|
|
143
|
-
204 and a fresh router list has no live child. In the inverse ordering, complete
|
|
144
|
-
the delete first and then release the attachment request: it must be refused
|
|
145
|
-
and must not leave a live child. Repeat with download and trusted resolve paused
|
|
146
|
-
before byte materialization. Remove the disposable item through the canonical
|
|
147
|
-
cascade after each run. This is a live concurrency probe, never a replacement
|
|
148
|
-
for the focused unit guards.
|
|
137
|
+
Verification: [attachment concurrency probe](../../docs/attachment-concurrency.md).
|
|
149
138
|
|
|
150
139
|
**Grants: use the single-grant operations.** `add_item_grant` /
|
|
151
140
|
`update_item_grant` / `remove_item_grant` change ONE recipient and leave the
|
|
@@ -179,7 +168,9 @@ make it "easier to read".
|
|
|
179
168
|
**Restored native enablement (`native_enable.py`).** The primitive requires an
|
|
180
169
|
active transaction and one exact restored v2 aggregate; it changes only parent
|
|
181
170
|
status and protected-source activity. The host owns current scope, authority,
|
|
182
|
-
grant locks and audit.
|
|
171
|
+
grant locks and audit. Personal passkey metadata must retain a non-null creation
|
|
172
|
+
organization independent of the audit request organization; organization-owned
|
|
173
|
+
aggregates still require parent, source and metadata organization equality.
|
|
183
174
|
|
|
184
175
|
## Mutation receipt routing
|
|
185
176
|
|
|
@@ -297,16 +288,11 @@ aidream's authorization layer is
|
|
|
297
288
|
membership → `iam.has_org_access_for`, adminhood → `public.is_org_admin_for`,
|
|
298
289
|
asserted before the battery is touched.
|
|
299
290
|
|
|
300
|
-
###
|
|
291
|
+
### Sealed-write authorization (`host_authorization.py`)
|
|
301
292
|
|
|
302
|
-
`
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
The battery still refuses to judge the decision — it refuses to be **the place
|
|
307
|
-
where nobody made one**. Adding a `handling='sealed'` field to an EXISTING item
|
|
308
|
-
requires the host to have RECORDED its decision for that `(item, actor)`,
|
|
309
|
-
carrying `manage`:
|
|
293
|
+
Adding a `handling='sealed'` field to an existing item requires the host to record
|
|
294
|
+
a `manage` decision for `(item, actor)` before writing. The battery enforces the
|
|
295
|
+
recorded decision without deciding tenancy.
|
|
310
296
|
|
|
311
297
|
```python
|
|
312
298
|
from matrx_orm.secrets_battery import host_authorization, note_host_authorization
|
|
@@ -347,8 +333,7 @@ tenancy. Guard: `tests/test_secret_audit_names_its_organization.py`.
|
|
|
347
333
|
- **Standalone package/service:** register your DB with matrx-orm, call the same
|
|
348
334
|
`configure_secrets`. Key comes from `CREDENTIALS_ENCRYPTION_KEY` env, or pass
|
|
349
335
|
`encryption_key=` (host injection).
|
|
350
|
-
- Key resolution
|
|
351
|
-
existing ciphertexts keep decrypting): explicit key → `CREDENTIALS_ENCRYPTION_KEY`
|
|
336
|
+
- Key resolution: explicit key → `CREDENTIALS_ENCRYPTION_KEY`
|
|
352
337
|
(44-char urlsafe-base64 used directly, else SHA-256-derived) → `SUPABASE_SECRET_KEY`
|
|
353
338
|
derivation with a loud warning → loud RuntimeError.
|
|
354
339
|
|
|
@@ -383,20 +368,13 @@ contributed org copies show `out_of_sync` afterward (cosmetic).
|
|
|
383
368
|
(`totp_seed`, extend via `register_non_transferable_field_key`) are retired —
|
|
384
369
|
soft-deleted, deactivated, audited — inside the transfer transaction, and are
|
|
385
370
|
never copied by a fork; `TransferResult.fields_not_transferred` names them so
|
|
386
|
-
the confirmation can say the seed did not travel
|
|
371
|
+
the confirmation can say the seed did not travel. This is
|
|
387
372
|
deliberately NOT "every sealed field": a sealed OAuth refresh token exists to
|
|
388
373
|
move with the item it authenticates, and retiring those would break live
|
|
389
374
|
integrations silently.
|
|
390
|
-
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
folds the active organization's vault into its context
|
|
394
|
-
(aidream `ai_task.py` → `hydrate_context_secrets`), so N parallel agent
|
|
395
|
-
invocations in one workflow step run the same multi-row UPDATE over the same
|
|
396
|
-
rows at the same instant. Without a pinned lock order two of them take the same
|
|
397
|
-
locks in opposite orders and Postgres kills one (40P01). Never drop the flag
|
|
398
|
-
"because the ids are already sorted":
|
|
399
|
-
the PLAN decides lock order, not the array
|
|
375
|
+
- Bulk `last_used_at` updates use `lock_rows_in_pk_order=True` to prevent
|
|
376
|
+
deadlocks between concurrent resolvers. Preserve this flag: SQL execution plans
|
|
377
|
+
determine lock order even when input IDs are sorted
|
|
400
378
|
(`matrx_orm/query/FEATURE.md` § A multi-row UPDATE can pin its lock ORDER).
|
|
401
379
|
- Every read is scoped by a **required** `user_id` or `organization_id`. No None
|
|
402
380
|
= "show everything".
|
|
@@ -414,8 +392,3 @@ contributed org copies show `out_of_sync` afterward (cosmetic).
|
|
|
414
392
|
Drift guard: `scripts/validate_secrets_decrypt.py` (loud, non-blocking, in
|
|
415
393
|
`release.sh`) asserts every active field and attachment still decrypts with the
|
|
416
394
|
configured key.
|
|
417
|
-
|
|
418
|
-
Verified against live code + the live `users.user_secrets` /
|
|
419
|
-
`users.credential_items` schema 2026-08-20 (destination-login metadata update,
|
|
420
|
-
bundle create, reveal, sealed denial, editable gate, rotate, item grants, soft
|
|
421
|
-
delete).
|
|
@@ -175,7 +175,7 @@ def _validate_auxiliaries(
|
|
|
175
175
|
_fail("native passkey aggregate has an unrecorded live attachment")
|
|
176
176
|
|
|
177
177
|
|
|
178
|
-
def _validate_ownership(parent: Mapping[str, Any], source: Mapping[str, Any], metadata: Mapping[str, Any]
|
|
178
|
+
def _validate_ownership(parent: Mapping[str, Any], source: Mapping[str, Any], metadata: Mapping[str, Any]) -> None:
|
|
179
179
|
user_id, organization_id = parent.get("user_id"), parent.get("organization_id")
|
|
180
180
|
if (user_id is None) == (organization_id is None):
|
|
181
181
|
_fail("native passkey parent ownership is invalid")
|
|
@@ -184,14 +184,18 @@ def _validate_ownership(parent: Mapping[str, Any], source: Mapping[str, Any], me
|
|
|
184
184
|
if organization_id is not None:
|
|
185
185
|
if source.get("user_id") is not None or not _same_id(source.get("organization_id"), organization_id) or not _same_id(metadata.get("organization_id"), organization_id):
|
|
186
186
|
_fail("native passkey organization ownership does not match")
|
|
187
|
-
elif
|
|
187
|
+
elif (
|
|
188
|
+
source.get("organization_id") is not None
|
|
189
|
+
or not _same_id(source.get("user_id"), user_id)
|
|
190
|
+
or metadata.get("organization_id") is None
|
|
191
|
+
):
|
|
188
192
|
_fail("native passkey personal ownership does not match")
|
|
189
193
|
|
|
190
194
|
|
|
191
195
|
def _validate_locked_aggregate(
|
|
192
196
|
parent: Mapping[str, Any], fields: Sequence[Mapping[str, Any]], attachments: Sequence[Mapping[str, Any]],
|
|
193
197
|
metadata_rows: Sequence[Mapping[str, Any]],
|
|
194
|
-
deletion_id: str,
|
|
198
|
+
deletion_id: str,
|
|
195
199
|
) -> tuple[str, str, bool]:
|
|
196
200
|
_require_keys(parent, NATIVE_ENABLE_PARENT_FIELDS, "parent")
|
|
197
201
|
for field in fields:
|
|
@@ -219,7 +223,7 @@ def _validate_locked_aggregate(
|
|
|
219
223
|
or not _same_id(metadata.get("source_field_id"), source.get("id"))
|
|
220
224
|
):
|
|
221
225
|
_fail("native passkey restored aggregate shape is invalid")
|
|
222
|
-
_validate_ownership(parent, source, metadata
|
|
226
|
+
_validate_ownership(parent, source, metadata)
|
|
223
227
|
manifest_field_ids, manifest_attachment_ids = _validate_manifest(
|
|
224
228
|
parent, deletion_id, source_id, passkey_id
|
|
225
229
|
)
|
|
@@ -250,7 +254,7 @@ async def enable_native_passkey(
|
|
|
250
254
|
await require_host_authorization(parent_id, actor_id, capability=CAPABILITY_MANAGE,
|
|
251
255
|
operation="native_passkey_enable", audit_organization_id=audit_organization_id)
|
|
252
256
|
source_id, _passkey_id, already_enabled = _validate_locked_aggregate(
|
|
253
|
-
parent, fields, attachments, metadata_rows, deletion_id
|
|
257
|
+
parent, fields, attachments, metadata_rows, deletion_id
|
|
254
258
|
)
|
|
255
259
|
if already_enabled:
|
|
256
260
|
return True
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.259"
|
|
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" }
|
|
@@ -227,20 +227,72 @@ async def test_historical_tombstoned_auxiliaries_outside_manifest_do_not_block_r
|
|
|
227
227
|
|
|
228
228
|
|
|
229
229
|
@pytest.mark.asyncio
|
|
230
|
-
|
|
231
|
-
async def test_personal_enable_binds_locked_personal_scope(_primitive_boundary, metadata_org):
|
|
230
|
+
async def test_personal_enable_preserves_creation_provenance_across_audit_scope(_primitive_boundary):
|
|
232
231
|
parent, fields, metadata = _aggregate()
|
|
233
232
|
parent.update(user_id="actor", organization_id=None)
|
|
234
233
|
fields[0].update(user_id="actor", organization_id=None)
|
|
235
|
-
metadata[0]["organization_id"] =
|
|
236
|
-
|
|
237
|
-
|
|
234
|
+
metadata[0]["organization_id"] = "org-b"
|
|
235
|
+
assert await native_enable.enable_native_passkey(
|
|
236
|
+
parent, fields, [], metadata, deletion_id=DELETION,
|
|
237
|
+
actor_id="actor", audit_organization_id="org-a",
|
|
238
|
+
) is False
|
|
239
|
+
# Persistence seam proves enablement cannot rewrite creation provenance.
|
|
240
|
+
assert metadata[0]["organization_id"] == "org-b"
|
|
241
|
+
assert "organization_id" not in repr(_primitive_boundary[0].calls + _primitive_boundary[1].calls)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
@pytest.mark.asyncio
|
|
245
|
+
@pytest.mark.parametrize("breakage", ["missing_owner", "source_owner", "missing_provenance", "org_source"])
|
|
246
|
+
async def test_personal_enable_refuses_broken_owner_or_provenance(_primitive_boundary, breakage):
|
|
247
|
+
parent, fields, metadata = _aggregate()
|
|
248
|
+
parent.update(user_id="actor", organization_id=None)
|
|
249
|
+
fields[0].update(user_id="actor", organization_id=None)
|
|
250
|
+
metadata[0]["organization_id"] = "org-b"
|
|
251
|
+
if breakage == "missing_owner":
|
|
252
|
+
parent["user_id"] = None
|
|
253
|
+
elif breakage == "source_owner":
|
|
254
|
+
fields[0]["user_id"] = "other"
|
|
255
|
+
elif breakage == "missing_provenance":
|
|
256
|
+
metadata[0]["organization_id"] = None
|
|
257
|
+
else:
|
|
258
|
+
fields[0]["organization_id"] = "org-b"
|
|
259
|
+
with pytest.raises(CredentialRestoreConflictError):
|
|
260
|
+
await native_enable.enable_native_passkey(
|
|
261
|
+
parent, fields, [], metadata, deletion_id=DELETION,
|
|
262
|
+
actor_id="actor", audit_organization_id="org-a",
|
|
263
|
+
)
|
|
264
|
+
assert _primitive_boundary[0].calls == _primitive_boundary[1].calls == []
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
@pytest.mark.asyncio
|
|
268
|
+
@pytest.mark.parametrize("breakage", ["source_org", "metadata_org"])
|
|
269
|
+
async def test_organization_enable_retains_exact_owner_equality(_primitive_boundary, breakage):
|
|
270
|
+
parent, fields, metadata = _aggregate()
|
|
271
|
+
if breakage == "source_org":
|
|
272
|
+
fields[0]["organization_id"] = "other-org"
|
|
273
|
+
else:
|
|
274
|
+
metadata[0]["organization_id"] = None
|
|
275
|
+
with pytest.raises(CredentialRestoreConflictError):
|
|
276
|
+
await native_enable.enable_native_passkey(
|
|
238
277
|
parent, fields, [], metadata, deletion_id=DELETION,
|
|
239
278
|
actor_id="actor", audit_organization_id="org",
|
|
240
279
|
)
|
|
241
|
-
|
|
242
|
-
|
|
280
|
+
assert _primitive_boundary[0].calls == _primitive_boundary[1].calls == []
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
@pytest.mark.asyncio
|
|
284
|
+
@pytest.mark.parametrize("breakage", ["source_parent", "metadata_parent", "metadata_source"])
|
|
285
|
+
async def test_enable_refuses_wrong_native_component_linkage(_primitive_boundary, breakage):
|
|
286
|
+
parent, fields, metadata = _aggregate()
|
|
287
|
+
if breakage == "source_parent":
|
|
288
|
+
fields[0]["credential_item_id"] = "00000000-0000-4000-8000-000000000099"
|
|
289
|
+
elif breakage == "metadata_parent":
|
|
290
|
+
metadata[0]["credential_item_id"] = "00000000-0000-4000-8000-000000000099"
|
|
243
291
|
else:
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
292
|
+
metadata[0]["source_field_id"] = "00000000-0000-4000-8000-000000000099"
|
|
293
|
+
with pytest.raises(CredentialRestoreConflictError):
|
|
294
|
+
await native_enable.enable_native_passkey(
|
|
295
|
+
parent, fields, [], metadata, deletion_id=DELETION,
|
|
296
|
+
actor_id="actor", audit_organization_id="org",
|
|
297
|
+
)
|
|
298
|
+
assert _primitive_boundary[0].calls == _primitive_boundary[1].calls == []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|