omnibase_infra 0.2.6__py3-none-any.whl

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 (833) hide show
  1. omnibase_infra/__init__.py +101 -0
  2. omnibase_infra/adapters/adapter_onex_tool_execution.py +451 -0
  3. omnibase_infra/capabilities/__init__.py +15 -0
  4. omnibase_infra/capabilities/capability_inference_rules.py +211 -0
  5. omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
  6. omnibase_infra/capabilities/intent_type_extractor.py +160 -0
  7. omnibase_infra/cli/__init__.py +1 -0
  8. omnibase_infra/cli/commands.py +216 -0
  9. omnibase_infra/clients/__init__.py +0 -0
  10. omnibase_infra/configs/widget_mapping.yaml +176 -0
  11. omnibase_infra/constants_topic_patterns.py +26 -0
  12. omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
  13. omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -0
  14. omnibase_infra/decorators/__init__.py +29 -0
  15. omnibase_infra/decorators/allow_any.py +109 -0
  16. omnibase_infra/dlq/__init__.py +90 -0
  17. omnibase_infra/dlq/constants_dlq.py +57 -0
  18. omnibase_infra/dlq/models/__init__.py +26 -0
  19. omnibase_infra/dlq/models/enum_replay_status.py +37 -0
  20. omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
  21. omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
  22. omnibase_infra/dlq/service_dlq_tracking.py +611 -0
  23. omnibase_infra/enums/__init__.py +132 -0
  24. omnibase_infra/enums/enum_any_type_violation.py +104 -0
  25. omnibase_infra/enums/enum_backend_type.py +27 -0
  26. omnibase_infra/enums/enum_capture_outcome.py +42 -0
  27. omnibase_infra/enums/enum_capture_state.py +88 -0
  28. omnibase_infra/enums/enum_chain_violation_type.py +119 -0
  29. omnibase_infra/enums/enum_circuit_state.py +51 -0
  30. omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
  31. omnibase_infra/enums/enum_consumer_group_purpose.py +92 -0
  32. omnibase_infra/enums/enum_contract_type.py +84 -0
  33. omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
  34. omnibase_infra/enums/enum_dispatch_status.py +191 -0
  35. omnibase_infra/enums/enum_environment.py +46 -0
  36. omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
  37. omnibase_infra/enums/enum_handler_error_type.py +111 -0
  38. omnibase_infra/enums/enum_handler_loader_error.py +178 -0
  39. omnibase_infra/enums/enum_handler_source_mode.py +86 -0
  40. omnibase_infra/enums/enum_handler_source_type.py +87 -0
  41. omnibase_infra/enums/enum_handler_type.py +77 -0
  42. omnibase_infra/enums/enum_handler_type_category.py +61 -0
  43. omnibase_infra/enums/enum_infra_transport_type.py +73 -0
  44. omnibase_infra/enums/enum_introspection_reason.py +154 -0
  45. omnibase_infra/enums/enum_kafka_acks.py +99 -0
  46. omnibase_infra/enums/enum_message_category.py +213 -0
  47. omnibase_infra/enums/enum_node_archetype.py +74 -0
  48. omnibase_infra/enums/enum_node_output_type.py +185 -0
  49. omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
  50. omnibase_infra/enums/enum_policy_type.py +32 -0
  51. omnibase_infra/enums/enum_registration_state.py +261 -0
  52. omnibase_infra/enums/enum_registration_status.py +33 -0
  53. omnibase_infra/enums/enum_registry_response_status.py +28 -0
  54. omnibase_infra/enums/enum_response_status.py +26 -0
  55. omnibase_infra/enums/enum_retry_error_category.py +98 -0
  56. omnibase_infra/enums/enum_security_rule_id.py +103 -0
  57. omnibase_infra/enums/enum_selection_strategy.py +91 -0
  58. omnibase_infra/enums/enum_topic_standard.py +42 -0
  59. omnibase_infra/enums/enum_validation_severity.py +78 -0
  60. omnibase_infra/errors/__init__.py +160 -0
  61. omnibase_infra/errors/error_architecture_violation.py +152 -0
  62. omnibase_infra/errors/error_binding_resolution.py +128 -0
  63. omnibase_infra/errors/error_chain_propagation.py +188 -0
  64. omnibase_infra/errors/error_compute_registry.py +95 -0
  65. omnibase_infra/errors/error_consul.py +132 -0
  66. omnibase_infra/errors/error_container_wiring.py +243 -0
  67. omnibase_infra/errors/error_event_bus_registry.py +105 -0
  68. omnibase_infra/errors/error_infra.py +610 -0
  69. omnibase_infra/errors/error_message_type_registry.py +101 -0
  70. omnibase_infra/errors/error_policy_registry.py +115 -0
  71. omnibase_infra/errors/error_vault.py +123 -0
  72. omnibase_infra/event_bus/__init__.py +72 -0
  73. omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +84 -0
  74. omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
  75. omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
  76. omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
  77. omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -0
  78. omnibase_infra/event_bus/models/__init__.py +29 -0
  79. omnibase_infra/event_bus/models/config/__init__.py +20 -0
  80. omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +693 -0
  81. omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
  82. omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
  83. omnibase_infra/event_bus/models/model_event_headers.py +115 -0
  84. omnibase_infra/event_bus/models/model_event_message.py +60 -0
  85. omnibase_infra/event_bus/testing/__init__.py +26 -0
  86. omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
  87. omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
  88. omnibase_infra/event_bus/topic_constants.py +376 -0
  89. omnibase_infra/handlers/__init__.py +82 -0
  90. omnibase_infra/handlers/filesystem/__init__.py +48 -0
  91. omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
  92. omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
  93. omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
  94. omnibase_infra/handlers/handler_consul.py +795 -0
  95. omnibase_infra/handlers/handler_db.py +1046 -0
  96. omnibase_infra/handlers/handler_filesystem.py +1478 -0
  97. omnibase_infra/handlers/handler_graph.py +2015 -0
  98. omnibase_infra/handlers/handler_http.py +926 -0
  99. omnibase_infra/handlers/handler_intent.py +387 -0
  100. omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
  101. omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
  102. omnibase_infra/handlers/handler_mcp.py +1430 -0
  103. omnibase_infra/handlers/handler_qdrant.py +1076 -0
  104. omnibase_infra/handlers/handler_vault.py +428 -0
  105. omnibase_infra/handlers/mcp/__init__.py +19 -0
  106. omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
  107. omnibase_infra/handlers/mcp/protocols.py +178 -0
  108. omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
  109. omnibase_infra/handlers/mixins/__init__.py +47 -0
  110. omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
  111. omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
  112. omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
  113. omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -0
  114. omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
  115. omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
  116. omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
  117. omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
  118. omnibase_infra/handlers/models/__init__.py +286 -0
  119. omnibase_infra/handlers/models/consul/__init__.py +81 -0
  120. omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
  121. omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
  122. omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
  123. omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
  124. omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
  125. omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
  126. omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
  127. omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
  128. omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
  129. omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
  130. omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
  131. omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
  132. omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
  133. omnibase_infra/handlers/models/graph/__init__.py +35 -0
  134. omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
  135. omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
  136. omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
  137. omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
  138. omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
  139. omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
  140. omnibase_infra/handlers/models/http/__init__.py +50 -0
  141. omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
  142. omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
  143. omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
  144. omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
  145. omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
  146. omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
  147. omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
  148. omnibase_infra/handlers/models/mcp/__init__.py +23 -0
  149. omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
  150. omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
  151. omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
  152. omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
  153. omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
  154. omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
  155. omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
  156. omnibase_infra/handlers/models/model_db_query_response.py +60 -0
  157. omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
  158. omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
  159. omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
  160. omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
  161. omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
  162. omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
  163. omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
  164. omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
  165. omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
  166. omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
  167. omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
  168. omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
  169. omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
  170. omnibase_infra/handlers/models/model_handler_response.py +103 -0
  171. omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
  172. omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
  173. omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
  174. omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
  175. omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
  176. omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
  177. omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
  178. omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
  179. omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
  180. omnibase_infra/handlers/models/model_operation_context.py +187 -0
  181. omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
  182. omnibase_infra/handlers/models/model_retry_state.py +162 -0
  183. omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
  184. omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
  185. omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
  186. omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
  187. omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
  188. omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
  189. omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
  190. omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
  191. omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
  192. omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
  193. omnibase_infra/handlers/models/vault/__init__.py +69 -0
  194. omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
  195. omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
  196. omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
  197. omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
  198. omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
  199. omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
  200. omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
  201. omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
  202. omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
  203. omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
  204. omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
  205. omnibase_infra/handlers/registration_storage/__init__.py +43 -0
  206. omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
  207. omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +922 -0
  208. omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
  209. omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
  210. omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
  211. omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
  212. omnibase_infra/handlers/service_discovery/__init__.py +43 -0
  213. omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +1051 -0
  214. omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
  215. omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
  216. omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
  217. omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
  218. omnibase_infra/handlers/service_discovery/models/model_service_info.py +109 -0
  219. omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
  220. omnibase_infra/idempotency/__init__.py +94 -0
  221. omnibase_infra/idempotency/models/__init__.py +43 -0
  222. omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
  223. omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
  224. omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
  225. omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
  226. omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
  227. omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
  228. omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
  229. omnibase_infra/idempotency/store_inmemory.py +265 -0
  230. omnibase_infra/idempotency/store_postgres.py +923 -0
  231. omnibase_infra/infrastructure/__init__.py +0 -0
  232. omnibase_infra/migrations/001_create_event_ledger.sql +166 -0
  233. omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
  234. omnibase_infra/mixins/__init__.py +71 -0
  235. omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -0
  236. omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
  237. omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
  238. omnibase_infra/mixins/mixin_node_introspection.py +2670 -0
  239. omnibase_infra/mixins/mixin_retry_execution.py +386 -0
  240. omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
  241. omnibase_infra/models/__init__.py +144 -0
  242. omnibase_infra/models/bindings/__init__.py +59 -0
  243. omnibase_infra/models/bindings/constants.py +144 -0
  244. omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
  245. omnibase_infra/models/bindings/model_operation_binding.py +44 -0
  246. omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
  247. omnibase_infra/models/bindings/model_parsed_binding.py +52 -0
  248. omnibase_infra/models/corpus/__init__.py +17 -0
  249. omnibase_infra/models/corpus/model_capture_config.py +133 -0
  250. omnibase_infra/models/corpus/model_capture_result.py +86 -0
  251. omnibase_infra/models/discovery/__init__.py +42 -0
  252. omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
  253. omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
  254. omnibase_infra/models/discovery/model_introspection_config.py +330 -0
  255. omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
  256. omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
  257. omnibase_infra/models/dispatch/__init__.py +155 -0
  258. omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -0
  259. omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
  260. omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
  261. omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
  262. omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
  263. omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
  264. omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
  265. omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
  266. omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
  267. omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
  268. omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
  269. omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
  270. omnibase_infra/models/dispatch/model_materialized_dispatch.py +141 -0
  271. omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
  272. omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
  273. omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
  274. omnibase_infra/models/errors/__init__.py +45 -0
  275. omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
  276. omnibase_infra/models/errors/model_infra_error_context.py +99 -0
  277. omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
  278. omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
  279. omnibase_infra/models/handlers/__init__.py +80 -0
  280. omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
  281. omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
  282. omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
  283. omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
  284. omnibase_infra/models/handlers/model_handler_source_config.py +220 -0
  285. omnibase_infra/models/health/__init__.py +9 -0
  286. omnibase_infra/models/health/model_health_check_result.py +40 -0
  287. omnibase_infra/models/lifecycle/__init__.py +39 -0
  288. omnibase_infra/models/logging/__init__.py +51 -0
  289. omnibase_infra/models/logging/model_log_context.py +756 -0
  290. omnibase_infra/models/mcp/__init__.py +15 -0
  291. omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
  292. omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
  293. omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
  294. omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
  295. omnibase_infra/models/model_node_identity.py +126 -0
  296. omnibase_infra/models/model_retry_error_classification.py +78 -0
  297. omnibase_infra/models/projection/__init__.py +43 -0
  298. omnibase_infra/models/projection/model_capability_fields.py +112 -0
  299. omnibase_infra/models/projection/model_registration_projection.py +434 -0
  300. omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
  301. omnibase_infra/models/projection/model_sequence_info.py +182 -0
  302. omnibase_infra/models/projection/model_snapshot_topic_config.py +591 -0
  303. omnibase_infra/models/projectors/__init__.py +41 -0
  304. omnibase_infra/models/projectors/model_projector_column.py +289 -0
  305. omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
  306. omnibase_infra/models/projectors/model_projector_index.py +270 -0
  307. omnibase_infra/models/projectors/model_projector_schema.py +415 -0
  308. omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
  309. omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
  310. omnibase_infra/models/registration/__init__.py +68 -0
  311. omnibase_infra/models/registration/commands/__init__.py +15 -0
  312. omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
  313. omnibase_infra/models/registration/events/__init__.py +56 -0
  314. omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
  315. omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
  316. omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
  317. omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
  318. omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
  319. omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
  320. omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
  321. omnibase_infra/models/registration/model_event_bus_topic_entry.py +59 -0
  322. omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
  323. omnibase_infra/models/registration/model_node_capabilities.py +190 -0
  324. omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
  325. omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
  326. omnibase_infra/models/registration/model_node_introspection_event.py +195 -0
  327. omnibase_infra/models/registration/model_node_metadata.py +79 -0
  328. omnibase_infra/models/registration/model_node_registration.py +162 -0
  329. omnibase_infra/models/registration/model_node_registration_record.py +162 -0
  330. omnibase_infra/models/registry/__init__.py +29 -0
  331. omnibase_infra/models/registry/model_domain_constraint.py +202 -0
  332. omnibase_infra/models/registry/model_message_type_entry.py +271 -0
  333. omnibase_infra/models/resilience/__init__.py +9 -0
  334. omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
  335. omnibase_infra/models/routing/__init__.py +25 -0
  336. omnibase_infra/models/routing/model_routing_entry.py +52 -0
  337. omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
  338. omnibase_infra/models/runtime/__init__.py +49 -0
  339. omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
  340. omnibase_infra/models/runtime/model_discovery_error.py +81 -0
  341. omnibase_infra/models/runtime/model_discovery_result.py +162 -0
  342. omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
  343. omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
  344. omnibase_infra/models/runtime/model_handler_contract.py +296 -0
  345. omnibase_infra/models/runtime/model_loaded_handler.py +129 -0
  346. omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
  347. omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
  348. omnibase_infra/models/security/__init__.py +50 -0
  349. omnibase_infra/models/security/classification_levels.py +99 -0
  350. omnibase_infra/models/security/model_environment_policy.py +145 -0
  351. omnibase_infra/models/security/model_handler_security_policy.py +107 -0
  352. omnibase_infra/models/security/model_security_error.py +81 -0
  353. omnibase_infra/models/security/model_security_validation_result.py +328 -0
  354. omnibase_infra/models/security/model_security_warning.py +67 -0
  355. omnibase_infra/models/snapshot/__init__.py +27 -0
  356. omnibase_infra/models/snapshot/model_field_change.py +65 -0
  357. omnibase_infra/models/snapshot/model_snapshot.py +270 -0
  358. omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
  359. omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
  360. omnibase_infra/models/types/__init__.py +71 -0
  361. omnibase_infra/models/validation/__init__.py +89 -0
  362. omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
  363. omnibase_infra/models/validation/model_any_type_violation.py +141 -0
  364. omnibase_infra/models/validation/model_category_match_result.py +345 -0
  365. omnibase_infra/models/validation/model_chain_violation.py +166 -0
  366. omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
  367. omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
  368. omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
  369. omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
  370. omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
  371. omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
  372. omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
  373. omnibase_infra/models/validation/model_output_validation_params.py +74 -0
  374. omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
  375. omnibase_infra/models/validation/model_validation_error_params.py +84 -0
  376. omnibase_infra/models/validation/model_validation_outcome.py +287 -0
  377. omnibase_infra/nodes/__init__.py +57 -0
  378. omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
  379. omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
  380. omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +203 -0
  381. omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
  382. omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
  383. omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
  384. omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
  385. omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
  386. omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
  387. omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
  388. omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
  389. omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
  390. omnibase_infra/nodes/architecture_validator/node.py +262 -0
  391. omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
  392. omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
  393. omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
  394. omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
  395. omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +106 -0
  396. omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
  397. omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
  398. omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
  399. omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
  400. omnibase_infra/nodes/contract_registry_reducer/__init__.py +29 -0
  401. omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
  402. omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
  403. omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
  404. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
  405. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
  406. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
  407. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
  408. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
  409. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
  410. omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
  411. omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
  412. omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
  413. omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
  414. omnibase_infra/nodes/effects/README.md +358 -0
  415. omnibase_infra/nodes/effects/__init__.py +26 -0
  416. omnibase_infra/nodes/effects/contract.yaml +167 -0
  417. omnibase_infra/nodes/effects/models/__init__.py +32 -0
  418. omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
  419. omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
  420. omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
  421. omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
  422. omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
  423. omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
  424. omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
  425. omnibase_infra/nodes/effects/registry_effect.py +525 -0
  426. omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
  427. omnibase_infra/nodes/handlers/consul/contract.yaml +85 -0
  428. omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
  429. omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
  430. omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
  431. omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
  432. omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
  433. omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
  434. omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
  435. omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
  436. omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
  437. omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
  438. omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
  439. omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
  440. omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
  441. omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
  442. omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
  443. omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
  444. omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
  445. omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
  446. omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
  447. omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
  448. omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
  449. omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
  450. omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
  451. omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
  452. omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
  453. omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
  454. omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
  455. omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
  456. omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
  457. omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
  458. omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
  459. omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
  460. omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
  461. omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -0
  462. omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
  463. omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
  464. omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +482 -0
  465. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
  466. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
  467. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
  468. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
  469. omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
  470. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
  471. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +694 -0
  472. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
  473. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
  474. omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
  475. omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
  476. omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
  477. omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
  478. omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
  479. omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
  480. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
  481. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
  482. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
  483. omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
  484. omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
  485. omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
  486. omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
  487. omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
  488. omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
  489. omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
  490. omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
  491. omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
  492. omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
  493. omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +528 -0
  494. omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
  495. omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -0
  496. omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
  497. omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
  498. omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
  499. omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
  500. omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
  501. omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
  502. omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
  503. omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
  504. omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +220 -0
  505. omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
  506. omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
  507. omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
  508. omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
  509. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
  510. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
  511. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
  512. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
  513. omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
  514. omnibase_infra/nodes/node_registration_storage_effect/node.py +112 -0
  515. omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
  516. omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
  517. omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
  518. omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +215 -0
  519. omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
  520. omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -0
  521. omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
  522. omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
  523. omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
  524. omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +417 -0
  525. omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
  526. omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
  527. omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
  528. omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
  529. omnibase_infra/nodes/node_registry_effect/node.py +165 -0
  530. omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
  531. omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
  532. omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
  533. omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
  534. omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
  535. omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
  536. omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
  537. omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
  538. omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
  539. omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
  540. omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
  541. omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
  542. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
  543. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
  544. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
  545. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
  546. omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
  547. omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
  548. omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
  549. omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
  550. omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +222 -0
  551. omnibase_infra/nodes/reducers/__init__.py +30 -0
  552. omnibase_infra/nodes/reducers/models/__init__.py +37 -0
  553. omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
  554. omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -0
  555. omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
  556. omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
  557. omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
  558. omnibase_infra/nodes/reducers/registration_reducer.py +1138 -0
  559. omnibase_infra/observability/__init__.py +143 -0
  560. omnibase_infra/observability/constants_metrics.py +91 -0
  561. omnibase_infra/observability/factory_observability_sink.py +525 -0
  562. omnibase_infra/observability/handlers/__init__.py +118 -0
  563. omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
  564. omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
  565. omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
  566. omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
  567. omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
  568. omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
  569. omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
  570. omnibase_infra/observability/hooks/__init__.py +74 -0
  571. omnibase_infra/observability/hooks/hook_observability.py +1223 -0
  572. omnibase_infra/observability/models/__init__.py +30 -0
  573. omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
  574. omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
  575. omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
  576. omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
  577. omnibase_infra/observability/sinks/__init__.py +69 -0
  578. omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
  579. omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
  580. omnibase_infra/plugins/__init__.py +27 -0
  581. omnibase_infra/plugins/examples/__init__.py +28 -0
  582. omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
  583. omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
  584. omnibase_infra/plugins/models/__init__.py +21 -0
  585. omnibase_infra/plugins/models/model_plugin_context.py +76 -0
  586. omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
  587. omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
  588. omnibase_infra/plugins/plugin_compute_base.py +449 -0
  589. omnibase_infra/projectors/__init__.py +30 -0
  590. omnibase_infra/projectors/contracts/__init__.py +63 -0
  591. omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
  592. omnibase_infra/projectors/projection_reader_registration.py +1559 -0
  593. omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
  594. omnibase_infra/protocols/__init__.py +104 -0
  595. omnibase_infra/protocols/protocol_capability_projection.py +253 -0
  596. omnibase_infra/protocols/protocol_capability_query.py +251 -0
  597. omnibase_infra/protocols/protocol_container_aware.py +200 -0
  598. omnibase_infra/protocols/protocol_dispatch_engine.py +152 -0
  599. omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
  600. omnibase_infra/protocols/protocol_event_projector.py +96 -0
  601. omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
  602. omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
  603. omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
  604. omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
  605. omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
  606. omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
  607. omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
  608. omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
  609. omnibase_infra/runtime/__init__.py +445 -0
  610. omnibase_infra/runtime/binding_config_resolver.py +2771 -0
  611. omnibase_infra/runtime/binding_resolver.py +753 -0
  612. omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
  613. omnibase_infra/runtime/constants_notification.py +75 -0
  614. omnibase_infra/runtime/constants_security.py +70 -0
  615. omnibase_infra/runtime/contract_handler_discovery.py +587 -0
  616. omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
  617. omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
  618. omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
  619. omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
  620. omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
  621. omnibase_infra/runtime/emit_daemon/cli.py +844 -0
  622. omnibase_infra/runtime/emit_daemon/client.py +811 -0
  623. omnibase_infra/runtime/emit_daemon/config.py +535 -0
  624. omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
  625. omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
  626. omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
  627. omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
  628. omnibase_infra/runtime/emit_daemon/queue.py +618 -0
  629. omnibase_infra/runtime/enums/__init__.py +18 -0
  630. omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
  631. omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
  632. omnibase_infra/runtime/envelope_validator.py +179 -0
  633. omnibase_infra/runtime/event_bus_subcontract_wiring.py +466 -0
  634. omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
  635. omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
  636. omnibase_infra/runtime/handler_contract_source.py +750 -0
  637. omnibase_infra/runtime/handler_identity.py +81 -0
  638. omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
  639. omnibase_infra/runtime/handler_registry.py +329 -0
  640. omnibase_infra/runtime/handler_source_resolver.py +367 -0
  641. omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
  642. omnibase_infra/runtime/kafka_contract_source.py +984 -0
  643. omnibase_infra/runtime/kernel.py +40 -0
  644. omnibase_infra/runtime/mixin_policy_validation.py +522 -0
  645. omnibase_infra/runtime/mixin_semver_cache.py +402 -0
  646. omnibase_infra/runtime/mixins/__init__.py +24 -0
  647. omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
  648. omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
  649. omnibase_infra/runtime/models/__init__.py +229 -0
  650. omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
  651. omnibase_infra/runtime/models/model_binding_config.py +168 -0
  652. omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
  653. omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
  654. omnibase_infra/runtime/models/model_cached_secret.py +138 -0
  655. omnibase_infra/runtime/models/model_compute_key.py +138 -0
  656. omnibase_infra/runtime/models/model_compute_registration.py +97 -0
  657. omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
  658. omnibase_infra/runtime/models/model_config_ref.py +331 -0
  659. omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
  660. omnibase_infra/runtime/models/model_contract_load_result.py +224 -0
  661. omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
  662. omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
  663. omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
  664. omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
  665. omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
  666. omnibase_infra/runtime/models/model_failed_component.py +55 -0
  667. omnibase_infra/runtime/models/model_health_check_response.py +168 -0
  668. omnibase_infra/runtime/models/model_health_check_result.py +229 -0
  669. omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
  670. omnibase_infra/runtime/models/model_logging_config.py +42 -0
  671. omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
  672. omnibase_infra/runtime/models/model_optional_string.py +94 -0
  673. omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
  674. omnibase_infra/runtime/models/model_policy_context.py +100 -0
  675. omnibase_infra/runtime/models/model_policy_key.py +138 -0
  676. omnibase_infra/runtime/models/model_policy_registration.py +139 -0
  677. omnibase_infra/runtime/models/model_policy_result.py +103 -0
  678. omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
  679. omnibase_infra/runtime/models/model_projector_notification_config.py +171 -0
  680. omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
  681. omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
  682. omnibase_infra/runtime/models/model_retry_policy.py +105 -0
  683. omnibase_infra/runtime/models/model_runtime_config.py +150 -0
  684. omnibase_infra/runtime/models/model_runtime_contract_config.py +268 -0
  685. omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -0
  686. omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
  687. omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
  688. omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
  689. omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
  690. omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
  691. omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
  692. omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
  693. omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
  694. omnibase_infra/runtime/models/model_security_config.py +109 -0
  695. omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
  696. omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
  697. omnibase_infra/runtime/models/model_transition_notification_outbox_config.py +112 -0
  698. omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
  699. omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -0
  700. omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
  701. omnibase_infra/runtime/projector_schema_manager.py +565 -0
  702. omnibase_infra/runtime/projector_shell.py +1330 -0
  703. omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
  704. omnibase_infra/runtime/protocol_contract_source.py +92 -0
  705. omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
  706. omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
  707. omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
  708. omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
  709. omnibase_infra/runtime/protocol_policy.py +366 -0
  710. omnibase_infra/runtime/protocols/__init__.py +37 -0
  711. omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
  712. omnibase_infra/runtime/publisher_topic_scoped.py +294 -0
  713. omnibase_infra/runtime/registry/__init__.py +93 -0
  714. omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
  715. omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
  716. omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
  717. omnibase_infra/runtime/registry/registry_message_type.py +542 -0
  718. omnibase_infra/runtime/registry/registry_protocol_binding.py +445 -0
  719. omnibase_infra/runtime/registry_compute.py +1143 -0
  720. omnibase_infra/runtime/registry_contract_source.py +693 -0
  721. omnibase_infra/runtime/registry_dispatcher.py +678 -0
  722. omnibase_infra/runtime/registry_policy.py +1185 -0
  723. omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
  724. omnibase_infra/runtime/runtime_scheduler.py +1070 -0
  725. omnibase_infra/runtime/secret_resolver.py +2112 -0
  726. omnibase_infra/runtime/security_metadata_validator.py +776 -0
  727. omnibase_infra/runtime/service_kernel.py +1651 -0
  728. omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
  729. omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
  730. omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
  731. omnibase_infra/runtime/transition_notification_publisher.py +765 -0
  732. omnibase_infra/runtime/util_container_wiring.py +1124 -0
  733. omnibase_infra/runtime/util_validation.py +314 -0
  734. omnibase_infra/runtime/util_version.py +98 -0
  735. omnibase_infra/runtime/util_wiring.py +723 -0
  736. omnibase_infra/schemas/schema_registration_projection.sql +320 -0
  737. omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
  738. omnibase_infra/services/__init__.py +89 -0
  739. omnibase_infra/services/corpus_capture.py +684 -0
  740. omnibase_infra/services/mcp/__init__.py +31 -0
  741. omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
  742. omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
  743. omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
  744. omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
  745. omnibase_infra/services/registry_api/__init__.py +40 -0
  746. omnibase_infra/services/registry_api/main.py +261 -0
  747. omnibase_infra/services/registry_api/models/__init__.py +66 -0
  748. omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
  749. omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
  750. omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
  751. omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
  752. omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
  753. omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
  754. omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
  755. omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
  756. omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
  757. omnibase_infra/services/registry_api/models/model_warning.py +49 -0
  758. omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
  759. omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
  760. omnibase_infra/services/registry_api/routes.py +371 -0
  761. omnibase_infra/services/registry_api/service.py +837 -0
  762. omnibase_infra/services/service_capability_query.py +945 -0
  763. omnibase_infra/services/service_health.py +898 -0
  764. omnibase_infra/services/service_node_selector.py +530 -0
  765. omnibase_infra/services/service_timeout_emitter.py +699 -0
  766. omnibase_infra/services/service_timeout_scanner.py +394 -0
  767. omnibase_infra/services/session/__init__.py +56 -0
  768. omnibase_infra/services/session/config_consumer.py +137 -0
  769. omnibase_infra/services/session/config_store.py +139 -0
  770. omnibase_infra/services/session/consumer.py +1007 -0
  771. omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
  772. omnibase_infra/services/session/store.py +997 -0
  773. omnibase_infra/services/snapshot/__init__.py +31 -0
  774. omnibase_infra/services/snapshot/service_snapshot.py +647 -0
  775. omnibase_infra/services/snapshot/store_inmemory.py +637 -0
  776. omnibase_infra/services/snapshot/store_postgres.py +1279 -0
  777. omnibase_infra/shared/__init__.py +8 -0
  778. omnibase_infra/testing/__init__.py +10 -0
  779. omnibase_infra/testing/utils.py +23 -0
  780. omnibase_infra/topics/__init__.py +45 -0
  781. omnibase_infra/topics/platform_topic_suffixes.py +140 -0
  782. omnibase_infra/topics/util_topic_composition.py +95 -0
  783. omnibase_infra/types/__init__.py +48 -0
  784. omnibase_infra/types/type_cache_info.py +49 -0
  785. omnibase_infra/types/type_dsn.py +173 -0
  786. omnibase_infra/types/type_infra_aliases.py +60 -0
  787. omnibase_infra/types/typed_dict/__init__.py +29 -0
  788. omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -0
  789. omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
  790. omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
  791. omnibase_infra/types/typed_dict_capabilities.py +64 -0
  792. omnibase_infra/utils/__init__.py +117 -0
  793. omnibase_infra/utils/correlation.py +208 -0
  794. omnibase_infra/utils/util_atomic_file.py +261 -0
  795. omnibase_infra/utils/util_consumer_group.py +232 -0
  796. omnibase_infra/utils/util_datetime.py +372 -0
  797. omnibase_infra/utils/util_db_transaction.py +239 -0
  798. omnibase_infra/utils/util_dsn_validation.py +333 -0
  799. omnibase_infra/utils/util_env_parsing.py +264 -0
  800. omnibase_infra/utils/util_error_sanitization.py +457 -0
  801. omnibase_infra/utils/util_pydantic_validators.py +477 -0
  802. omnibase_infra/utils/util_retry_optimistic.py +281 -0
  803. omnibase_infra/utils/util_semver.py +233 -0
  804. omnibase_infra/validation/__init__.py +307 -0
  805. omnibase_infra/validation/contracts/security.validation.yaml +114 -0
  806. omnibase_infra/validation/enums/__init__.py +11 -0
  807. omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
  808. omnibase_infra/validation/infra_validators.py +1514 -0
  809. omnibase_infra/validation/linter_contract.py +907 -0
  810. omnibase_infra/validation/mixin_any_type_classification.py +120 -0
  811. omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
  812. omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
  813. omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
  814. omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
  815. omnibase_infra/validation/models/__init__.py +15 -0
  816. omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
  817. omnibase_infra/validation/models/model_contract_violation.py +41 -0
  818. omnibase_infra/validation/service_validation_aggregator.py +395 -0
  819. omnibase_infra/validation/validation_exemptions.yaml +2033 -0
  820. omnibase_infra/validation/validator_any_type.py +715 -0
  821. omnibase_infra/validation/validator_chain_propagation.py +839 -0
  822. omnibase_infra/validation/validator_execution_shape.py +465 -0
  823. omnibase_infra/validation/validator_localhandler.py +261 -0
  824. omnibase_infra/validation/validator_registration_security.py +410 -0
  825. omnibase_infra/validation/validator_routing_coverage.py +1020 -0
  826. omnibase_infra/validation/validator_runtime_shape.py +915 -0
  827. omnibase_infra/validation/validator_security.py +513 -0
  828. omnibase_infra/validation/validator_topic_category.py +1152 -0
  829. omnibase_infra-0.2.6.dist-info/METADATA +197 -0
  830. omnibase_infra-0.2.6.dist-info/RECORD +833 -0
  831. omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
  832. omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
  833. omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,2033 @@
1
+ # Validation Exemption Patterns
2
+ # ============================================================================
3
+ # These patterns exempt specific code from validation rules.
4
+ #
5
+ # Why exemptions exist:
6
+ # Infrastructure code often has legitimate architectural reasons to exceed
7
+ # default thresholds (method counts, parameter counts, etc.). Rather than
8
+ # raising global thresholds or suppressing warnings entirely, we document
9
+ # specific exemptions with their rationale.
10
+ #
11
+ # How exemptions work:
12
+ # - Uses regex-based matching to handle code evolution gracefully
13
+ # - All specified pattern fields must match for exemption to apply
14
+ # - Unspecified optional fields are not checked (match everything)
15
+ # - Uses re.search() for flexible substring matching
16
+ #
17
+ # Pattern fields:
18
+ # - file_pattern: Regex matching the filename (required in practice)
19
+ # - class_pattern: Optional regex for class name context
20
+ # - method_pattern: Optional regex for method name context
21
+ # - violation_pattern: Regex matching the violation type
22
+ #
23
+ # Adding new exemptions:
24
+ # 1. Identify the exact violation message from validator output
25
+ # 2. Create minimal patterns to match only that specific case
26
+ # 3. Document the rationale and link to relevant tickets
27
+ # 4. Run tests to verify the exemption works
28
+ # ============================================================================
29
+ # Schema version for future compatibility
30
+ schema_version: "1.0.0"
31
+ # ==============================================================================
32
+ # Skip Directories Configuration
33
+ # ==============================================================================
34
+ # Directories to exclude from validation scans. Uses EXACT name matching
35
+ # (case-sensitive) to prevent false positives from substring matching.
36
+ #
37
+ # Matching behavior:
38
+ # - Only parent directories are checked (filenames are NOT checked)
39
+ # - Matching is case-sensitive (Linux standard)
40
+ # - Uses set membership for O(1) lookup performance
41
+ # - A path is skipped if ANY parent directory matches exactly
42
+ #
43
+ # Examples of what IS skipped:
44
+ # - /src/archive/foo.py (has "archive" directory)
45
+ # - /src/__pycache__/bar.pyc (has "__pycache__" directory)
46
+ # - /src/.venv/lib/baz.py (has ".venv" directory)
47
+ #
48
+ # Examples of what is NOT skipped (no false positives):
49
+ # - /src/archived_feature/foo.py ("archived_feature" != "archived")
50
+ # - /src/my_archive/bar.py ("my_archive" != "archive")
51
+ # - /src/Archive/baz.py (case-sensitive: "Archive" != "archive")
52
+ # - /src/archive.py (filename not checked, only directories)
53
+ #
54
+ # To add new skip directories:
55
+ # 1. Add to the appropriate category below
56
+ # 2. Document why this directory should be skipped
57
+ # 3. Run tests to verify (tests/unit/validation/test_path_skipping.py)
58
+ # ==============================================================================
59
+ skip_directories:
60
+ # Historical/demo code - not subject to current validation rules
61
+ historical:
62
+ - archive # Historical code preserved for reference
63
+ - archived # Alternative naming for archived code
64
+ - examples # Demo code that may intentionally show anti-patterns
65
+ # Python bytecode and caches - generated files, not source code
66
+ caches:
67
+ - __pycache__ # Python bytecode cache
68
+ - .mypy_cache # mypy type checking cache
69
+ - .pytest_cache # pytest cache directory
70
+ # Virtual environments - third-party code, not project code
71
+ virtual_environments:
72
+ - .venv # Standard virtual environment directory
73
+ - venv # Alternative virtual environment directory
74
+ # Build outputs - generated during build, not source code
75
+ build_outputs:
76
+ - build # Python build output directory
77
+ - dist # Distribution packages output
78
+ - .eggs # setuptools eggs directory
79
+ # Version control - repository metadata, not project code
80
+ version_control:
81
+ - .git # Git repository metadata
82
+ # Testing infrastructure - testing tool directories
83
+ testing:
84
+ - .tox # Tox testing directory
85
+ # Node.js - JavaScript/Node dependencies (if any JS in repo)
86
+ nodejs:
87
+ - node_modules # Node.js package dependencies
88
+ # Pattern validator exemptions
89
+ # These handle method count, parameter count, naming, and style violations
90
+ pattern_exemptions:
91
+ # ==========================================================================
92
+ # ModelRuntimeContractConfig Exemptions (OMN-1519)
93
+ # ==========================================================================
94
+ # Data model with cohesive accessor properties for querying loaded contracts.
95
+ # All methods serve same purpose: querying contract_results collection.
96
+ # Properties: all_successful, success_rate, successful_results, failed_results,
97
+ # handler_routing_configs, operation_bindings_configs, error_messages
98
+ # Methods: get_routing_for_contract, get_bindings_for_contract, __bool__, __str__
99
+ - file_pattern: 'model_runtime_contract_config\.py'
100
+ class_pattern: "Class 'ModelRuntimeContractConfig'"
101
+ violation_pattern: 'has \d+ methods'
102
+ reason: >
103
+ Cohesive data model with accessor properties that all query the same contract_results collection. Properties provide convenient typed access to loaded configs, success metrics, and error details. Breaking into smaller classes would reduce cohesion without meaningful benefit.
104
+
105
+ documentation:
106
+ - OMN-1519 PR description
107
+ ticket: OMN-1519
108
+ # ==========================================================================
109
+ # EventBusKafka Exemptions (OMN-934, OMN-1305)
110
+ # ==========================================================================
111
+ # Event bus pattern requires many methods for lifecycle (start/stop/health),
112
+ # pub/sub (subscribe/unsubscribe/publish), circuit breaker, protocol compatibility.
113
+ # Complexity managed through mixin composition (MixinKafkaDlq, MixinKafkaBroadcast).
114
+ # See: event_bus_kafka.py class docstring, CLAUDE.md "Accepted Pattern Exceptions"
115
+ - file_pattern: 'event_bus_kafka\.py'
116
+ class_pattern: "Class 'EventBusKafka'"
117
+ violation_pattern: 'has \d+ methods'
118
+ reason: >
119
+ Event bus pattern requires lifecycle (start/stop/health), pub/sub (subscribe/unsubscribe/publish), circuit breaker, and protocol compatibility methods. DLQ and broadcast methods extracted to mixins. Core class has 12+ methods for protocol compliance.
120
+
121
+ documentation:
122
+ - CLAUDE.md (Accepted Pattern Exceptions - EventBusKafka Complexity)
123
+ - docs/patterns/circuit_breaker_implementation.md
124
+ ticket: OMN-1305
125
+ - file_pattern: 'event_bus_kafka\.py'
126
+ method_pattern: "Function '__init__'"
127
+ violation_pattern: 'has \d+ parameters'
128
+ reason: >
129
+ Configuration managed via ModelKafkaEventBusConfig. Init requires config model parameter.
130
+
131
+ documentation:
132
+ - CLAUDE.md (Accepted Pattern Exceptions - EventBusKafka Complexity)
133
+ ticket: OMN-1305
134
+ # ==========================================================================
135
+ # Protocol Plugin Architecture Exemptions
136
+ # ==========================================================================
137
+ # The 'execute' method name is a standard plugin architecture pattern.
138
+ # It's intentionally generic as it's the protocol-defined entry point.
139
+ # Design Doc: CLAUDE.md "ONEX Architecture" section - Protocol-based plugin execution pattern
140
+ - file_pattern: 'protocol_plugin_compute\.py'
141
+ violation_pattern: "Function name 'execute' is too generic"
142
+ reason: Standard plugin architecture pattern - execute is the protocol-defined entry point.
143
+ documentation:
144
+ - CLAUDE.md (ONEX Architecture - Protocol Resolution section)
145
+ ticket: null
146
+ - file_pattern: 'plugin_compute_base\.py'
147
+ violation_pattern: "Function name 'execute' is too generic"
148
+ reason: Base class implements protocol pattern - execute is the standard entry point.
149
+ documentation:
150
+ - CLAUDE.md (ONEX Architecture - Protocol Resolution section)
151
+ ticket: null
152
+ # ==========================================================================
153
+ # RuntimeHostProcess Exemptions (OMN-756)
154
+ # ==========================================================================
155
+ # Central coordinator class that legitimately requires multiple methods for:
156
+ # - Lifecycle management (start, stop, health_check)
157
+ # - Message handling (_on_message, _handle_envelope)
158
+ # - Graceful shutdown (shutdown_ready, drain logic)
159
+ # - Handler management (register_handler, get_handler)
160
+ - file_pattern: 'service_runtime_host_process\.py'
161
+ class_pattern: "Class 'RuntimeHostProcess'"
162
+ violation_pattern: 'has \d+ methods'
163
+ reason: >
164
+ Central coordinator pattern requires lifecycle management, message handling, graceful shutdown, and handler management methods.
165
+
166
+ documentation:
167
+ - docs/architecture/RUNTIME_HOST_IMPLEMENTATION_PLAN.md
168
+ - docs/adr/ADR-001-graceful-shutdown-drain-period.md
169
+ ticket: OMN-756
170
+ - file_pattern: 'service_runtime_host_process\.py'
171
+ method_pattern: "Function '__init__'"
172
+ violation_pattern: 'has \d+ parameters'
173
+ reason: >
174
+ Central coordinator requires multiple configuration parameters: event_bus, input_topic, output_topic, config, handler_registry.
175
+
176
+ documentation:
177
+ - docs/architecture/RUNTIME_HOST_IMPLEMENTATION_PLAN.md
178
+ ticket: OMN-756
179
+ # ==========================================================================
180
+ # PolicyRegistry Exemptions
181
+ # ==========================================================================
182
+ # Domain registry pattern requires comprehensive policy management operations.
183
+ # Design Doc: docs/patterns/container_dependency_injection.md - Registry patterns
184
+ - file_pattern: 'policy_registry\.py'
185
+ class_pattern: "Class 'PolicyRegistry'"
186
+ violation_pattern: 'has \d+ methods'
187
+ reason: >
188
+ Central registry pattern requires CRUD operations (register, get, update, remove), query operations (list, filter, search), and lifecycle operations (enable, disable, validate).
189
+
190
+ documentation:
191
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
192
+ - CLAUDE.md (Container-Based Dependency Injection section)
193
+ ticket: null
194
+ - file_pattern: 'registry_policy\.py'
195
+ method_pattern: "Function 'register_policy'"
196
+ violation_pattern: 'has \d+ parameters'
197
+ reason: Policy registration requires multiple fields for complete policy definition. ModelPolicyRegistration is available as the preferred API for new code.
198
+ documentation:
199
+ - docs/patterns/container_dependency_injection.md
200
+ ticket: null
201
+ - file_pattern: 'registry_policy\.py'
202
+ class_pattern: "Class 'RegistryPolicy'"
203
+ violation_pattern: 'has \d+ methods'
204
+ reason: >
205
+ Registry pattern after mixin extraction (MixinPolicyValidation, MixinSemverCache). Core class has 12 methods for CRUD, query, and lifecycle operations. This is at the threshold and acceptable per CLAUDE.md registry patterns.
206
+
207
+ documentation:
208
+ - docs/patterns/container_dependency_injection.md
209
+ ticket: OMN-1305
210
+ # ==========================================================================
211
+ # Policy ID Exemptions (OMN-812)
212
+ # ==========================================================================
213
+ # policy_id is intentionally a human-readable string identifier (e.g., 'exponential_backoff'),
214
+ # NOT a UUID. The _id suffix triggers false positive UUID suggestions.
215
+ - file_pattern: 'model_policy_key\.py'
216
+ violation_pattern: "Field 'policy_id' should use UUID"
217
+ reason: >
218
+ policy_id is a human-readable string identifier (e.g., 'exponential_backoff'), not a UUID. The _id suffix triggers false positive.
219
+
220
+ documentation:
221
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
222
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
223
+ ticket: OMN-812
224
+ - file_pattern: 'model_policy_registration\.py'
225
+ violation_pattern: "Field 'policy_id' should use UUID"
226
+ reason: Same as ModelPolicyKey - semantic identifier, not UUID.
227
+ documentation:
228
+ - CLAUDE.md (Registry Naming Conventions)
229
+ ticket: OMN-812
230
+ # ==========================================================================
231
+ # Infrastructure Handler Exemptions (OMN-1092)
232
+ # ==========================================================================
233
+ # Infrastructure handlers require multiple methods for: connection lifecycle,
234
+ # operation dispatching, health checks, and protocol-specific operations.
235
+ - file_pattern: 'handler_consul\.py'
236
+ class_pattern: "Class 'HandlerConsul'"
237
+ violation_pattern: 'has \d+ methods'
238
+ reason: >
239
+ Infrastructure handler pattern requires multiple methods: connection lifecycle (connect, disconnect), operation dispatch (handle_operation, handle_kv_*, handle_service_*), properties (handler_type, handler_category), and health/describe methods. This is standard for infrastructure handlers.
240
+
241
+ documentation:
242
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
243
+ - CLAUDE.md (Infrastructure Patterns - Adapter Pattern)
244
+ ticket: OMN-1092
245
+ # ==========================================================================
246
+ # Projector Schema Model Exemptions (OMN-1168)
247
+ # ==========================================================================
248
+ # ModelProjectorSchema requires multiple methods for SQL generation, validation,
249
+ # and schema introspection operations.
250
+ - file_pattern: 'model_projector_schema\.py'
251
+ class_pattern: "Class 'ModelProjectorSchema'"
252
+ violation_pattern: 'has \d+ methods'
253
+ reason: >
254
+ Schema model requires SQL generation methods (to_create_table_sql, to_full_migration_sql), schema introspection (get_column_names, get_primary_key_columns), validation methods, and identifier quoting for complete projector schema management.
255
+
256
+ documentation:
257
+ - src/omnibase_infra/models/projectors/model_projector_schema.py (class docstring)
258
+ ticket: OMN-1168
259
+ # ==========================================================================
260
+ # Execution Shape Validator Exemptions (OMN-958)
261
+ # ==========================================================================
262
+ - file_pattern: 'enum_handler_type\.py'
263
+ violation_pattern: "contains anti-pattern 'Handler'"
264
+ reason: >
265
+ EnumHandlerType defines ONEX handler architectural roles (InfraHandler, NodeHandler, etc.) which are architectural concepts, not implementation classes.
266
+
267
+ documentation:
268
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
269
+ - CLAUDE.md (ONEX Architecture - Handler Types)
270
+ ticket: OMN-1092
271
+ - file_pattern: 'enum_handler_type_category\.py'
272
+ violation_pattern: "contains anti-pattern 'Handler'"
273
+ reason: >
274
+ EnumHandlerTypeCategory defines ONEX handler behavioral classification (Compute, Effect, NondeterministicCompute) which are architectural concepts for policy envelopes, not implementation classes.
275
+
276
+ documentation:
277
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
278
+ - CLAUDE.md (ONEX Architecture - Handler Classification)
279
+ ticket: OMN-1092
280
+ - file_pattern: 'validator_execution_shape\.py'
281
+ class_pattern: "Class name 'ModelDetectedNodeInfo'"
282
+ violation_pattern: "contains anti-pattern 'Model'"
283
+ reason: >
284
+ ModelDetectedNodeInfo is a validation data class for describing detected node information during AST analysis - follows Model* naming convention.
285
+
286
+ documentation:
287
+ - docs/validation/validator_reference.md
288
+ ticket: OMN-958
289
+ - file_pattern: 'validator_execution_shape\.py'
290
+ class_pattern: "Class 'ExecutionShapeValidator'"
291
+ violation_pattern: 'has \d+ methods'
292
+ reason: >
293
+ Validator class requires multiple methods for comprehensive AST analysis: validate_file, validate_directory, _extract_handlers, _find_handler_type, _detect_return_type, _analyze_return_statement, _check_forbidden_calls, _categorize_output. Cohesive validator pattern.
294
+
295
+ documentation:
296
+ - docs/as_is/02_NODE_EXECUTION_SHAPES.md
297
+ - docs/validation/validator_reference.md
298
+ ticket: OMN-958
299
+ # ==========================================================================
300
+ # Any Type Validator Exemptions (OMN-1276)
301
+ # ==========================================================================
302
+ # AST-based validator for Any type usage enforcement. The class requires
303
+ # multiple visitor methods and helper methods for comprehensive detection.
304
+ - file_pattern: 'validator_any_type\.py'
305
+ class_pattern: "Class 'AnyTypeDetector'"
306
+ violation_pattern: 'has \d+ methods'
307
+ reason: >
308
+ AST visitor class after mixin extraction (MixinAnyTypeClassification, MixinAnyTypeExemption, MixinAnyTypeReporting). Core class has 12 methods for visit methods and annotation checking. This is at the threshold and acceptable per standard AST visitor pattern.
309
+
310
+ documentation:
311
+ - docs/decisions/adr-any-type-pydantic-workaround.md
312
+ - CLAUDE.md (Any Type CI Enforcement)
313
+ ticket: OMN-1276
314
+ - file_pattern: 'model_any_type_violation\.py'
315
+ violation_pattern: "Field 'context_name' might reference an entity"
316
+ reason: >
317
+ context_name is descriptive metadata (e.g., "process_event(payload)") showing where the violation occurred, not an entity reference requiring ID + display_name. It provides human-readable context for error messages.
318
+
319
+ documentation:
320
+ - docs/decisions/adr-any-type-pydantic-workaround.md
321
+ ticket: OMN-1276
322
+ # ==========================================================================
323
+ # RuntimeShapeValidator Exemptions
324
+ # ==========================================================================
325
+ # Design Doc: docs/patterns/error_handling_patterns.md - Validation error patterns
326
+ - file_pattern: 'validator_runtime_shape\.py'
327
+ method_pattern: "Function 'validate_handler_output'"
328
+ violation_pattern: 'has \d+ parameters'
329
+ reason: >
330
+ Validation requires multiple context parameters for proper violation reporting: handler_type, output, output_category, source_file, line_number, correlation_id. These are distinct required contexts, not candidates for a model wrapper.
331
+
332
+ documentation:
333
+ - docs/patterns/error_handling_patterns.md (Validation error hierarchy)
334
+ - CLAUDE.md (ONEX Architecture - Contract-Driven section)
335
+ ticket: null
336
+ - file_pattern: 'validator_runtime_shape\.py'
337
+ method_pattern: "Function 'validate_and_raise'"
338
+ violation_pattern: 'has \d+ parameters'
339
+ reason: Same rationale as validate_handler_output - requires distinct context params.
340
+ documentation:
341
+ - docs/patterns/error_handling_patterns.md
342
+ ticket: null
343
+ # ==========================================================================
344
+ # MixinNodeIntrospection Exemptions (OMN-958)
345
+ # ==========================================================================
346
+ - file_pattern: 'mixin_node_introspection\.py'
347
+ method_pattern: "Function 'initialize_introspection'"
348
+ violation_pattern: 'has \d+ parameters'
349
+ reason: >
350
+ Flexible initialization interface. The preferred method initialize_introspection_from_config() takes ModelIntrospectionConfig with parameter count of 2. Direct parameters method provides fine-grained control when needed.
351
+
352
+ documentation:
353
+ - CLAUDE.md (Node Introspection Security Considerations)
354
+ ticket: OMN-958
355
+ - file_pattern: 'mixin_node_introspection\.py'
356
+ class_pattern: "Class 'MixinNodeIntrospection'"
357
+ violation_pattern: 'has \d+ methods'
358
+ reason: >
359
+ Introspection mixin legitimately requires multiple methods: lifecycle (initialize_introspection, start/stop tasks), capability discovery (get_capabilities, get_endpoints, get_current_state), caching (invalidate_introspection_cache), publishing (publish_introspection), and background tasks (heartbeat, registry listener).
360
+
361
+ documentation:
362
+ - CLAUDE.md (Node Introspection Security Considerations)
363
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
364
+ ticket: OMN-958
365
+ # ==========================================================================
366
+ # Message Dispatch Engine Exemptions (OMN-934, OMN-983)
367
+ # ==========================================================================
368
+ # Central dispatch coordinator pattern requires comprehensive routing capabilities.
369
+ - file_pattern: 'service_message_dispatch_engine\.py'
370
+ class_pattern: "Class 'MessageDispatchEngine'"
371
+ violation_pattern: 'has \d+ methods'
372
+ reason: >
373
+ Central dispatch coordinator requires: registration (register_dispatcher, register_route), routing (dispatch, get_dispatchers_for_message), metrics (get_dispatcher_metrics, get_dispatch_metrics), lifecycle (start, stop, health_check). This is a central coordinator pattern.
374
+
375
+ documentation:
376
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
377
+ - docs/as_is/05_RUNTIME_DISPATCH_SHAPES.md
378
+ ticket: OMN-934
379
+ - file_pattern: 'service_message_dispatch_engine\.py'
380
+ method_pattern: "Function '_build_log_context'"
381
+ violation_pattern: 'has \d+ parameters'
382
+ reason: >
383
+ Log context builder intentionally takes many optional parameters to build structured log context. Each parameter is a distinct log field.
384
+
385
+ documentation:
386
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
387
+ ticket: OMN-934
388
+ - file_pattern: 'service_message_dispatch_engine\.py'
389
+ method_pattern: "Function '__init__'"
390
+ violation_pattern: 'has \d+ parameters'
391
+ reason: >
392
+ Central dispatch coordinator requires multiple configuration parameters: context_enforcer, topic_parser, default_node_kind, logger, topic_to_dispatcher_map, category_dispatchers. These are distinct required contexts for dispatch orchestration.
393
+
394
+ documentation:
395
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
396
+ ticket: OMN-990
397
+ - file_pattern: 'service_message_dispatch_engine\.py'
398
+ method_pattern: "Function 'register_dispatcher'"
399
+ violation_pattern: 'has \d+ parameters'
400
+ reason: >
401
+ Dispatcher registration requires multiple parameters for complete routing configuration: dispatcher, category, node_kind, topic_patterns, priority. These are distinct routing configuration fields.
402
+
403
+ documentation:
404
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
405
+ ticket: OMN-990
406
+ # ==========================================================================
407
+ # RegistryDispatcher Exemptions (OMN-934)
408
+ # ==========================================================================
409
+ - file_pattern: 'registry_dispatcher\.py'
410
+ class_pattern: "Class 'RegistryDispatcher'"
411
+ violation_pattern: 'has \d+ methods'
412
+ reason: >
413
+ Domain registry pattern requires CRUD + query operations: registration (register, unregister), lookup (get_by_id, get_by_type, get_all), metrics (get_metrics). This is an established domain registry pattern.
414
+
415
+ documentation:
416
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
417
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
418
+ ticket: OMN-934
419
+ # ==========================================================================
420
+ # Dispatch Model Semantic Identifier Exemptions (OMN-983)
421
+ # ==========================================================================
422
+ # dispatcher_id, route_id are semantic identifiers (like policy_id), NOT UUIDs.
423
+ # They are human-readable strings that identify dispatchers/routes by name.
424
+ - file_pattern: 'model_dispatcher_registration\.py'
425
+ violation_pattern: "Field 'dispatcher_id' should use UUID"
426
+ reason: >
427
+ dispatcher_id is a human-readable semantic identifier (e.g., "kafka-main-dispatcher"), not a UUID. Similar to policy_id pattern.
428
+
429
+ documentation:
430
+ - CLAUDE.md (Registry Naming Conventions)
431
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
432
+ ticket: OMN-983
433
+ - file_pattern: 'model_dispatcher_registration\.py'
434
+ violation_pattern: 'dispatcher_name.*entity'
435
+ reason: >
436
+ dispatcher_name is a display name for the dispatcher, paired with dispatcher_id as the semantic identifier. This follows the ID + display_name pattern.
437
+
438
+ documentation:
439
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
440
+ ticket: OMN-983
441
+ - file_pattern: 'model_dispatcher_metrics\.py'
442
+ violation_pattern: "Field 'dispatcher_id' should use UUID"
443
+ reason: >
444
+ dispatcher_id is a human-readable semantic identifier, not a UUID. Consistent with model_dispatcher_registration.
445
+
446
+ documentation:
447
+ - CLAUDE.md (Registry Naming Conventions)
448
+ ticket: OMN-983
449
+ - file_pattern: 'model_dispatch_route\.py'
450
+ violation_pattern: "Field 'route_id' should use UUID"
451
+ reason: >
452
+ route_id is a human-readable semantic identifier (e.g., "default-route"), not a UUID.
453
+
454
+ documentation:
455
+ - CLAUDE.md (Registry Naming Conventions)
456
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
457
+ ticket: OMN-983
458
+ - file_pattern: 'model_dispatch_route\.py'
459
+ violation_pattern: "Field 'dispatcher_id' should use UUID"
460
+ reason: >
461
+ dispatcher_id is a human-readable semantic identifier, consistent across dispatch models.
462
+
463
+ documentation:
464
+ - CLAUDE.md (Registry Naming Conventions)
465
+ ticket: OMN-983
466
+ - file_pattern: 'model_dispatch_metrics\.py'
467
+ method_pattern: "Function 'record_dispatch'"
468
+ violation_pattern: 'has \d+ parameters'
469
+ reason: >
470
+ Metrics recording requires multiple parameters for complete dispatch tracking: identifiers (dispatcher_id, route_id, topic, message_type), timing (start_time, end_time, duration_ms), status (success, error_code, error_message).
471
+
472
+ documentation:
473
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
474
+ ticket: OMN-983
475
+ # ==========================================================================
476
+ # RuntimeScheduler Semantic Identifier Exemptions (OMN-953)
477
+ # ==========================================================================
478
+ # scheduler_id is a human-readable semantic identifier set via environment variable
479
+ # (e.g., "runtime-scheduler-prod-1"), NOT a UUID. Follows same pattern as policy_id
480
+ # and dispatcher_id.
481
+ - file_pattern: 'model_runtime_scheduler_config\.py'
482
+ violation_pattern: "Field 'scheduler_id' should use UUID"
483
+ reason: >
484
+ scheduler_id is a human-readable semantic identifier (e.g., "runtime-scheduler-prod-1") set via RUNTIME_SCHEDULER_ID environment variable. Not a UUID - follows policy_id/dispatcher_id pattern.
485
+
486
+ documentation:
487
+ - CLAUDE.md (Registry Naming Conventions)
488
+ ticket: OMN-953
489
+ - file_pattern: 'model_runtime_scheduler_metrics\.py'
490
+ violation_pattern: "Field 'scheduler_id' should use UUID"
491
+ reason: >
492
+ scheduler_id is a human-readable semantic identifier, consistent with model_runtime_scheduler_config.
493
+
494
+ documentation:
495
+ - CLAUDE.md (Registry Naming Conventions)
496
+ ticket: OMN-953
497
+ - file_pattern: 'model_runtime_tick\.py'
498
+ violation_pattern: "Field 'scheduler_id' should use UUID"
499
+ reason: >
500
+ scheduler_id identifies which runtime scheduler instance emitted the tick. Human-readable identifier, consistent across scheduler models.
501
+
502
+ documentation:
503
+ - CLAUDE.md (Registry Naming Conventions)
504
+ ticket: OMN-953
505
+ # ==========================================================================
506
+ # TransitionNotificationPublisher publisher_id Exemption (OMN-1139)
507
+ # ==========================================================================
508
+ # publisher_id is a human-readable semantic identifier similar to scheduler_id.
509
+ # It identifies the publisher instance and may be auto-generated or user-specified.
510
+ - file_pattern: 'model_transition_notification_publisher_metrics\.py'
511
+ violation_pattern: "Field 'publisher_id' should use UUID"
512
+ reason: >
513
+ publisher_id is a human-readable semantic identifier (e.g., "transition-publisher-<uuid>") that identifies the publisher instance. Follows the same pattern as scheduler_id.
514
+
515
+ documentation:
516
+ - CLAUDE.md (Registry Naming Conventions)
517
+ ticket: OMN-1139
518
+ # ==========================================================================
519
+ # ModelTransitionNotificationOutboxMetrics table_name Exemption (OMN-1139)
520
+ # ==========================================================================
521
+ # table_name is the database table name string, not an entity reference.
522
+ - file_pattern: 'model_transition_notification_outbox_metrics\.py'
523
+ violation_pattern: "Field 'table_name' might reference an entity"
524
+ reason: >
525
+ table_name is the database table name string (e.g., "transition_notification_outbox"), not an entity reference. It identifies the outbox table for metrics reporting and does not require ID + display_name pattern.
526
+
527
+ documentation:
528
+ - CLAUDE.md (Registry Naming Conventions)
529
+ ticket: OMN-1139
530
+ # ==========================================================================
531
+ # TransitionNotificationOutbox Method Count Exemption (OMN-1139)
532
+ # ==========================================================================
533
+ # Outbox pattern requires lifecycle (start/stop), storage (store/cleanup),
534
+ # processing (process_pending), and multiple config properties for observability.
535
+ # NOTE: Pattern anchored with src/omnibase_infra/runtime/ prefix to match only
536
+ # the production file, not test files.
537
+ - file_pattern: 'src/omnibase_infra/runtime/transition_notification_outbox\.py'
538
+ class_pattern: "Class 'TransitionNotificationOutbox'"
539
+ violation_pattern: 'has \d+ methods'
540
+ reason: >
541
+ Transactional outbox pattern inherently requires: lifecycle methods (start/stop), storage operations (store/cleanup_processed), processing (process_pending), background loop (_processor_loop), metrics (get_metrics), and configuration properties (table_name, batch_size, poll_interval, is_running, shutdown_timeout, notifications_stored/processed/failed, strict_transaction_mode). Method count is driven by pattern requirements, not poor design.
542
+
543
+ documentation:
544
+ - src/omnibase_infra/schemas/schema_transition_notification_outbox.sql
545
+ ticket: OMN-1139
546
+ # ==========================================================================
547
+ # ServiceTimeoutEmitter/Scanner Naming Exemptions (OMN-1055)
548
+ # ==========================================================================
549
+ # These service classes follow the CLAUDE.md Service<Name> naming convention.
550
+ # Service files use service_<name>.py with Service<Name> class names.
551
+ - file_pattern: 'service_timeout_emitter\.py'
552
+ class_pattern: "Class name 'ServiceTimeoutEmitter'"
553
+ violation_pattern: "contains anti-pattern 'Service'"
554
+ reason: >
555
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
556
+
557
+ documentation:
558
+ - CLAUDE.md (File & Class Naming - Service convention)
559
+ ticket: OMN-1055
560
+ - file_pattern: 'service_timeout_scanner\.py'
561
+ class_pattern: "Class name 'ServiceTimeoutScanner'"
562
+ violation_pattern: "contains anti-pattern 'Service'"
563
+ reason: >
564
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
565
+
566
+ documentation:
567
+ - CLAUDE.md (File & Class Naming - Service convention)
568
+ ticket: OMN-1055
569
+ # ==========================================================================
570
+ # ServiceHealth Exemptions (OMN-529)
571
+ # ==========================================================================
572
+ # ServiceHealth follows the CLAUDE.md Service<Name> naming convention and
573
+ # requires multiple __init__ parameters to support dual initialization modes
574
+ # (direct runtime injection and container-based DI).
575
+ - file_pattern: 'service_health\.py'
576
+ class_pattern: "Class name 'ServiceHealth'"
577
+ violation_pattern: "contains anti-pattern 'Service'"
578
+ reason: >
579
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
580
+
581
+ documentation:
582
+ - CLAUDE.md (File & Class Naming - Service convention)
583
+ ticket: OMN-529
584
+ - file_pattern: 'service_dlq_tracking\.py'
585
+ class_pattern: "Class name 'ServiceDlqTracking'"
586
+ violation_pattern: "contains anti-pattern 'Service'"
587
+ reason: >
588
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
589
+
590
+ documentation:
591
+ - CLAUDE.md (File & Class Naming - Service convention)
592
+ ticket: OMN-1270
593
+ - file_pattern: 'service_capability_query\.py'
594
+ class_pattern: "Class name 'ServiceCapabilityQuery'"
595
+ violation_pattern: "contains anti-pattern 'Service'"
596
+ reason: >
597
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
598
+
599
+ documentation:
600
+ - CLAUDE.md (File & Class Naming - Service convention)
601
+ ticket: OMN-1135
602
+ - file_pattern: 'service_node_selector\.py'
603
+ class_pattern: "Class name 'ServiceNodeSelector'"
604
+ violation_pattern: "contains anti-pattern 'Service'"
605
+ reason: >
606
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
607
+
608
+ documentation:
609
+ - CLAUDE.md (File & Class Naming - Service convention)
610
+ ticket: OMN-1135
611
+ - file_pattern: 'service_snapshot\.py'
612
+ class_pattern: "Class name 'ServiceSnapshot'"
613
+ violation_pattern: "contains anti-pattern 'Service'"
614
+ reason: >
615
+ Follows CLAUDE.md Service<Name> naming convention for service classes. ServiceSnapshot provides generic snapshot infrastructure for state persistence. File renamed from snapshot_repository.py per PR review feedback.
616
+
617
+ documentation:
618
+ - CLAUDE.md (File & Class Naming - Service convention)
619
+ ticket: OMN-1246
620
+ - file_pattern: 'service_health\.py'
621
+ method_pattern: "Function '__init__'"
622
+ violation_pattern: 'has \d+ parameters'
623
+ reason: >
624
+ ServiceHealth supports dual initialization modes (direct runtime injection and container-based DI) requiring multiple optional parameters. This is intentional to support migration from legacy patterns to ONEX-compliant container injection.
625
+
626
+ documentation:
627
+ - CLAUDE.md (Container-Based Dependency Injection)
628
+ ticket: OMN-529
629
+ # ==========================================================================
630
+ # Consul Service ID Exemptions (OMN-889)
631
+ # ==========================================================================
632
+ # consul_service_id is a Consul-specific identifier that is a user-defined string,
633
+ # NOT a UUID. The Consul API accepts any string as a service ID. This field is
634
+ # named with the 'consul_' prefix to clarify it's a Consul concept.
635
+ - file_pattern: 'model_consul_register_payload\.py'
636
+ violation_pattern: "Field 'consul_service_id' should use UUID"
637
+ reason: >
638
+ consul_service_id is a Consul-specific identifier that is a user-defined string, not a UUID. The Consul API accepts any string as a service ID.
639
+
640
+ documentation:
641
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
642
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
643
+ ticket: OMN-889
644
+ - file_pattern: 'model_consul_deregister_payload\.py'
645
+ violation_pattern: "Field 'consul_service_id' should use UUID"
646
+ reason: >
647
+ consul_service_id is a Consul-specific identifier that is a user-defined string, not a UUID. The Consul API accepts any string as a service ID.
648
+
649
+ documentation:
650
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
651
+ ticket: OMN-889
652
+ # ==========================================================================
653
+ # MessageTypeRegistry Exemptions (OMN-983)
654
+ # ==========================================================================
655
+ - file_pattern: 'registry_message_type\.py'
656
+ class_pattern: "Class 'RegistryMessageType'"
657
+ violation_pattern: 'has \d+ methods'
658
+ reason: >
659
+ Domain registry pattern after mixin extraction (MixinMessageTypeRegistration, MixinMessageTypeQuery). Core class has 11 methods for domain registry operations. This is below the threshold and acceptable per established domain registry pattern.
660
+
661
+ documentation:
662
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
663
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
664
+ ticket: OMN-983
665
+ # ==========================================================================
666
+ # Idempotency Store Configuration Exemptions (OMN-945)
667
+ # ==========================================================================
668
+ # table_name is a database configuration field specifying the PostgreSQL table
669
+ # name for storing idempotency records. It is NOT an entity reference.
670
+ - file_pattern: 'model_postgres_idempotency_store_config\.py'
671
+ violation_pattern: "Field 'table_name' might reference an entity"
672
+ reason: >
673
+ table_name is a database configuration parameter specifying the PostgreSQL table name for storing idempotency records (default: "idempotency_records"). This is infrastructure configuration, not an entity reference.
674
+
675
+ documentation:
676
+ - docs/patterns/retry_backoff_compensation_strategy.md (Idempotency patterns)
677
+ ticket: OMN-945
678
+ # ==========================================================================
679
+ # RegistryCompute Exemptions (OMN-811)
680
+ # ==========================================================================
681
+ # Central registry pattern for compute plugins follows same patterns as
682
+ # PolicyRegistry, MessageTypeRegistry, and RegistryDispatcher.
683
+ - file_pattern: 'registry_compute\.py'
684
+ class_pattern: "Class 'RegistryCompute'"
685
+ violation_pattern: 'has \d+ methods'
686
+ reason: >
687
+ Central registry pattern requires comprehensive plugin management: CRUD operations (register, unregister, get), query operations (list_keys, list_plugins, get_all), version resolution (get_latest_version, _parse_version), validation (protocol compliance, async detection), and container integration. This is an established domain registry pattern consistent with PolicyRegistry, MessageTypeRegistry.
688
+
689
+ documentation:
690
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
691
+ - CLAUDE.md (Registry Naming Conventions)
692
+ ticket: OMN-811
693
+ - file_pattern: 'registry_compute\.py'
694
+ method_pattern: "Function 'register_plugin'"
695
+ violation_pattern: 'has \d+ parameters'
696
+ reason: >
697
+ Plugin registration requires multiple parameters for complete registration: plugin_id, plugin_class, version, description, deterministic_async. This is a convenience method; the model-based register() method is the preferred API.
698
+
699
+ documentation:
700
+ - docs/patterns/container_dependency_injection.md
701
+ ticket: OMN-811
702
+ # ==========================================================================
703
+ # ComputeRegistryError Exemptions (OMN-811)
704
+ # ==========================================================================
705
+ # Error classes require multiple context parameters for comprehensive error reporting.
706
+ - file_pattern: 'error_compute_registry\.py'
707
+ method_pattern: "Function '__init__'"
708
+ violation_pattern: 'has \d+ parameters'
709
+ reason: >
710
+ Error class requires multiple contextual parameters for debugging: message, plugin_id, version, registered_plugins, context, and **extra_context. These are distinct error context fields needed for comprehensive error reporting.
711
+
712
+ documentation:
713
+ - docs/patterns/error_handling_patterns.md
714
+ - CLAUDE.md (Infrastructure Error Patterns)
715
+ ticket: OMN-811
716
+ # ==========================================================================
717
+ # EventBusRegistryError Exemptions (OMN-1276)
718
+ # ==========================================================================
719
+ # Error classes require multiple context parameters for comprehensive error reporting.
720
+ - file_pattern: 'error_event_bus_registry\.py'
721
+ method_pattern: "Function '__init__'"
722
+ violation_pattern: 'has \d+ parameters'
723
+ reason: >
724
+ Error class requires multiple contextual parameters for debugging: message, bus_kind, bus_class, available_kinds, existing_class, context, and **extra_context. These are distinct error context fields needed for comprehensive error reporting.
725
+
726
+ documentation:
727
+ - docs/patterns/error_handling_patterns.md
728
+ - CLAUDE.md (Infrastructure Error Patterns)
729
+ ticket: OMN-1276
730
+ # ==========================================================================
731
+ # MessageTypeRegistryError Exemptions (OMN-983)
732
+ # ==========================================================================
733
+ # Error classes require multiple context parameters for comprehensive error reporting.
734
+ - file_pattern: 'error_message_type_registry\.py'
735
+ method_pattern: "Function '__init__'"
736
+ violation_pattern: 'has \d+ parameters'
737
+ reason: >
738
+ Error class requires multiple contextual parameters for debugging: message, message_type, domain, category, context, and **extra_context. These are distinct error context fields needed for comprehensive error reporting.
739
+
740
+ documentation:
741
+ - docs/patterns/error_handling_patterns.md
742
+ - CLAUDE.md (Infrastructure Error Patterns)
743
+ ticket: OMN-983
744
+ # ==========================================================================
745
+ # Compute Plugin ID Exemptions (OMN-811)
746
+ # ==========================================================================
747
+ # plugin_id is a semantic identifier (e.g., 'json_normalizer'), NOT a UUID.
748
+ # Follows same pattern as policy_id, dispatcher_id, scheduler_id.
749
+ - file_pattern: 'model_compute_key\.py'
750
+ violation_pattern: "Field 'plugin_id' should use UUID"
751
+ reason: >
752
+ plugin_id is a human-readable semantic identifier (e.g., 'json_normalizer'), not a UUID. This follows the same pattern as policy_id, dispatcher_id, and scheduler_id.
753
+
754
+ documentation:
755
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
756
+ - docs/patterns/container_dependency_injection.md
757
+ ticket: OMN-811
758
+ - file_pattern: 'model_compute_registration\.py'
759
+ violation_pattern: "Field 'plugin_id' should use UUID"
760
+ reason: >
761
+ plugin_id is a human-readable semantic identifier, consistent with ModelComputeKey. Follows the policy_id/dispatcher_id pattern.
762
+
763
+ documentation:
764
+ - CLAUDE.md (Registry Naming Conventions)
765
+ ticket: OMN-811
766
+ # ==========================================================================
767
+ # Consul Intent Payload Exemptions (OMN-888)
768
+ # ==========================================================================
769
+ # service_name in ModelConsulIntentPayload is the Consul service name to register,
770
+ # NOT a reference to an internal entity. It is a Consul-specific configuration field.
771
+ - file_pattern: 'model_consul_intent_payload\.py'
772
+ violation_pattern: "Field 'service_name' might reference an entity"
773
+ reason: >
774
+ service_name is the Consul service name to register in service discovery (e.g., "node-effect-123"). This is Consul-specific configuration, not an entity reference. The field specifies how the node appears in Consul's service catalog.
775
+
776
+ documentation:
777
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
778
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
779
+ ticket: OMN-888
780
+ # ==========================================================================
781
+ # Private Class Naming Exemptions (OMN-811)
782
+ # ==========================================================================
783
+ # Private helper classes (prefixed with _) follow PascalCase after the underscore.
784
+ # The pattern validator's regex expects names to start with uppercase, but private
785
+ # classes correctly use underscore prefix + PascalCase (e.g., _MetricsTimer).
786
+ - file_pattern: 'registry_compute\.py'
787
+ class_pattern: "Class name '_MetricsTimer'"
788
+ violation_pattern: "should use PascalCase"
789
+ reason: >
790
+ _MetricsTimer IS valid PascalCase for a private class. The underscore prefix indicates private visibility, and "MetricsTimer" follows PascalCase. The validator regex doesn't account for underscore-prefixed private classes.
791
+
792
+ documentation:
793
+ - PEP 8 - Naming Conventions (https://peps.python.org/pep-0008/#naming-conventions)
794
+ - CLAUDE.md (File & Class Naming Conventions)
795
+ ticket: OMN-811
796
+ # ==========================================================================
797
+ # Plugin Models Exemptions (OMN-811)
798
+ # ==========================================================================
799
+ # ModelPluginContext uses str for correlation_id for flexibility - plugins may
800
+ # receive correlation IDs from various sources as strings. This is intentional
801
+ # to support diverse plugin use cases without requiring UUID conversion.
802
+ - file_pattern: 'model_plugin_context\.py'
803
+ violation_pattern: "Field 'correlation_id' should use UUID"
804
+ reason: >
805
+ Plugin context accepts correlation_id as string for flexibility. Plugins may receive correlation IDs from various sources that are not UUIDs. String type allows compatibility with diverse plugin input sources.
806
+
807
+ documentation:
808
+ - docs/patterns/correlation_id_tracking.md
809
+ ticket: OMN-811
810
+ # ==========================================================================
811
+ # MCP Handler Model Exemptions (OMN-1288)
812
+ # ==========================================================================
813
+ # tool_name in ModelMcpToolCall is the MCP protocol identifier for the tool
814
+ # to invoke (e.g., "get_weather", "search_documents"). It is NOT an entity
815
+ # reference requiring UUID + display_name pattern - it's a protocol-level
816
+ # identifier defined by the MCP specification.
817
+ - file_pattern: 'model_mcp_tool_call\.py'
818
+ violation_pattern: "Field 'tool_name' might reference an entity"
819
+ reason: >
820
+ tool_name is an MCP protocol identifier for the tool to invoke (e.g., "get_weather"). This is a protocol-level identifier from the Model Context Protocol specification, not an entity reference.
821
+
822
+ documentation:
823
+ - Model Context Protocol Specification (https://modelcontextprotocol.io/)
824
+ ticket: OMN-1288
825
+ # ==========================================================================
826
+ # Corpus Capture Model Exemptions (OMN-1203)
827
+ # ==========================================================================
828
+ # corpus_display_name in ModelCaptureConfig is a user-provided label for the
829
+ # corpus (e.g., "regression-suite-v1"). It is NOT an entity reference - it's
830
+ # simply a human-readable display name for configuration.
831
+ - file_pattern: 'model_capture_config\.py'
832
+ violation_pattern: "Field 'corpus_display_name' might reference an entity"
833
+ reason: >
834
+ corpus_display_name is a user-provided display label for the corpus (e.g., "regression-suite-v1"). This is a configuration display name, not an entity reference requiring UUID + display_name pattern.
835
+
836
+ documentation:
837
+ - src/omnibase_infra/models/corpus/model_capture_config.py (class docstring)
838
+ ticket: OMN-1203
839
+ # ==========================================================================
840
+ # Union Reduction Phase 2 Model Exemptions (OMN-1002)
841
+ # ==========================================================================
842
+ # These models use builder patterns with many convenience methods.
843
+ # Method counts exceed thresholds but provide valuable developer ergonomics.
844
+ # ModelLogContext - Structured logging context with builder pattern
845
+ - file_pattern: 'model_log_context\.py'
846
+ class_pattern: "Class 'ModelLogContext'"
847
+ violation_pattern: 'has \d+ methods'
848
+ reason: >
849
+ Builder pattern model for structured logging with fluent interface. Many methods provide convenience factories (for_event_bus, for_dispatch, for_error) and builder methods (with_*). This is intentional API design for developer ergonomics.
850
+
851
+ documentation:
852
+ - docs/patterns/correlation_id_tracking.md
853
+ - CLAUDE.md (Type Annotation Conventions)
854
+ ticket: OMN-1002
855
+ - file_pattern: 'model_log_context\.py'
856
+ violation_pattern: "Field 'correlation_id' should use UUID"
857
+ reason: >
858
+ correlation_id is stored as str for logging compatibility. Log formatters expect string values. The correlation ID is typically stringified from UUID before logging anyway.
859
+
860
+ documentation:
861
+ - docs/patterns/correlation_id_tracking.md
862
+ ticket: OMN-1002
863
+ - file_pattern: 'model_log_context\.py'
864
+ violation_pattern: "Field 'group_id' should use UUID"
865
+ reason: >
866
+ group_id is Kafka consumer group ID which is a string, not a UUID. This is infrastructure-specific and follows Kafka naming conventions.
867
+
868
+ documentation:
869
+ - Apache Kafka Consumer Group Configuration (https://kafka.apache.org/documentation/#consumerconfigs_group.id)
870
+ ticket: OMN-1002
871
+ - file_pattern: 'model_log_context\.py'
872
+ violation_pattern: "Field 'service_name' might reference an entity"
873
+ reason: >
874
+ service_name is a logging field for identifying the service (e.g., "kafka", "consul"). It is NOT an entity reference but a simple label for log correlation.
875
+
876
+ documentation:
877
+ - docs/patterns/correlation_id_tracking.md
878
+ ticket: OMN-1002
879
+ # ModelDispatchLogContext - Dispatch-specific logging
880
+ - file_pattern: 'model_dispatch_log_context\.py'
881
+ class_pattern: "Class 'ModelDispatchLogContext'"
882
+ violation_pattern: 'has \d+ methods'
883
+ reason: >
884
+ Builder pattern model for dispatch logging with factory methods for common patterns (for_dispatch_start, for_dispatch_complete, for_dispatch_error). Intentional API design.
885
+
886
+ documentation:
887
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
888
+ - docs/patterns/correlation_id_tracking.md
889
+ ticket: OMN-1002
890
+ - file_pattern: 'model_dispatch_log_context\.py'
891
+ violation_pattern: "Field 'dispatcher_id' should use UUID"
892
+ reason: >
893
+ dispatcher_id is a user-defined string identifier for dispatchers, not a UUID. Dispatchers are registered with string IDs for readability in logs and configuration.
894
+
895
+ documentation:
896
+ - CLAUDE.md (Registry Naming Conventions)
897
+ ticket: OMN-1002
898
+ - file_pattern: 'model_dispatch_log_context\.py'
899
+ method_pattern: "Function 'for_dispatch_complete'"
900
+ violation_pattern: 'has \d+ parameters'
901
+ reason: >
902
+ Factory method that captures all dispatch completion context. Parameters are optional with defaults. Breaking into multiple calls would reduce usability.
903
+
904
+ documentation:
905
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
906
+ ticket: OMN-1002
907
+ - file_pattern: 'model_dispatch_log_context\.py'
908
+ method_pattern: "Function 'for_dispatch_error'"
909
+ violation_pattern: 'has \d+ parameters'
910
+ reason: >
911
+ Factory method that captures all dispatch error context. Parameters are optional with defaults. Breaking into multiple calls would reduce usability.
912
+
913
+ documentation:
914
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
915
+ ticket: OMN-1002
916
+ # ModelDispatchOutcome - Dispatcher output normalization
917
+ - file_pattern: 'model_dispatch_outcome\.py'
918
+ class_pattern: "Class 'ModelDispatchOutcome'"
919
+ violation_pattern: 'has \d+ methods'
920
+ reason: >
921
+ Model with multiple factory methods (none, single, multiple, from_legacy_output) and convenience properties (is_empty, has_topics, single_topic, has_single_topic). Provides comprehensive API for handling dispatcher outputs.
922
+
923
+ documentation:
924
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
925
+ - docs/design/ADR_DISPATCHER_TYPE_SAFETY.md
926
+ ticket: OMN-1002
927
+ # ==========================================================================
928
+ # Failed Component Model Exemptions (OMN-1007)
929
+ # ==========================================================================
930
+ # component_name in ModelFailedComponent is a simple string identifier for
931
+ # the component that failed during shutdown (e.g., "KafkaEventBus", "VaultAdapter").
932
+ # It is NOT an entity reference requiring UUID + display_name pattern.
933
+ - file_pattern: 'model_failed_component\.py'
934
+ violation_pattern: "Field 'component_name' might reference an entity"
935
+ reason: >
936
+ component_name is a simple string identifier for the failed component (e.g., "KafkaEventBus"). This is a shutdown tracking field, not an entity reference. The component is identified by its type name, not by a UUID.
937
+
938
+ documentation:
939
+ - docs/adr/ADR-001-graceful-shutdown-drain-period.md
940
+ - CLAUDE.md (Model Field Naming - computed display names)
941
+ ticket: OMN-1007
942
+ # ==========================================================================
943
+ # ModelRegistryResponse Factory Method Exemptions (PR #79)
944
+ # ==========================================================================
945
+ # from_backend_results is a classmethod factory that requires all parameters
946
+ # to construct a response from individual backend results. Each parameter is
947
+ # a distinct required context for computing the response status.
948
+ - file_pattern: 'model_registry_response\.py'
949
+ method_pattern: "Function 'from_backend_results'"
950
+ violation_pattern: 'has \d+ parameters'
951
+ reason: >
952
+ Classmethod factory requires all parameters to construct response from backend results: node_id, correlation_id, consul_result, postgres_result, timestamp. These are distinct required inputs for computing status, processing_time, and error_summary.
953
+
954
+ documentation:
955
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
956
+ - CLAUDE.md (Factory Method Patterns)
957
+ ticket: PR-79
958
+ # ==========================================================================
959
+ # Union Reduction Phase 3 Result Model Exemptions (OMN-1003)
960
+ # ==========================================================================
961
+ # Result models use comprehensive APIs with factory methods, computed properties,
962
+ # and convenience methods for developer ergonomics.
963
+ - file_pattern: 'model_execution_shape_validation_result\.py'
964
+ class_pattern: "Class 'ModelExecutionShapeValidationResult'"
965
+ violation_pattern: 'has \d+ methods'
966
+ reason: >
967
+ Result model with comprehensive API: computed properties (has_blocking, violation_count, blocking_count, warning_count), factory methods (from_violations, success, from_legacy_result), utility methods (to_legacy_result, format_for_ci), and dunder methods (__bool__, __str__). This is intentional API design for CI integration and developer ergonomics.
968
+
969
+ documentation:
970
+ - docs/validation/validator_reference.md
971
+ - CLAUDE.md (Custom __bool__ for Result Models)
972
+ ticket: OMN-1003
973
+ # ==========================================================================
974
+ # OMN-1004: Union Reduction Phase 4 - New Model Exemptions
975
+ # ==========================================================================
976
+ # ModelCircuitBreakerConfig - service_name is a service identifier string
977
+ - file_pattern: 'model_circuit_breaker_config\.py'
978
+ violation_pattern: "Field 'service_name' might reference an entity"
979
+ reason: >
980
+ service_name is a string identifier for circuit breaker monitoring (e.g., "kafka.producer", "consul.client"). It is NOT an entity reference but a simple label for observability and logging purposes.
981
+
982
+ documentation:
983
+ - CLAUDE.md (Circuit Breaker Pattern section)
984
+ ticket: OMN-1004
985
+ # ModelOperationContext - operation_name is an operation identifier string
986
+ - file_pattern: 'model_operation_context\.py'
987
+ violation_pattern: "Field 'operation_name' might reference an entity"
988
+ reason: >
989
+ operation_name is a string identifier for handler operations (e.g., "connect", "publish", "query"). It is NOT an entity reference but a simple label for operation tracking and timeout context.
990
+
991
+ documentation:
992
+ - CLAUDE.md (Handler Refactoring section)
993
+ ticket: OMN-1004
994
+ # ModelValidationResult - field_name is the name of a validated field
995
+ - file_pattern: 'registration_reducer\.py'
996
+ violation_pattern: "Field 'field_name' might reference an entity"
997
+ reason: >
998
+ field_name is a string containing the name of a field being validated (e.g., "node_id", "name"). It is NOT an entity reference but metadata about validation errors for debugging purposes.
999
+
1000
+ documentation:
1001
+ - docs/architecture/REGISTRATION_REDUCER.md
1002
+ ticket: OMN-1004
1003
+ # ==========================================================================
1004
+ # Handler Validation Error Model Exemptions (OMN-1091)
1005
+ # ==========================================================================
1006
+ # Handler validation error types are explicitly named per ticket requirements.
1007
+ # rule_id and handler_id are human-readable semantic identifiers, not UUIDs.
1008
+ - file_pattern: 'enum_handler_error_type\.py'
1009
+ violation_pattern: "contains anti-pattern 'Handler'"
1010
+ reason: >
1011
+ EnumHandlerErrorType is an enum for handler validation error types (CONTRACT_PARSE_ERROR, SECURITY_VALIDATION_ERROR, etc.). The "Handler" name is intentional per OMN-1091 spec.
1012
+
1013
+ documentation:
1014
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1015
+ ticket: OMN-1091
1016
+ - file_pattern: 'enum_handler_source_type\.py'
1017
+ violation_pattern: "contains anti-pattern 'Handler'"
1018
+ reason: >
1019
+ EnumHandlerSourceType is an enum for validation source types (CONTRACT, DESCRIPTOR, STATIC_ANALYSIS). The "Handler" name is intentional per OMN-1091 spec.
1020
+
1021
+ documentation:
1022
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1023
+ ticket: OMN-1091
1024
+ - file_pattern: 'model_handler_validation_error\.py'
1025
+ violation_pattern: "Field 'rule_id' should use UUID"
1026
+ reason: >
1027
+ rule_id is a human-readable semantic identifier (e.g., "CONTRACT-001", "SECURITY-002") per ticket spec. Used for CI output and developer reference. Not a UUID.
1028
+
1029
+ documentation:
1030
+ - docs/patterns/error_handling_patterns.md
1031
+ ticket: OMN-1091
1032
+ - file_pattern: 'model_handler_validation_error\.py'
1033
+ method_pattern: "Function 'from_contract_error'"
1034
+ violation_pattern: 'has \d+ parameters'
1035
+ reason: >
1036
+ Factory method with many optional parameters for complete error construction. Parameters have defaults. Breaking into multiple calls would reduce usability.
1037
+
1038
+ documentation:
1039
+ - docs/patterns/error_handling_patterns.md
1040
+ ticket: OMN-1091
1041
+ - file_pattern: 'model_handler_validation_error\.py'
1042
+ method_pattern: "Function 'from_security_violation'"
1043
+ violation_pattern: 'has \d+ parameters'
1044
+ reason: >
1045
+ Factory method with many optional parameters for complete error construction. Parameters have defaults. Breaking into multiple calls would reduce usability.
1046
+
1047
+ documentation:
1048
+ - docs/patterns/error_handling_patterns.md
1049
+ ticket: OMN-1091
1050
+ - file_pattern: 'model_handler_validation_error\.py'
1051
+ method_pattern: "Function 'from_descriptor_error'"
1052
+ violation_pattern: 'has \d+ parameters'
1053
+ reason: >
1054
+ Factory method with many optional parameters for complete error construction. Parameters have defaults.
1055
+
1056
+ documentation:
1057
+ - docs/patterns/error_handling_patterns.md
1058
+ ticket: OMN-1091
1059
+ - file_pattern: 'model_handler_validation_error\.py'
1060
+ method_pattern: "Function 'from_architecture_error'"
1061
+ violation_pattern: 'has \d+ parameters'
1062
+ reason: >
1063
+ Factory method with many optional parameters for complete error construction. Parameters have defaults.
1064
+
1065
+ documentation:
1066
+ - docs/patterns/error_handling_patterns.md
1067
+ ticket: OMN-1091
1068
+ - file_pattern: 'model_handler_identifier\.py'
1069
+ violation_pattern: "Field 'handler_id' should use UUID"
1070
+ reason: >
1071
+ handler_id is a human-readable semantic identifier (e.g., "http-handler", "db-handler") per existing patterns. Not a UUID.
1072
+
1073
+ documentation:
1074
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
1075
+ ticket: OMN-1091
1076
+ # ==========================================================================
1077
+ # Handler Contract Source Exemptions (OMN-1097)
1078
+ # ==========================================================================
1079
+ # handler_contract_source.py contains legitimate handler discovery code.
1080
+ # The "Handler" in the class name refers to ONEX handler contracts, not an
1081
+ # anti-pattern manager/helper class.
1082
+ - file_pattern: 'handler_contract_source\.py'
1083
+ class_pattern: "Class name 'HandlerContractSource'"
1084
+ violation_pattern: "contains anti-pattern 'Handler'"
1085
+ reason: >
1086
+ HandlerContractSource discovers handler contract YAML files from the filesystem. The "Handler" refers to ONEX handler contracts being discovered, not an anti-pattern manager class. This is legitimate handler infrastructure code.
1087
+
1088
+ documentation:
1089
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1090
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1091
+ ticket: OMN-1097
1092
+ # ==========================================================================
1093
+ # Handler Bootstrap Source Exemptions (OMN-1087)
1094
+ # ==========================================================================
1095
+ # HandlerBootstrapSource provides hardcoded handler descriptors for core
1096
+ # infrastructure handlers. The "Handler" in the name refers to ONEX handler
1097
+ # concepts, consistent with HandlerContractSource and HandlerPluginLoader.
1098
+ #
1099
+ # Pattern specificity note: Uses separate class_pattern + violation_pattern
1100
+ # (not combined "Class name .* contains...") for precise targeting. All three
1101
+ # patterns must match: exact filename, exact class name, and violation type.
1102
+ # This is consistent with HandlerContractSource/HandlerPluginLoader exemptions.
1103
+ - file_pattern: 'handler_bootstrap_source\.py'
1104
+ class_pattern: "Class name 'HandlerBootstrapSource'"
1105
+ violation_pattern: "contains anti-pattern 'Handler'"
1106
+ reason: >
1107
+ HandlerBootstrapSource centralizes hardcoded handler registration for core infrastructure handlers (Consul, DB, HTTP, Vault). The "Handler" refers to ONEX handler concepts, consistent with HandlerContractSource. This is legitimate handler infrastructure code per OMN-1087.
1108
+
1109
+ documentation:
1110
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1111
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1112
+ ticket: OMN-1087
1113
+ # ==========================================================================
1114
+ # Handler Source Mode Exemptions (OMN-1095)
1115
+ # ==========================================================================
1116
+ # EnumHandlerSourceMode and HandlerSourceResolver are part of the handler
1117
+ # source mode feature flag implementation. The "Handler" in the names refers
1118
+ # to ONEX handler concepts (how handlers are discovered/loaded), consistent
1119
+ # with HandlerBootstrapSource and HandlerContractSource.
1120
+ - file_pattern: 'enum_handler_source_mode\.py'
1121
+ class_pattern: "Class name 'EnumHandlerSourceMode'"
1122
+ violation_pattern: "contains anti-pattern 'Handler'"
1123
+ reason: >
1124
+ EnumHandlerSourceMode defines handler loading modes (BOOTSTRAP, CONTRACT, HYBRID). The "Handler" refers to ONEX handler concepts - how handlers are discovered and loaded at runtime. Consistent with HandlerBootstrapSource and HandlerContractSource naming.
1125
+
1126
+ documentation:
1127
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1128
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1129
+ ticket: OMN-1095
1130
+ - file_pattern: 'handler_source_resolver\.py'
1131
+ class_pattern: "Class name 'HandlerSourceResolver'"
1132
+ violation_pattern: "contains anti-pattern 'Handler'"
1133
+ reason: >
1134
+ HandlerSourceResolver implements per-handler identity resolution between bootstrap and contract sources. The "Handler" refers to ONEX handler concepts - resolving which handler source takes precedence. Consistent with HandlerBootstrapSource and HandlerContractSource naming.
1135
+
1136
+ documentation:
1137
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1138
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1139
+ ticket: OMN-1095
1140
+ # ==========================================================================
1141
+ # Handler Plugin Loader Exemptions (OMN-1132)
1142
+ # ==========================================================================
1143
+ # HandlerPluginLoader discovers and loads ONEX handlers from contract YAML files.
1144
+ # The "Handler" in the name refers to ONEX handler contracts being loaded,
1145
+ # not an anti-pattern manager/helper class.
1146
+ - file_pattern: 'handler_plugin_loader\.py'
1147
+ class_pattern: "Class name 'HandlerPluginLoader'"
1148
+ violation_pattern: "contains anti-pattern 'Handler'"
1149
+ reason: >
1150
+ HandlerPluginLoader loads ONEX handler contracts from YAML files. The "Handler" refers to ONEX handler contracts being discovered and loaded, not an anti-pattern manager class. This is legitimate handler infrastructure code.
1151
+
1152
+ documentation:
1153
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1154
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1155
+ ticket: OMN-1132
1156
+ - file_pattern: 'handler_plugin_loader\.py'
1157
+ class_pattern: "Class 'HandlerPluginLoader'"
1158
+ violation_pattern: 'has \d+ methods'
1159
+ reason: >
1160
+ Plugin loader pattern requires multiple discovery methods (load_from_contract, load_from_directory, discover_and_load), security validation (_validate_namespace, _validate_file_security), contract parsing (_load_contract, _import_handler_class), and error handling methods. This is the standard plugin loader pattern consistent with ProjectorPluginLoader.
1161
+
1162
+ documentation:
1163
+ - docs/patterns/handler_plugin_loader.md
1164
+ - CLAUDE.md (Handler Plugin Loader Patterns)
1165
+ ticket: OMN-1132
1166
+ - file_pattern: 'protocol_handler_plugin_loader\.py'
1167
+ class_pattern: "Class name 'ProtocolHandlerPluginLoader'"
1168
+ violation_pattern: "contains anti-pattern 'Handler'"
1169
+ reason: >
1170
+ ProtocolHandlerPluginLoader defines the interface for handler plugin loading. The "Handler" refers to ONEX handler contracts, consistent with HandlerPluginLoader.
1171
+
1172
+ documentation:
1173
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1174
+ ticket: OMN-1132
1175
+ - file_pattern: 'model_loaded_handler\.py'
1176
+ class_pattern: "Class name 'ModelLoadedHandler'"
1177
+ violation_pattern: "contains anti-pattern 'Handler'"
1178
+ reason: >
1179
+ ModelLoadedHandler represents metadata about a loaded ONEX handler contract. The "Handler" refers to ONEX handler concepts, not an anti-pattern.
1180
+
1181
+ documentation:
1182
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1183
+ ticket: OMN-1132
1184
+ - file_pattern: 'model_handler_contract\.py'
1185
+ class_pattern: "Class name 'ModelHandlerContract'"
1186
+ violation_pattern: "contains anti-pattern 'Handler'"
1187
+ reason: >
1188
+ ModelHandlerContract is the Pydantic schema for handler contract YAML files. The "Handler" refers to ONEX handler contracts, consistent with HandlerPluginLoader and ModelLoadedHandler.
1189
+
1190
+ documentation:
1191
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1192
+ ticket: OMN-1132
1193
+ - file_pattern: 'model_handler_contract\.py'
1194
+ violation_pattern: "Field 'handler_name' might reference an entity"
1195
+ reason: >
1196
+ handler_name is a human-readable identifier from the contract YAML (e.g., "auth-handler"). It's a semantic identifier, not an entity reference. Consistent with ModelLoadedHandler.
1197
+
1198
+ documentation:
1199
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers)
1200
+ ticket: OMN-1132
1201
+ # ==========================================================================
1202
+ # Contract Handler Discovery Exemptions (OMN-1133)
1203
+ # ==========================================================================
1204
+ # ContractHandlerDiscovery bridges HandlerPluginLoader with the BindingRegistry
1205
+ # for automatic handler discovery from contracts. The "Handler" in the name
1206
+ # refers to ONEX handler contracts being discovered, not an anti-pattern.
1207
+ - file_pattern: 'contract_handler_discovery\.py'
1208
+ class_pattern: "Class name 'ContractHandlerDiscovery'"
1209
+ violation_pattern: "contains anti-pattern 'Handler'"
1210
+ reason: >
1211
+ ContractHandlerDiscovery discovers ONEX handler contracts and registers them with the runtime. The "Handler" refers to ONEX handler contracts being discovered, consistent with HandlerPluginLoader.
1212
+
1213
+ documentation:
1214
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1215
+ - CLAUDE.md (Handler Plugin Loader Patterns)
1216
+ ticket: OMN-1133
1217
+ - file_pattern: 'protocol_handler_discovery\.py'
1218
+ class_pattern: "Class name 'ProtocolHandlerDiscovery'"
1219
+ violation_pattern: "contains anti-pattern 'Handler'"
1220
+ reason: >
1221
+ ProtocolHandlerDiscovery defines the interface for handler discovery services. The "Handler" refers to ONEX handler contracts, consistent with ProtocolHandlerPluginLoader.
1222
+
1223
+ documentation:
1224
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1225
+ ticket: OMN-1133
1226
+ - file_pattern: 'model_loaded_handler\.py'
1227
+ violation_pattern: "Field 'handler_name' might reference an entity"
1228
+ reason: >
1229
+ handler_name is a human-readable identifier for the handler from the contract (e.g., "auth-handler"). It's a semantic identifier, not an entity reference.
1230
+
1231
+ documentation:
1232
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers)
1233
+ ticket: OMN-1132
1234
+ - file_pattern: 'model_handler_descriptor\.py'
1235
+ violation_pattern: "Field 'handler_id' should use UUID"
1236
+ reason: >
1237
+ handler_id in ModelHandlerDescriptor is a human-readable semantic identifier from handler contracts (e.g., "auth.handler"). Consistent with ModelHandlerIdentifier and other handler models. Not a UUID.
1238
+
1239
+ documentation:
1240
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
1241
+ ticket: OMN-1097
1242
+ - file_pattern: 'model_handler_security_policy\.py'
1243
+ violation_pattern: "contains anti-pattern 'Handler'"
1244
+ reason: >
1245
+ ModelHandlerSecurityPolicy defines security policies for ONEX handlers. The "Handler" refers to ONEX handler security constraints, not an anti-pattern manager class. Part of the two-layer security validation system (OMN-1098).
1246
+
1247
+ documentation:
1248
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1249
+ ticket: OMN-1098
1250
+ # LocalHandler validator models - OMN-743
1251
+ # These models validate LocalHandler import restrictions in production code.
1252
+ # The "Handler" in the name refers to the specific LocalHandler class being
1253
+ # validated, not an anti-pattern handler class.
1254
+ - file_pattern: 'model_localhandler_violation\.py'
1255
+ class_pattern: "Class name 'ModelLocalHandlerViolation'"
1256
+ violation_pattern: "contains anti-pattern 'Handler'"
1257
+ reason: >
1258
+ ModelLocalHandlerViolation is a validation result model for detecting forbidden LocalHandler imports. The "Handler" refers to the omnibase_core.handlers.LocalHandler class being validated against, not an anti-pattern manager class.
1259
+
1260
+ documentation:
1261
+ - CLAUDE.md (LocalHandler dev-only enforcement)
1262
+ ticket: OMN-743
1263
+ - file_pattern: 'model_localhandler_validation_result\.py'
1264
+ class_pattern: "Class name 'ModelLocalHandlerValidationResult'"
1265
+ violation_pattern: "contains anti-pattern 'Handler'"
1266
+ reason: >
1267
+ ModelLocalHandlerValidationResult is the aggregate validation result for LocalHandler import checking. The "Handler" refers to the omnibase_core.handlers.LocalHandler class being validated against, not an anti-pattern manager class.
1268
+
1269
+ documentation:
1270
+ - CLAUDE.md (LocalHandler dev-only enforcement)
1271
+ ticket: OMN-743
1272
+ - file_pattern: 'validation_aggregator\.py'
1273
+ class_pattern: "Class 'ValidationAggregator'"
1274
+ violation_pattern: 'has \d+ methods'
1275
+ reason: >
1276
+ Aggregator class requires multiple methods for comprehensive error management: collection (add_error, add_errors), properties (has_errors, has_blocking_errors, counts), grouping (by_type, by_source), formatting (console, ci, summary), and lifecycle (raise_if_blocking, clear). This is an established aggregator pattern.
1277
+
1278
+ documentation:
1279
+ - docs/patterns/error_handling_patterns.md
1280
+ ticket: OMN-1091
1281
+ - file_pattern: 'validator_security\.py'
1282
+ method_pattern: "Function 'convert_to_validation_error'"
1283
+ violation_pattern: 'has \d+ parameters'
1284
+ reason: >
1285
+ Conversion function requires multiple context parameters for complete error construction. Parameters are distinct required contexts for error reporting.
1286
+
1287
+ documentation:
1288
+ - docs/patterns/security_patterns.md
1289
+ ticket: OMN-1091
1290
+ # ==========================================================================
1291
+ # Service Discovery Node Exemptions (OMN-1131)
1292
+ # ==========================================================================
1293
+ # The service discovery node is a domain-specific infrastructure component that
1294
+ # integrates with external service discovery systems (Consul, Kubernetes).
1295
+ # The term "Service" is fundamental to the service discovery domain and cannot
1296
+ # be replaced with alternative terminology without losing semantic clarity.
1297
+ # HashiCorp Consul, Kubernetes, and all major service discovery systems use
1298
+ # "service" as the canonical term for discoverable network endpoints.
1299
+ - file_pattern: 'node_service_discovery_effect/node\.py'
1300
+ class_pattern: "Class name 'NodeServiceDiscoveryEffect'"
1301
+ violation_pattern: "contains anti-pattern 'Service'"
1302
+ reason: >
1303
+ NodeServiceDiscoveryEffect is the ONEX node for service discovery operations. "Service" is the canonical domain term from HashiCorp Consul and Kubernetes service discovery APIs.
1304
+
1305
+ documentation:
1306
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1307
+ - Kubernetes Service Discovery (https://kubernetes.io/docs/concepts/services-networking/service/)
1308
+ ticket: OMN-1131
1309
+ - file_pattern: 'node_service_discovery_effect/models/model_service_info\.py'
1310
+ class_pattern: "Class name 'ModelServiceInfo'"
1311
+ violation_pattern: "contains anti-pattern 'Service'"
1312
+ reason: >
1313
+ ModelServiceInfo represents service metadata from discovery systems. "Service" is the canonical domain term.
1314
+
1315
+ documentation:
1316
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1317
+ - Kubernetes Service Discovery (https://kubernetes.io/docs/concepts/services-networking/service/)
1318
+ ticket: OMN-1131
1319
+ - file_pattern: 'node_service_discovery_effect/models/model_service_info\.py'
1320
+ violation_pattern: "Field 'service_name' might reference an entity"
1321
+ reason: >
1322
+ service_name is the canonical Consul/K8s service identifier. This is infrastructure configuration, not an entity reference.
1323
+
1324
+ documentation:
1325
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1326
+ - CLAUDE.md (Model Field Naming - infrastructure identifiers)
1327
+ ticket: OMN-1131
1328
+ - file_pattern: 'node_service_discovery_effect/models/enum_service_discovery_operation\.py'
1329
+ class_pattern: "Class name 'EnumServiceDiscoveryOperation'"
1330
+ violation_pattern: "contains anti-pattern 'Service'"
1331
+ reason: >
1332
+ EnumServiceDiscoveryOperation defines operations for service discovery (REGISTER, DEREGISTER, DISCOVER). "Service" is the canonical domain term.
1333
+
1334
+ documentation:
1335
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1336
+ - Kubernetes Service Discovery (https://kubernetes.io/docs/concepts/services-networking/service/)
1337
+ ticket: OMN-1131
1338
+ - file_pattern: 'node_service_discovery_effect/models/model_service_discovery_health_check_details\.py'
1339
+ class_pattern: "Class name 'ModelServiceDiscoveryHealthCheckDetails'"
1340
+ violation_pattern: "contains anti-pattern 'Service'"
1341
+ reason: >
1342
+ ModelServiceDiscoveryHealthCheckDetails contains health check configuration for service discovery. "Service" is the canonical domain term.
1343
+
1344
+ documentation:
1345
+ - HashiCorp Consul Health Checks (https://developer.hashicorp.com/consul/docs/services/usage/checks)
1346
+ - Kubernetes Probes (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)
1347
+ ticket: OMN-1131
1348
+ - file_pattern: 'node_service_discovery_effect/models/model_service_registration\.py'
1349
+ class_pattern: "Class name 'ModelServiceRegistration'"
1350
+ violation_pattern: "contains anti-pattern 'Service'"
1351
+ reason: >
1352
+ ModelServiceRegistration is the input model for registering services in discovery systems. "Service" is the canonical domain term.
1353
+
1354
+ documentation:
1355
+ - HashiCorp Consul Service Registration (https://developer.hashicorp.com/consul/api-docs/agent/service#register-service)
1356
+ - Kubernetes Service Discovery (https://kubernetes.io/docs/concepts/services-networking/service/)
1357
+ ticket: OMN-1131
1358
+ - file_pattern: 'node_service_discovery_effect/models/model_service_registration\.py'
1359
+ violation_pattern: "Field 'service_name' might reference an entity"
1360
+ reason: >
1361
+ service_name is the canonical Consul/K8s service identifier. This is infrastructure configuration, not an entity reference.
1362
+
1363
+ documentation:
1364
+ - HashiCorp Consul Service Registration (https://developer.hashicorp.com/consul/api-docs/agent/service#register-service)
1365
+ - CLAUDE.md (Model Field Naming - infrastructure identifiers)
1366
+ ticket: OMN-1131
1367
+ - file_pattern: 'node_service_discovery_effect/models/model_service_discovery_health_check_result\.py'
1368
+ class_pattern: "Class name 'ModelServiceDiscoveryHealthCheckResult'"
1369
+ violation_pattern: "contains anti-pattern 'Service'"
1370
+ reason: >
1371
+ ModelServiceDiscoveryHealthCheckResult contains health check results from service discovery. "Service" is the canonical domain term.
1372
+
1373
+ documentation:
1374
+ - HashiCorp Consul Health Checks (https://developer.hashicorp.com/consul/docs/services/usage/checks)
1375
+ - Kubernetes Probes (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)
1376
+ ticket: OMN-1131
1377
+ - file_pattern: 'node_service_discovery_effect/registry/registry_infra_service_discovery\.py'
1378
+ class_pattern: "Class name 'RegistryInfraServiceDiscovery'"
1379
+ violation_pattern: "contains anti-pattern 'Service'"
1380
+ reason: >
1381
+ RegistryInfraServiceDiscovery is the DI registry for service discovery handlers. "Service" is the canonical domain term.
1382
+
1383
+ documentation:
1384
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
1385
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1386
+ ticket: OMN-1131
1387
+ - file_pattern: 'handlers/registration_storage/handler_registration_storage_postgres\.py'
1388
+ method_pattern: "Function '__init__'"
1389
+ violation_pattern: 'has \d+ parameters'
1390
+ reason: >
1391
+ PostgreSQL handler requires multiple configuration parameters: pool, host, port, database, user, password, min_size, max_size, timeout, circuit_breaker_config. These are standard database connection parameters.
1392
+
1393
+ documentation:
1394
+ - asyncpg Pool Configuration (https://magicstack.github.io/asyncpg/current/api/index.html#connection-pools)
1395
+ ticket: OMN-1131
1396
+ - file_pattern: 'handlers/service_discovery/handler_service_discovery_consul\.py'
1397
+ method_pattern: "Function '__init__'"
1398
+ violation_pattern: 'has \d+ parameters'
1399
+ reason: >
1400
+ Consul handler requires multiple configuration parameters: consul_client, token, scheme, host, port, dc, circuit_breaker_config. These are standard Consul connection parameters.
1401
+
1402
+ documentation:
1403
+ - HashiCorp Consul API Configuration (https://developer.hashicorp.com/consul/api-docs)
1404
+ ticket: OMN-1131
1405
+ - file_pattern: 'handlers/service_discovery/models/model_service_info\.py'
1406
+ violation_pattern: "Field 'service_name' might reference an entity"
1407
+ reason: >
1408
+ service_name is the canonical Consul/K8s service identifier. This is infrastructure configuration, not an entity reference.
1409
+
1410
+ documentation:
1411
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1412
+ - CLAUDE.md (Model Field Naming - infrastructure identifiers)
1413
+ ticket: OMN-1131
1414
+ # ==========================================================================
1415
+ # Architecture Validator AST Exemptions (OMN-1099)
1416
+ # ==========================================================================
1417
+ # Python ast.NodeVisitor convention uses visit_ClassDef, visit_Call, visit_Name, etc.
1418
+ # These method names are REQUIRED by the ast module - they cannot be renamed.
1419
+ # Reference: https://docs.python.org/3/library/ast.html#ast.NodeVisitor
1420
+ #
1421
+ # This is a GENERAL exemption for ALL visit_* methods in ANY Python file,
1422
+ # as AST visitor patterns are used throughout the codebase for static analysis.
1423
+ - file_pattern: '.*\.py'
1424
+ violation_pattern: "Function name 'visit_\\w+' should use snake_case"
1425
+ reason: >
1426
+ Python ast.NodeVisitor convention. visit_* methods (visit_ClassDef, visit_Call, visit_Name, etc.) are standard AST visitor method names that the ast module dispatches to. They cannot be renamed without breaking the visitor pattern.
1427
+
1428
+ documentation:
1429
+ - Python ast.NodeVisitor (https://docs.python.org/3/library/ast.html)
1430
+ - PEP 8 - Exception for stdlib compatibility
1431
+ ticket: OMN-1099
1432
+ # HandlerPublishingVisitor is a class that validates handler publishing constraints.
1433
+ # The "Handler" name is appropriate because it IS validating handler behavior.
1434
+ - file_pattern: 'validator_no_handler_publishing\.py'
1435
+ violation_pattern: "Class name .* contains anti-pattern 'Handler'"
1436
+ reason: >
1437
+ HandlerPublishingVisitor is an AST visitor class that validates handler publishing constraints. The "Handler" name is intentional and appropriate because it validates that handlers do NOT have direct event bus access. This is a validator class, not a handler implementation.
1438
+
1439
+ documentation:
1440
+ - CLAUDE.md (Handler No-Publish Constraint)
1441
+ - docs/patterns/security_patterns.md
1442
+ ticket: OMN-1099
1443
+ # ==========================================================================
1444
+ # Validation Result Model Exemptions (OMN-1104)
1445
+ # ==========================================================================
1446
+ # field_name in ModelValidationResult is a validation field path identifier,
1447
+ # not an entity reference. It represents which field in the validated object
1448
+ # failed validation (e.g., "node_id", "node_type").
1449
+ - file_pattern: 'model_validation_result\.py'
1450
+ violation_pattern: "Field 'field_name' might reference an entity"
1451
+ reason: >
1452
+ field_name is a validation field path (e.g., "node_id"), not an entity reference. It indicates which field in the validated object failed validation.
1453
+
1454
+ documentation:
1455
+ - docs/patterns/error_handling_patterns.md
1456
+ ticket: OMN-1104
1457
+ # ==========================================================================
1458
+ # Consul Registration Payload Exemptions (OMN-1104)
1459
+ # ==========================================================================
1460
+ # service_id and service_name are Consul native formats (strings), not UUIDs
1461
+ # or entity references. Consul service registry uses string identifiers.
1462
+ - file_pattern: 'model_payload_consul_register\.py'
1463
+ violation_pattern: "Field 'service_id' should use UUID"
1464
+ reason: >
1465
+ service_id is Consul's native string format for service identifiers. Consul does not use UUIDs for service identification - it uses human-readable string IDs.
1466
+
1467
+ documentation:
1468
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
1469
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1470
+ ticket: OMN-1104
1471
+ - file_pattern: 'model_payload_consul_register\.py'
1472
+ violation_pattern: "Field 'service_name' might reference an entity"
1473
+ reason: >
1474
+ service_name is a display string for the Consul service catalog, not an entity reference. It's the human-readable name shown in Consul's UI.
1475
+
1476
+ documentation:
1477
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
1478
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1479
+ ticket: OMN-1104
1480
+ # ==========================================================================
1481
+ # Architecture Validator Semantic ID Exemptions (OMN-1138)
1482
+ # ==========================================================================
1483
+ # Architecture validation rules use semantic string identifiers (e.g.,
1484
+ # 'NO_HANDLER_PUBLISHING', 'PURE_REDUCERS') rather than UUIDs. These are
1485
+ # human-readable rule codes similar to error codes, not database entity IDs.
1486
+ - file_pattern: 'model_rule_check_result\.py'
1487
+ violation_pattern: "Field 'rule_id' should use UUID"
1488
+ reason: >
1489
+ rule_id is a semantic identifier for architecture rules (e.g., 'NO_HANDLER_PUBLISHING'). These are human-readable rule codes like error codes, not database entity UUIDs.
1490
+
1491
+ documentation:
1492
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
1493
+ ticket: OMN-1138
1494
+ - file_pattern: 'model_architecture_violation\.py'
1495
+ violation_pattern: "Field 'rule_id' should use UUID"
1496
+ reason: >
1497
+ rule_id is a semantic identifier for architecture rules (e.g., 'NO_HANDLER_PUBLISHING'). These are human-readable rule codes, not database entity UUIDs.
1498
+
1499
+ documentation:
1500
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
1501
+ ticket: OMN-1138
1502
+ - file_pattern: 'model_architecture_violation\.py'
1503
+ violation_pattern: "Field 'rule_name' might reference an entity"
1504
+ reason: >
1505
+ rule_name is a human-readable display name for the rule (e.g., 'No Handler Publishing'). It's a static description, not a reference to a named entity.
1506
+
1507
+ documentation:
1508
+ - CLAUDE.md (Model Field Naming - display names vs entity references)
1509
+ ticket: OMN-1138
1510
+ - file_pattern: 'model_architecture_violation\.py'
1511
+ violation_pattern: "Field 'target_name' might reference an entity"
1512
+ reason: >
1513
+ target_name is dynamically derived from type(target).__name__ during validation. It's a runtime-computed description for logging, not an entity reference.
1514
+
1515
+ documentation:
1516
+ - CLAUDE.md (Model Field Naming - computed display names)
1517
+ ticket: OMN-1138
1518
+ # ==========================================================================
1519
+ # ProjectorValidationError Exemptions (OMN-1168)
1520
+ # ==========================================================================
1521
+ # Validation error class requires multiple context parameters for complete
1522
+ # error information: error_type, contract_path, message, remediation_hint,
1523
+ # and correlation_id. These are distinct required contexts for error reporting.
1524
+ - file_pattern: 'model_projector_validation_error\.py'
1525
+ method_pattern: "Function '__init__'"
1526
+ violation_pattern: 'has \d+ parameters'
1527
+ reason: >
1528
+ Validation error class requires multiple contextual parameters for debugging: error_type, contract_path, message, remediation_hint, correlation_id. These are distinct error context fields needed for comprehensive error reporting and graceful mode error collection.
1529
+
1530
+ documentation:
1531
+ - docs/patterns/error_handling_patterns.md
1532
+ - CLAUDE.md (Infrastructure Error Patterns)
1533
+ ticket: OMN-1168
1534
+ # ==========================================================================
1535
+ # ProjectorPluginLoader Exemptions (OMN-1168)
1536
+ # ==========================================================================
1537
+ # Plugin loader pattern requires multiple discovery methods:
1538
+ # - load_from_contract, load_from_directory, discover_and_load
1539
+ # - Security validation methods (_validate_file_security, _sanitize_path)
1540
+ # - Contract parsing (_load_contract, _parse_yaml)
1541
+ # - Error handling (discover_with_errors, graceful mode support)
1542
+ - file_pattern: 'projector_plugin_loader\.py'
1543
+ class_pattern: "Class 'ProjectorPluginLoader'"
1544
+ violation_pattern: 'has \d+ methods'
1545
+ reason: >
1546
+ Plugin loader pattern requires multiple discovery methods (load_from_contract, load_from_directory, discover_and_load), security validation, contract parsing, and error handling methods. Mirrors handler_contract_source.py pattern.
1547
+
1548
+ documentation:
1549
+ - src/omnibase_infra/runtime/handler_contract_source.py (reference pattern)
1550
+ ticket: OMN-1168
1551
+ - file_pattern: 'projector_plugin_loader\.py'
1552
+ method_pattern: "Function '__init__'"
1553
+ violation_pattern: 'has \d+ parameters'
1554
+ reason: >
1555
+ ProjectorPluginLoader.__init__ requires multiple configuration parameters for security controls (allowed_namespaces), observability (correlation_id), and plugin discovery settings. Mirrors HandlerPluginLoader pattern which has similar constructor signature.
1556
+
1557
+ documentation:
1558
+ - src/omnibase_infra/runtime/handler_plugin_loader.py (reference pattern)
1559
+ - docs/patterns/handler_plugin_loader.md (security model)
1560
+ ticket: OMN-1316
1561
+ # ==========================================================================
1562
+ # ProjectorShell Exemptions (OMN-1169)
1563
+ # ==========================================================================
1564
+ # ProjectorShell implements ProtocolEventProjector protocol which requires:
1565
+ # - Protocol properties (projector_id, aggregate_type, consumed_events, contract, is_placeholder)
1566
+ # - Core methods (project, get_state, get_states, partial_update, upsert_partial)
1567
+ # - SQL execution modes handled by MixinProjectorSqlOperations
1568
+ # - Value extraction (_extract_values, _resolve_path, _get_event_type, _execute_projection)
1569
+ # - Notification integration (via MixinProjectorNotificationPublishing)
1570
+ # Total: 11 methods, all cohesive to the contract-driven projector pattern.
1571
+ # OMN-1139: Added notification publishing support via mixin composition.
1572
+ # NOTE: Pattern anchored with src/omnibase_infra/runtime/ prefix to match only
1573
+ # the production file at src/omnibase_infra/runtime/projector_shell.py.
1574
+ # This prevents matching test files in tests/unit/runtime/ or tests/integration/runtime/.
1575
+ - file_pattern: 'src/omnibase_infra/runtime/projector_shell\.py'
1576
+ class_pattern: "Class 'ProjectorShell'"
1577
+ violation_pattern: 'has \d+ methods'
1578
+ reason: >
1579
+ Implements ProtocolEventProjector protocol requiring protocol properties (projector_id, aggregate_type, consumed_events, is_placeholder), core methods (project, get_state), three SQL execution modes (_upsert, _insert, _append), value extraction helpers (_extract_values, _resolve_path, _get_event_type), and utility method (_parse_row_count). All methods are cohesive to the contract-driven projector pattern.
1580
+
1581
+ documentation:
1582
+ - src/omnibase_infra/runtime/projector_shell.py (class docstring)
1583
+ - omnibase_spi/protocols/projectors/protocol_event_projector.py (protocol definition)
1584
+ ticket: OMN-1169
1585
+ # ==========================================================================
1586
+ # Qdrant Handler Model Exemptions (OMN-1142)
1587
+ # ==========================================================================
1588
+ # collection_name is a Qdrant-native identifier, not an entity reference.
1589
+ # Qdrant uses string collection names as the primary way to identify and
1590
+ # access vector collections. This matches the qdrant-client API design.
1591
+ - file_pattern: 'model_qdrant_upsert_payload\.py'
1592
+ violation_pattern: "Field 'collection_name' might reference an entity"
1593
+ reason: >
1594
+ collection_name is a Qdrant collection identifier (e.g., 'embeddings', 'documents'). Qdrant uses string collection names as the primary API identifier, not UUIDs. This matches the qdrant-client library design.
1595
+
1596
+ documentation:
1597
+ - https://qdrant.tech/documentation/concepts/collections/
1598
+ - src/omnibase_infra/handlers/handler_qdrant.py
1599
+ ticket: OMN-1142
1600
+ - file_pattern: 'model_qdrant_collection_payload\.py'
1601
+ violation_pattern: "Field 'collection_name' might reference an entity"
1602
+ reason: >
1603
+ collection_name is a Qdrant collection identifier (e.g., 'embeddings', 'documents'). Qdrant uses string collection names as the primary API identifier, not UUIDs. This matches the qdrant-client library design.
1604
+
1605
+ documentation:
1606
+ - https://qdrant.tech/documentation/concepts/collections/
1607
+ - src/omnibase_infra/handlers/handler_qdrant.py
1608
+ ticket: OMN-1142
1609
+ - file_pattern: 'model_qdrant_search_payload\.py'
1610
+ violation_pattern: "Field 'collection_name' might reference an entity"
1611
+ reason: >
1612
+ collection_name is a Qdrant collection identifier (e.g., 'embeddings', 'documents'). Qdrant uses string collection names as the primary API identifier, not UUIDs. This matches the qdrant-client library design.
1613
+
1614
+ documentation:
1615
+ - https://qdrant.tech/documentation/concepts/collections/
1616
+ - src/omnibase_infra/handlers/handler_qdrant.py
1617
+ ticket: OMN-1142
1618
+ - file_pattern: 'model_qdrant_delete_payload\.py'
1619
+ violation_pattern: "Field 'collection_name' might reference an entity"
1620
+ reason: >
1621
+ collection_name is a Qdrant collection identifier (e.g., 'embeddings', 'documents'). Qdrant uses string collection names as the primary API identifier, not UUIDs. This matches the qdrant-client library design.
1622
+
1623
+ documentation:
1624
+ - https://qdrant.tech/documentation/concepts/collections/
1625
+ - src/omnibase_infra/handlers/handler_qdrant.py
1626
+ ticket: OMN-1142
1627
+ # ==========================================================================
1628
+ # Projector Schema Model Exemptions (OMN-1168)
1629
+ # ==========================================================================
1630
+ # table_name is a standard database identifier, not an entity reference.
1631
+ # This pattern is ubiquitous in database-related models.
1632
+ # NOTE: Projector models are temporarily in omnibase_infra until omnibase_core
1633
+ # provides canonical projector model types.
1634
+ - file_pattern: 'model_projector_schema\.py'
1635
+ violation_pattern: "Field 'table_name' might reference an entity"
1636
+ reason: >
1637
+ table_name is a PostgreSQL table identifier (e.g., 'node_registrations'), not an entity reference. Standard database schema pattern. Note: Projector models are temporarily located in omnibase_infra until omnibase_core provides canonical projector model types.
1638
+
1639
+ documentation:
1640
+ - PostgreSQL CREATE TABLE syntax
1641
+ - src/omnibase_infra/schemas/schema_registration_projection.sql (example usage)
1642
+ - src/omnibase_infra/models/projectors/model_projector_schema.py (ModelProjectorSchema defines table_name as identifier, temporary location in omnibase_infra)
1643
+ ticket: OMN-1168
1644
+ # ==========================================================================
1645
+ # SecretResolver Exemptions (OMN-764)
1646
+ # ==========================================================================
1647
+ # SecretResolver is a centralized secret resolution service with cohesive
1648
+ # functionality: sync/async resolution, caching, introspection, and refresh.
1649
+ # The 18 methods form a complete API for secret management:
1650
+ # - Primary API (4): get_secret, get_secrets, get_secret_async, get_secrets_async
1651
+ # - Cache management (3): refresh, refresh_all, get_cache_stats
1652
+ # - Introspection (2): list_configured_secrets, get_source_info
1653
+ # - Internal helpers (9): resolution, caching, path conversion
1654
+ - file_pattern: 'secret_resolver\.py'
1655
+ class_pattern: "Class 'SecretResolver'"
1656
+ violation_pattern: 'has \d+ methods'
1657
+ reason: >
1658
+ SecretResolver provides centralized secret resolution with sync/async APIs, caching with TTL, and safe introspection. The 18 methods are cohesive: 4 primary API methods, 3 cache management, 2 introspection, and 9 internal helpers. Splitting would fragment a unified secret management interface.
1659
+
1660
+ documentation:
1661
+ - docs/patterns/secret_resolver.md
1662
+ - CLAUDE.md (Infrastructure Patterns - SecretResolver)
1663
+ ticket: OMN-764
1664
+ # logical_name is a secret identifier using dotted path convention (e.g., "database.postgres.password")
1665
+ # It is NOT an entity reference - it's a lookup key for secret resolution.
1666
+ - file_pattern: 'model_secret_source_info\.py'
1667
+ violation_pattern: "Field 'logical_name' might reference an entity"
1668
+ reason: >
1669
+ logical_name is a secret identifier using dotted path convention (e.g., "database.postgres.password"), not an entity reference. It's a lookup key for the SecretResolver, similar to how env var names or Vault paths identify secrets.
1670
+
1671
+ documentation:
1672
+ - docs/patterns/secret_resolver.md (Naming Conventions section)
1673
+ ticket: OMN-764
1674
+ - file_pattern: 'model_secret_mapping\.py'
1675
+ violation_pattern: "Field 'logical_name' might reference an entity"
1676
+ reason: >
1677
+ logical_name is a secret identifier using dotted path convention (e.g., "database.postgres.password"), not an entity reference. It's a lookup key for mapping secrets to their sources.
1678
+
1679
+ documentation:
1680
+ - docs/patterns/secret_resolver.md (Naming Conventions section)
1681
+ ticket: OMN-764
1682
+ - file_pattern: 'model_cached_secret\.py'
1683
+ violation_pattern: "Field 'logical_name' might reference an entity"
1684
+ reason: >
1685
+ logical_name is a secret identifier using dotted path convention (e.g., "database.postgres.password"), not an entity reference. It's stored in the cache to track which secret this cached value represents.
1686
+
1687
+ documentation:
1688
+ - docs/patterns/secret_resolver.md (Naming Conventions section)
1689
+ ticket: OMN-764
1690
+ # ==========================================================================
1691
+ # Observability Layer Exemptions (OMN-767)
1692
+ # ==========================================================================
1693
+ # The observability layer implements hot-path sinks and hooks that require
1694
+ # comprehensive interfaces for metrics, logging, and timing operations.
1695
+ # Per CLAUDE.md "Handlers own lifecycle, sinks own hot path" principle.
1696
+ - file_pattern: 'sink_logging_structured\.py'
1697
+ class_pattern: "Class 'SinkLoggingStructured'"
1698
+ violation_pattern: 'has \d+ methods'
1699
+ reason: >
1700
+ Hot-path logging sink requires comprehensive interface for ProtocolHotPathLoggingSink compliance: emit(), flush(), buffer management, and output formatting. Methods are protocol-mandated.
1701
+
1702
+ documentation:
1703
+ - CLAUDE.md (Observability Layer - Handlers own lifecycle, sinks own hot path)
1704
+ ticket: OMN-767
1705
+ - file_pattern: 'hook_observability\.py'
1706
+ class_pattern: "Class 'HookObservability'"
1707
+ violation_pattern: 'has \d+ methods'
1708
+ reason: >
1709
+ Pipeline observability hook requires comprehensive interface for cross-cutting concerns: before/after operation tracking, metrics integration, context management, retry tracking, and circuit breaker state changes.
1710
+
1711
+ documentation:
1712
+ - CLAUDE.md (Observability Layer - Handlers own lifecycle, sinks own hot path)
1713
+ ticket: OMN-767
1714
+ - file_pattern: 'model_metrics_handler_config\.py'
1715
+ violation_pattern: "Field 'job_name' might reference an entity"
1716
+ reason: >
1717
+ job_name is a Prometheus Pushgateway configuration value (human-readable string identifier), not an entity reference. It follows Prometheus naming conventions.
1718
+
1719
+ documentation:
1720
+ - Prometheus Pushgateway documentation
1721
+ ticket: OMN-767
1722
+ # ==========================================================================
1723
+ # BindingConfigResolver Exemptions (OMN-765)
1724
+ # ==========================================================================
1725
+ # BindingConfigResolver is a centralized configuration resolution service with
1726
+ # cohesive functionality: sync/async resolution, multi-source support, caching,
1727
+ # and environment overrides. Similar to SecretResolver, the methods form a
1728
+ # complete API for configuration management:
1729
+ # - Primary API (4): resolve, resolve_async, resolve_many, resolve_many_async
1730
+ # - Cache management (4): invalidate, invalidate_all, get_cache_stats, cleanup
1731
+ # - Internal helpers (13): source loading, env overrides, vault refs, validation
1732
+ - file_pattern: 'binding_config_resolver\.py'
1733
+ class_pattern: "Class 'BindingConfigResolver'"
1734
+ violation_pattern: 'has \d+ methods'
1735
+ reason: >
1736
+ BindingConfigResolver provides centralized configuration resolution with sync/async APIs, TTL-based caching, and multi-source support (file, env, vault). Similar to SecretResolver, the 21 methods are cohesive: 4 primary resolution API methods, 4 cache management, and 13 internal helpers for source loading, environment overrides, vault reference resolution, and validation. Splitting would fragment a unified configuration management interface.
1737
+
1738
+ documentation:
1739
+ - docs/patterns/binding_config_resolver.md
1740
+ ticket: OMN-765
1741
+ # ==========================================================================
1742
+ # HandlerMCP Method Count Exemption (OMN-1282)
1743
+ # ==========================================================================
1744
+ # MCP handler is a complex infrastructure component requiring many methods:
1745
+ # - 4 ProtocolHandler methods (initialize, shutdown, execute, health_check)
1746
+ # - 2 factory methods for route handlers (_create_health_endpoint, _create_tools_list_endpoint)
1747
+ # - 2 server lifecycle methods (_start_http_server, _stop_http_server)
1748
+ # - 3 execution/operation methods (_run_server, _execute_tool_operation, _execute_describe)
1749
+ # Complexity is inherent to MCP protocol requirements and uvicorn server management.
1750
+ - file_pattern: 'handler_mcp\.py'
1751
+ class_pattern: "Class 'HandlerMCP'"
1752
+ violation_pattern: 'has \d+ methods'
1753
+ reason: >
1754
+ HandlerMCP is a complex infrastructure handler implementing MCP protocol with internal uvicorn server lifecycle. The 11 methods are cohesive: 4 ProtocolHandler interface methods, 2 factory methods for Starlette route handlers (explicit closure capture), 2 server lifecycle methods (start/stop), and 3 operation methods. Splitting would fragment the unified MCP server abstraction.
1755
+
1756
+ documentation:
1757
+ - CLAUDE.md (Handler Plugin Loader Patterns)
1758
+ ticket: OMN-1282
1759
+ # ==========================================================================
1760
+ # Registry API Models - service_name Exemptions (OMN-1278)
1761
+ # ==========================================================================
1762
+ # service_name in registry API models is the Consul service name for discovery,
1763
+ # NOT an entity reference. It's an external Consul identifier.
1764
+ - file_pattern: 'services/registry_api/models/model_registry_node_view\.py'
1765
+ violation_pattern: "Field 'service_name' might reference an entity"
1766
+ reason: >
1767
+ service_name is the Consul service name for service discovery (e.g., "onex-effect-abc123"). This is an external Consul identifier, NOT an ONEX entity reference. The node_id field provides the UUID identifier; service_name is how the node appears in Consul's catalog.
1768
+
1769
+ documentation:
1770
+ - CLAUDE.md (Type Annotation Conventions)
1771
+ - Consul service discovery documentation
1772
+ ticket: OMN-1278
1773
+ - file_pattern: 'services/registry_api/models/model_registry_instance_view\.py'
1774
+ violation_pattern: "Field 'service_name' might reference an entity"
1775
+ reason: >
1776
+ service_name is the Consul service name for live instance discovery (e.g., "my-service"). This is an external Consul identifier, NOT an ONEX entity reference. The node_id and service_id fields provide UUID identifiers; service_name is the Consul catalog name.
1777
+
1778
+ documentation:
1779
+ - CLAUDE.md (Type Annotation Conventions)
1780
+ - Consul service discovery documentation
1781
+ ticket: OMN-1278
1782
+ # ==========================================================================
1783
+ # ==========================================================================
1784
+ # OperationBindingResolver.resolve() requires multiple parameters for binding
1785
+ # resolution: operation, bindings_subcontract, envelope, context, correlation_id.
1786
+ # These are distinct inputs required for the resolution process.
1787
+ - file_pattern: 'binding_resolver\.py'
1788
+ # Declarative Operation Bindings Exemptions (OMN-1518)
1789
+
1790
+ method_pattern: "Function 'resolve'"
1791
+ violation_pattern: 'has \d+ parameters'
1792
+ reason: >
1793
+ resolve() requires distinct parameters for binding resolution: operation name, bindings subcontract, envelope data, optional context, and correlation_id for error context. Breaking into multiple calls would require intermediate state or complex configuration objects that reduce API clarity.
1794
+
1795
+ documentation:
1796
+ - docs/decisions/adr-declarative-operation-bindings.md
1797
+ ticket: OMN-1518
1798
+ # parameter_name in binding models is the handler parameter name being bound,
1799
+ # NOT an entity reference. It's a simple string identifier for the target parameter.
1800
+ - file_pattern: 'model_operation_binding\.py'
1801
+ violation_pattern: "Field 'parameter_name' might reference an entity"
1802
+ reason: >
1803
+ parameter_name is the target handler input field name (e.g., "correlation_id", "sql"). This is a Python function parameter name, NOT an entity reference. It maps to the handler's function signature parameter.
1804
+
1805
+ documentation:
1806
+ - docs/decisions/adr-declarative-operation-bindings.md
1807
+ ticket: OMN-1518
1808
+ - file_pattern: 'model_parsed_binding\.py'
1809
+ violation_pattern: "Field 'parameter_name' might reference an entity"
1810
+ reason: >
1811
+ parameter_name is the target handler input field name (e.g., "correlation_id", "sql"). This is a Python function parameter name, NOT an entity reference. It maps to the handler's function signature parameter.
1812
+
1813
+ documentation:
1814
+ - docs/decisions/adr-declarative-operation-bindings.md
1815
+ ticket: OMN-1518
1816
+ # operation_name in ModelBindingResolutionResult is the operation that was
1817
+ # resolved (e.g., "db.query"), NOT an entity reference. It's a dispatch key.
1818
+ - file_pattern: 'model_binding_resolution_result\.py'
1819
+ violation_pattern: "Field 'operation_name' might reference an entity"
1820
+ reason: >
1821
+ operation_name is the dispatch operation key that was resolved (e.g., "db.query", "consul.register"). This is a routing identifier, NOT an entity reference. It identifies which operation's bindings were resolved.
1822
+
1823
+ documentation:
1824
+ - docs/decisions/adr-declarative-operation-bindings.md
1825
+ ticket: OMN-1518
1826
+ # ==========================================================================
1827
+ # ModelNodeIdentity node_name Exemption (OMN-1602)
1828
+ # ==========================================================================
1829
+ # node_name in ModelNodeIdentity is a canonical identifier for the node within
1830
+ # the ONEX infrastructure, NOT a foreign key reference to another entity.
1831
+ # It is one of the four dimensions (env, service, node_name, version) that
1832
+ # uniquely identify a node instance.
1833
+ - file_pattern: 'model_node_identity\.py'
1834
+ violation_pattern: "Field 'node_name' might reference an entity"
1835
+ reason: >
1836
+ node_name is a canonical identifier (e.g., "claude_hook_event_effect") that uniquely identifies a node within its service. It is NOT a foreign key reference - it is the node's own name from its contract. Combined with env, service, and version, it forms the node's identity.
1837
+
1838
+ documentation:
1839
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
1840
+ ticket: OMN-1602
1841
+ # ==========================================================================
1842
+ # Emit Daemon Field Type Exemptions (OMN-1610)
1843
+ # ==========================================================================
1844
+ # Fields that are intentionally str instead of UUID for specific reasons
1845
+ - file_pattern: 'emit_daemon/queue\.py'
1846
+ violation_pattern: "Field 'event_id' should use UUID type instead of str"
1847
+ reason: event_id is a string representation of a UUID for JSON serialization compatibility.
1848
+ documentation:
1849
+ - src/omnibase_infra/runtime/emit_daemon/queue.py
1850
+ ticket: OMN-1610
1851
+ - file_pattern: 'emit_daemon/model_daemon_response\.py'
1852
+ violation_pattern: "Field 'event_id' should use UUID type instead of str"
1853
+ reason: event_id is returned as a string in the daemon protocol for JSON serialization compatibility. Matches queue.py event_id.
1854
+ documentation:
1855
+ - src/omnibase_infra/runtime/emit_daemon/model_daemon_response.py
1856
+ ticket: OMN-1610
1857
+ - file_pattern: 'emit_daemon/config\.py'
1858
+ violation_pattern: "Field 'kafka_client_id' should use UUID type instead of str"
1859
+ reason: kafka_client_id is a Kafka client identifier string, not a UUID.
1860
+ documentation:
1861
+ - Kafka client.id documentation
1862
+ ticket: OMN-1610
1863
+ # ==========================================================================
1864
+ # Contract Registry Reducer Handler Exemptions (OMN-1653)
1865
+ # ==========================================================================
1866
+ # Pure reducer handlers follow the pattern: (self, state, event, topic, partition, offset)
1867
+ # This 6-parameter signature is standard for event-sourced reducers that need:
1868
+ # - state: immutable input state
1869
+ # - event: typed domain event
1870
+ # - topic/partition/offset: Kafka position for idempotency tracking
1871
+ - file_pattern: 'nodes/contract_registry_reducer/reducer\.py'
1872
+ method_pattern: '_on_contract_registered'
1873
+ violation_pattern: 'has 6 parameters'
1874
+ reason: >
1875
+ Standard reducer handler signature for event-sourced reducers. The 6 parameters provide: self, state (immutable input), event (typed domain event), and Kafka position (topic/partition/offset) for idempotency tracking. This is the canonical pattern for ONEX reducers.
1876
+
1877
+ documentation:
1878
+ - CLAUDE.md (Node Archetypes - NodeReducer)
1879
+ - docs/patterns/reducer_pattern.md
1880
+ ticket: OMN-1653
1881
+ - file_pattern: 'nodes/contract_registry_reducer/reducer\.py'
1882
+ method_pattern: '_on_contract_deregistered'
1883
+ violation_pattern: 'has 6 parameters'
1884
+ reason: Same as _on_contract_registered - standard reducer handler signature.
1885
+ documentation:
1886
+ - CLAUDE.md (Node Archetypes - NodeReducer)
1887
+ ticket: OMN-1653
1888
+ - file_pattern: 'nodes/contract_registry_reducer/reducer\.py'
1889
+ method_pattern: '_on_heartbeat'
1890
+ violation_pattern: 'has 6 parameters'
1891
+ reason: Same as _on_contract_registered - standard reducer handler signature.
1892
+ documentation:
1893
+ - CLAUDE.md (Node Archetypes - NodeReducer)
1894
+ ticket: OMN-1653
1895
+ - file_pattern: 'nodes/contract_registry_reducer/reducer\.py'
1896
+ method_pattern: '_on_runtime_tick'
1897
+ violation_pattern: 'has 6 parameters'
1898
+ reason: Same as _on_contract_registered - standard reducer handler signature.
1899
+ documentation:
1900
+ - CLAUDE.md (Node Archetypes - NodeReducer)
1901
+ ticket: OMN-1653
1902
+ # Contract ID is a derived natural key (node_name:major.minor.patch), not a UUID.
1903
+ # This is intentional per the contract registry design where contracts are identified
1904
+ # by their name and version, enabling human-readable queries and deduplication.
1905
+ - file_pattern: 'nodes/contract_registry_reducer/models/model_payload_.*\.py'
1906
+ violation_pattern: "Field 'contract_id' should use UUID"
1907
+ reason: >
1908
+ contract_id is a derived natural key (node_name:major.minor.patch), not a UUID. This design enables human-readable queries, version-based deduplication, and matches the contract.yaml identification pattern used throughout ONEX.
1909
+
1910
+ documentation:
1911
+ - CLAUDE.md (Intent Model Architecture - Contract Identity)
1912
+ ticket: OMN-1653
1913
+ # node_name is the contract's semantic name, not an entity reference requiring ID + display_name.
1914
+ - file_pattern: 'nodes/contract_registry_reducer/models/model_payload_.*\.py'
1915
+ violation_pattern: "Field 'node_name' might reference an entity"
1916
+ reason: >
1917
+ node_name is the contract's semantic identifier from contract.yaml, not a reference to a separate entity. Contracts are identified by name, making this a primary attribute not a foreign key.
1918
+
1919
+ documentation:
1920
+ - CLAUDE.md (Contract-Driven - node_name conventions)
1921
+ ticket: OMN-1653
1922
+ # Architecture validator exemptions
1923
+ # These handle one-model-per-file violations for domain-grouped protocols
1924
+ architecture_exemptions:
1925
+ # ==========================================================================
1926
+ # Emit Daemon Config Input Model Exemption (OMN-1610)
1927
+ # ==========================================================================
1928
+ # config.py contains ModelEmitDaemonConfigInput (intermediate input model)
1929
+ # and ModelEmitDaemonConfig (final validated config). The input model is
1930
+ # tightly coupled and only used internally by with_env_overrides() factory.
1931
+ - file_pattern: 'emit_daemon/config\.py'
1932
+ violation_pattern: '\d+ models in one file'
1933
+ reason: >
1934
+ ModelEmitDaemonConfigInput is an intermediate input model used only by ModelEmitDaemonConfig.with_env_overrides() factory method. It provides early validation for environment variable parsing and is tightly coupled with the main config model. Separating would add complexity without benefit.
1935
+
1936
+ documentation:
1937
+ - CLAUDE.md (Protocol File Naming - domain-grouping convention)
1938
+ ticket: OMN-1610
1939
+ # ==========================================================================
1940
+ # Emit Daemon Protocol Models Exemption (OMN-1610)
1941
+ # ==========================================================================
1942
+ # Request and response models form discriminated unions that are always used
1943
+ # together. Separating into individual files would break the cohesive API.
1944
+ - file_pattern: 'emit_daemon/model_daemon_request\.py'
1945
+ violation_pattern: '\d+ models in one file'
1946
+ reason: >
1947
+ ModelDaemonPingRequest and ModelDaemonEmitRequest form a discriminated union (ModelDaemonRequest) for the daemon protocol. These request types are always parsed together via parse_daemon_request(). Per CLAUDE.md domain-grouping convention for protocol messages.
1948
+
1949
+ documentation:
1950
+ - CLAUDE.md (Protocol File Naming - domain-grouping convention)
1951
+ ticket: OMN-1610
1952
+ - file_pattern: 'emit_daemon/model_daemon_response\.py'
1953
+ violation_pattern: '\d+ models in one file'
1954
+ reason: >
1955
+ ModelDaemonPingResponse, ModelDaemonQueuedResponse, and ModelDaemonErrorResponse form a discriminated union (ModelDaemonResponse) for the daemon protocol. These response types are always parsed together via parse_daemon_response(). Per CLAUDE.md domain-grouping convention for protocol messages.
1956
+
1957
+ documentation:
1958
+ - CLAUDE.md (Protocol File Naming - domain-grouping convention)
1959
+ ticket: OMN-1610
1960
+ # ==========================================================================
1961
+ # Contract Linter Models Exemption (PR #57)
1962
+ # ==========================================================================
1963
+ # linter_contract.py contains domain-grouped validation models and enums
1964
+ # that are cohesive and always used together. These define the complete
1965
+ # interface for contract linting results.
1966
+ - file_pattern: 'validation/linter_contract\.py'
1967
+ violation_pattern: '\d+ models in one file'
1968
+ reason: >
1969
+ Domain-grouped validation result models for contract linting. ModelContractViolation and ModelContractLintResult define the complete interface for contract validation results. Per CLAUDE.md domain-grouping convention for cohesive models that are always used together.
1970
+
1971
+ documentation:
1972
+ - CLAUDE.md (Protocol File Naming - domain-grouping convention)
1973
+ - docs/validation/validator_reference.md
1974
+ ticket: PR-57
1975
+ - file_pattern: 'validation/linter_contract\.py'
1976
+ violation_pattern: 'Mixed types in one file'
1977
+ reason: >
1978
+ Contract linter module contains cohesive types (enum + models) for validation results. EnumContractViolationSeverity is tightly coupled with ModelContractViolation and ModelContractLintResult.
1979
+
1980
+ documentation:
1981
+ - CLAUDE.md (Protocol File Naming)
1982
+ - docs/validation/validator_reference.md
1983
+ ticket: PR-57
1984
+ # ==========================================================================
1985
+ # Domain-Grouped Protocol Exemptions (CLAUDE.md Convention)
1986
+ # ==========================================================================
1987
+ # Per CLAUDE.md "Protocol File Naming" section:
1988
+ # "Domain-grouped protocols: Use protocols.py when multiple cohesive protocols
1989
+ # belong to a specific domain or node module"
1990
+ - file_pattern: 'nodes/node_registration_orchestrator/protocols\.py'
1991
+ violation_pattern: '\d+ protocols in one file'
1992
+ reason: >
1993
+ Domain-grouped protocols for registration orchestrator workflow. ProtocolReducer and ProtocolEffect define the complete interface for the reducer-effect pattern in node registration. Per CLAUDE.md convention.
1994
+
1995
+ Architectural documentation included in module: - Concurrency safety requirements (lines 13-24): Implementations MUST be coroutine-safe - Error sanitization guidelines (lines 26-52): NEVER include credentials in errors - Protocol contracts with examples in docstrings
1996
+
1997
+ Full architectural documentation: - Node architecture: docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md - Protocol design: docs/architecture/NODE_REGISTRATION_ORCHESTRATOR_PROTOCOLS.md - Node README: src/omnibase_infra/nodes/node_registration_orchestrator/README.md
1998
+
1999
+ documentation:
2000
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
2001
+ - docs/architecture/NODE_REGISTRATION_ORCHESTRATOR_PROTOCOLS.md
2002
+ ticket: OMN-888
2003
+ # ==========================================================================
2004
+ # ServiceTimeoutEmitter Models Exemption (OMN-932)
2005
+ # ==========================================================================
2006
+ # service_timeout_emitter.py contains domain-grouped models for timeout emission:
2007
+ # - ModelTimeoutEmissionResult: Result of timeout emission processing
2008
+ # - ModelTimeoutEmissionConfig: Configuration for the emitter
2009
+ # These are tightly coupled and always used together.
2010
+ - file_pattern: 'services/service_timeout_emitter\.py'
2011
+ violation_pattern: '\d+ models in one file'
2012
+ reason: >
2013
+ Domain-grouped models for timeout emission. ModelTimeoutEmissionResult and ModelTimeoutEmissionConfig define the complete interface for the ServiceTimeoutEmitter. Per CLAUDE.md domain-grouping convention for cohesive models that are always used together.
2014
+
2015
+ documentation:
2016
+ - CLAUDE.md (Protocol File Naming - domain-grouping convention)
2017
+ - docs/patterns/timeout_scanner_emitter.md
2018
+ ticket: OMN-932
2019
+ # These handle complex union type violations
2020
+ union_exemptions:
2021
+ # ==========================================================================
2022
+ # ModelNodeCapabilities Config Field Exemption
2023
+ # ==========================================================================
2024
+ # Design Doc: CLAUDE.md "Type Annotation Conventions" section - Union patterns
2025
+ - file_pattern: 'model_node_capabilities\.py'
2026
+ violation_pattern: 'Union with 4\+ primitive types.*bool.*float.*int.*str'
2027
+ reason: >
2028
+ The config field uses dict[str, int | str | bool | float] for nested configuration values. This is a standard JSON-like config pattern where values can be any primitive type. Creating a ModelConfigValue wrapper would add unnecessary complexity without real benefit for this infrastructure domain.
2029
+
2030
+ documentation:
2031
+ - CLAUDE.md (Type Annotation Conventions - Union patterns)
2032
+ - Standard JSON config pattern (RFC 8259)
2033
+ ticket: null