omninode-memory 0.6.0__tar.gz → 0.6.1__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 (479) hide show
  1. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/required-checks.yaml +8 -1
  2. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/pre-commit.yml +1 -1
  3. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/test.yml +27 -0
  4. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.pre-commit-config.yaml +7 -0
  5. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/CHANGELOG.md +16 -0
  6. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/PKG-INFO +4 -4
  7. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/environment_variables.md +4 -4
  8. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/pyproject.toml +5 -10
  9. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validate_ci_precommit_alignment.py +2 -0
  10. omninode_memory-0.6.1/scripts/validation/check_ai_slop.py +492 -0
  11. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/__init__.py +1 -1
  12. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/handler_kreuzberg_parse.py +6 -27
  13. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_archive.py +9 -9
  14. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_contract_topics.py +112 -0
  15. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_validate_ci_precommit_alignment.py +1 -1
  16. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/uv.lock +14 -19
  17. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.claude/architecture-handshake.md +0 -0
  18. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.env.example +0 -0
  19. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.flake8 +0 -0
  20. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  22. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  23. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/dependabot.yml +0 -0
  24. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/auto-tag-on-merge.yml +0 -0
  25. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/release-dry-run.yml +0 -0
  26. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.github/workflows/release.yml +0 -0
  27. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.gitignore +0 -0
  28. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.secrets.baseline +0 -0
  29. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.serena/memories/project_overview.md +0 -0
  30. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.serena/memories/suggested_commands.md +0 -0
  31. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.serena/project.yml +0 -0
  32. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/.yamlfmt +0 -0
  33. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/CLAUDE.md +0 -0
  34. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/CODE_OF_CONDUCT.md +0 -0
  35. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/CONTRIBUTING.md +0 -0
  36. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/LICENSE +0 -0
  37. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/README.md +0 -0
  38. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/SECURITY.md +0 -0
  39. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/contract.yaml +0 -0
  40. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations/001_create_subscription_tables.sql +0 -0
  41. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations/002_create_memories_table.sql +0 -0
  42. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations/003_create_crawl_state_table.sql +0 -0
  43. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations/004_create_navigation_sessions_table.sql +0 -0
  44. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations_pending/004_create_navigation_paths_collection.py +0 -0
  45. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/migrations_pending/004_create_navigation_sessions_table.sql +0 -0
  46. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/deployment/database/pending/003_create_crawl_state_table.sql +0 -0
  47. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docker-compose.prod.yml +0 -0
  48. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docker-compose.yml +0 -0
  49. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/INDEX.md +0 -0
  50. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/PERFORMANCE_TESTING.md +0 -0
  51. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/architecture/ARCH_002_KAFKA_ABSTRACTION.md +0 -0
  52. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/architecture/ONEX_FOUR_NODE_ARCHITECTURE.md +0 -0
  53. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/ci/CI_MONITORING_GUIDE.md +0 -0
  54. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/db-split/fk-audit-omn-2069.md +0 -0
  55. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/handler_reuse_matrix.md +0 -0
  56. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/pii_handling.md +0 -0
  57. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/runtime/RUNTIME_PLUGINS.md +0 -0
  58. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/docs/stub_protocols.md +0 -0
  59. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/examples/__init__.py +0 -0
  60. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/examples/advanced_architecture_demo.py +0 -0
  61. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/pyrightconfig.json +0 -0
  62. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/check_migration_freeze.sh +0 -0
  63. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validate_no_transport_imports.py +0 -0
  64. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_enum_casing.py +0 -0
  65. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_http_imports.py +0 -0
  66. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_kafka_imports.py +0 -0
  67. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_model_locations.py +0 -0
  68. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_naming.py +0 -0
  69. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_no_backward_compatibility.py +0 -0
  70. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_pydantic_patterns.py +0 -0
  71. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_secrets.py +0 -0
  72. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/scripts/validation/validate_single_class_per_file.py +0 -0
  73. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/_compat_imports.py +0 -0
  74. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/audit/__init__.py +0 -0
  75. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/audit/__main__.py +0 -0
  76. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/audit/io_audit.py +0 -0
  77. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/bootstrap.py +0 -0
  78. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/__init__.py +0 -0
  79. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/crawl/__init__.py +0 -0
  80. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/crawl/enum_context_source_type.py +0 -0
  81. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/crawl/enum_crawler_type.py +0 -0
  82. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/crawl/enum_detected_doc_type.py +0 -0
  83. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_attribution_signal_type.py +0 -0
  84. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_context_item_type.py +0 -0
  85. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_data_type.py +0 -0
  86. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_entity_extraction_mode.py +0 -0
  87. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_error_code.py +0 -0
  88. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_intelligence_operation_type.py +0 -0
  89. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_lifecycle_state.py +0 -0
  90. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_memory_operation_type.py +0 -0
  91. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_memory_storage_type.py +0 -0
  92. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_migration_status.py +0 -0
  93. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_node_type.py +0 -0
  94. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_operation_status.py +0 -0
  95. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_priority_level.py +0 -0
  96. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_promotion_tier.py +0 -0
  97. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_semantic_entity_type.py +0 -0
  98. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_severity.py +0 -0
  99. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_subscription_status.py +0 -0
  100. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/enums/enum_trust_level.py +0 -0
  101. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/errors/__init__.py +0 -0
  102. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/errors/embedding_errors.py +0 -0
  103. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/__init__.py +0 -0
  104. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/__init__.py +0 -0
  105. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_embedding_http.py +0 -0
  106. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_graph_memory.py +0 -0
  107. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_intent_graph.py +0 -0
  108. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_rate_limiter.py +0 -0
  109. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/adapter_valkey.py +0 -0
  110. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/models/__init__.py +0 -0
  111. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/models/model_adapter_intent_graph_config.py +0 -0
  112. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/models/model_intent_domain.py +0 -0
  113. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/adapters/models/model_intent_graph_health.py +0 -0
  114. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/handler_intent.py +0 -0
  115. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/handler_subscription.py +0 -0
  116. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/models/__init__.py +0 -0
  117. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/handlers/models/model_handler_intent_config.py +0 -0
  118. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/__init__.py +0 -0
  119. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/__init__.py +0 -0
  120. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_connections_result.py +0 -0
  121. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_filesystem_adapter_config.py +0 -0
  122. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_graph_memory_config.py +0 -0
  123. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_graph_memory_health.py +0 -0
  124. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_memory_connection.py +0 -0
  125. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_related_memory.py +0 -0
  126. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/adapters/model_related_memory_result.py +0 -0
  127. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/__init__.py +0 -0
  128. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_doc_source_config.py +0 -0
  129. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_embedding_config.py +0 -0
  130. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_filesystem_config.py +0 -0
  131. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_handler_semantic_compute_config.py +0 -0
  132. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_linear_scope_mapping.py +0 -0
  133. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_memory_service_config.py +0 -0
  134. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_path_scope_mapping.py +0 -0
  135. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_postgres_config.py +0 -0
  136. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_promotion_threshold_set.py +0 -0
  137. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_qdrant_config.py +0 -0
  138. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_rate_limiter_config.py +0 -0
  139. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_scope_mapping_config.py +0 -0
  140. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/config/model_semantic_compute_policy_config.py +0 -0
  141. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/container/__init__.py +0 -0
  142. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/__init__.py +0 -0
  143. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/mixin_handler_routing.py +0 -0
  144. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/model_contract_compute_extended.py +0 -0
  145. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/model_contract_effect_extended.py +0 -0
  146. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/model_contract_orchestrator_extended.py +0 -0
  147. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/contracts/model_contract_reducer_extended.py +0 -0
  148. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/__init__.py +0 -0
  149. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_context.py +0 -0
  150. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_metadata.py +0 -0
  151. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_parameters.py +0 -0
  152. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_request.py +0 -0
  153. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_memory_response.py +0 -0
  154. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_operation_metadata.py +0 -0
  155. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_processing_metrics.py +0 -0
  156. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/core/model_provenance.py +0 -0
  157. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/__init__.py +0 -0
  158. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_crawl_state_record.py +0 -0
  159. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_crawl_tick_command.py +0 -0
  160. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_changed_event.py +0 -0
  161. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_discovered_event.py +0 -0
  162. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_indexed_event.py +0 -0
  163. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_indexed_kreuzberg_event.py +0 -0
  164. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_parse_failed_event.py +0 -0
  165. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/model_document_removed_event.py +0 -0
  166. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/crawl/types.py +0 -0
  167. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/events/__init__.py +0 -0
  168. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/events/model_crawl_tick_command.py +0 -0
  169. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/events/model_intent_classified_event.py +0 -0
  170. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/__init__.py +0 -0
  171. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_audit_metadata.py +0 -0
  172. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_configuration.py +0 -0
  173. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_connection_metadata.py +0 -0
  174. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_error_details.py +0 -0
  175. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_health_metadata.py +0 -0
  176. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_health_response.py +0 -0
  177. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_memory_data.py +0 -0
  178. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_metrics_response.py +0 -0
  179. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_migration_progress.py +0 -0
  180. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_notes.py +0 -0
  181. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_priority.py +0 -0
  182. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_progress_summary.py +0 -0
  183. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_semver.py +0 -0
  184. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_success_metrics.py +0 -0
  185. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_system_health.py +0 -0
  186. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_tags.py +0 -0
  187. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_trust_score.py +0 -0
  188. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_typed_collections.py +0 -0
  189. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/foundation/model_user.py +0 -0
  190. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/__init__.py +0 -0
  191. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_intelligence_analysis.py +0 -0
  192. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_pattern_recognition_result.py +0 -0
  193. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_semantic_analysis_result.py +0 -0
  194. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_semantic_entity.py +0 -0
  195. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/intelligence/model_semantic_entity_list.py +0 -0
  196. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/__init__.py +0 -0
  197. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_memory_item.py +0 -0
  198. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_memory_query.py +0 -0
  199. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_memory_search_result.py +0 -0
  200. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_memory_storage_config.py +0 -0
  201. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/memory/model_similarity_result.py +0 -0
  202. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/scoring/__init__.py +0 -0
  203. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/scoring/model_context_item_stats.py +0 -0
  204. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/scoring/model_context_policy_config.py +0 -0
  205. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/scoring/model_promotion_decision.py +0 -0
  206. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/service/__init__.py +0 -0
  207. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/service/model_service_config.py +0 -0
  208. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/service/model_service_health.py +0 -0
  209. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/service/model_service_registry.py +0 -0
  210. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/__init__.py +0 -0
  211. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/constants.py +0 -0
  212. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/model_notification_event.py +0 -0
  213. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/model_notification_event_payload.py +0 -0
  214. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/subscription/model_subscription.py +0 -0
  215. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/__init__.py +0 -0
  216. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_audit.py +0 -0
  217. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_circuit_breaker_config.py +0 -0
  218. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_circuit_breaker_stats_response.py +0 -0
  219. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_concurrency.py +0 -0
  220. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_correlation_context.py +0 -0
  221. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_health_check_config.py +0 -0
  222. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_health_check_details.py +0 -0
  223. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_health_check_result.py +0 -0
  224. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_health_status.py +0 -0
  225. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_detection_result.py +0 -0
  226. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_detector_config.py +0 -0
  227. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_match.py +0 -0
  228. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_pattern_config.py +0 -0
  229. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_pii_type.py +0 -0
  230. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_resource_health_check.py +0 -0
  231. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_retry_attempt_info.py +0 -0
  232. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_retry_config.py +0 -0
  233. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_retry_statistics.py +0 -0
  234. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_structured_log_entry.py +0 -0
  235. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/models/utils/model_system_health.py +0 -0
  236. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/__init__.py +0 -0
  237. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/__init__.py +0 -0
  238. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/contract.yaml +0 -0
  239. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/models/__init__.py +0 -0
  240. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/models/model_request.py +0 -0
  241. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/agent_coordinator_orchestrator/models/model_response.py +0 -0
  242. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/base.py +0 -0
  243. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/__init__.py +0 -0
  244. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/contract.yaml +0 -0
  245. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/handler_filesystem_crawler.py +0 -0
  246. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/models/__init__.py +0 -0
  247. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/models/model_filesystem_crawl_result.py +0 -0
  248. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/filesystem_crawler_effect/models/model_filesystem_crawler_config.py +0 -0
  249. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/__init__.py +0 -0
  250. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/contract.yaml +0 -0
  251. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/handler_intent_event_consumer.py +0 -0
  252. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/models/__init__.py +0 -0
  253. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/models/model_consumer_config.py +0 -0
  254. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/models/model_consumer_health.py +0 -0
  255. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/utils/__init__.py +0 -0
  256. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_event_consumer_effect/utils/util_event_mapper.py +0 -0
  257. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/__init__.py +0 -0
  258. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/contract.yaml +0 -0
  259. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/handlers/__init__.py +0 -0
  260. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/handlers/handler_intent_query.py +0 -0
  261. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/models/__init__.py +0 -0
  262. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/models/model_handler_intent_query_config.py +0 -0
  263. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/registry/__init__.py +0 -0
  264. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/registry/registry_intent_query_effect.py +0 -0
  265. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/utils/__init__.py +0 -0
  266. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_query_effect/utils/util_intent_mapping.py +0 -0
  267. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/__init__.py +0 -0
  268. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/adapters/__init__.py +0 -0
  269. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/adapters/adapter_intent_storage.py +0 -0
  270. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/contract.yaml +0 -0
  271. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/models/__init__.py +0 -0
  272. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/models/model_intent_storage_request.py +0 -0
  273. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/intent_storage_effect/models/model_intent_storage_response.py +0 -0
  274. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/__init__.py +0 -0
  275. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/clients/__init__.py +0 -0
  276. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/clients/client_kreuzberg.py +0 -0
  277. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/contract.yaml +0 -0
  278. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/models/__init__.py +0 -0
  279. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/models/model_kreuzberg_parse_config.py +0 -0
  280. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/kreuzberg_parse_effect/models/model_kreuzberg_parse_result.py +0 -0
  281. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_consolidator_reducer/__init__.py +0 -0
  282. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/__init__.py +0 -0
  283. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/__init__.py +0 -0
  284. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/adapter_postgres_deactivate_memory.py +0 -0
  285. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/adapters/adapter_runtime_tick_memory.py +0 -0
  286. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/contract.yaml +0 -0
  287. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/__init__.py +0 -0
  288. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_expire.py +0 -0
  289. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/handlers/handler_memory_tick.py +0 -0
  290. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/models/__init__.py +0 -0
  291. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/validators/__init__.py +0 -0
  292. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_lifecycle_orchestrator/validators/validator_lifecycle_transition.py +0 -0
  293. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/__init__.py +0 -0
  294. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/clients/__init__.py +0 -0
  295. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/clients/embedding_client.py +0 -0
  296. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/contract.yaml +0 -0
  297. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/__init__.py +0 -0
  298. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_db_mock.py +0 -0
  299. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_graph_mock.py +0 -0
  300. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_memory_retrieval.py +0 -0
  301. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/handlers/handler_qdrant_mock.py +0 -0
  302. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/__init__.py +0 -0
  303. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_embedding_client_config.py +0 -0
  304. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_db_mock_config.py +0 -0
  305. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_graph_mock_config.py +0 -0
  306. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_memory_retrieval_config.py +0 -0
  307. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_handler_qdrant_mock_config.py +0 -0
  308. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_memory_retrieval_request.py +0 -0
  309. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_retrieval_effect/models/model_memory_retrieval_response.py +0 -0
  310. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/__init__.py +0 -0
  311. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/adapters/__init__.py +0 -0
  312. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/adapters/adapter_filesystem.py +0 -0
  313. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/contract.yaml +0 -0
  314. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/models/__init__.py +0 -0
  315. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/models/model_memory_storage_request.py +0 -0
  316. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/memory_storage_effect/models/model_memory_storage_response.py +0 -0
  317. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/__init__.py +0 -0
  318. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/handlers/__init__.py +0 -0
  319. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/handlers/handler_navigation_history_reducer.py +0 -0
  320. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/models/__init__.py +0 -0
  321. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_history_request.py +0 -0
  322. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_history_response.py +0 -0
  323. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/models/model_navigation_session.py +0 -0
  324. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/navigation_history_reducer/node_navigation_history_reducer.py +0 -0
  325. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/__init__.py +0 -0
  326. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/contract.yaml +0 -0
  327. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/handlers/__init__.py +0 -0
  328. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/handlers/handler_semantic_compute.py +0 -0
  329. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/models/__init__.py +0 -0
  330. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/models/model_semantic_analyzer_compute_request.py +0 -0
  331. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/models/model_semantic_analyzer_compute_response.py +0 -0
  332. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/semantic_analyzer_compute/node_semantic_analyzer_compute.py +0 -0
  333. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/__init__.py +0 -0
  334. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/contract.yaml +0 -0
  335. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/handlers/__init__.py +0 -0
  336. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/handlers/handler_similarity_compute.py +0 -0
  337. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/models/__init__.py +0 -0
  338. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/models/model_handler_similarity_compute_config.py +0 -0
  339. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/models/model_similarity_compute_request.py +0 -0
  340. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/models/model_similarity_compute_response.py +0 -0
  341. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/similarity_compute/node_similarity_compute.py +0 -0
  342. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/nodes/statistics_reducer/__init__.py +0 -0
  343. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/__init__.py +0 -0
  344. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/base_protocols.py +0 -0
  345. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/data_models.py +0 -0
  346. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/error_models.py +0 -0
  347. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_crawl_state_repository.py +0 -0
  348. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_embedding.py +0 -0
  349. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_embedding_provider.py +0 -0
  350. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_handler_intent.py +0 -0
  351. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_intent_graph_adapter.py +0 -0
  352. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/protocols/protocol_secrets_provider.py +0 -0
  353. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/__init__.py +0 -0
  354. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/adapters.py +0 -0
  355. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/contract_topics.py +0 -0
  356. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/dispatch_handlers.py +0 -0
  357. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/introspection.py +0 -0
  358. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/message_type_registration.py +0 -0
  359. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/plugin.py +0 -0
  360. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/runtime/wiring.py +0 -0
  361. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/secrets.py +0 -0
  362. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/settings.py +0 -0
  363. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/tools/__init__.py +0 -0
  364. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/tools/contract_linter.py +0 -0
  365. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/tools/stubs/__init__.py +0 -0
  366. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/tools/stubs/contract_validator.py +0 -0
  367. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/__init__.py +0 -0
  368. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/audit_logger.py +0 -0
  369. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/concurrency.py +0 -0
  370. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/db_url.py +0 -0
  371. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/error_sanitizer.py +0 -0
  372. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/handler_constants.py +0 -0
  373. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/health_manager.py +0 -0
  374. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/observability.py +0 -0
  375. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/pii_detector.py +0 -0
  376. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/resource_manager.py +0 -0
  377. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/src/omnimemory/utils/retry_utils.py +0 -0
  378. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/__init__.py +0 -0
  379. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/audit/io_audit_whitelist.yaml +0 -0
  380. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/audit/transport_import_whitelist.yaml +0 -0
  381. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/conftest.py +0 -0
  382. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/__init__.py +0 -0
  383. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/__init__.py +0 -0
  384. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_embedding_http.py +0 -0
  385. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_embedding_http_integration.py +0 -0
  386. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_graph_memory.py +0 -0
  387. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_graph_memory_integration.py +0 -0
  388. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_intent_graph.py +0 -0
  389. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/adapters/test_adapter_rate_limiter.py +0 -0
  390. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/test_handler_intent.py +0 -0
  391. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/handlers/test_handler_semantic_compute.py +0 -0
  392. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/__init__.py +0 -0
  393. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/conftest.py +0 -0
  394. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/nodes/__init__.py +0 -0
  395. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/nodes/test_kreuzberg_parse_effect.py +0 -0
  396. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/nodes/test_memory_lifecycle_orchestrator_integration.py +0 -0
  397. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/nodes/test_navigation_history_reducer_integration.py +0 -0
  398. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/test_entry_point_discovery.py +0 -0
  399. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/test_handler_lifecycle_pattern.py +0 -0
  400. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/test_handler_subscription.py +0 -0
  401. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/integration/test_node_agent_coordinator.py +0 -0
  402. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/__init__.py +0 -0
  403. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/contracts/__init__.py +0 -0
  404. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/contracts/test_extended_contracts.py +0 -0
  405. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/events/__init__.py +0 -0
  406. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/events/test_model_intent_classified_event.py +0 -0
  407. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/models/test_frozen_boundary_models.py +0 -0
  408. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/__init__.py +0 -0
  409. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/filesystem_crawler_effect/__init__.py +0 -0
  410. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/filesystem_crawler_effect/test_handler_filesystem_crawler.py +0 -0
  411. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_event_consumer_effect/__init__.py +0 -0
  412. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_event_consumer_effect/test_handler_intent_event_consumer.py +0 -0
  413. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_event_consumer_effect/test_model_consumer_health.py +0 -0
  414. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_event_consumer_effect/test_util_event_mapper.py +0 -0
  415. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_query_effect/__init__.py +0 -0
  416. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_query_effect/conftest.py +0 -0
  417. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_query_effect/test_handler_intent_query_integration.py +0 -0
  418. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_storage_effect/__init__.py +0 -0
  419. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/intent_storage_effect/test_handler_intent_storage_adapter_integration.py +0 -0
  420. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/memory_retrieval_effect/__init__.py +0 -0
  421. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/memory_retrieval_effect/test_memory_retrieval_effect.py +0 -0
  422. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/memory_storage_effect/__init__.py +0 -0
  423. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/memory_storage_effect/test_memory_storage_effect.py +0 -0
  424. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/navigation_history_reducer/__init__.py +0 -0
  425. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/navigation_history_reducer/test_navigation_history_reducer_unit.py +0 -0
  426. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/similarity_compute/__init__.py +0 -0
  427. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/nodes/similarity_compute/test_similarity_compute.py +0 -0
  428. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_bootstrap.py +0 -0
  429. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_concurrency.py +0 -0
  430. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_config_models.py +0 -0
  431. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_contract_validation.py +0 -0
  432. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_contract_version.py +0 -0
  433. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_db_url.py +0 -0
  434. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_foundation.py +0 -0
  435. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_health_manager.py +0 -0
  436. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_migration_progress.py +0 -0
  437. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_node_enforcement.py +0 -0
  438. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_node_imports.py +0 -0
  439. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_observability_metrics.py +0 -0
  440. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_performance.py +0 -0
  441. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_resource_manager.py +0 -0
  442. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_secrets_provider.py +0 -0
  443. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_semantic_compute_policy_config.py +0 -0
  444. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_settings.py +0 -0
  445. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/test_validation_scripts.py +0 -0
  446. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/__init__.py +0 -0
  447. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/handlers/__init__.py +0 -0
  448. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/handlers/adapters/__init__.py +0 -0
  449. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/handlers/adapters/test_graph_adapter_typing.py +0 -0
  450. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/handlers/test_subscription_typing.py +0 -0
  451. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_kreuzberg_parse_effect/__init__.py +0 -0
  452. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_kreuzberg_parse_effect/test_handler_kreuzberg_parse.py +0 -0
  453. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/__init__.py +0 -0
  454. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_adapter_postgres_deactivate_memory.py +0 -0
  455. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_adapter_runtime_tick_memory.py +0 -0
  456. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_archive.py +0 -0
  457. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_expire.py +0 -0
  458. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_handler_memory_tick.py +0 -0
  459. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/nodes/test_memory_lifecycle_orchestrator/test_validator_lifecycle_transition.py +0 -0
  460. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/__init__.py +0 -0
  461. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/conftest.py +0 -0
  462. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_adapters.py +0 -0
  463. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_dispatch_handlers.py +0 -0
  464. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_introspection.py +0 -0
  465. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_message_type_registration.py +0 -0
  466. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_plugin.py +0 -0
  467. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/runtime/test_wiring.py +0 -0
  468. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_contract_linter.py +0 -0
  469. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_handler_subscription_notify_strict.py +0 -0
  470. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_ingestion_models.py +0 -0
  471. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_io_audit.py +0 -0
  472. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_scope_mapping_config.py +0 -0
  473. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_sql_placeholders.py +0 -0
  474. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_validate_kafka_imports.py +0 -0
  475. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/tests/unit/test_validate_no_transport_imports.py +0 -0
  476. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/validate_architecture_improvements.py +0 -0
  477. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/validate_foundation.py +0 -0
  478. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/validate_foundation_isolated.py +0 -0
  479. {omninode_memory-0.6.0 → omninode_memory-0.6.1}/validate_foundation_minimal.py +0 -0
