omnibase_infra 0.2.1__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 (675) hide show
  1. omnibase_infra/__init__.py +101 -0
  2. omnibase_infra/cli/__init__.py +1 -0
  3. omnibase_infra/cli/commands.py +216 -0
  4. omnibase_infra/clients/__init__.py +0 -0
  5. omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
  6. omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
  7. omnibase_infra/decorators/__init__.py +29 -0
  8. omnibase_infra/decorators/allow_any.py +109 -0
  9. omnibase_infra/dlq/__init__.py +90 -0
  10. omnibase_infra/dlq/constants_dlq.py +57 -0
  11. omnibase_infra/dlq/models/__init__.py +26 -0
  12. omnibase_infra/dlq/models/enum_replay_status.py +37 -0
  13. omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
  14. omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
  15. omnibase_infra/dlq/service_dlq_tracking.py +611 -0
  16. omnibase_infra/enums/__init__.py +123 -0
  17. omnibase_infra/enums/enum_any_type_violation.py +104 -0
  18. omnibase_infra/enums/enum_backend_type.py +27 -0
  19. omnibase_infra/enums/enum_capture_outcome.py +42 -0
  20. omnibase_infra/enums/enum_capture_state.py +88 -0
  21. omnibase_infra/enums/enum_chain_violation_type.py +119 -0
  22. omnibase_infra/enums/enum_circuit_state.py +51 -0
  23. omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
  24. omnibase_infra/enums/enum_contract_type.py +84 -0
  25. omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
  26. omnibase_infra/enums/enum_dispatch_status.py +191 -0
  27. omnibase_infra/enums/enum_environment.py +46 -0
  28. omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
  29. omnibase_infra/enums/enum_handler_error_type.py +101 -0
  30. omnibase_infra/enums/enum_handler_loader_error.py +178 -0
  31. omnibase_infra/enums/enum_handler_source_type.py +87 -0
  32. omnibase_infra/enums/enum_handler_type.py +77 -0
  33. omnibase_infra/enums/enum_handler_type_category.py +61 -0
  34. omnibase_infra/enums/enum_infra_transport_type.py +73 -0
  35. omnibase_infra/enums/enum_introspection_reason.py +154 -0
  36. omnibase_infra/enums/enum_message_category.py +213 -0
  37. omnibase_infra/enums/enum_node_archetype.py +74 -0
  38. omnibase_infra/enums/enum_node_output_type.py +185 -0
  39. omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
  40. omnibase_infra/enums/enum_policy_type.py +32 -0
  41. omnibase_infra/enums/enum_registration_state.py +261 -0
  42. omnibase_infra/enums/enum_registration_status.py +33 -0
  43. omnibase_infra/enums/enum_registry_response_status.py +28 -0
  44. omnibase_infra/enums/enum_response_status.py +26 -0
  45. omnibase_infra/enums/enum_retry_error_category.py +98 -0
  46. omnibase_infra/enums/enum_security_rule_id.py +103 -0
  47. omnibase_infra/enums/enum_selection_strategy.py +91 -0
  48. omnibase_infra/enums/enum_topic_standard.py +42 -0
  49. omnibase_infra/enums/enum_validation_severity.py +78 -0
  50. omnibase_infra/errors/__init__.py +156 -0
  51. omnibase_infra/errors/error_architecture_violation.py +152 -0
  52. omnibase_infra/errors/error_chain_propagation.py +188 -0
  53. omnibase_infra/errors/error_compute_registry.py +92 -0
  54. omnibase_infra/errors/error_consul.py +132 -0
  55. omnibase_infra/errors/error_container_wiring.py +243 -0
  56. omnibase_infra/errors/error_event_bus_registry.py +102 -0
  57. omnibase_infra/errors/error_infra.py +608 -0
  58. omnibase_infra/errors/error_message_type_registry.py +101 -0
  59. omnibase_infra/errors/error_policy_registry.py +112 -0
  60. omnibase_infra/errors/error_vault.py +123 -0
  61. omnibase_infra/event_bus/__init__.py +72 -0
  62. omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
  63. omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
  64. omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
  65. omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
  66. omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
  67. omnibase_infra/event_bus/models/__init__.py +29 -0
  68. omnibase_infra/event_bus/models/config/__init__.py +20 -0
  69. omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
  70. omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
  71. omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
  72. omnibase_infra/event_bus/models/model_event_headers.py +115 -0
  73. omnibase_infra/event_bus/models/model_event_message.py +60 -0
  74. omnibase_infra/event_bus/topic_constants.py +376 -0
  75. omnibase_infra/handlers/__init__.py +75 -0
  76. omnibase_infra/handlers/filesystem/__init__.py +48 -0
  77. omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
  78. omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
  79. omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
  80. omnibase_infra/handlers/handler_consul.py +787 -0
  81. omnibase_infra/handlers/handler_db.py +1039 -0
  82. omnibase_infra/handlers/handler_filesystem.py +1478 -0
  83. omnibase_infra/handlers/handler_graph.py +1154 -0
  84. omnibase_infra/handlers/handler_http.py +920 -0
  85. omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
  86. omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
  87. omnibase_infra/handlers/handler_mcp.py +748 -0
  88. omnibase_infra/handlers/handler_qdrant.py +1076 -0
  89. omnibase_infra/handlers/handler_vault.py +422 -0
  90. omnibase_infra/handlers/mcp/__init__.py +19 -0
  91. omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
  92. omnibase_infra/handlers/mcp/protocols.py +178 -0
  93. omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
  94. omnibase_infra/handlers/mixins/__init__.py +42 -0
  95. omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
  96. omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
  97. omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
  98. omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
  99. omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
  100. omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
  101. omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
  102. omnibase_infra/handlers/models/__init__.py +286 -0
  103. omnibase_infra/handlers/models/consul/__init__.py +81 -0
  104. omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
  105. omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
  106. omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
  107. omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
  108. omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
  109. omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
  110. omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
  111. omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
  112. omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
  113. omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
  114. omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
  115. omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
  116. omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
  117. omnibase_infra/handlers/models/graph/__init__.py +35 -0
  118. omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
  119. omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
  120. omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
  121. omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
  122. omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
  123. omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
  124. omnibase_infra/handlers/models/http/__init__.py +50 -0
  125. omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
  126. omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
  127. omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
  128. omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
  129. omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
  130. omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
  131. omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
  132. omnibase_infra/handlers/models/mcp/__init__.py +23 -0
  133. omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
  134. omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
  135. omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
  136. omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
  137. omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
  138. omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
  139. omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
  140. omnibase_infra/handlers/models/model_db_query_response.py +60 -0
  141. omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
  142. omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
  143. omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
  144. omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
  145. omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
  146. omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
  147. omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
  148. omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
  149. omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
  150. omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
  151. omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
  152. omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
  153. omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
  154. omnibase_infra/handlers/models/model_handler_response.py +103 -0
  155. omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
  156. omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
  157. omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
  158. omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
  159. omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
  160. omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
  161. omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
  162. omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
  163. omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
  164. omnibase_infra/handlers/models/model_operation_context.py +187 -0
  165. omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
  166. omnibase_infra/handlers/models/model_retry_state.py +162 -0
  167. omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
  168. omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
  169. omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
  170. omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
  171. omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
  172. omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
  173. omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
  174. omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
  175. omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
  176. omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
  177. omnibase_infra/handlers/models/vault/__init__.py +69 -0
  178. omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
  179. omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
  180. omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
  181. omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
  182. omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
  183. omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
  184. omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
  185. omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
  186. omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
  187. omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
  188. omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
  189. omnibase_infra/handlers/registration_storage/__init__.py +43 -0
  190. omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
  191. omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
  192. omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
  193. omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
  194. omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
  195. omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
  196. omnibase_infra/handlers/service_discovery/__init__.py +43 -0
  197. omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
  198. omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
  199. omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
  200. omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
  201. omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
  202. omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
  203. omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
  204. omnibase_infra/idempotency/__init__.py +94 -0
  205. omnibase_infra/idempotency/models/__init__.py +43 -0
  206. omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
  207. omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
  208. omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
  209. omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
  210. omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
  211. omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
  212. omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
  213. omnibase_infra/idempotency/store_inmemory.py +265 -0
  214. omnibase_infra/idempotency/store_postgres.py +923 -0
  215. omnibase_infra/infrastructure/__init__.py +0 -0
  216. omnibase_infra/mixins/__init__.py +71 -0
  217. omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
  218. omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
  219. omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
  220. omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
  221. omnibase_infra/mixins/mixin_retry_execution.py +386 -0
  222. omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
  223. omnibase_infra/models/__init__.py +136 -0
  224. omnibase_infra/models/corpus/__init__.py +17 -0
  225. omnibase_infra/models/corpus/model_capture_config.py +133 -0
  226. omnibase_infra/models/corpus/model_capture_result.py +86 -0
  227. omnibase_infra/models/discovery/__init__.py +42 -0
  228. omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
  229. omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
  230. omnibase_infra/models/discovery/model_introspection_config.py +311 -0
  231. omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
  232. omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
  233. omnibase_infra/models/dispatch/__init__.py +147 -0
  234. omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
  235. omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
  236. omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
  237. omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
  238. omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
  239. omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
  240. omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
  241. omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
  242. omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
  243. omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
  244. omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
  245. omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
  246. omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
  247. omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
  248. omnibase_infra/models/errors/__init__.py +45 -0
  249. omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
  250. omnibase_infra/models/errors/model_infra_error_context.py +99 -0
  251. omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
  252. omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
  253. omnibase_infra/models/handlers/__init__.py +37 -0
  254. omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
  255. omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
  256. omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
  257. omnibase_infra/models/health/__init__.py +9 -0
  258. omnibase_infra/models/health/model_health_check_result.py +40 -0
  259. omnibase_infra/models/lifecycle/__init__.py +39 -0
  260. omnibase_infra/models/logging/__init__.py +51 -0
  261. omnibase_infra/models/logging/model_log_context.py +756 -0
  262. omnibase_infra/models/model_retry_error_classification.py +78 -0
  263. omnibase_infra/models/projection/__init__.py +43 -0
  264. omnibase_infra/models/projection/model_capability_fields.py +112 -0
  265. omnibase_infra/models/projection/model_registration_projection.py +434 -0
  266. omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
  267. omnibase_infra/models/projection/model_sequence_info.py +182 -0
  268. omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
  269. omnibase_infra/models/projectors/__init__.py +41 -0
  270. omnibase_infra/models/projectors/model_projector_column.py +289 -0
  271. omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
  272. omnibase_infra/models/projectors/model_projector_index.py +270 -0
  273. omnibase_infra/models/projectors/model_projector_schema.py +415 -0
  274. omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
  275. omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
  276. omnibase_infra/models/registration/__init__.py +59 -0
  277. omnibase_infra/models/registration/commands/__init__.py +15 -0
  278. omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
  279. omnibase_infra/models/registration/events/__init__.py +56 -0
  280. omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
  281. omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
  282. omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
  283. omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
  284. omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
  285. omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
  286. omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
  287. omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
  288. omnibase_infra/models/registration/model_node_capabilities.py +179 -0
  289. omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
  290. omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
  291. omnibase_infra/models/registration/model_node_metadata.py +79 -0
  292. omnibase_infra/models/registration/model_node_registration.py +162 -0
  293. omnibase_infra/models/registration/model_node_registration_record.py +162 -0
  294. omnibase_infra/models/registry/__init__.py +29 -0
  295. omnibase_infra/models/registry/model_domain_constraint.py +202 -0
  296. omnibase_infra/models/registry/model_message_type_entry.py +271 -0
  297. omnibase_infra/models/resilience/__init__.py +9 -0
  298. omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
  299. omnibase_infra/models/routing/__init__.py +25 -0
  300. omnibase_infra/models/routing/model_routing_entry.py +52 -0
  301. omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
  302. omnibase_infra/models/runtime/__init__.py +40 -0
  303. omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
  304. omnibase_infra/models/runtime/model_discovery_error.py +81 -0
  305. omnibase_infra/models/runtime/model_discovery_result.py +162 -0
  306. omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
  307. omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
  308. omnibase_infra/models/runtime/model_handler_contract.py +280 -0
  309. omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
  310. omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
  311. omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
  312. omnibase_infra/models/security/__init__.py +50 -0
  313. omnibase_infra/models/security/classification_levels.py +99 -0
  314. omnibase_infra/models/security/model_environment_policy.py +145 -0
  315. omnibase_infra/models/security/model_handler_security_policy.py +107 -0
  316. omnibase_infra/models/security/model_security_error.py +81 -0
  317. omnibase_infra/models/security/model_security_validation_result.py +328 -0
  318. omnibase_infra/models/security/model_security_warning.py +67 -0
  319. omnibase_infra/models/snapshot/__init__.py +27 -0
  320. omnibase_infra/models/snapshot/model_field_change.py +65 -0
  321. omnibase_infra/models/snapshot/model_snapshot.py +270 -0
  322. omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
  323. omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
  324. omnibase_infra/models/types/__init__.py +71 -0
  325. omnibase_infra/models/validation/__init__.py +89 -0
  326. omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
  327. omnibase_infra/models/validation/model_any_type_violation.py +141 -0
  328. omnibase_infra/models/validation/model_category_match_result.py +345 -0
  329. omnibase_infra/models/validation/model_chain_violation.py +166 -0
  330. omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
  331. omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
  332. omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
  333. omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
  334. omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
  335. omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
  336. omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
  337. omnibase_infra/models/validation/model_output_validation_params.py +74 -0
  338. omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
  339. omnibase_infra/models/validation/model_validation_error_params.py +84 -0
  340. omnibase_infra/models/validation/model_validation_outcome.py +287 -0
  341. omnibase_infra/nodes/__init__.py +48 -0
  342. omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
  343. omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
  344. omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
  345. omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
  346. omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
  347. omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
  348. omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
  349. omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
  350. omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
  351. omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
  352. omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
  353. omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
  354. omnibase_infra/nodes/architecture_validator/node.py +262 -0
  355. omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
  356. omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
  357. omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
  358. omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
  359. omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
  360. omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
  361. omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
  362. omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
  363. omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
  364. omnibase_infra/nodes/effects/README.md +358 -0
  365. omnibase_infra/nodes/effects/__init__.py +26 -0
  366. omnibase_infra/nodes/effects/contract.yaml +172 -0
  367. omnibase_infra/nodes/effects/models/__init__.py +32 -0
  368. omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
  369. omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
  370. omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
  371. omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
  372. omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
  373. omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
  374. omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
  375. omnibase_infra/nodes/effects/registry_effect.py +525 -0
  376. omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
  377. omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
  378. omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
  379. omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
  380. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
  381. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
  382. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
  383. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
  384. omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
  385. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
  386. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
  387. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
  388. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
  389. omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
  390. omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
  391. omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
  392. omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
  393. omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
  394. omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
  395. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
  396. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
  397. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
  398. omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
  399. omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
  400. omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
  401. omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
  402. omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
  403. omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
  404. omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
  405. omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
  406. omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
  407. omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
  408. omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
  409. omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
  410. omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
  411. omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
  412. omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
  413. omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
  414. omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
  415. omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
  416. omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
  417. omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
  418. omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
  419. omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
  420. omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
  421. omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
  422. omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
  423. omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
  424. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
  425. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
  426. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
  427. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
  428. omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
  429. omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
  430. omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
  431. omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
  432. omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
  433. omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
  434. omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
  435. omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
  436. omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
  437. omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
  438. omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
  439. omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
  440. omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
  441. omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
  442. omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
  443. omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
  444. omnibase_infra/nodes/node_registry_effect/node.py +165 -0
  445. omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
  446. omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
  447. omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
  448. omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
  449. omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
  450. omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
  451. omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
  452. omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
  453. omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
  454. omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
  455. omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
  456. omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
  457. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
  458. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
  459. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
  460. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
  461. omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
  462. omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
  463. omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
  464. omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
  465. omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
  466. omnibase_infra/nodes/reducers/__init__.py +30 -0
  467. omnibase_infra/nodes/reducers/models/__init__.py +32 -0
  468. omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
  469. omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
  470. omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
  471. omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
  472. omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
  473. omnibase_infra/observability/__init__.py +143 -0
  474. omnibase_infra/observability/constants_metrics.py +91 -0
  475. omnibase_infra/observability/factory_observability_sink.py +525 -0
  476. omnibase_infra/observability/handlers/__init__.py +118 -0
  477. omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
  478. omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
  479. omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
  480. omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
  481. omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
  482. omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
  483. omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
  484. omnibase_infra/observability/hooks/__init__.py +74 -0
  485. omnibase_infra/observability/hooks/hook_observability.py +1223 -0
  486. omnibase_infra/observability/models/__init__.py +30 -0
  487. omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
  488. omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
  489. omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
  490. omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
  491. omnibase_infra/observability/sinks/__init__.py +69 -0
  492. omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
  493. omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
  494. omnibase_infra/plugins/__init__.py +27 -0
  495. omnibase_infra/plugins/examples/__init__.py +28 -0
  496. omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
  497. omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
  498. omnibase_infra/plugins/models/__init__.py +21 -0
  499. omnibase_infra/plugins/models/model_plugin_context.py +76 -0
  500. omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
  501. omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
  502. omnibase_infra/plugins/plugin_compute_base.py +435 -0
  503. omnibase_infra/projectors/__init__.py +30 -0
  504. omnibase_infra/projectors/contracts/__init__.py +63 -0
  505. omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
  506. omnibase_infra/projectors/projection_reader_registration.py +1559 -0
  507. omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
  508. omnibase_infra/protocols/__init__.py +99 -0
  509. omnibase_infra/protocols/protocol_capability_projection.py +253 -0
  510. omnibase_infra/protocols/protocol_capability_query.py +251 -0
  511. omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
  512. omnibase_infra/protocols/protocol_event_projector.py +96 -0
  513. omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
  514. omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
  515. omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
  516. omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
  517. omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
  518. omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
  519. omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
  520. omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
  521. omnibase_infra/runtime/__init__.py +296 -0
  522. omnibase_infra/runtime/binding_config_resolver.py +2706 -0
  523. omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
  524. omnibase_infra/runtime/contract_handler_discovery.py +582 -0
  525. omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
  526. omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
  527. omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
  528. omnibase_infra/runtime/enums/__init__.py +18 -0
  529. omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
  530. omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
  531. omnibase_infra/runtime/envelope_validator.py +179 -0
  532. omnibase_infra/runtime/handler_contract_source.py +669 -0
  533. omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
  534. omnibase_infra/runtime/handler_registry.py +321 -0
  535. omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
  536. omnibase_infra/runtime/kernel.py +40 -0
  537. omnibase_infra/runtime/mixin_policy_validation.py +522 -0
  538. omnibase_infra/runtime/mixin_semver_cache.py +378 -0
  539. omnibase_infra/runtime/mixins/__init__.py +17 -0
  540. omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
  541. omnibase_infra/runtime/models/__init__.py +192 -0
  542. omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
  543. omnibase_infra/runtime/models/model_binding_config.py +168 -0
  544. omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
  545. omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
  546. omnibase_infra/runtime/models/model_cached_secret.py +138 -0
  547. omnibase_infra/runtime/models/model_compute_key.py +138 -0
  548. omnibase_infra/runtime/models/model_compute_registration.py +97 -0
  549. omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
  550. omnibase_infra/runtime/models/model_config_ref.py +331 -0
  551. omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
  552. omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
  553. omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
  554. omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
  555. omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
  556. omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
  557. omnibase_infra/runtime/models/model_failed_component.py +55 -0
  558. omnibase_infra/runtime/models/model_health_check_response.py +168 -0
  559. omnibase_infra/runtime/models/model_health_check_result.py +228 -0
  560. omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
  561. omnibase_infra/runtime/models/model_logging_config.py +42 -0
  562. omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
  563. omnibase_infra/runtime/models/model_optional_string.py +94 -0
  564. omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
  565. omnibase_infra/runtime/models/model_policy_context.py +100 -0
  566. omnibase_infra/runtime/models/model_policy_key.py +138 -0
  567. omnibase_infra/runtime/models/model_policy_registration.py +139 -0
  568. omnibase_infra/runtime/models/model_policy_result.py +103 -0
  569. omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
  570. omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
  571. omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
  572. omnibase_infra/runtime/models/model_retry_policy.py +105 -0
  573. omnibase_infra/runtime/models/model_runtime_config.py +150 -0
  574. omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
  575. omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
  576. omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
  577. omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
  578. omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
  579. omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
  580. omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
  581. omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
  582. omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
  583. omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
  584. omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
  585. omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
  586. omnibase_infra/runtime/projector_schema_manager.py +565 -0
  587. omnibase_infra/runtime/projector_shell.py +1102 -0
  588. omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
  589. omnibase_infra/runtime/protocol_contract_source.py +92 -0
  590. omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
  591. omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
  592. omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
  593. omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
  594. omnibase_infra/runtime/protocol_policy.py +366 -0
  595. omnibase_infra/runtime/protocols/__init__.py +27 -0
  596. omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
  597. omnibase_infra/runtime/registry/__init__.py +93 -0
  598. omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
  599. omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
  600. omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
  601. omnibase_infra/runtime/registry/registry_message_type.py +542 -0
  602. omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
  603. omnibase_infra/runtime/registry_compute.py +1143 -0
  604. omnibase_infra/runtime/registry_dispatcher.py +678 -0
  605. omnibase_infra/runtime/registry_policy.py +1502 -0
  606. omnibase_infra/runtime/runtime_scheduler.py +1070 -0
  607. omnibase_infra/runtime/secret_resolver.py +2110 -0
  608. omnibase_infra/runtime/security_metadata_validator.py +776 -0
  609. omnibase_infra/runtime/service_kernel.py +1573 -0
  610. omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
  611. omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
  612. omnibase_infra/runtime/util_container_wiring.py +1123 -0
  613. omnibase_infra/runtime/util_validation.py +314 -0
  614. omnibase_infra/runtime/util_version.py +98 -0
  615. omnibase_infra/runtime/util_wiring.py +566 -0
  616. omnibase_infra/schemas/schema_registration_projection.sql +320 -0
  617. omnibase_infra/services/__init__.py +68 -0
  618. omnibase_infra/services/corpus_capture.py +678 -0
  619. omnibase_infra/services/service_capability_query.py +945 -0
  620. omnibase_infra/services/service_health.py +897 -0
  621. omnibase_infra/services/service_node_selector.py +530 -0
  622. omnibase_infra/services/service_timeout_emitter.py +682 -0
  623. omnibase_infra/services/service_timeout_scanner.py +390 -0
  624. omnibase_infra/services/snapshot/__init__.py +31 -0
  625. omnibase_infra/services/snapshot/service_snapshot.py +647 -0
  626. omnibase_infra/services/snapshot/store_inmemory.py +637 -0
  627. omnibase_infra/services/snapshot/store_postgres.py +1279 -0
  628. omnibase_infra/shared/__init__.py +8 -0
  629. omnibase_infra/testing/__init__.py +10 -0
  630. omnibase_infra/testing/utils.py +23 -0
  631. omnibase_infra/types/__init__.py +48 -0
  632. omnibase_infra/types/type_cache_info.py +49 -0
  633. omnibase_infra/types/type_dsn.py +173 -0
  634. omnibase_infra/types/type_infra_aliases.py +60 -0
  635. omnibase_infra/types/typed_dict/__init__.py +21 -0
  636. omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
  637. omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
  638. omnibase_infra/types/typed_dict_capabilities.py +64 -0
  639. omnibase_infra/utils/__init__.py +89 -0
  640. omnibase_infra/utils/correlation.py +208 -0
  641. omnibase_infra/utils/util_datetime.py +372 -0
  642. omnibase_infra/utils/util_dsn_validation.py +333 -0
  643. omnibase_infra/utils/util_env_parsing.py +264 -0
  644. omnibase_infra/utils/util_error_sanitization.py +457 -0
  645. omnibase_infra/utils/util_pydantic_validators.py +477 -0
  646. omnibase_infra/utils/util_semver.py +233 -0
  647. omnibase_infra/validation/__init__.py +307 -0
  648. omnibase_infra/validation/enums/__init__.py +11 -0
  649. omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
  650. omnibase_infra/validation/infra_validators.py +1486 -0
  651. omnibase_infra/validation/linter_contract.py +907 -0
  652. omnibase_infra/validation/mixin_any_type_classification.py +120 -0
  653. omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
  654. omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
  655. omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
  656. omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
  657. omnibase_infra/validation/models/__init__.py +15 -0
  658. omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
  659. omnibase_infra/validation/models/model_contract_violation.py +41 -0
  660. omnibase_infra/validation/service_validation_aggregator.py +395 -0
  661. omnibase_infra/validation/validation_exemptions.yaml +1710 -0
  662. omnibase_infra/validation/validator_any_type.py +715 -0
  663. omnibase_infra/validation/validator_chain_propagation.py +839 -0
  664. omnibase_infra/validation/validator_execution_shape.py +465 -0
  665. omnibase_infra/validation/validator_localhandler.py +261 -0
  666. omnibase_infra/validation/validator_registration_security.py +410 -0
  667. omnibase_infra/validation/validator_routing_coverage.py +1020 -0
  668. omnibase_infra/validation/validator_runtime_shape.py +915 -0
  669. omnibase_infra/validation/validator_security.py +410 -0
  670. omnibase_infra/validation/validator_topic_category.py +1152 -0
  671. omnibase_infra-0.2.1.dist-info/METADATA +197 -0
  672. omnibase_infra-0.2.1.dist-info/RECORD +675 -0
  673. omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
  674. omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
  675. omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1710 @@
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
+ # EventBusKafka Exemptions (OMN-934, OMN-1305)
93
+ # ==========================================================================
94
+ # Event bus pattern requires many methods for lifecycle (start/stop/health),
95
+ # pub/sub (subscribe/unsubscribe/publish), circuit breaker, protocol compatibility.
96
+ # Complexity managed through mixin composition (MixinKafkaDlq, MixinKafkaBroadcast).
97
+ # See: event_bus_kafka.py class docstring, CLAUDE.md "Accepted Pattern Exceptions"
98
+ - file_pattern: 'event_bus_kafka\.py'
99
+ class_pattern: "Class 'EventBusKafka'"
100
+ violation_pattern: 'has \d+ methods'
101
+ reason: >
102
+ 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.
103
+
104
+ documentation:
105
+ - CLAUDE.md (Accepted Pattern Exceptions - EventBusKafka Complexity)
106
+ - docs/patterns/circuit_breaker_implementation.md
107
+ ticket: OMN-1305
108
+ - file_pattern: 'event_bus_kafka\.py'
109
+ method_pattern: "Function '__init__'"
110
+ violation_pattern: 'has \d+ parameters'
111
+ reason: >
112
+ Configuration managed via ModelKafkaEventBusConfig. Init requires config model parameter.
113
+
114
+ documentation:
115
+ - CLAUDE.md (Accepted Pattern Exceptions - EventBusKafka Complexity)
116
+ ticket: OMN-1305
117
+ # ==========================================================================
118
+ # Protocol Plugin Architecture Exemptions
119
+ # ==========================================================================
120
+ # The 'execute' method name is a standard plugin architecture pattern.
121
+ # It's intentionally generic as it's the protocol-defined entry point.
122
+ # Design Doc: CLAUDE.md "ONEX Architecture" section - Protocol-based plugin execution pattern
123
+ - file_pattern: 'protocol_plugin_compute\.py'
124
+ violation_pattern: "Function name 'execute' is too generic"
125
+ reason: Standard plugin architecture pattern - execute is the protocol-defined entry point.
126
+ documentation:
127
+ - CLAUDE.md (ONEX Architecture - Protocol Resolution section)
128
+ ticket: null
129
+ - file_pattern: 'plugin_compute_base\.py'
130
+ violation_pattern: "Function name 'execute' is too generic"
131
+ reason: Base class implements protocol pattern - execute is the standard entry point.
132
+ documentation:
133
+ - CLAUDE.md (ONEX Architecture - Protocol Resolution section)
134
+ ticket: null
135
+ # ==========================================================================
136
+ # RuntimeHostProcess Exemptions (OMN-756)
137
+ # ==========================================================================
138
+ # Central coordinator class that legitimately requires multiple methods for:
139
+ # - Lifecycle management (start, stop, health_check)
140
+ # - Message handling (_on_message, _handle_envelope)
141
+ # - Graceful shutdown (shutdown_ready, drain logic)
142
+ # - Handler management (register_handler, get_handler)
143
+ - file_pattern: 'service_runtime_host_process\.py'
144
+ class_pattern: "Class 'RuntimeHostProcess'"
145
+ violation_pattern: 'has \d+ methods'
146
+ reason: >
147
+ Central coordinator pattern requires lifecycle management, message handling, graceful shutdown, and handler management methods.
148
+
149
+ documentation:
150
+ - docs/architecture/RUNTIME_HOST_IMPLEMENTATION_PLAN.md
151
+ - docs/adr/ADR-001-graceful-shutdown-drain-period.md
152
+ ticket: OMN-756
153
+ - file_pattern: 'service_runtime_host_process\.py'
154
+ method_pattern: "Function '__init__'"
155
+ violation_pattern: 'has \d+ parameters'
156
+ reason: >
157
+ Central coordinator requires multiple configuration parameters: event_bus, input_topic, output_topic, config, handler_registry.
158
+
159
+ documentation:
160
+ - docs/architecture/RUNTIME_HOST_IMPLEMENTATION_PLAN.md
161
+ ticket: OMN-756
162
+ # ==========================================================================
163
+ # PolicyRegistry Exemptions
164
+ # ==========================================================================
165
+ # Domain registry pattern requires comprehensive policy management operations.
166
+ # Design Doc: docs/patterns/container_dependency_injection.md - Registry patterns
167
+ - file_pattern: 'policy_registry\.py'
168
+ class_pattern: "Class 'PolicyRegistry'"
169
+ violation_pattern: 'has \d+ methods'
170
+ reason: >
171
+ Central registry pattern requires CRUD operations (register, get, update, remove), query operations (list, filter, search), and lifecycle operations (enable, disable, validate).
172
+
173
+ documentation:
174
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
175
+ - CLAUDE.md (Container-Based Dependency Injection section)
176
+ ticket: null
177
+ - file_pattern: 'registry_policy\.py'
178
+ method_pattern: "Function 'register_policy'"
179
+ violation_pattern: 'has \d+ parameters'
180
+ reason: Policy registration requires multiple fields for complete policy definition. ModelPolicyRegistration is available as the preferred API for new code.
181
+ documentation:
182
+ - docs/patterns/container_dependency_injection.md
183
+ ticket: null
184
+ - file_pattern: 'registry_policy\.py'
185
+ class_pattern: "Class 'RegistryPolicy'"
186
+ violation_pattern: 'has \d+ methods'
187
+ reason: >
188
+ 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.
189
+
190
+ documentation:
191
+ - docs/patterns/container_dependency_injection.md
192
+ ticket: OMN-1305
193
+ # ==========================================================================
194
+ # Policy ID Exemptions (OMN-812)
195
+ # ==========================================================================
196
+ # policy_id is intentionally a human-readable string identifier (e.g., 'exponential_backoff'),
197
+ # NOT a UUID. The _id suffix triggers false positive UUID suggestions.
198
+ - file_pattern: 'model_policy_key\.py'
199
+ violation_pattern: "Field 'policy_id' should use UUID"
200
+ reason: >
201
+ policy_id is a human-readable string identifier (e.g., 'exponential_backoff'), not a UUID. The _id suffix triggers false positive.
202
+
203
+ documentation:
204
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
205
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
206
+ ticket: OMN-812
207
+ - file_pattern: 'model_policy_registration\.py'
208
+ violation_pattern: "Field 'policy_id' should use UUID"
209
+ reason: Same as ModelPolicyKey - semantic identifier, not UUID.
210
+ documentation:
211
+ - CLAUDE.md (Registry Naming Conventions)
212
+ ticket: OMN-812
213
+ # ==========================================================================
214
+ # Infrastructure Handler Exemptions (OMN-1092)
215
+ # ==========================================================================
216
+ # Infrastructure handlers require multiple methods for: connection lifecycle,
217
+ # operation dispatching, health checks, and protocol-specific operations.
218
+ - file_pattern: 'handler_consul\.py'
219
+ class_pattern: "Class 'HandlerConsul'"
220
+ violation_pattern: 'has \d+ methods'
221
+ reason: >
222
+ 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.
223
+
224
+ documentation:
225
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
226
+ - CLAUDE.md (Infrastructure Patterns - Adapter Pattern)
227
+ ticket: OMN-1092
228
+ # ==========================================================================
229
+ # Projector Schema Model Exemptions (OMN-1168)
230
+ # ==========================================================================
231
+ # ModelProjectorSchema requires multiple methods for SQL generation, validation,
232
+ # and schema introspection operations.
233
+ - file_pattern: 'model_projector_schema\.py'
234
+ class_pattern: "Class 'ModelProjectorSchema'"
235
+ violation_pattern: 'has \d+ methods'
236
+ reason: >
237
+ 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.
238
+
239
+ documentation:
240
+ - src/omnibase_infra/models/projectors/model_projector_schema.py (class docstring)
241
+ ticket: OMN-1168
242
+ # ==========================================================================
243
+ # Execution Shape Validator Exemptions (OMN-958)
244
+ # ==========================================================================
245
+ - file_pattern: 'enum_handler_type\.py'
246
+ violation_pattern: "contains anti-pattern 'Handler'"
247
+ reason: >
248
+ EnumHandlerType defines ONEX handler architectural roles (InfraHandler, NodeHandler, etc.) which are architectural concepts, not implementation classes.
249
+
250
+ documentation:
251
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
252
+ - CLAUDE.md (ONEX Architecture - Handler Types)
253
+ ticket: OMN-1092
254
+ - file_pattern: 'enum_handler_type_category\.py'
255
+ violation_pattern: "contains anti-pattern 'Handler'"
256
+ reason: >
257
+ EnumHandlerTypeCategory defines ONEX handler behavioral classification (Compute, Effect, NondeterministicCompute) which are architectural concepts for policy envelopes, not implementation classes.
258
+
259
+ documentation:
260
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
261
+ - CLAUDE.md (ONEX Architecture - Handler Classification)
262
+ ticket: OMN-1092
263
+ - file_pattern: 'validator_execution_shape\.py'
264
+ class_pattern: "Class name 'ModelDetectedNodeInfo'"
265
+ violation_pattern: "contains anti-pattern 'Model'"
266
+ reason: >
267
+ ModelDetectedNodeInfo is a validation data class for describing detected node information during AST analysis - follows Model* naming convention.
268
+
269
+ documentation:
270
+ - docs/validation/validator_reference.md
271
+ ticket: OMN-958
272
+ - file_pattern: 'validator_execution_shape\.py'
273
+ class_pattern: "Class 'ExecutionShapeValidator'"
274
+ violation_pattern: 'has \d+ methods'
275
+ reason: >
276
+ 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.
277
+
278
+ documentation:
279
+ - docs/as_is/02_NODE_EXECUTION_SHAPES.md
280
+ - docs/validation/validator_reference.md
281
+ ticket: OMN-958
282
+ # ==========================================================================
283
+ # Any Type Validator Exemptions (OMN-1276)
284
+ # ==========================================================================
285
+ # AST-based validator for Any type usage enforcement. The class requires
286
+ # multiple visitor methods and helper methods for comprehensive detection.
287
+ - file_pattern: 'validator_any_type\.py'
288
+ class_pattern: "Class 'AnyTypeDetector'"
289
+ violation_pattern: 'has \d+ methods'
290
+ reason: >
291
+ 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.
292
+
293
+ documentation:
294
+ - docs/decisions/adr-any-type-pydantic-workaround.md
295
+ - CLAUDE.md (Any Type CI Enforcement)
296
+ ticket: OMN-1276
297
+ - file_pattern: 'model_any_type_violation\.py'
298
+ violation_pattern: "Field 'context_name' might reference an entity"
299
+ reason: >
300
+ 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.
301
+
302
+ documentation:
303
+ - docs/decisions/adr-any-type-pydantic-workaround.md
304
+ ticket: OMN-1276
305
+ # ==========================================================================
306
+ # RuntimeShapeValidator Exemptions
307
+ # ==========================================================================
308
+ # Design Doc: docs/patterns/error_handling_patterns.md - Validation error patterns
309
+ - file_pattern: 'validator_runtime_shape\.py'
310
+ method_pattern: "Function 'validate_handler_output'"
311
+ violation_pattern: 'has \d+ parameters'
312
+ reason: >
313
+ 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.
314
+
315
+ documentation:
316
+ - docs/patterns/error_handling_patterns.md (Validation error hierarchy)
317
+ - CLAUDE.md (ONEX Architecture - Contract-Driven section)
318
+ ticket: null
319
+ - file_pattern: 'validator_runtime_shape\.py'
320
+ method_pattern: "Function 'validate_and_raise'"
321
+ violation_pattern: 'has \d+ parameters'
322
+ reason: Same rationale as validate_handler_output - requires distinct context params.
323
+ documentation:
324
+ - docs/patterns/error_handling_patterns.md
325
+ ticket: null
326
+ # ==========================================================================
327
+ # MixinNodeIntrospection Exemptions (OMN-958)
328
+ # ==========================================================================
329
+ - file_pattern: 'mixin_node_introspection\.py'
330
+ method_pattern: "Function 'initialize_introspection'"
331
+ violation_pattern: 'has \d+ parameters'
332
+ reason: >
333
+ 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.
334
+
335
+ documentation:
336
+ - CLAUDE.md (Node Introspection Security Considerations)
337
+ ticket: OMN-958
338
+ - file_pattern: 'mixin_node_introspection\.py'
339
+ class_pattern: "Class 'MixinNodeIntrospection'"
340
+ violation_pattern: 'has \d+ methods'
341
+ reason: >
342
+ 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).
343
+
344
+ documentation:
345
+ - CLAUDE.md (Node Introspection Security Considerations)
346
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
347
+ ticket: OMN-958
348
+ # ==========================================================================
349
+ # Message Dispatch Engine Exemptions (OMN-934, OMN-983)
350
+ # ==========================================================================
351
+ # Central dispatch coordinator pattern requires comprehensive routing capabilities.
352
+ - file_pattern: 'service_message_dispatch_engine\.py'
353
+ class_pattern: "Class 'MessageDispatchEngine'"
354
+ violation_pattern: 'has \d+ methods'
355
+ reason: >
356
+ 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.
357
+
358
+ documentation:
359
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
360
+ - docs/as_is/05_RUNTIME_DISPATCH_SHAPES.md
361
+ ticket: OMN-934
362
+ - file_pattern: 'service_message_dispatch_engine\.py'
363
+ method_pattern: "Function '_build_log_context'"
364
+ violation_pattern: 'has \d+ parameters'
365
+ reason: >
366
+ Log context builder intentionally takes many optional parameters to build structured log context. Each parameter is a distinct log field.
367
+
368
+ documentation:
369
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
370
+ ticket: OMN-934
371
+ - file_pattern: 'service_message_dispatch_engine\.py'
372
+ method_pattern: "Function '__init__'"
373
+ violation_pattern: 'has \d+ parameters'
374
+ reason: >
375
+ 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.
376
+
377
+ documentation:
378
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
379
+ ticket: OMN-990
380
+ - file_pattern: 'service_message_dispatch_engine\.py'
381
+ method_pattern: "Function 'register_dispatcher'"
382
+ violation_pattern: 'has \d+ parameters'
383
+ reason: >
384
+ Dispatcher registration requires multiple parameters for complete routing configuration: dispatcher, category, node_kind, topic_patterns, priority. These are distinct routing configuration fields.
385
+
386
+ documentation:
387
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
388
+ ticket: OMN-990
389
+ # ==========================================================================
390
+ # RegistryDispatcher Exemptions (OMN-934)
391
+ # ==========================================================================
392
+ - file_pattern: 'registry_dispatcher\.py'
393
+ class_pattern: "Class 'RegistryDispatcher'"
394
+ violation_pattern: 'has \d+ methods'
395
+ reason: >
396
+ 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.
397
+
398
+ documentation:
399
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
400
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
401
+ ticket: OMN-934
402
+ # ==========================================================================
403
+ # Dispatch Model Semantic Identifier Exemptions (OMN-983)
404
+ # ==========================================================================
405
+ # dispatcher_id, route_id are semantic identifiers (like policy_id), NOT UUIDs.
406
+ # They are human-readable strings that identify dispatchers/routes by name.
407
+ - file_pattern: 'model_dispatcher_registration\.py'
408
+ violation_pattern: "Field 'dispatcher_id' should use UUID"
409
+ reason: >
410
+ dispatcher_id is a human-readable semantic identifier (e.g., "kafka-main-dispatcher"), not a UUID. Similar to policy_id pattern.
411
+
412
+ documentation:
413
+ - CLAUDE.md (Registry Naming Conventions)
414
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
415
+ ticket: OMN-983
416
+ - file_pattern: 'model_dispatcher_registration\.py'
417
+ violation_pattern: 'dispatcher_name.*entity'
418
+ reason: >
419
+ dispatcher_name is a display name for the dispatcher, paired with dispatcher_id as the semantic identifier. This follows the ID + display_name pattern.
420
+
421
+ documentation:
422
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
423
+ ticket: OMN-983
424
+ - file_pattern: 'model_dispatcher_metrics\.py'
425
+ violation_pattern: "Field 'dispatcher_id' should use UUID"
426
+ reason: >
427
+ dispatcher_id is a human-readable semantic identifier, not a UUID. Consistent with model_dispatcher_registration.
428
+
429
+ documentation:
430
+ - CLAUDE.md (Registry Naming Conventions)
431
+ ticket: OMN-983
432
+ - file_pattern: 'model_dispatch_route\.py'
433
+ violation_pattern: "Field 'route_id' should use UUID"
434
+ reason: >
435
+ route_id is a human-readable semantic identifier (e.g., "default-route"), not a UUID.
436
+
437
+ documentation:
438
+ - CLAUDE.md (Registry Naming Conventions)
439
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
440
+ ticket: OMN-983
441
+ - file_pattern: 'model_dispatch_route\.py'
442
+ violation_pattern: "Field 'dispatcher_id' should use UUID"
443
+ reason: >
444
+ dispatcher_id is a human-readable semantic identifier, consistent across dispatch models.
445
+
446
+ documentation:
447
+ - CLAUDE.md (Registry Naming Conventions)
448
+ ticket: OMN-983
449
+ - file_pattern: 'model_dispatch_metrics\.py'
450
+ method_pattern: "Function 'record_dispatch'"
451
+ violation_pattern: 'has \d+ parameters'
452
+ reason: >
453
+ 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).
454
+
455
+ documentation:
456
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
457
+ ticket: OMN-983
458
+ # ==========================================================================
459
+ # RuntimeScheduler Semantic Identifier Exemptions (OMN-953)
460
+ # ==========================================================================
461
+ # scheduler_id is a human-readable semantic identifier set via environment variable
462
+ # (e.g., "runtime-scheduler-prod-1"), NOT a UUID. Follows same pattern as policy_id
463
+ # and dispatcher_id.
464
+ - file_pattern: 'model_runtime_scheduler_config\.py'
465
+ violation_pattern: "Field 'scheduler_id' should use UUID"
466
+ reason: >
467
+ 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.
468
+
469
+ documentation:
470
+ - CLAUDE.md (Registry Naming Conventions)
471
+ ticket: OMN-953
472
+ - file_pattern: 'model_runtime_scheduler_metrics\.py'
473
+ violation_pattern: "Field 'scheduler_id' should use UUID"
474
+ reason: >
475
+ scheduler_id is a human-readable semantic identifier, consistent with model_runtime_scheduler_config.
476
+
477
+ documentation:
478
+ - CLAUDE.md (Registry Naming Conventions)
479
+ ticket: OMN-953
480
+ - file_pattern: 'model_runtime_tick\.py'
481
+ violation_pattern: "Field 'scheduler_id' should use UUID"
482
+ reason: >
483
+ scheduler_id identifies which runtime scheduler instance emitted the tick. Human-readable identifier, consistent across scheduler models.
484
+
485
+ documentation:
486
+ - CLAUDE.md (Registry Naming Conventions)
487
+ ticket: OMN-953
488
+ # ==========================================================================
489
+ # ServiceTimeoutEmitter/Scanner Naming Exemptions (OMN-1055)
490
+ # ==========================================================================
491
+ # These service classes follow the CLAUDE.md Service<Name> naming convention.
492
+ # Service files use service_<name>.py with Service<Name> class names.
493
+ - file_pattern: 'service_timeout_emitter\.py'
494
+ class_pattern: "Class name 'ServiceTimeoutEmitter'"
495
+ violation_pattern: "contains anti-pattern 'Service'"
496
+ reason: >
497
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
498
+
499
+ documentation:
500
+ - CLAUDE.md (File & Class Naming - Service convention)
501
+ ticket: OMN-1055
502
+ - file_pattern: 'service_timeout_scanner\.py'
503
+ class_pattern: "Class name 'ServiceTimeoutScanner'"
504
+ violation_pattern: "contains anti-pattern 'Service'"
505
+ reason: >
506
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
507
+
508
+ documentation:
509
+ - CLAUDE.md (File & Class Naming - Service convention)
510
+ ticket: OMN-1055
511
+ # ==========================================================================
512
+ # ServiceHealth Exemptions (OMN-529)
513
+ # ==========================================================================
514
+ # ServiceHealth follows the CLAUDE.md Service<Name> naming convention and
515
+ # requires multiple __init__ parameters to support dual initialization modes
516
+ # (direct runtime injection and container-based DI).
517
+ - file_pattern: 'service_health\.py'
518
+ class_pattern: "Class name 'ServiceHealth'"
519
+ violation_pattern: "contains anti-pattern 'Service'"
520
+ reason: >
521
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
522
+
523
+ documentation:
524
+ - CLAUDE.md (File & Class Naming - Service convention)
525
+ ticket: OMN-529
526
+ - file_pattern: 'service_dlq_tracking\.py'
527
+ class_pattern: "Class name 'ServiceDlqTracking'"
528
+ violation_pattern: "contains anti-pattern 'Service'"
529
+ reason: >
530
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
531
+
532
+ documentation:
533
+ - CLAUDE.md (File & Class Naming - Service convention)
534
+ ticket: OMN-1270
535
+ - file_pattern: 'service_capability_query\.py'
536
+ class_pattern: "Class name 'ServiceCapabilityQuery'"
537
+ violation_pattern: "contains anti-pattern 'Service'"
538
+ reason: >
539
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
540
+
541
+ documentation:
542
+ - CLAUDE.md (File & Class Naming - Service convention)
543
+ ticket: OMN-1135
544
+ - file_pattern: 'service_node_selector\.py'
545
+ class_pattern: "Class name 'ServiceNodeSelector'"
546
+ violation_pattern: "contains anti-pattern 'Service'"
547
+ reason: >
548
+ Follows CLAUDE.md Service<Name> naming convention for service classes. Service files use service_<name>.py with Service<Name> class names.
549
+
550
+ documentation:
551
+ - CLAUDE.md (File & Class Naming - Service convention)
552
+ ticket: OMN-1135
553
+ - file_pattern: 'service_snapshot\.py'
554
+ class_pattern: "Class name 'ServiceSnapshot'"
555
+ violation_pattern: "contains anti-pattern 'Service'"
556
+ reason: >
557
+ 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.
558
+
559
+ documentation:
560
+ - CLAUDE.md (File & Class Naming - Service convention)
561
+ ticket: OMN-1246
562
+ - file_pattern: 'service_health\.py'
563
+ method_pattern: "Function '__init__'"
564
+ violation_pattern: 'has \d+ parameters'
565
+ reason: >
566
+ 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.
567
+
568
+ documentation:
569
+ - CLAUDE.md (Container-Based Dependency Injection)
570
+ ticket: OMN-529
571
+ # ==========================================================================
572
+ # Consul Service ID Exemptions (OMN-889)
573
+ # ==========================================================================
574
+ # consul_service_id is a Consul-specific identifier that is a user-defined string,
575
+ # NOT a UUID. The Consul API accepts any string as a service ID. This field is
576
+ # named with the 'consul_' prefix to clarify it's a Consul concept.
577
+ - file_pattern: 'model_consul_register_payload\.py'
578
+ violation_pattern: "Field 'consul_service_id' should use UUID"
579
+ reason: >
580
+ 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.
581
+
582
+ documentation:
583
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
584
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
585
+ ticket: OMN-889
586
+ - file_pattern: 'model_consul_deregister_payload\.py'
587
+ violation_pattern: "Field 'consul_service_id' should use UUID"
588
+ reason: >
589
+ 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.
590
+
591
+ documentation:
592
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
593
+ ticket: OMN-889
594
+ # ==========================================================================
595
+ # MessageTypeRegistry Exemptions (OMN-983)
596
+ # ==========================================================================
597
+ - file_pattern: 'registry_message_type\.py'
598
+ class_pattern: "Class 'RegistryMessageType'"
599
+ violation_pattern: 'has \d+ methods'
600
+ reason: >
601
+ 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.
602
+
603
+ documentation:
604
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
605
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
606
+ ticket: OMN-983
607
+ # ==========================================================================
608
+ # Idempotency Store Configuration Exemptions (OMN-945)
609
+ # ==========================================================================
610
+ # table_name is a database configuration field specifying the PostgreSQL table
611
+ # name for storing idempotency records. It is NOT an entity reference.
612
+ - file_pattern: 'model_postgres_idempotency_store_config\.py'
613
+ violation_pattern: "Field 'table_name' might reference an entity"
614
+ reason: >
615
+ 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.
616
+
617
+ documentation:
618
+ - docs/patterns/retry_backoff_compensation_strategy.md (Idempotency patterns)
619
+ ticket: OMN-945
620
+ # ==========================================================================
621
+ # RegistryCompute Exemptions (OMN-811)
622
+ # ==========================================================================
623
+ # Central registry pattern for compute plugins follows same patterns as
624
+ # PolicyRegistry, MessageTypeRegistry, and RegistryDispatcher.
625
+ - file_pattern: 'registry_compute\.py'
626
+ class_pattern: "Class 'RegistryCompute'"
627
+ violation_pattern: 'has \d+ methods'
628
+ reason: >
629
+ 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.
630
+
631
+ documentation:
632
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
633
+ - CLAUDE.md (Registry Naming Conventions)
634
+ ticket: OMN-811
635
+ - file_pattern: 'registry_compute\.py'
636
+ method_pattern: "Function 'register_plugin'"
637
+ violation_pattern: 'has \d+ parameters'
638
+ reason: >
639
+ 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.
640
+
641
+ documentation:
642
+ - docs/patterns/container_dependency_injection.md
643
+ ticket: OMN-811
644
+ # ==========================================================================
645
+ # ComputeRegistryError Exemptions (OMN-811)
646
+ # ==========================================================================
647
+ # Error classes require multiple context parameters for comprehensive error reporting.
648
+ - file_pattern: 'error_compute_registry\.py'
649
+ method_pattern: "Function '__init__'"
650
+ violation_pattern: 'has \d+ parameters'
651
+ reason: >
652
+ 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.
653
+
654
+ documentation:
655
+ - docs/patterns/error_handling_patterns.md
656
+ - CLAUDE.md (Infrastructure Error Patterns)
657
+ ticket: OMN-811
658
+ # ==========================================================================
659
+ # EventBusRegistryError Exemptions (OMN-1276)
660
+ # ==========================================================================
661
+ # Error classes require multiple context parameters for comprehensive error reporting.
662
+ - file_pattern: 'error_event_bus_registry\.py'
663
+ method_pattern: "Function '__init__'"
664
+ violation_pattern: 'has \d+ parameters'
665
+ reason: >
666
+ 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.
667
+
668
+ documentation:
669
+ - docs/patterns/error_handling_patterns.md
670
+ - CLAUDE.md (Infrastructure Error Patterns)
671
+ ticket: OMN-1276
672
+ # ==========================================================================
673
+ # MessageTypeRegistryError Exemptions (OMN-983)
674
+ # ==========================================================================
675
+ # Error classes require multiple context parameters for comprehensive error reporting.
676
+ - file_pattern: 'error_message_type_registry\.py'
677
+ method_pattern: "Function '__init__'"
678
+ violation_pattern: 'has \d+ parameters'
679
+ reason: >
680
+ 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.
681
+
682
+ documentation:
683
+ - docs/patterns/error_handling_patterns.md
684
+ - CLAUDE.md (Infrastructure Error Patterns)
685
+ ticket: OMN-983
686
+ # ==========================================================================
687
+ # Compute Plugin ID Exemptions (OMN-811)
688
+ # ==========================================================================
689
+ # plugin_id is a semantic identifier (e.g., 'json_normalizer'), NOT a UUID.
690
+ # Follows same pattern as policy_id, dispatcher_id, scheduler_id.
691
+ - file_pattern: 'model_compute_key\.py'
692
+ violation_pattern: "Field 'plugin_id' should use UUID"
693
+ reason: >
694
+ 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.
695
+
696
+ documentation:
697
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
698
+ - docs/patterns/container_dependency_injection.md
699
+ ticket: OMN-811
700
+ - file_pattern: 'model_compute_registration\.py'
701
+ violation_pattern: "Field 'plugin_id' should use UUID"
702
+ reason: >
703
+ plugin_id is a human-readable semantic identifier, consistent with ModelComputeKey. Follows the policy_id/dispatcher_id pattern.
704
+
705
+ documentation:
706
+ - CLAUDE.md (Registry Naming Conventions)
707
+ ticket: OMN-811
708
+ # ==========================================================================
709
+ # Consul Intent Payload Exemptions (OMN-888)
710
+ # ==========================================================================
711
+ # service_name in ModelConsulIntentPayload is the Consul service name to register,
712
+ # NOT a reference to an internal entity. It is a Consul-specific configuration field.
713
+ - file_pattern: 'model_consul_intent_payload\.py'
714
+ violation_pattern: "Field 'service_name' might reference an entity"
715
+ reason: >
716
+ 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.
717
+
718
+ documentation:
719
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
720
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
721
+ ticket: OMN-888
722
+ # ==========================================================================
723
+ # Private Class Naming Exemptions (OMN-811)
724
+ # ==========================================================================
725
+ # Private helper classes (prefixed with _) follow PascalCase after the underscore.
726
+ # The pattern validator's regex expects names to start with uppercase, but private
727
+ # classes correctly use underscore prefix + PascalCase (e.g., _MetricsTimer).
728
+ - file_pattern: 'registry_compute\.py'
729
+ class_pattern: "Class name '_MetricsTimer'"
730
+ violation_pattern: "should use PascalCase"
731
+ reason: >
732
+ _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.
733
+
734
+ documentation:
735
+ - PEP 8 - Naming Conventions (https://peps.python.org/pep-0008/#naming-conventions)
736
+ - CLAUDE.md (File & Class Naming Conventions)
737
+ ticket: OMN-811
738
+ # ==========================================================================
739
+ # Plugin Models Exemptions (OMN-811)
740
+ # ==========================================================================
741
+ # ModelPluginContext uses str for correlation_id for flexibility - plugins may
742
+ # receive correlation IDs from various sources as strings. This is intentional
743
+ # to support diverse plugin use cases without requiring UUID conversion.
744
+ - file_pattern: 'model_plugin_context\.py'
745
+ violation_pattern: "Field 'correlation_id' should use UUID"
746
+ reason: >
747
+ 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.
748
+
749
+ documentation:
750
+ - docs/patterns/correlation_id_tracking.md
751
+ ticket: OMN-811
752
+ # ==========================================================================
753
+ # MCP Handler Model Exemptions (OMN-1288)
754
+ # ==========================================================================
755
+ # tool_name in ModelMcpToolCall is the MCP protocol identifier for the tool
756
+ # to invoke (e.g., "get_weather", "search_documents"). It is NOT an entity
757
+ # reference requiring UUID + display_name pattern - it's a protocol-level
758
+ # identifier defined by the MCP specification.
759
+ - file_pattern: 'model_mcp_tool_call\.py'
760
+ violation_pattern: "Field 'tool_name' might reference an entity"
761
+ reason: >
762
+ 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.
763
+
764
+ documentation:
765
+ - Model Context Protocol Specification (https://modelcontextprotocol.io/)
766
+ ticket: OMN-1288
767
+ # ==========================================================================
768
+ # Corpus Capture Model Exemptions (OMN-1203)
769
+ # ==========================================================================
770
+ # corpus_display_name in ModelCaptureConfig is a user-provided label for the
771
+ # corpus (e.g., "regression-suite-v1"). It is NOT an entity reference - it's
772
+ # simply a human-readable display name for configuration.
773
+ - file_pattern: 'model_capture_config\.py'
774
+ violation_pattern: "Field 'corpus_display_name' might reference an entity"
775
+ reason: >
776
+ 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.
777
+
778
+ documentation:
779
+ - src/omnibase_infra/models/corpus/model_capture_config.py (class docstring)
780
+ ticket: OMN-1203
781
+ # ==========================================================================
782
+ # Union Reduction Phase 2 Model Exemptions (OMN-1002)
783
+ # ==========================================================================
784
+ # These models use builder patterns with many convenience methods.
785
+ # Method counts exceed thresholds but provide valuable developer ergonomics.
786
+ # ModelLogContext - Structured logging context with builder pattern
787
+ - file_pattern: 'model_log_context\.py'
788
+ class_pattern: "Class 'ModelLogContext'"
789
+ violation_pattern: 'has \d+ methods'
790
+ reason: >
791
+ 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.
792
+
793
+ documentation:
794
+ - docs/patterns/correlation_id_tracking.md
795
+ - CLAUDE.md (Type Annotation Conventions)
796
+ ticket: OMN-1002
797
+ - file_pattern: 'model_log_context\.py'
798
+ violation_pattern: "Field 'correlation_id' should use UUID"
799
+ reason: >
800
+ 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.
801
+
802
+ documentation:
803
+ - docs/patterns/correlation_id_tracking.md
804
+ ticket: OMN-1002
805
+ - file_pattern: 'model_log_context\.py'
806
+ violation_pattern: "Field 'group_id' should use UUID"
807
+ reason: >
808
+ group_id is Kafka consumer group ID which is a string, not a UUID. This is infrastructure-specific and follows Kafka naming conventions.
809
+
810
+ documentation:
811
+ - Apache Kafka Consumer Group Configuration (https://kafka.apache.org/documentation/#consumerconfigs_group.id)
812
+ ticket: OMN-1002
813
+ - file_pattern: 'model_log_context\.py'
814
+ violation_pattern: "Field 'service_name' might reference an entity"
815
+ reason: >
816
+ 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.
817
+
818
+ documentation:
819
+ - docs/patterns/correlation_id_tracking.md
820
+ ticket: OMN-1002
821
+ # ModelDispatchLogContext - Dispatch-specific logging
822
+ - file_pattern: 'model_dispatch_log_context\.py'
823
+ class_pattern: "Class 'ModelDispatchLogContext'"
824
+ violation_pattern: 'has \d+ methods'
825
+ reason: >
826
+ Builder pattern model for dispatch logging with factory methods for common patterns (for_dispatch_start, for_dispatch_complete, for_dispatch_error). Intentional API design.
827
+
828
+ documentation:
829
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
830
+ - docs/patterns/correlation_id_tracking.md
831
+ ticket: OMN-1002
832
+ - file_pattern: 'model_dispatch_log_context\.py'
833
+ violation_pattern: "Field 'dispatcher_id' should use UUID"
834
+ reason: >
835
+ 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.
836
+
837
+ documentation:
838
+ - CLAUDE.md (Registry Naming Conventions)
839
+ ticket: OMN-1002
840
+ - file_pattern: 'model_dispatch_log_context\.py'
841
+ method_pattern: "Function 'for_dispatch_complete'"
842
+ violation_pattern: 'has \d+ parameters'
843
+ reason: >
844
+ Factory method that captures all dispatch completion context. Parameters are optional with defaults. Breaking into multiple calls would reduce usability.
845
+
846
+ documentation:
847
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
848
+ ticket: OMN-1002
849
+ - file_pattern: 'model_dispatch_log_context\.py'
850
+ method_pattern: "Function 'for_dispatch_error'"
851
+ violation_pattern: 'has \d+ parameters'
852
+ reason: >
853
+ Factory method that captures all dispatch error context. Parameters are optional with defaults. Breaking into multiple calls would reduce usability.
854
+
855
+ documentation:
856
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
857
+ ticket: OMN-1002
858
+ # ModelDispatchOutcome - Dispatcher output normalization
859
+ - file_pattern: 'model_dispatch_outcome\.py'
860
+ class_pattern: "Class 'ModelDispatchOutcome'"
861
+ violation_pattern: 'has \d+ methods'
862
+ reason: >
863
+ 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.
864
+
865
+ documentation:
866
+ - docs/architecture/MESSAGE_DISPATCH_ENGINE.md
867
+ - docs/design/ADR_DISPATCHER_TYPE_SAFETY.md
868
+ ticket: OMN-1002
869
+ # ==========================================================================
870
+ # Failed Component Model Exemptions (OMN-1007)
871
+ # ==========================================================================
872
+ # component_name in ModelFailedComponent is a simple string identifier for
873
+ # the component that failed during shutdown (e.g., "KafkaEventBus", "VaultAdapter").
874
+ # It is NOT an entity reference requiring UUID + display_name pattern.
875
+ - file_pattern: 'model_failed_component\.py'
876
+ violation_pattern: "Field 'component_name' might reference an entity"
877
+ reason: >
878
+ 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.
879
+
880
+ documentation:
881
+ - docs/adr/ADR-001-graceful-shutdown-drain-period.md
882
+ - CLAUDE.md (Model Field Naming - computed display names)
883
+ ticket: OMN-1007
884
+ # ==========================================================================
885
+ # ModelRegistryResponse Factory Method Exemptions (PR #79)
886
+ # ==========================================================================
887
+ # from_backend_results is a classmethod factory that requires all parameters
888
+ # to construct a response from individual backend results. Each parameter is
889
+ # a distinct required context for computing the response status.
890
+ - file_pattern: 'model_registry_response\.py'
891
+ method_pattern: "Function 'from_backend_results'"
892
+ violation_pattern: 'has \d+ parameters'
893
+ reason: >
894
+ 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.
895
+
896
+ documentation:
897
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
898
+ - CLAUDE.md (Factory Method Patterns)
899
+ ticket: PR-79
900
+ # ==========================================================================
901
+ # Union Reduction Phase 3 Result Model Exemptions (OMN-1003)
902
+ # ==========================================================================
903
+ # Result models use comprehensive APIs with factory methods, computed properties,
904
+ # and convenience methods for developer ergonomics.
905
+ - file_pattern: 'model_execution_shape_validation_result\.py'
906
+ class_pattern: "Class 'ModelExecutionShapeValidationResult'"
907
+ violation_pattern: 'has \d+ methods'
908
+ reason: >
909
+ 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.
910
+
911
+ documentation:
912
+ - docs/validation/validator_reference.md
913
+ - CLAUDE.md (Custom __bool__ for Result Models)
914
+ ticket: OMN-1003
915
+ # ==========================================================================
916
+ # OMN-1004: Union Reduction Phase 4 - New Model Exemptions
917
+ # ==========================================================================
918
+ # ModelCircuitBreakerConfig - service_name is a service identifier string
919
+ - file_pattern: 'model_circuit_breaker_config\.py'
920
+ violation_pattern: "Field 'service_name' might reference an entity"
921
+ reason: >
922
+ 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.
923
+
924
+ documentation:
925
+ - CLAUDE.md (Circuit Breaker Pattern section)
926
+ ticket: OMN-1004
927
+ # ModelOperationContext - operation_name is an operation identifier string
928
+ - file_pattern: 'model_operation_context\.py'
929
+ violation_pattern: "Field 'operation_name' might reference an entity"
930
+ reason: >
931
+ 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.
932
+
933
+ documentation:
934
+ - CLAUDE.md (Handler Refactoring section)
935
+ ticket: OMN-1004
936
+ # ModelValidationResult - field_name is the name of a validated field
937
+ - file_pattern: 'registration_reducer\.py'
938
+ violation_pattern: "Field 'field_name' might reference an entity"
939
+ reason: >
940
+ 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.
941
+
942
+ documentation:
943
+ - docs/architecture/REGISTRATION_REDUCER.md
944
+ ticket: OMN-1004
945
+ # ==========================================================================
946
+ # Handler Validation Error Model Exemptions (OMN-1091)
947
+ # ==========================================================================
948
+ # Handler validation error types are explicitly named per ticket requirements.
949
+ # rule_id and handler_id are human-readable semantic identifiers, not UUIDs.
950
+ - file_pattern: 'enum_handler_error_type\.py'
951
+ violation_pattern: "contains anti-pattern 'Handler'"
952
+ reason: >
953
+ 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.
954
+
955
+ documentation:
956
+ - CLAUDE.md (ONEX Architecture - Handler Types)
957
+ ticket: OMN-1091
958
+ - file_pattern: 'enum_handler_source_type\.py'
959
+ violation_pattern: "contains anti-pattern 'Handler'"
960
+ reason: >
961
+ EnumHandlerSourceType is an enum for validation source types (CONTRACT, DESCRIPTOR, STATIC_ANALYSIS). The "Handler" name is intentional per OMN-1091 spec.
962
+
963
+ documentation:
964
+ - CLAUDE.md (ONEX Architecture - Handler Types)
965
+ ticket: OMN-1091
966
+ - file_pattern: 'model_handler_validation_error\.py'
967
+ violation_pattern: "Field 'rule_id' should use UUID"
968
+ reason: >
969
+ 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.
970
+
971
+ documentation:
972
+ - docs/patterns/error_handling_patterns.md
973
+ ticket: OMN-1091
974
+ - file_pattern: 'model_handler_validation_error\.py'
975
+ method_pattern: "Function 'from_contract_error'"
976
+ violation_pattern: 'has \d+ parameters'
977
+ reason: >
978
+ Factory method with many optional parameters for complete error construction. Parameters have defaults. Breaking into multiple calls would reduce usability.
979
+
980
+ documentation:
981
+ - docs/patterns/error_handling_patterns.md
982
+ ticket: OMN-1091
983
+ - file_pattern: 'model_handler_validation_error\.py'
984
+ method_pattern: "Function 'from_security_violation'"
985
+ violation_pattern: 'has \d+ parameters'
986
+ reason: >
987
+ Factory method with many optional parameters for complete error construction. Parameters have defaults. Breaking into multiple calls would reduce usability.
988
+
989
+ documentation:
990
+ - docs/patterns/error_handling_patterns.md
991
+ ticket: OMN-1091
992
+ - file_pattern: 'model_handler_validation_error\.py'
993
+ method_pattern: "Function 'from_descriptor_error'"
994
+ violation_pattern: 'has \d+ parameters'
995
+ reason: >
996
+ Factory method with many optional parameters for complete error construction. Parameters have defaults.
997
+
998
+ documentation:
999
+ - docs/patterns/error_handling_patterns.md
1000
+ ticket: OMN-1091
1001
+ - file_pattern: 'model_handler_validation_error\.py'
1002
+ method_pattern: "Function 'from_architecture_error'"
1003
+ violation_pattern: 'has \d+ parameters'
1004
+ reason: >
1005
+ Factory method with many optional parameters for complete error construction. Parameters have defaults.
1006
+
1007
+ documentation:
1008
+ - docs/patterns/error_handling_patterns.md
1009
+ ticket: OMN-1091
1010
+ - file_pattern: 'model_handler_identifier\.py'
1011
+ violation_pattern: "Field 'handler_id' should use UUID"
1012
+ reason: >
1013
+ handler_id is a human-readable semantic identifier (e.g., "http-handler", "db-handler") per existing patterns. Not a UUID.
1014
+
1015
+ documentation:
1016
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
1017
+ ticket: OMN-1091
1018
+ # ==========================================================================
1019
+ # Handler Contract Source Exemptions (OMN-1097)
1020
+ # ==========================================================================
1021
+ # handler_contract_source.py contains legitimate handler discovery code.
1022
+ # The "Handler" in the class name refers to ONEX handler contracts, not an
1023
+ # anti-pattern manager/helper class.
1024
+ - file_pattern: 'handler_contract_source\.py'
1025
+ class_pattern: "Class name 'HandlerContractSource'"
1026
+ violation_pattern: "contains anti-pattern 'Handler'"
1027
+ reason: >
1028
+ 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.
1029
+
1030
+ documentation:
1031
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1032
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1033
+ ticket: OMN-1097
1034
+ # ==========================================================================
1035
+ # Handler Plugin Loader Exemptions (OMN-1132)
1036
+ # ==========================================================================
1037
+ # HandlerPluginLoader discovers and loads ONEX handlers from contract YAML files.
1038
+ # The "Handler" in the name refers to ONEX handler contracts being loaded,
1039
+ # not an anti-pattern manager/helper class.
1040
+ - file_pattern: 'handler_plugin_loader\.py'
1041
+ class_pattern: "Class name 'HandlerPluginLoader'"
1042
+ violation_pattern: "contains anti-pattern 'Handler'"
1043
+ reason: >
1044
+ 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.
1045
+
1046
+ documentation:
1047
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1048
+ - CLAUDE.md (ONEX Architecture - Handler Types)
1049
+ ticket: OMN-1132
1050
+ - file_pattern: 'handler_plugin_loader\.py'
1051
+ class_pattern: "Class 'HandlerPluginLoader'"
1052
+ violation_pattern: 'has \d+ methods'
1053
+ reason: >
1054
+ 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.
1055
+
1056
+ documentation:
1057
+ - docs/patterns/handler_plugin_loader.md
1058
+ - CLAUDE.md (Handler Plugin Loader Patterns)
1059
+ ticket: OMN-1132
1060
+ - file_pattern: 'protocol_handler_plugin_loader\.py'
1061
+ class_pattern: "Class name 'ProtocolHandlerPluginLoader'"
1062
+ violation_pattern: "contains anti-pattern 'Handler'"
1063
+ reason: >
1064
+ ProtocolHandlerPluginLoader defines the interface for handler plugin loading. The "Handler" refers to ONEX handler contracts, consistent with HandlerPluginLoader.
1065
+
1066
+ documentation:
1067
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1068
+ ticket: OMN-1132
1069
+ - file_pattern: 'model_loaded_handler\.py'
1070
+ class_pattern: "Class name 'ModelLoadedHandler'"
1071
+ violation_pattern: "contains anti-pattern 'Handler'"
1072
+ reason: >
1073
+ ModelLoadedHandler represents metadata about a loaded ONEX handler contract. The "Handler" refers to ONEX handler concepts, not an anti-pattern.
1074
+
1075
+ documentation:
1076
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1077
+ ticket: OMN-1132
1078
+ - file_pattern: 'model_handler_contract\.py'
1079
+ class_pattern: "Class name 'ModelHandlerContract'"
1080
+ violation_pattern: "contains anti-pattern 'Handler'"
1081
+ reason: >
1082
+ ModelHandlerContract is the Pydantic schema for handler contract YAML files. The "Handler" refers to ONEX handler contracts, consistent with HandlerPluginLoader and ModelLoadedHandler.
1083
+
1084
+ documentation:
1085
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1086
+ ticket: OMN-1132
1087
+ - file_pattern: 'model_handler_contract\.py'
1088
+ violation_pattern: "Field 'handler_name' might reference an entity"
1089
+ reason: >
1090
+ 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.
1091
+
1092
+ documentation:
1093
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers)
1094
+ ticket: OMN-1132
1095
+ # ==========================================================================
1096
+ # Contract Handler Discovery Exemptions (OMN-1133)
1097
+ # ==========================================================================
1098
+ # ContractHandlerDiscovery bridges HandlerPluginLoader with the BindingRegistry
1099
+ # for automatic handler discovery from contracts. The "Handler" in the name
1100
+ # refers to ONEX handler contracts being discovered, not an anti-pattern.
1101
+ - file_pattern: 'contract_handler_discovery\.py'
1102
+ class_pattern: "Class name 'ContractHandlerDiscovery'"
1103
+ violation_pattern: "contains anti-pattern 'Handler'"
1104
+ reason: >
1105
+ ContractHandlerDiscovery discovers ONEX handler contracts and registers them with the runtime. The "Handler" refers to ONEX handler contracts being discovered, consistent with HandlerPluginLoader.
1106
+
1107
+ documentation:
1108
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1109
+ - CLAUDE.md (Handler Plugin Loader Patterns)
1110
+ ticket: OMN-1133
1111
+ - file_pattern: 'protocol_handler_discovery\.py'
1112
+ class_pattern: "Class name 'ProtocolHandlerDiscovery'"
1113
+ violation_pattern: "contains anti-pattern 'Handler'"
1114
+ reason: >
1115
+ ProtocolHandlerDiscovery defines the interface for handler discovery services. The "Handler" refers to ONEX handler contracts, consistent with ProtocolHandlerPluginLoader.
1116
+
1117
+ documentation:
1118
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1119
+ ticket: OMN-1133
1120
+ - file_pattern: 'model_loaded_handler\.py'
1121
+ violation_pattern: "Field 'handler_name' might reference an entity"
1122
+ reason: >
1123
+ 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.
1124
+
1125
+ documentation:
1126
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers)
1127
+ ticket: OMN-1132
1128
+ - file_pattern: 'model_handler_descriptor\.py'
1129
+ violation_pattern: "Field 'handler_id' should use UUID"
1130
+ reason: >
1131
+ 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.
1132
+
1133
+ documentation:
1134
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
1135
+ ticket: OMN-1097
1136
+ - file_pattern: 'model_handler_security_policy\.py'
1137
+ violation_pattern: "contains anti-pattern 'Handler'"
1138
+ reason: >
1139
+ 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).
1140
+
1141
+ documentation:
1142
+ - docs/architecture/HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md
1143
+ ticket: OMN-1098
1144
+ # LocalHandler validator models - OMN-743
1145
+ # These models validate LocalHandler import restrictions in production code.
1146
+ # The "Handler" in the name refers to the specific LocalHandler class being
1147
+ # validated, not an anti-pattern handler class.
1148
+ - file_pattern: 'model_localhandler_violation\.py'
1149
+ class_pattern: "Class name 'ModelLocalHandlerViolation'"
1150
+ violation_pattern: "contains anti-pattern 'Handler'"
1151
+ reason: >
1152
+ 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.
1153
+
1154
+ documentation:
1155
+ - CLAUDE.md (LocalHandler dev-only enforcement)
1156
+ ticket: OMN-743
1157
+ - file_pattern: 'model_localhandler_validation_result\.py'
1158
+ class_pattern: "Class name 'ModelLocalHandlerValidationResult'"
1159
+ violation_pattern: "contains anti-pattern 'Handler'"
1160
+ reason: >
1161
+ 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.
1162
+
1163
+ documentation:
1164
+ - CLAUDE.md (LocalHandler dev-only enforcement)
1165
+ ticket: OMN-743
1166
+ - file_pattern: 'validation_aggregator\.py'
1167
+ class_pattern: "Class 'ValidationAggregator'"
1168
+ violation_pattern: 'has \d+ methods'
1169
+ reason: >
1170
+ 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.
1171
+
1172
+ documentation:
1173
+ - docs/patterns/error_handling_patterns.md
1174
+ ticket: OMN-1091
1175
+ - file_pattern: 'validator_security\.py'
1176
+ method_pattern: "Function 'convert_to_validation_error'"
1177
+ violation_pattern: 'has \d+ parameters'
1178
+ reason: >
1179
+ Conversion function requires multiple context parameters for complete error construction. Parameters are distinct required contexts for error reporting.
1180
+
1181
+ documentation:
1182
+ - docs/patterns/security_patterns.md
1183
+ ticket: OMN-1091
1184
+ # ==========================================================================
1185
+ # Service Discovery Node Exemptions (OMN-1131)
1186
+ # ==========================================================================
1187
+ # The service discovery node is a domain-specific infrastructure component that
1188
+ # integrates with external service discovery systems (Consul, Kubernetes).
1189
+ # The term "Service" is fundamental to the service discovery domain and cannot
1190
+ # be replaced with alternative terminology without losing semantic clarity.
1191
+ # HashiCorp Consul, Kubernetes, and all major service discovery systems use
1192
+ # "service" as the canonical term for discoverable network endpoints.
1193
+ - file_pattern: 'node_service_discovery_effect/node\.py'
1194
+ class_pattern: "Class name 'NodeServiceDiscoveryEffect'"
1195
+ violation_pattern: "contains anti-pattern 'Service'"
1196
+ reason: >
1197
+ NodeServiceDiscoveryEffect is the ONEX node for service discovery operations. "Service" is the canonical domain term from HashiCorp Consul and Kubernetes service discovery APIs.
1198
+
1199
+ documentation:
1200
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1201
+ - Kubernetes Service Discovery (https://kubernetes.io/docs/concepts/services-networking/service/)
1202
+ ticket: OMN-1131
1203
+ - file_pattern: 'node_service_discovery_effect/models/model_service_info\.py'
1204
+ class_pattern: "Class name 'ModelServiceInfo'"
1205
+ violation_pattern: "contains anti-pattern 'Service'"
1206
+ reason: >
1207
+ ModelServiceInfo represents service metadata from discovery systems. "Service" is the canonical domain term.
1208
+
1209
+ documentation:
1210
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1211
+ - Kubernetes Service Discovery (https://kubernetes.io/docs/concepts/services-networking/service/)
1212
+ ticket: OMN-1131
1213
+ - file_pattern: 'node_service_discovery_effect/models/model_service_info\.py'
1214
+ violation_pattern: "Field 'service_name' might reference an entity"
1215
+ reason: >
1216
+ service_name is the canonical Consul/K8s service identifier. This is infrastructure configuration, not an entity reference.
1217
+
1218
+ documentation:
1219
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1220
+ - CLAUDE.md (Model Field Naming - infrastructure identifiers)
1221
+ ticket: OMN-1131
1222
+ - file_pattern: 'node_service_discovery_effect/models/enum_service_discovery_operation\.py'
1223
+ class_pattern: "Class name 'EnumServiceDiscoveryOperation'"
1224
+ violation_pattern: "contains anti-pattern 'Service'"
1225
+ reason: >
1226
+ EnumServiceDiscoveryOperation defines operations for service discovery (REGISTER, DEREGISTER, DISCOVER). "Service" is the canonical domain term.
1227
+
1228
+ documentation:
1229
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1230
+ - Kubernetes Service Discovery (https://kubernetes.io/docs/concepts/services-networking/service/)
1231
+ ticket: OMN-1131
1232
+ - file_pattern: 'node_service_discovery_effect/models/model_service_discovery_health_check_details\.py'
1233
+ class_pattern: "Class name 'ModelServiceDiscoveryHealthCheckDetails'"
1234
+ violation_pattern: "contains anti-pattern 'Service'"
1235
+ reason: >
1236
+ ModelServiceDiscoveryHealthCheckDetails contains health check configuration for service discovery. "Service" is the canonical domain term.
1237
+
1238
+ documentation:
1239
+ - HashiCorp Consul Health Checks (https://developer.hashicorp.com/consul/docs/services/usage/checks)
1240
+ - Kubernetes Probes (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)
1241
+ ticket: OMN-1131
1242
+ - file_pattern: 'node_service_discovery_effect/models/model_service_registration\.py'
1243
+ class_pattern: "Class name 'ModelServiceRegistration'"
1244
+ violation_pattern: "contains anti-pattern 'Service'"
1245
+ reason: >
1246
+ ModelServiceRegistration is the input model for registering services in discovery systems. "Service" is the canonical domain term.
1247
+
1248
+ documentation:
1249
+ - HashiCorp Consul Service Registration (https://developer.hashicorp.com/consul/api-docs/agent/service#register-service)
1250
+ - Kubernetes Service Discovery (https://kubernetes.io/docs/concepts/services-networking/service/)
1251
+ ticket: OMN-1131
1252
+ - file_pattern: 'node_service_discovery_effect/models/model_service_registration\.py'
1253
+ violation_pattern: "Field 'service_name' might reference an entity"
1254
+ reason: >
1255
+ service_name is the canonical Consul/K8s service identifier. This is infrastructure configuration, not an entity reference.
1256
+
1257
+ documentation:
1258
+ - HashiCorp Consul Service Registration (https://developer.hashicorp.com/consul/api-docs/agent/service#register-service)
1259
+ - CLAUDE.md (Model Field Naming - infrastructure identifiers)
1260
+ ticket: OMN-1131
1261
+ - file_pattern: 'node_service_discovery_effect/models/model_service_discovery_health_check_result\.py'
1262
+ class_pattern: "Class name 'ModelServiceDiscoveryHealthCheckResult'"
1263
+ violation_pattern: "contains anti-pattern 'Service'"
1264
+ reason: >
1265
+ ModelServiceDiscoveryHealthCheckResult contains health check results from service discovery. "Service" is the canonical domain term.
1266
+
1267
+ documentation:
1268
+ - HashiCorp Consul Health Checks (https://developer.hashicorp.com/consul/docs/services/usage/checks)
1269
+ - Kubernetes Probes (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)
1270
+ ticket: OMN-1131
1271
+ - file_pattern: 'node_service_discovery_effect/registry/registry_infra_service_discovery\.py'
1272
+ class_pattern: "Class name 'RegistryInfraServiceDiscovery'"
1273
+ violation_pattern: "contains anti-pattern 'Service'"
1274
+ reason: >
1275
+ RegistryInfraServiceDiscovery is the DI registry for service discovery handlers. "Service" is the canonical domain term.
1276
+
1277
+ documentation:
1278
+ - docs/patterns/container_dependency_injection.md (Registry patterns)
1279
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1280
+ ticket: OMN-1131
1281
+ - file_pattern: 'handlers/registration_storage/handler_registration_storage_postgres\.py'
1282
+ method_pattern: "Function '__init__'"
1283
+ violation_pattern: 'has \d+ parameters'
1284
+ reason: >
1285
+ 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.
1286
+
1287
+ documentation:
1288
+ - asyncpg Pool Configuration (https://magicstack.github.io/asyncpg/current/api/index.html#connection-pools)
1289
+ ticket: OMN-1131
1290
+ - file_pattern: 'handlers/service_discovery/handler_service_discovery_consul\.py'
1291
+ method_pattern: "Function '__init__'"
1292
+ violation_pattern: 'has \d+ parameters'
1293
+ reason: >
1294
+ Consul handler requires multiple configuration parameters: consul_client, token, scheme, host, port, dc, circuit_breaker_config. These are standard Consul connection parameters.
1295
+
1296
+ documentation:
1297
+ - HashiCorp Consul API Configuration (https://developer.hashicorp.com/consul/api-docs)
1298
+ ticket: OMN-1131
1299
+ - file_pattern: 'handlers/service_discovery/models/model_service_info\.py'
1300
+ violation_pattern: "Field 'service_name' might reference an entity"
1301
+ reason: >
1302
+ service_name is the canonical Consul/K8s service identifier. This is infrastructure configuration, not an entity reference.
1303
+
1304
+ documentation:
1305
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1306
+ - CLAUDE.md (Model Field Naming - infrastructure identifiers)
1307
+ ticket: OMN-1131
1308
+ # ==========================================================================
1309
+ # Architecture Validator AST Exemptions (OMN-1099)
1310
+ # ==========================================================================
1311
+ # Python ast.NodeVisitor convention uses visit_ClassDef, visit_Call, visit_Name, etc.
1312
+ # These method names are REQUIRED by the ast module - they cannot be renamed.
1313
+ # Reference: https://docs.python.org/3/library/ast.html#ast.NodeVisitor
1314
+ #
1315
+ # This is a GENERAL exemption for ALL visit_* methods in ANY Python file,
1316
+ # as AST visitor patterns are used throughout the codebase for static analysis.
1317
+ - file_pattern: '.*\.py'
1318
+ violation_pattern: "Function name 'visit_\\w+' should use snake_case"
1319
+ reason: >
1320
+ 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.
1321
+
1322
+ documentation:
1323
+ - Python ast.NodeVisitor (https://docs.python.org/3/library/ast.html)
1324
+ - PEP 8 - Exception for stdlib compatibility
1325
+ ticket: OMN-1099
1326
+ # HandlerPublishingVisitor is a class that validates handler publishing constraints.
1327
+ # The "Handler" name is appropriate because it IS validating handler behavior.
1328
+ - file_pattern: 'validator_no_handler_publishing\.py'
1329
+ violation_pattern: "Class name .* contains anti-pattern 'Handler'"
1330
+ reason: >
1331
+ 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.
1332
+
1333
+ documentation:
1334
+ - CLAUDE.md (Handler No-Publish Constraint)
1335
+ - docs/patterns/security_patterns.md
1336
+ ticket: OMN-1099
1337
+ # ==========================================================================
1338
+ # Validation Result Model Exemptions (OMN-1104)
1339
+ # ==========================================================================
1340
+ # field_name in ModelValidationResult is a validation field path identifier,
1341
+ # not an entity reference. It represents which field in the validated object
1342
+ # failed validation (e.g., "node_id", "node_type").
1343
+ - file_pattern: 'model_validation_result\.py'
1344
+ violation_pattern: "Field 'field_name' might reference an entity"
1345
+ reason: >
1346
+ 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.
1347
+
1348
+ documentation:
1349
+ - docs/patterns/error_handling_patterns.md
1350
+ ticket: OMN-1104
1351
+ # ==========================================================================
1352
+ # Consul Registration Payload Exemptions (OMN-1104)
1353
+ # ==========================================================================
1354
+ # service_id and service_name are Consul native formats (strings), not UUIDs
1355
+ # or entity references. Consul service registry uses string identifiers.
1356
+ - file_pattern: 'model_payload_consul_register\.py'
1357
+ violation_pattern: "Field 'service_id' should use UUID"
1358
+ reason: >
1359
+ 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.
1360
+
1361
+ documentation:
1362
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
1363
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1364
+ ticket: OMN-1104
1365
+ - file_pattern: 'model_payload_consul_register\.py'
1366
+ violation_pattern: "Field 'service_name' might reference an entity"
1367
+ reason: >
1368
+ 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.
1369
+
1370
+ documentation:
1371
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
1372
+ - HashiCorp Consul Service Discovery API (https://developer.hashicorp.com/consul/api-docs/agent/service)
1373
+ ticket: OMN-1104
1374
+ # ==========================================================================
1375
+ # Architecture Validator Semantic ID Exemptions (OMN-1138)
1376
+ # ==========================================================================
1377
+ # Architecture validation rules use semantic string identifiers (e.g.,
1378
+ # 'NO_HANDLER_PUBLISHING', 'PURE_REDUCERS') rather than UUIDs. These are
1379
+ # human-readable rule codes similar to error codes, not database entity IDs.
1380
+ - file_pattern: 'model_rule_check_result\.py'
1381
+ violation_pattern: "Field 'rule_id' should use UUID"
1382
+ reason: >
1383
+ 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.
1384
+
1385
+ documentation:
1386
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
1387
+ ticket: OMN-1138
1388
+ - file_pattern: 'model_architecture_violation\.py'
1389
+ violation_pattern: "Field 'rule_id' should use UUID"
1390
+ reason: >
1391
+ rule_id is a semantic identifier for architecture rules (e.g., 'NO_HANDLER_PUBLISHING'). These are human-readable rule codes, not database entity UUIDs.
1392
+
1393
+ documentation:
1394
+ - CLAUDE.md (Registry Naming Conventions - semantic identifiers vs UUIDs)
1395
+ ticket: OMN-1138
1396
+ - file_pattern: 'model_architecture_violation\.py'
1397
+ violation_pattern: "Field 'rule_name' might reference an entity"
1398
+ reason: >
1399
+ 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.
1400
+
1401
+ documentation:
1402
+ - CLAUDE.md (Model Field Naming - display names vs entity references)
1403
+ ticket: OMN-1138
1404
+ - file_pattern: 'model_architecture_violation\.py'
1405
+ violation_pattern: "Field 'target_name' might reference an entity"
1406
+ reason: >
1407
+ target_name is dynamically derived from type(target).__name__ during validation. It's a runtime-computed description for logging, not an entity reference.
1408
+
1409
+ documentation:
1410
+ - CLAUDE.md (Model Field Naming - computed display names)
1411
+ ticket: OMN-1138
1412
+ # ==========================================================================
1413
+ # ProjectorValidationError Exemptions (OMN-1168)
1414
+ # ==========================================================================
1415
+ # Validation error class requires multiple context parameters for complete
1416
+ # error information: error_type, contract_path, message, remediation_hint,
1417
+ # and correlation_id. These are distinct required contexts for error reporting.
1418
+ - file_pattern: 'model_projector_validation_error\.py'
1419
+ method_pattern: "Function '__init__'"
1420
+ violation_pattern: 'has \d+ parameters'
1421
+ reason: >
1422
+ 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.
1423
+
1424
+ documentation:
1425
+ - docs/patterns/error_handling_patterns.md
1426
+ - CLAUDE.md (Infrastructure Error Patterns)
1427
+ ticket: OMN-1168
1428
+ # ==========================================================================
1429
+ # ProjectorPluginLoader Exemptions (OMN-1168)
1430
+ # ==========================================================================
1431
+ # Plugin loader pattern requires multiple discovery methods:
1432
+ # - load_from_contract, load_from_directory, discover_and_load
1433
+ # - Security validation methods (_validate_file_security, _sanitize_path)
1434
+ # - Contract parsing (_load_contract, _parse_yaml)
1435
+ # - Error handling (discover_with_errors, graceful mode support)
1436
+ - file_pattern: 'projector_plugin_loader\.py'
1437
+ class_pattern: "Class 'ProjectorPluginLoader'"
1438
+ violation_pattern: 'has \d+ methods'
1439
+ reason: >
1440
+ 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.
1441
+
1442
+ documentation:
1443
+ - src/omnibase_infra/runtime/handler_contract_source.py (reference pattern)
1444
+ ticket: OMN-1168
1445
+ - file_pattern: 'projector_plugin_loader\.py'
1446
+ method_pattern: "Function '__init__'"
1447
+ violation_pattern: 'has \d+ parameters'
1448
+ reason: >
1449
+ 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.
1450
+
1451
+ documentation:
1452
+ - src/omnibase_infra/runtime/handler_plugin_loader.py (reference pattern)
1453
+ - docs/patterns/handler_plugin_loader.md (security model)
1454
+ ticket: OMN-1316
1455
+ # ==========================================================================
1456
+ # ProjectorShell Exemptions (OMN-1169)
1457
+ # ==========================================================================
1458
+ # ProjectorShell implements ProtocolEventProjector protocol which requires:
1459
+ # - Protocol properties (projector_id, aggregate_type, consumed_events, is_placeholder)
1460
+ # - Core methods (project, get_state)
1461
+ # - SQL execution modes (_upsert, _insert, _append, _execute_projection)
1462
+ # - Value extraction (_extract_values, _resolve_path, _get_event_type)
1463
+ # - Utility (_parse_row_count)
1464
+ # Total: 11 methods, all cohesive to the projector contract pattern.
1465
+ # NOTE: Pattern anchored with omnibase_infra/runtime/ prefix and $ suffix to
1466
+ # match only the production file at src/omnibase_infra/runtime/projector_shell.py.
1467
+ # This prevents matching test files in tests/unit/runtime/ or tests/integration/runtime/.
1468
+ - file_pattern: 'omnibase_infra/runtime/projector_shell\.py$'
1469
+ class_pattern: "Class 'ProjectorShell'"
1470
+ violation_pattern: 'has \d+ methods'
1471
+ reason: >
1472
+ 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.
1473
+
1474
+ documentation:
1475
+ - src/omnibase_infra/runtime/projector_shell.py (class docstring)
1476
+ - omnibase_spi/protocols/projectors/protocol_event_projector.py (protocol definition)
1477
+ ticket: OMN-1169
1478
+ # ==========================================================================
1479
+ # Qdrant Handler Model Exemptions (OMN-1142)
1480
+ # ==========================================================================
1481
+ # collection_name is a Qdrant-native identifier, not an entity reference.
1482
+ # Qdrant uses string collection names as the primary way to identify and
1483
+ # access vector collections. This matches the qdrant-client API design.
1484
+ - file_pattern: 'model_qdrant_upsert_payload\.py'
1485
+ violation_pattern: "Field 'collection_name' might reference an entity"
1486
+ reason: >
1487
+ 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.
1488
+
1489
+ documentation:
1490
+ - https://qdrant.tech/documentation/concepts/collections/
1491
+ - src/omnibase_infra/handlers/handler_qdrant.py
1492
+ ticket: OMN-1142
1493
+ - file_pattern: 'model_qdrant_collection_payload\.py'
1494
+ violation_pattern: "Field 'collection_name' might reference an entity"
1495
+ reason: >
1496
+ 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.
1497
+
1498
+ documentation:
1499
+ - https://qdrant.tech/documentation/concepts/collections/
1500
+ - src/omnibase_infra/handlers/handler_qdrant.py
1501
+ ticket: OMN-1142
1502
+ - file_pattern: 'model_qdrant_search_payload\.py'
1503
+ violation_pattern: "Field 'collection_name' might reference an entity"
1504
+ reason: >
1505
+ 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.
1506
+
1507
+ documentation:
1508
+ - https://qdrant.tech/documentation/concepts/collections/
1509
+ - src/omnibase_infra/handlers/handler_qdrant.py
1510
+ ticket: OMN-1142
1511
+ - file_pattern: 'model_qdrant_delete_payload\.py'
1512
+ violation_pattern: "Field 'collection_name' might reference an entity"
1513
+ reason: >
1514
+ 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.
1515
+
1516
+ documentation:
1517
+ - https://qdrant.tech/documentation/concepts/collections/
1518
+ - src/omnibase_infra/handlers/handler_qdrant.py
1519
+ ticket: OMN-1142
1520
+ # ==========================================================================
1521
+ # Projector Schema Model Exemptions (OMN-1168)
1522
+ # ==========================================================================
1523
+ # table_name is a standard database identifier, not an entity reference.
1524
+ # This pattern is ubiquitous in database-related models.
1525
+ # NOTE: Projector models are temporarily in omnibase_infra until omnibase_core
1526
+ # provides canonical projector model types.
1527
+ - file_pattern: 'model_projector_schema\.py'
1528
+ violation_pattern: "Field 'table_name' might reference an entity"
1529
+ reason: >
1530
+ 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.
1531
+
1532
+ documentation:
1533
+ - PostgreSQL CREATE TABLE syntax
1534
+ - src/omnibase_infra/schemas/schema_registration_projection.sql (example usage)
1535
+ - src/omnibase_infra/models/projectors/model_projector_schema.py (ModelProjectorSchema defines table_name as identifier, temporary location in omnibase_infra)
1536
+ ticket: OMN-1168
1537
+ # ==========================================================================
1538
+ # SecretResolver Exemptions (OMN-764)
1539
+ # ==========================================================================
1540
+ # SecretResolver is a centralized secret resolution service with cohesive
1541
+ # functionality: sync/async resolution, caching, introspection, and refresh.
1542
+ # The 18 methods form a complete API for secret management:
1543
+ # - Primary API (4): get_secret, get_secrets, get_secret_async, get_secrets_async
1544
+ # - Cache management (3): refresh, refresh_all, get_cache_stats
1545
+ # - Introspection (2): list_configured_secrets, get_source_info
1546
+ # - Internal helpers (9): resolution, caching, path conversion
1547
+ - file_pattern: 'secret_resolver\.py'
1548
+ class_pattern: "Class 'SecretResolver'"
1549
+ violation_pattern: 'has \d+ methods'
1550
+ reason: >
1551
+ 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.
1552
+
1553
+ documentation:
1554
+ - docs/patterns/secret_resolver.md
1555
+ - CLAUDE.md (Infrastructure Patterns - SecretResolver)
1556
+ ticket: OMN-764
1557
+ # logical_name is a secret identifier using dotted path convention (e.g., "database.postgres.password")
1558
+ # It is NOT an entity reference - it's a lookup key for secret resolution.
1559
+ - file_pattern: 'model_secret_source_info\.py'
1560
+ violation_pattern: "Field 'logical_name' might reference an entity"
1561
+ reason: >
1562
+ 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.
1563
+
1564
+ documentation:
1565
+ - docs/patterns/secret_resolver.md (Naming Conventions section)
1566
+ ticket: OMN-764
1567
+ - file_pattern: 'model_secret_mapping\.py'
1568
+ violation_pattern: "Field 'logical_name' might reference an entity"
1569
+ reason: >
1570
+ 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.
1571
+
1572
+ documentation:
1573
+ - docs/patterns/secret_resolver.md (Naming Conventions section)
1574
+ ticket: OMN-764
1575
+ - file_pattern: 'model_cached_secret\.py'
1576
+ violation_pattern: "Field 'logical_name' might reference an entity"
1577
+ reason: >
1578
+ 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.
1579
+
1580
+ documentation:
1581
+ - docs/patterns/secret_resolver.md (Naming Conventions section)
1582
+ ticket: OMN-764
1583
+ # ==========================================================================
1584
+ # Observability Layer Exemptions (OMN-767)
1585
+ # ==========================================================================
1586
+ # The observability layer implements hot-path sinks and hooks that require
1587
+ # comprehensive interfaces for metrics, logging, and timing operations.
1588
+ # Per CLAUDE.md "Handlers own lifecycle, sinks own hot path" principle.
1589
+ - file_pattern: 'sink_logging_structured\.py'
1590
+ class_pattern: "Class 'SinkLoggingStructured'"
1591
+ violation_pattern: 'has \d+ methods'
1592
+ reason: >
1593
+ Hot-path logging sink requires comprehensive interface for ProtocolHotPathLoggingSink compliance: emit(), flush(), buffer management, and output formatting. Methods are protocol-mandated.
1594
+
1595
+ documentation:
1596
+ - CLAUDE.md (Observability Layer - Handlers own lifecycle, sinks own hot path)
1597
+ ticket: OMN-767
1598
+ - file_pattern: 'hook_observability\.py'
1599
+ class_pattern: "Class 'HookObservability'"
1600
+ violation_pattern: 'has \d+ methods'
1601
+ reason: >
1602
+ 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.
1603
+
1604
+ documentation:
1605
+ - CLAUDE.md (Observability Layer - Handlers own lifecycle, sinks own hot path)
1606
+ ticket: OMN-767
1607
+ - file_pattern: 'model_metrics_handler_config\.py'
1608
+ violation_pattern: "Field 'job_name' might reference an entity"
1609
+ reason: >
1610
+ job_name is a Prometheus Pushgateway configuration value (human-readable string identifier), not an entity reference. It follows Prometheus naming conventions.
1611
+
1612
+ documentation:
1613
+ - Prometheus Pushgateway documentation
1614
+ ticket: OMN-767
1615
+ # ==========================================================================
1616
+ # BindingConfigResolver Exemptions (OMN-765)
1617
+ # ==========================================================================
1618
+ # BindingConfigResolver is a centralized configuration resolution service with
1619
+ # cohesive functionality: sync/async resolution, multi-source support, caching,
1620
+ # and environment overrides. Similar to SecretResolver, the methods form a
1621
+ # complete API for configuration management:
1622
+ # - Primary API (4): resolve, resolve_async, resolve_many, resolve_many_async
1623
+ # - Cache management (4): invalidate, invalidate_all, get_cache_stats, cleanup
1624
+ # - Internal helpers (13): source loading, env overrides, vault refs, validation
1625
+ - file_pattern: 'binding_config_resolver\.py'
1626
+ class_pattern: "Class 'BindingConfigResolver'"
1627
+ violation_pattern: 'has \d+ methods'
1628
+ reason: >
1629
+ 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.
1630
+
1631
+ documentation:
1632
+ - docs/patterns/binding_config_resolver.md
1633
+ ticket: OMN-765
1634
+ # Architecture validator exemptions
1635
+ # These handle one-model-per-file violations for domain-grouped protocols
1636
+ architecture_exemptions:
1637
+ # ==========================================================================
1638
+ # Contract Linter Models Exemption (PR #57)
1639
+ # ==========================================================================
1640
+ # linter_contract.py contains domain-grouped validation models and enums
1641
+ # that are cohesive and always used together. These define the complete
1642
+ # interface for contract linting results.
1643
+ - file_pattern: 'validation/linter_contract\.py'
1644
+ violation_pattern: '\d+ models in one file'
1645
+ reason: >
1646
+ 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.
1647
+
1648
+ documentation:
1649
+ - CLAUDE.md (Protocol File Naming - domain-grouping convention)
1650
+ - docs/validation/validator_reference.md
1651
+ ticket: PR-57
1652
+ - file_pattern: 'validation/linter_contract\.py'
1653
+ violation_pattern: 'Mixed types in one file'
1654
+ reason: >
1655
+ Contract linter module contains cohesive types (enum + models) for validation results. EnumContractViolationSeverity is tightly coupled with ModelContractViolation and ModelContractLintResult.
1656
+
1657
+ documentation:
1658
+ - CLAUDE.md (Protocol File Naming)
1659
+ - docs/validation/validator_reference.md
1660
+ ticket: PR-57
1661
+ # ==========================================================================
1662
+ # Domain-Grouped Protocol Exemptions (CLAUDE.md Convention)
1663
+ # ==========================================================================
1664
+ # Per CLAUDE.md "Protocol File Naming" section:
1665
+ # "Domain-grouped protocols: Use protocols.py when multiple cohesive protocols
1666
+ # belong to a specific domain or node module"
1667
+ - file_pattern: 'nodes/node_registration_orchestrator/protocols\.py'
1668
+ violation_pattern: '\d+ protocols in one file'
1669
+ reason: >
1670
+ 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.
1671
+
1672
+ 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
1673
+
1674
+ 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
1675
+
1676
+ documentation:
1677
+ - docs/architecture/REGISTRATION_ORCHESTRATOR_ARCHITECTURE.md
1678
+ - docs/architecture/NODE_REGISTRATION_ORCHESTRATOR_PROTOCOLS.md
1679
+ ticket: OMN-888
1680
+ # ==========================================================================
1681
+ # ServiceTimeoutEmitter Models Exemption (OMN-932)
1682
+ # ==========================================================================
1683
+ # service_timeout_emitter.py contains domain-grouped models for timeout emission:
1684
+ # - ModelTimeoutEmissionResult: Result of timeout emission processing
1685
+ # - ModelTimeoutEmissionConfig: Configuration for the emitter
1686
+ # These are tightly coupled and always used together.
1687
+ - file_pattern: 'services/service_timeout_emitter\.py'
1688
+ violation_pattern: '\d+ models in one file'
1689
+ reason: >
1690
+ 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.
1691
+
1692
+ documentation:
1693
+ - CLAUDE.md (Protocol File Naming - domain-grouping convention)
1694
+ - docs/patterns/timeout_scanner_emitter.md
1695
+ ticket: OMN-932
1696
+ # These handle complex union type violations
1697
+ union_exemptions:
1698
+ # ==========================================================================
1699
+ # ModelNodeCapabilities Config Field Exemption
1700
+ # ==========================================================================
1701
+ # Design Doc: CLAUDE.md "Type Annotation Conventions" section - Union patterns
1702
+ - file_pattern: 'model_node_capabilities\.py'
1703
+ violation_pattern: 'Union with 4\+ primitive types.*bool.*float.*int.*str'
1704
+ reason: >
1705
+ 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.
1706
+
1707
+ documentation:
1708
+ - CLAUDE.md (Type Annotation Conventions - Union patterns)
1709
+ - Standard JSON config pattern (RFC 8259)
1710
+ ticket: null