Skip to content

feat(OMN-12451): author canonical gitignore-baseline.yaml asset - #1181

Merged
jonahgabriel merged 6 commits into
devfrom
jonah/omn-12451-gitignore-baseline-asset
May 30, 2026
Merged

jonahgabriel merged 6 commits into
devfrom
jonah/omn-12451-gitignore-baseline-asset

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented May 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Implements OMN-12451 — the foundational asset for the OMN-12450 canonical .gitignore baseline epic.

  • Adds architecture-handshakes/gitignore-baseline.yaml as the machine-readable single source of truth for managed .gitignore blocks
  • Defines two sections: universal (all repos) and python (repos with pyproject.toml)
  • Each block carries verbatim start_marker/end_marker strings and an ordered patterns list so the T2 validator (OMN-12452) can assemble and assert exact block presence without interpretation
  • Schema follows the validator-requirements.yaml house 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 passed
  • uv run pytest tests/validation/ -q → 271/271 passed
  • pre-commit run --files → all hooks passed (yamlfmt reformatted on first run, clean on second)

dod_evidence

  • Schema file present at architecture-handshakes/gitignore-baseline.yaml with universal and python sections
  • Both sections carry ordered pattern lists matching OMN-12451 specification verbatim
  • Marker convention # === onex-managed: <name> === / # === end onex-managed: <name> === asserted by test
  • 13 schema-locking tests pass; validator (OMN-12452) can load this file and drive block assembly without further spec interpretation

jonahgabriel and others added 3 commits May 26, 2026 09:36
* 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.
@coderabbitai

coderabbitai Bot commented May 30, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@jonahgabriel, we couldn't start this review because you've reached your PR review rate limit.

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 @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4b66be54-868c-41eb-adcf-efdee277035e

📥 Commits

Reviewing files that changed from the base of the PR and between 022552b and 1024763.