@@ -14,7 +14,7 @@
14
14
  #
15
15
  # Applied via: gh api repos/OmniNode-ai/omnimemory/branches/main/protection -X PUT
16
16
  # Mode: strict (branch must be up-to-date before merging)
17
- # Total required checks: 10
17
+ # Total required checks: 11
18
18
 
19
19
  required_checks:
20
20
  # -- Phase 1: Quick Validation (parallel, ~2-5 min) -------------------------
@@ -68,6 +68,13 @@ required_checks:
68
68
  condition: "Skipped on fork PRs (forks may not have access to cross-repo checkout)"
69
69
  rationale: "Cross-repo architecture handshake with omnibase_core is current"
70
70
 
71
+ - name: "AI-Slop Pattern Check (strict, PR diff)"
72
+ workflow: test.yml
73
+ job_id: ai-slop-check
74
+ conditional: true
75
+ condition: "Skipped when no Python/Markdown files changed in the PR diff"
76
+ rationale: "Prevents AI-generated slop patterns from entering the codebase (OMN-2972)"
77
+
71
78
  # -- Phase 2: Full Test Suite ------------------------------------------------
72
79
 
73
80
  - name: "Tests"
@@ -25,4 +25,4 @@ jobs:
25
25
  # - mypy -> lint job (pre-push stage, not triggered here anyway)
26
26
  - uses: pre-commit/action@v3.0.1
27
27
  env:
28
- SKIP: contract-linter,io-audit
28
+ SKIP: contract-linter,io-audit,check-ai-slop
@@ -433,3 +433,30 @@ jobs:
433
433
  echo "Tests: $test"
434
434
  exit 1
435
435
  fi
436
+
437
+ ai-slop-check:
438
+ name: AI-Slop Pattern Check (strict, PR diff)
439
+ runs-on: ubuntu-latest
440
+ steps:
441
+ - uses: actions/checkout@v4
442
+ with:
443
+ fetch-depth: 0
444
+ - name: Set up Python
445
+ uses: actions/setup-python@v5
446
+ with:
447
+ python-version: '3.12'
448
+ - name: Compute changed Python/Markdown files vs PR base
449
+ id: changed
450
+ run: |
451
+ if [ -n "${{ github.base_ref }}" ]; then
452
+ git fetch origin "${{ github.base_ref }}" --no-tags --depth=1
453
+ FILES=$(git diff --name-only "origin/${{ github.base_ref }}"...HEAD -- '*.py' '*.md' | tr '\n' ' ')
454
+ else
455
+ FILES=$(git diff --name-only HEAD~1 -- '*.py' '*.md' 2>/dev/null | tr '\n' ' ')
456
+ fi
457
+ echo "files=$FILES" >> "$GITHUB_OUTPUT"
458
+ - name: Check changed files for AI-slop patterns (strict)
459
+ run: |
460
+ FILES="${{ steps.changed.outputs.files }}"
461
+ if [ -z "$FILES" ]; then exit 0; fi
462
+ python scripts/validation/check_ai_slop.py --strict $FILES
@@ -375,6 +375,13 @@ repos:
375
375
  found (add # onex-allow-internal-ip to suppress)" && exit 1 || exit 0'
376
376
  pass_filenames: false
377
377
  stages: [pre-commit]
378
+ - id: check-ai-slop
379
+ name: Check for AI-slop patterns
380
+ language: system
381
+ entry: uv run python scripts/validation/check_ai_slop.py
382
+ types_or: [python, markdown]
383
+ pass_filenames: true
384
+ stages: [pre-commit]
378
385
 
379
386
  # Configuration
380
387
  default_install_hook_types: [pre-commit, pre-push]
@@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.1] - 2026-02-28
9
+
10
+ ### Added
11
+ - Contract topic validation tests for `intent_query_effect` (OMN-1538, #95)
12
+ - AI-slop checker Phase 2 rollout (#97)
13
+
14
+ ### Changed
15
+ - Replace omninode_bridge db references with omnimemory in docs (#96)
16
+ - Replace Step N narration with intent comments in handler docs (#98)
17
+
18
+ ### Dependencies
19
+ - `omnibase-core` bumped to >=0.22.0,<0.23.0 (was ==0.21.0)
20
+ - `omnibase-spi` bumped to >=0.15.0,<0.16.0 (was ==0.14.0)
21
+ - `omnibase-infra` bumped to >=0.13.0,<0.14.0 (was >=0.11.0,<0.12.0)
22
+ - Removed `[tool.uv] override-dependencies` (no longer needed with omnibase-infra>=0.13.0)
23
+
8
24
  ## [0.6.0] - 2026-02-27
9
25
 
10
26
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omninode-memory
3
- Version: 0.6.0
3
+ Version: 0.6.1
4
4
  Summary: OmniNode document ingestion and semantic retrieval
5
5
  Project-URL: Homepage, https://github.com/OmniNode-ai/omnimemory
6
6
  Project-URL: Repository, https://github.com/OmniNode-ai/omnimemory
@@ -20,9 +20,9 @@ Requires-Dist: cachetools<8.0.0,>=6.2.4
20
20
  Requires-Dist: fastapi<1.0.0,>=0.120.1
21
21
  Requires-Dist: httpx<1.0.0,>=0.28.0
22
22
  Requires-Dist: mcp<2.0.0,>=1.8.0
23
- Requires-Dist: omnibase-core==0.21.0
24
- Requires-Dist: omnibase-infra<0.12.0,>=0.11.0
25
- Requires-Dist: omnibase-spi==0.14.0
23
+ Requires-Dist: omnibase-core<0.23.0,>=0.22.0
24
+ Requires-Dist: omnibase-infra<0.14.0,>=0.13.0
25
+ Requires-Dist: omnibase-spi<0.16.0,>=0.15.0
26
26
  Requires-Dist: pinecone-client<7.0.0,>=4.1.0
27
27
  Requires-Dist: psutil<8.0.0,>=7.0.0
28
28
  Requires-Dist: psycopg2-binary<3.0.0,>=2.9.10
@@ -137,7 +137,7 @@ When using the `asyncpg` driver (used internally for health checks and lifecycle
137
137
  OMNIMEMORY_DB_URL=postgresql://omnimemory:dev_password@localhost:5432/omnimemory_dev
138
138
 
139
139
  # Remote shared infrastructure (OmniNode standard)
140
- OMNIMEMORY_DB_URL=postgresql://postgres:secret@<db-host>:<db-port>/omninode_bridge
140
+ OMNIMEMORY_DB_URL=postgresql://postgres:secret@<db-host>:<db-port>/omnimemory
141
141
  ```
142
142
 
143
143
  > **Breaking change (0.2.0 → 0.3.0)**: The database connection URL is now read **exclusively** from `OMNIMEMORY_DB_URL`. Any previous mechanism for supplying the database URL no longer applies. Update your `.env` file to include this variable before upgrading.
@@ -301,9 +301,9 @@ def safe_db_url_display(url: str) -> str: ...
301
301
  ```python
302
302
  from omnimemory.utils import safe_db_url_display
303
303
 
304
- url = "postgresql://omnimemory:super_secret@<db-host>:5436/omninode_bridge"
304
+ url = "postgresql://omnimemory:super_secret@<db-host>:5436/omnimemory"
305
305
  print(safe_db_url_display(url))
306
- # Output: <db-host>:5436/omninode_bridge
306
+ # Output: <db-host>:5436/omnimemory
307
307
  ```
308
308
 
309
309
  **Edge cases**:
@@ -311,7 +311,7 @@ print(safe_db_url_display(url))
311
311
  | Input | Output |
312
312
  |-------|--------|
313
313
  | `postgresql://user:pass@localhost:5432/mydb` | `localhost:5432/mydb` |
314
- | `postgresql://user:pass@<db-host>:5436/omninode_bridge` | `<db-host>:5436/omninode_bridge` |
314
+ | `postgresql://user:pass@<db-host>:5436/omnimemory` | `<db-host>:5436/omnimemory` |
315
315
  | `postgresql://user:pass@[::1]:5432/mydb` (IPv6) | `[::1]:5432/mydb` |
316
316
  | `postgresql://host_only/mydb` (no port) | `host_only/mydb` |
317
317
  | `https://not-a-db-url` (wrong scheme) | `(unparseable URL)` |
@@ -7,7 +7,7 @@ build-backend = "hatchling.build"
7
7
 
8
8
  [project]
9
9
  name = "omninode-memory"
10
- version = "0.6.0"
10
+ version = "0.6.1"
11
11
  description = "OmniNode document ingestion and semantic retrieval"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.12,<4.0"
@@ -59,9 +59,9 @@ dependencies = [
59
59
  "pyyaml>=6.0.2,<7.0.0",
60
60
 
61
61
  # ONEX dependencies - versioned releases from PyPI
62
- "omnibase-core==0.21.0",
63
- "omnibase-spi==0.14.0",
64
- "omnibase-infra>=0.11.0,<0.12.0",
62
+ "omnibase-core>=0.22.0,<0.23.0",
63
+ "omnibase-spi>=0.15.0,<0.16.0",
64
+ "omnibase-infra>=0.13.0,<0.14.0",
65
65
 
66
66
  # Logging and monitoring
67
67
  # Version ^23.3.0 required for compatibility with omnibase-infra (requires ^23.2.0)
@@ -347,9 +347,4 @@ markers = [
347
347
  ]
348
348
 
349
349
  [tool.uv]
350
- override-dependencies = [
351
- # omnibase-infra==0.11.0 caps these at <0.14.0 / <0.21.0; override to allow
352
- # the pinned versions required by coordinated platform release release-20260227-eceed7
353
- "omnibase-spi==0.14.0",
354
- "omnibase-core==0.21.0",
355
- ]
350
+ # No override-dependencies needed — omnibase-infra>=0.13.0 now allows omnibase-core>=0.22.0 and omnibase-spi>=0.15.0.
@@ -71,6 +71,8 @@ EXPECTED_ALIGNMENTS: list[tuple[str, str, str]] = [
71
71
  ),
72
72
  ("contract-linter", "contract-validation", "contract_linter"),
73
73
  ("io-audit", "io-audit", "io_audit"),
74
+ # AI-slop pattern checker
75
+ ("check-ai-slop", "ai-slop-check", "check_ai_slop.py"),
74
76
  ]
75
77
 
76
78
 
@@ -0,0 +1,492 @@
1
+ #!/usr/bin/env python3
2
+ # SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ """
6
+ ONEX AI-Slop Pattern Checker
7
+
8
+ This pre-commit hook and CI gate detects AI-generated boilerplate ("slop") patterns
9
+ in Python and Markdown files. Uses AST analysis for docstring patterns and line-based
10
+ regex for non-docstring patterns.
11
+
12
+ Checks performed:
13
+ - ERROR: sycophancy (sycophantic docstring openers: "Excellent", "Great", "Sure")
14
+ - ERROR: rest_docstring (reST-style :param:, :type:, :returns:, :rtype:)
15
+ - WARNING: boilerplate_docstring ("This module/class/function provides/implements/contains")
16
+ - WARNING: step_narration ("# Step N:" comments)
17
+ - WARNING: md_separator (four-or-more = signs used as markdown separators in docstrings)
18
+ - INFO: obvious_comment (self-evident inline comments, report mode only)
19
+
20
+ Suppression:
21
+ Add `# ai-slop-ok: reason` on:
22
+ - The def/class line
23
+ - The docstring's opening triple-quote line
24
+ - The line immediately preceding the def/class line
25
+
26
+ Exit codes:
27
+ 0 - No violations (or only INFO/WARNING in non-strict mode)
28
+ 1 - ERROR violations found
29
+ 2 - WARNING violations found (--strict mode only)
30
+
31
+ Usage:
32
+ python scripts/validation/check_ai_slop.py [files...]
33
+ python scripts/validation/check_ai_slop.py --strict [files...]
34
+ python scripts/validation/check_ai_slop.py --report src/
35
+
36
+ Linear ticket: OMN-2971
37
+ """
38
+
39
+ from __future__ import annotations
40
+
41
+ import ast
42
+ import re
43
+ import sys
44
+ from pathlib import Path
45
+
46
+
47
+ # ---------------------------------------------------------------------------
48
+ # Data models
49
+ # ---------------------------------------------------------------------------
50
+
51
+ SEVERITY_ERROR = "ERROR"
52
+ SEVERITY_WARNING = "WARNING"
53
+ SEVERITY_INFO = "INFO"
54
+
55
+ CHECK_SYCOPHANCY = "sycophancy"
56
+ CHECK_REST_DOCSTRING = "rest_docstring"
57
+ CHECK_BOILERPLATE_DOCSTRING = "boilerplate_docstring"
58
+ CHECK_STEP_NARRATION = "step_narration"
59
+ CHECK_MD_SEPARATOR = "md_separator"
60
+ CHECK_OBVIOUS_COMMENT = "obvious_comment"
61
+
62
+ SUPPRESSION_MARKER = "ai-slop-ok"
63
+
64
+ # Sycophantic openers (case-insensitive, must be at start of docstring content)
65
+ _SYCOPHANCY_RE = re.compile(
66
+ r"^\s*(Excellent|Great|Sure|Certainly|Absolutely|Of course|Happy to|"
67
+ r"I would be|Gladly|Wonderful|Perfect|Fantastic|Awesome)[!,. ]",
68
+ re.IGNORECASE,
69
+ )
70
+
71
+ # reST docstring markers
72
+ _REST_RE = re.compile(r"^\s*:(param|type|returns?|rtype|raises?|var|ivar|cvar)\b")
73
+
74
+ # Boilerplate "This <thing> provides/implements/contains/is responsible for"
75
+ _BOILERPLATE_RE = re.compile(
76
+ r"^\s*This\s+(module|class|function|method|file|script|node|handler|service)"
77
+ r"\s+(provides?|implements?|contains?|is responsible for|handles?|manages?|offers?)",
78
+ re.IGNORECASE,
79
+ )
80
+
81
+ # Step narration: "# Step N:" or "# Step N -"
82
+ _STEP_NARRATION_RE = re.compile(r"#\s*Step\s+\d+\s*[:\-]", re.IGNORECASE)
83
+
84
+ # Markdown separator: 4+ = characters in a docstring line
85
+ _MD_SEPARATOR_RE = re.compile(r"={4,}")
86
+
87
+
88
+ class SlopViolation:
89
+ """A single AI-slop violation found in a file."""
90
+
91
+ def __init__(
92
+ self,
93
+ filename: str,
94
+ line: int,
95
+ check: str,
96
+ severity: str,
97
+ message: str,
98
+ source_line: str = "",
99
+ ) -> None:
100
+ self.filename = filename
101
+ self.line = line
102
+ self.check = check
103
+ self.severity = severity
104
+ self.message = message
105
+ self.source_line = source_line
106
+
107
+ def __repr__(self) -> str:
108
+ return (
109
+ f"SlopViolation({self.filename}:{self.line} [{self.severity}] "
110
+ f"{self.check}: {self.message})"
111
+ )
112
+
113
+ def format_line(self) -> str:
114
+ return (
115
+ f"{self.filename}:{self.line}: [{self.severity}] "
116
+ f"{self.check}: {self.message}"
117
+ )
118
+
119
+
120
+ # ---------------------------------------------------------------------------
121
+ # AST visitor — handles docstring patterns
122
+ # ---------------------------------------------------------------------------
123
+
124
+
125
+ class _DocstringVisitor(ast.NodeVisitor):
126
+ """
127
+ AST-based visitor that extracts docstrings from functions, classes, and
128
+ modules and checks them for AI-slop patterns.
129
+
130
+ Uses AST so that the opener line is correctly resolved even when the
131
+ triple-quote and the first content line are on different lines.
132
+ """
133
+
134
+ def __init__(self, filename: str, source_lines: list[str]) -> None:
135
+ self.filename = filename
136
+ self.source_lines = source_lines
137
+ self.violations: list[SlopViolation] = []
138
+
139
+ # ------------------------------------------------------------------
140
+ # Suppression helpers
141
+ # ------------------------------------------------------------------
142
+
143
+ def _has_suppression(self, def_lineno: int, docstring_lineno: int) -> bool:
144
+ """
145
+ Return True if any of the three suppression locations contain the
146
+ suppression marker:
147
+ 1. The def/class line itself (1-indexed)
148
+ 2. The docstring's opening triple-quote line
149
+ 3. The line immediately preceding the def/class line
150
+ """
151
+ lines = self.source_lines
152
+ n = len(lines)
153
+
154
+ def _check(lineno: int) -> bool:
155
+ if 1 <= lineno <= n:
156
+ return SUPPRESSION_MARKER in lines[lineno - 1]
157
+ return False
158
+
159
+ return _check(def_lineno) or _check(docstring_lineno) or _check(def_lineno - 1)
160
+
161
+ # ------------------------------------------------------------------
162
+ # Docstring checker
163
+ # ------------------------------------------------------------------
164
+
165
+ def _check_docstring(
166
+ self,
167
+ node: ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef | ast.Module,
168
+ def_lineno: int,
169
+ ) -> None:
170
+ """Extract and check the docstring of a node."""
171
+ docstring = ast.get_docstring(node, clean=False)
172
+ if not docstring:
173
+ return
174
+
175
+ # Find the AST Constant node that IS the docstring
176
+ if not node.body:
177
+ return
178
+ first_stmt = node.body[0]
179
+ if not isinstance(first_stmt, ast.Expr):
180
+ return
181
+ if not isinstance(first_stmt.value, ast.Constant):
182
+ return
183
+ if not isinstance(first_stmt.value.value, str):
184
+ return
185
+
186
+ docstring_lineno: int = first_stmt.value.lineno # opening triple-quote line
187
+
188
+ if self._has_suppression(def_lineno, docstring_lineno):
189
+ return
190
+
191
+ # Check each line of the docstring for patterns
192
+ doc_lines = docstring.splitlines()
193
+ for offset, doc_line in enumerate(doc_lines):
194
+ actual_lineno = docstring_lineno + offset
195
+
196
+ # Sycophancy (ERROR)
197
+ if _SYCOPHANCY_RE.match(doc_line):
198
+ self.violations.append(
199
+ SlopViolation(
200
+ filename=self.filename,
201
+ line=actual_lineno,
202
+ check=CHECK_SYCOPHANCY,
203
+ severity=SEVERITY_ERROR,
204
+ message=f"Sycophantic opener: {doc_line.strip()!r}",
205
+ source_line=doc_line,
206
+ )
207
+ )
208
+
209
+ # reST docstring (ERROR)
210
+ if _REST_RE.match(doc_line):
211
+ self.violations.append(
212
+ SlopViolation(
213
+ filename=self.filename,
214
+ line=actual_lineno,
215
+ check=CHECK_REST_DOCSTRING,
216
+ severity=SEVERITY_ERROR,
217
+ message=f"reST-style docstring marker: {doc_line.strip()!r}",
218
+ source_line=doc_line,
219
+ )
220
+ )
221
+
222
+ # Boilerplate opener (WARNING)
223
+ if _BOILERPLATE_RE.match(doc_line):
224
+ self.violations.append(
225
+ SlopViolation(
226
+ filename=self.filename,
227
+ line=actual_lineno,
228
+ check=CHECK_BOILERPLATE_DOCSTRING,
229
+ severity=SEVERITY_WARNING,
230
+ message=f"Boilerplate docstring opener: {doc_line.strip()!r}",
231
+ source_line=doc_line,
232
+ )
233
+ )
234
+
235
+ # Markdown separator (WARNING)
236
+ if _MD_SEPARATOR_RE.search(doc_line):
237
+ self.violations.append(
238
+ SlopViolation(
239
+ filename=self.filename,
240
+ line=actual_lineno,
241
+ check=CHECK_MD_SEPARATOR,
242
+ severity=SEVERITY_WARNING,
243
+ message=f"Markdown-style separator in docstring: {doc_line.strip()!r}",
244
+ source_line=doc_line,
245
+ )
246
+ )
247
+
248
+ # ------------------------------------------------------------------
249
+ # AST visit methods
250
+ # ------------------------------------------------------------------
251
+
252
+ def visit_Module(self, node: ast.Module) -> None:
253
+ self._check_docstring(node, 1)
254
+ self.generic_visit(node)
255
+
256
+ def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
257
+ self._check_docstring(node, node.lineno)
258
+ self.generic_visit(node)
259
+
260
+ def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None:
261
+ self._check_docstring(node, node.lineno)
262
+ self.generic_visit(node)
263
+
264
+ def visit_ClassDef(self, node: ast.ClassDef) -> None:
265
+ self._check_docstring(node, node.lineno)
266
+ self.generic_visit(node)
267
+
268
+
269
+ # ---------------------------------------------------------------------------
270
+ # Line-based checks (non-docstring patterns)
271
+ # ---------------------------------------------------------------------------
272
+
273
+
274
+ def _check_lines(filename: str, source_lines: list[str]) -> list[SlopViolation]:
275
+ """
276
+ Line-based regex checks for patterns that don't require AST analysis.
277
+ Only applies outside of docstrings (we use a simple heuristic: skip
278
+ lines inside triple-quoted strings by tracking quote depth).
279
+ """
280
+ violations: list[SlopViolation] = []
281
+
282
+ in_triple_quote = False
283
+ triple_char = ""
284
+
285
+ for lineno, line in enumerate(source_lines, start=1):
286
+ stripped = line.rstrip()
287
+
288
+ # Toggle triple-quote tracking (simple heuristic)
289
+ # Count occurrences of """ and '''
290
+ for tq in ('"""', "'''"):
291
+ count = stripped.count(tq)
292
+ if count:
293
+ if not in_triple_quote:
294
+ if count % 2 == 1:
295
+ in_triple_quote = True
296
+ triple_char = tq
297
+ elif tq == triple_char:
298
+ if count % 2 == 1:
299
+ in_triple_quote = False
300
+ triple_char = ""
301
+
302
+ if in_triple_quote:
303
+ continue
304
+
305
+ # Step narration: "# Step N:" outside docstrings
306
+ comment_match = re.search(r"#(.+)", stripped)
307
+ if comment_match:
308
+ comment_text = comment_match.group(0)
309
+ if _STEP_NARRATION_RE.search(comment_text):
310
+ # Check for suppression on this line
311
+ if SUPPRESSION_MARKER not in stripped:
312
+ violations.append(
313
+ SlopViolation(
314
+ filename=filename,
315
+ line=lineno,
316
+ check=CHECK_STEP_NARRATION,
317
+ severity=SEVERITY_WARNING,
318
+ message=f"Step narration comment: {comment_text.strip()!r}",
319
+ source_line=stripped,
320
+ )
321
+ )
322
+
323
+ return violations
324
+
325
+
326
+ # ---------------------------------------------------------------------------
327
+ # File-level checker
328
+ # ---------------------------------------------------------------------------
329
+
330
+
331
+ def check_file(filepath: str | Path) -> list[SlopViolation]:
332
+ """
333
+ Check a single Python file for AI-slop patterns.
334
+
335
+ Returns a list of SlopViolation instances (may be empty).
336
+ """
337
+ path = Path(filepath)
338
+ violations: list[SlopViolation] = []
339
+
340
+ try:
341
+ source = path.read_text(encoding="utf-8")
342
+ except OSError as exc:
343
+ return [
344
+ SlopViolation(
345
+ filename=str(filepath),
346
+ line=0,
347
+ check="file_read",
348
+ severity=SEVERITY_ERROR,
349
+ message=f"Cannot read file: {exc}",
350
+ )
351
+ ]
352
+
353
+ try:
354
+ tree = ast.parse(source, filename=str(filepath))
355
+ except SyntaxError as exc:
356
+ return [
357
+ SlopViolation(
358
+ filename=str(filepath),
359
+ line=exc.lineno or 0,
360
+ check="syntax_error",
361
+ severity=SEVERITY_ERROR,
362
+ message=f"Syntax error: {exc.msg}",
363
+ )
364
+ ]
365
+
366
+ source_lines = source.splitlines()
367
+
368
+ # AST-based docstring checks
369
+ visitor = _DocstringVisitor(filename=str(filepath), source_lines=source_lines)
370
+ visitor.visit(tree)
371
+ violations.extend(visitor.violations)
372
+
373
+ # Line-based checks (step narration, etc.)
374
+ violations.extend(_check_lines(str(filepath), source_lines))
375
+
376
+ # Sort by line number
377
+ violations.sort(key=lambda v: v.line)
378
+ return violations
379
+
380
+
381
+ # ---------------------------------------------------------------------------
382
+ # Entry point
383
+ # ---------------------------------------------------------------------------
384
+
385
+
386
+ def main(argv: list[str] | None = None) -> int:
387
+ """
388
+ Main entry point for the AI-slop checker.
389
+
390
+ Returns:
391
+ 0 - No violations (or only WARNING/INFO in non-strict mode)
392
+ 1 - ERROR violations found
393
+ 2 - WARNING violations found (--strict mode only)
394
+ """
395
+ import argparse
396
+
397
+ parser = argparse.ArgumentParser(
398
+ description="Check Python/Markdown files for AI-slop patterns."
399
+ )
400
+ parser.add_argument(
401
+ "files",
402
+ nargs="*",
403
+ help="Files or directories to check. When no files are given, exits 0.",
404
+ )
405
+ parser.add_argument(
406
+ "--strict",
407
+ action="store_true",
408
+ help="Treat WARNING violations as blocking (exit code 2).",
409
+ )
410
+ parser.add_argument(
411
+ "--report",
412
+ action="store_true",
413
+ help="Report mode: include INFO violations, scan directories recursively.",
414
+ )
415
+ parser.add_argument(
416
+ "--json",
417
+ action="store_true",
418
+ dest="json_output",
419
+ help="Output results as JSON.",
420
+ )
421
+
422
+ args = parser.parse_args(argv)
423
+
424
+ # Collect files
425
+ files: list[Path] = []
426
+ for f in args.files:
427
+ p = Path(f)
428
+ if p.is_dir():
429
+ files.extend(p.rglob("*.py"))
430
+ if args.report:
431
+ files.extend(p.rglob("*.md"))
432
+ elif p.exists():
433
+ files.append(p)
434
+
435
+ all_violations: list[SlopViolation] = []
436
+ for filepath in files:
437
+ if filepath.suffix == ".py":
438
+ all_violations.extend(check_file(filepath))
439
+ # Markdown files: no AST checks, only line-based (step_narration)
440
+ elif filepath.suffix == ".md":
441
+ try:
442
+ source_lines = filepath.read_text(encoding="utf-8").splitlines()
443
+ all_violations.extend(_check_lines(str(filepath), source_lines))
444
+ except OSError as exc:
445
+ all_violations.append(
446
+ SlopViolation(
447
+ filename=str(filepath),
448
+ line=0,
449
+ check="file_read",
450
+ severity=SEVERITY_ERROR,
451
+ message=f"Cannot read file: {exc}",
452
+ )
453
+ )
454
+
455
+ # Filter by severity
456
+ if not args.report:
457
+ all_violations = [
458
+ v
459
+ for v in all_violations
460
+ if v.severity in (SEVERITY_ERROR, SEVERITY_WARNING)
461
+ ]
462
+
463
+ if args.json_output:
464
+ import json
465
+
466
+ output: list[dict[str, str | int]] = [
467
+ {
468
+ "filename": v.filename,
469
+ "line": v.line,
470
+ "check": v.check,
471
+ "severity": v.severity,
472
+ "message": v.message,
473
+ }
474
+ for v in all_violations
475
+ ]
476
+ print(json.dumps(output, indent=2))
477
+ else:
478
+ for v in all_violations:
479
+ print(v.format_line(), file=sys.stderr)
480
+
481
+ has_errors = any(v.severity == SEVERITY_ERROR for v in all_violations)
482
+ has_warnings = any(v.severity == SEVERITY_WARNING for v in all_violations)
483
+
484
+ if has_errors:
485
+ return 1
486
+ if args.strict and has_warnings:
487
+ return 2
488
+ return 0
489
+
490
+
491
+ if __name__ == "__main__":
492
+ sys.exit(main())