📒 Files selected for processing (86)
  • .github/workflows/main-target-guard.yml
  • .pre-commit-config.yaml
  • architecture-handshakes/gitignore-baseline.yaml
  • examples/mixin_discovery_usage.py
  • examples/practical_migration_example.py
  • scripts/check_protocol_exports.py
  • scripts/validation/validate-string-typing.py
  • src/omnibase_core/contracts/contract_diff_computer.py
  • src/omnibase_core/enums/routing/__init__.py
  • src/omnibase_core/enums/routing/enum_capability_tier.py
  • src/omnibase_core/enums/routing/enum_provider.py
  • src/omnibase_core/enums/routing/enum_retry_type.py
  • src/omnibase_core/enums/routing/enum_risk_level.py
  • src/omnibase_core/mixins/mixin_event_handler.py
  • src/omnibase_core/mixins/mixin_introspection_publisher.py
  • src/omnibase_core/mixins/mixin_node_executor.py
  • src/omnibase_core/mixins/mixin_node_lifecycle.py
  • src/omnibase_core/mixins/mixin_node_service.py
  • src/omnibase_core/models/configuration/model_load_balancing_policy.py
  • src/omnibase_core/models/container/model_onex_container.py
  • src/omnibase_core/models/contracts/__init__.py
  • src/omnibase_core/models/contracts/evidence/model_contract_evidence_proof.py
  • src/omnibase_core/models/contracts/evidence/model_contract_evidence_spec.py
  • src/omnibase_core/models/contracts/evidence/model_evidence_provenance.py
  • src/omnibase_core/models/contracts/model_delegation_dashboard_connection.py
  • src/omnibase_core/models/contracts/model_delegation_datastore.py
  • src/omnibase_core/models/contracts/model_delegation_event_bus_endpoint.py
  • src/omnibase_core/models/contracts/model_delegation_llm_backend.py
  • src/omnibase_core/models/contracts/model_delegation_pricing_manifest_ref.py
  • src/omnibase_core/models/contracts/model_delegation_projection_api.py
  • src/omnibase_core/models/contracts/model_delegation_runtime_profile.py
  • src/omnibase_core/models/contracts/model_delegation_secret_ref.py
  • src/omnibase_core/models/contracts/model_delegation_security.py
  • src/omnibase_core/models/core/model_cli_tool_execution_input.py
  • src/omnibase_core/models/core/model_cli_tool_execution_input_config.py
  • src/omnibase_core/models/core/model_connection_properties.py
  • src/omnibase_core/models/core/model_extension_data.py
  • src/omnibase_core/models/core/model_generic_value.py
  • src/omnibase_core/models/core/model_group_manifest.py
  • src/omnibase_core/models/core/model_group_manifest_config.py
  • src/omnibase_core/models/core/model_parsed_arguments.py
  • src/omnibase_core/models/core/model_severity.py
  • src/omnibase_core/models/core/model_state_update.py
  • src/omnibase_core/models/core/model_tool_type.py
  • src/omnibase_core/models/discovery/model_discovery_response.py
  • src/omnibase_core/models/events/__init__.py
  • src/omnibase_core/models/events/model_event_envelope_v1_minimal.py
  • src/omnibase_core/models/node_metadata/model_node_configuration_value.py
  • src/omnibase_core/models/routing/__init__.py
  • src/omnibase_core/models/routing/model_routing_decision.py
  • src/omnibase_core/models/routing/model_routing_degraded_event.py
  • src/omnibase_core/models/security/model_securityeventcollection.py
  • src/omnibase_core/models/telemetry/__init__.py
  • src/omnibase_core/models/telemetry/model_sweep_result.py
  • src/omnibase_core/protocols/http/__init__.py
  • src/omnibase_core/protocols/http/protocol_http_client.py
  • src/omnibase_core/utils/util_bootstrap.py
  • src/omnibase_core/utils/util_streaming_window.py
  • src/omnibase_core/validation/delegation/validator_delegation_profile.py
  • tests/unit/contracts/test_contract_diff_computer.py
  • tests/unit/contracts/test_model_contract_config.py
  • tests/unit/enums/test_compat_enum_parity_omn12189.py
  • tests/unit/models/contracts/evidence/test_contract_evidence_spec.py
  • tests/unit/models/contracts/test_model_behavior_proven_receipt.py
  • tests/unit/models/contracts/test_model_delegation_runtime_profile.py
  • tests/unit/models/contracts/test_runtime_sha_match.py
  • tests/unit/models/contracts/test_runtime_sha_match_dod_gate.py
  • tests/unit/models/delegation/test_model_health_status.py
  • tests/unit/models/dispatch/test_model_dispatch_claim.py
  • tests/unit/models/events/test_model_event_envelope_v1_minimal.py
  • tests/unit/models/routing/test_routing_decision_and_degraded.py
  • tests/unit/models/telemetry/__init__.py
  • tests/unit/models/telemetry/test_model_sweep_result.py
  • tests/unit/models/validation/test_model_event_destination.py
  • tests/unit/nodes/test_node_compute_critical.py
  • tests/unit/nodes/test_node_effect_critical.py
  • tests/unit/nodes/test_node_reducer_snapshot_deep_copy.py
  • tests/unit/services/replay/test_service_time_injector.py
  • tests/unit/test_no_internal_deps.py
  • tests/unit/utils/test_workflow_executor_critical.py
  • tests/unit/validation/delegation/test_validator_delegation_profile.py
  • tests/unit/validation/test_receipt_gate_internal_guards.py
  • tests/validation/test_gitignore_baseline_spec.py
  • tests/validation/test_validate_import_patterns.py
  • tests/validation/test_validate_secrets.py
  • tests/validation/test_validate_typing_syntax.py
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jonah/omn-12451-gitignore-baseline-asset

Comment @coderabbitai help to get the list of available commands and usage tips.

@jonahgabriel
jonahgabriel enabled auto-merge May 30, 2026 13:46
@jonahgabriel
jonahgabriel added this pull request to the merge queue May 30, 2026
Merged via the queue into dev with commit 2964c50 May 30, 2026
90 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-12451-gitignore-baseline-asset branch May 30, 2026 14:49
jonahgabriel added a commit that referenced this pull request Jun 6, 2026
…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>
jonahgabriel added a commit that referenced this pull request Jun 7, 2026
* 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 …
jonahgabriel added a commit that referenced this pull request Jun 7, 2026
* 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…
jonahgabriel added a commit that referenced this pull request Jun 12, 2026
…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
jonahgabriel added a commit that referenced this pull request Jun 15, 2026
…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
jonahgabriel added a commit that referenced this pull request Jun 18, 2026
…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
jonahgabriel added a commit that referenced this pull request Jun 30, 2026
* 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
…
andywu42 pushed a commit to andywu42/omnibase_core that referenced this pull request Jul 1, 2026
…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>
jonahgabriel added a commit that referenced this pull request Jul 1, 2026
…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…
jonahgabriel added a commit that referenced this pull request Jul 3, 2026
…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…
jonahgabriel added a commit that referenced this pull request Jul 3, 2026
…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…
jonahgabriel added a commit that referenced this pull request Jul 4, 2026
…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…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant