Repository navigation
promote(OMN-15181): dev->main dev-wins bridge — one-time merge-commit exception (OMN-15195) - #2481
Conversation
…o auto-wiring resolver (#2234) * fix(OMN-14139)(OMN-14140): wire node_ledger_write_effect handlers into auto-wiring resolver Two defects blocked the ledger-append pipeline from ever running: - OMN-14139: contract.yaml's handler_routing.handlers[] used the flat handler_class:/handler_module: fields, which ModelHandlerRoutingEntry does not parse (nested handler: {name, module} required) -- both entries silently dropped, wiring ZERO handlers. Fixed to the nested schema, plus an explicit topic: per entry so the two operation_match handlers don't hit the multi-handler topic-assignment ambiguity guard. - OMN-14140: HandlerLedgerAppend/HandlerLedgerQuery required a db_handler constructor argument the auto-wiring resolver cannot supply (its known-injectable set is container/event_bus/ ownership_query only), so even with routing fixed the handlers were unconstructable (quarantined). Both now compose HandlerDb internally from `container` alone, connecting lazily on first real use via `_ensure_db_ready()` since the resolver never calls initialize() on auto-wired handlers. Also fixed, discovered during live verification: HandlerLedgerAppend's OMN-14134 handle() adapter (and the mirrored one added here for HandlerLedgerQuery) extracted payload/correlation_id via getattr(envelope, "payload", ...), which silently no-ops on the DICT envelope MessageDispatchEngine._materialize_envelope_with_bindings actually delivers on the live dispatch path -- only object-shaped test doubles worked. Both now use a dict-or-attribute extraction helper mirroring HandlerBuildLoopProjection._coerce_event_message. Verified live on .201 dev lane: wire_from_manifest resolves both handlers with zero quarantine and registers both topic routes; a synthetic ledger-append event produced to onex.cmd.platform.ledger-append.v1 landed a durable row in event_ledger (count 0 -> 1) with the lazily-connected HandlerDb and a published onex.evt.platform.ledger-appended.v1 confirmation. * fix(OMN-14139): remove ledger handler env reads * test(OMN-14139): regenerate ledger dispatch parity oracle
… dev candidate runtime image can build (#2214) * fix(OMN-13985): install pydantic before sibling-lock-pin preflight so dev candidate runtime image can build The 'Stage workspace sibling trees into the build context' step runs scripts/runtime_build/stage_workspace.sh, which invokes scripts/runtime_build/check_sibling_lock_pins.py. That script imports pydantic (BaseModel, ConfigDict, Field) at module top level, but the workflow only sets up Python via actions/setup-python and installs no project deps before this step. The preflight died with ModuleNotFoundError: No module named 'pydantic' -> stage_workspace.sh exit 3, so the docker build / ECR push / digest steps never ran. Only pydantic is third-party; everything else the script imports is stdlib. Insert a minimal 'pip install pydantic>=2' step against the setup-python interpreter immediately before the failing staging step. The script is invoked via bare 'python3', matching this install target. Evidence: run 28748861432 failed at the staging step with the above ModuleNotFoundError. Locally reproduced (clean venv): import fails before install, and after installing pydantic the script reaches argparse (exit 2), proving the import is resolved. * ci(OMN-13985): route sibling refresh on trusted runners * ci(OMN-13985): clean receipt honesty sibling checkout * ci(OMN-13985): extend contract compliance timeout * chore(OMN-13985): retrigger lint CI
…ns the OMN-13888 grandfather validator (#2231) * fix(OMN-14130): bump omnibase-core 0.46.3->0.46.5 (OMN-13888 OCC grandfather validator) omnibase_infra pinned omnibase-core==0.46.3, which predates OMN-13888 (per-entry OCC receipt hashing + append-only + supersession + dual-accept / grandfather, shipped in 0.46.5). occ-preflight installs the caller repo's pinned core version, so infra PRs were evaluating OCC eligibility with the pre-grandfather 0.46.3 validator. That validator re-applies the old 'all receipts must equal the current whole-file contract hash' rule and rejects any PR whose ticket contract received an append after merge (e.g. OMN-14127 shared between omniclaude #1870 and infra #2230 → contract_hash_mismatch on the legacy dod-omniclaude-pr-1870 receipt). Bump to ==0.46.5 (both dependency groups) + regenerate uv.lock + resync _FALLBACK_MATRIX in version_compatibility.py. Verified clean on 0.46.5: 25,453 tests collect with zero import/API breaks; full unit suite 21,076 passed (0 real failures); test_version_compatibility 25 passed. Unblocks OMN-14127 (#2230) once merged + rebased. See also OMN-14131 (harden occ-preflight so the built main wheel wins over a CWD pin). * fix(OMN-14130): refresh runner identity for core pin bump
…osted fail-closed poller so it never wedges under self-hosted saturation (#2230) * ci(OMN-14127): convert CI Summary to no-needs GitHub-hosted fail-closed poller Port the proven omniclaude #1870 wedge fix to omnibase_infra. The required branch-protection context "CI Summary" was a needs-gated aggregator over ~20 self-hosted jobs; under fleet saturation those jobs never terminalized, so the required check-run was ABSENT (not failing/pending) and PRs wedged BLOCKED with no auto-recovery. - ci-summary is now a NO-needs, runs-on: ubuntu-latest, if: always(), fail-closed bounded-deadline poller. Its check-run instantiates immediately (the required context can never be absent) and it polls the current run's job conclusions via the GitHub jobs API. Zero self-hosted/LAN dependency. Name 'CI Summary' preserved byte-for-byte (rename would re-wedge every PR). - scripts/ci/ci_summary_gate.py: default-deny, fail-closed verdict (exit 0/1/2). Reproduces infra's exact original semantics (13 strict == success gates + 4 success||skipped gates as the completeness anchor) and adds a strictly-stronger default-deny sweep that catches detect-changes / plugin-env-service-completeness / compose-required-env-coverage / contract-path-preflight failures the old tests-gate greened on 'skipped'. Small soft-allowlist of genuinely-non-gating jobs (advisory / not-required), prefix-aware for reusable-workflow callers. - tests/ci/test_ci_summary_gate.py: 18 unit tests pinning the fail-closed verdict (strict-skip=fail, sweep catches leaves, allowlist ignored, empty run != vacuous green, docs-only success). - Removes the (unset, no-op) OMNI_REQUIRED_CI_RUNS_ON_JSON merge_group override from the ci-summary runs-on selector; the poller is runner-independent. * fix(OMN-14127): allow hosted ci summary aggregator * fix(OMN-14127): route ci process changes to ci tests * fix(OMN-14127): fail closed on duplicate summary jobs
* ci(OMN-14104): gate all PR workflows on OCC preflight * ci(OMN-14104): re-arm OCC preflight after evidence merge * ci(OMN-14104): target core dev for OCC preflight callers * ci(OMN-14104): pin infra OCC preflight reusable workflow * ci(OMN-14104): pin infra OCC preflight to workflow-sha fix * ci(OMN-14104): correct OCC preflight workflow pin * ci(OMN-14104): use working OCC preflight core pin * ci(OMN-14104): pin OCC preflight to dev-validator workflow * ci(OMN-14104): pin OCC preflight to isolated wheel build * ci(OMN-14104): pass explicit OCC preflight core ref * ci(OMN-14104): pin infra OCC preflight to compat-dev core fix * ci(OMN-14104): fail CI Summary explicitly when OCC preflight is red CodeRabbit flagged that gating the required CI Summary aggregate with `if: needs.occ-preflight.result == 'success' && (always())` turns a RED occ-preflight into a SKIPPED CI Summary. A skipped required branch-protection check reports as success, so a failed OCC preflight could be merged. Keep `if: always()` and enforce OCC eligibility as the first step, failing explicitly when preflight did not succeed so the required check stays RED. CI Summary is the single umbrella required gate (OMN-4497, .github/required-checks.yaml), so a red CI Summary blocks the merge even though the runner-heavy fanout is (intentionally) skipped on preflight failure. * ci(OMN-14104): re-trigger CI after transient startup_failure batch The 06:58Z run batch on the prior push hit a transient GitHub Actions startup_failure across all workflows (zero jobs, name==path, no diff cause — untouched workflows failed too). Infra recovered by 07:01Z (sibling branch runs queuing/running normally). startup_failure runs are non-retriable, so this empty commit re-triggers a fresh CI cycle. No code change. * ci(OMN-14104): re-pin occ-preflight reusable to merged omnibase_core dev SHA The 43 workflow callers pinned the occ-preflight reusable (and its core-ref input) to 7975803283 — a commit on the omnibase_core OMN-14104 PR branch (#1396, 'ci: use dev for OCC preflight compat checkout'). That PR squash-merged to omnibase_core dev (8a47e092), deleting the branch and ORPHANING 7975803283. GitHub Actions can no longer resolve the reusable at an unreachable SHA, so every caller on this branch hit startup_failure ('workflow file issue', zero jobs) — all 43 workflows red. Re-pin all 86 references (43 uses:@ + 43 core-ref) to 8a47e092002dd1338599fa0733feda469436acbf, the merged commit that last defined occ-preflight.yml on omnibase_core dev (ancestor of dev HEAD, reachable). Input interface is identical (contracts-dir/receipts-dir/core-ref, all optional) — verified against both SHAs. Also rebased onto origin/dev to pick up the 4 missing commits (incl. OMN-14130 core 0.46.5 bump for the grandfather validator). * ci(OMN-14104): refresh dispatch parity fixture * ci(OMN-14104): restore routed dispatch parity fixture * ci(OMN-14104): refresh parity fixture metadata * ci(OMN-14104): allow reusable occ preflight in webhook tests * ci(OMN-14104): run plugin lifecycle guard in uv env
…s (WS-F) (#2219) * fix(OMN-14017): set UV_HTTP_TIMEOUT=600 on merge_group validator gates Three merge_group required-status validators (Runtime Profiles, URL Authority Gate, Validate Validator Requirements) run a raw `uv sync` via astral-sh/setup-uv directly, bypassing the hardened ./.github/actions/setup-python-uv composite. That path inherits uv's 30s default timeout with zero retries, so it fails HARD on the first PyPI download timeout under fleet egress saturation (WS-F) — while the 16 composite-using workflows retry through the same contention. Observed: the Runtime Profiles / validate merge_group check at the omnibase_infra queue HEAD (run 28775491973) failed on `virtualenv==20.36.1` with 'network timeout ... current value: 30s'. Set UV_HTTP_TIMEOUT=600 at the workflow env level of all three (matches the composite's ${UV_HTTP_TIMEOUT:-600} and ci.yml/omni-standards precedent). It propagates to every uv sync and uv run --with git+https call in the job. Minimal, uniform, no step restructuring. Related: OMN-13932 (WS-F fleet epic; systemic mirror decision is separate). * ci(OMN-14017): retrigger stale canceled checks * fix(OMN-14017): route sibling lock refresh runner * ci(OMN-14017): widen saturated validator gate budgets
* feat(OMN-14029): scale runner fleet to 56 * ci(OMN-14029): refresh cancelled status rollup * fix(OMN-14029): preserve runner script executable bits * fix(OMN-14029): trust local runner listener health during api flaps * fix(OMN-14029): reconcile runner fleet target to 64 * ci(OMN-14029): narrow stale todo checkout fetch * ci(OMN-14029): route sibling lock refresh on trusted runners
…lows (Lever 1 fan-out) (#2224) * ci(OMN-14078): remove merge_group triggers from 15 non-required workflows (Lever 1 fan-out) Lever 1 fan-out from docs/plans/2026-07-06-ci-streamlining-logjam-reduction-plan.md (sibling of OMN-14076 core canary). The merge queue only waits on required status contexts; these 15 workflows carry none, so their merge_group runs burn shared self-hosted runner slots and gate nothing. Removes only the merge_group: trigger from each on: block. pull_request and push triggers untouched -- nothing un-enforced. No logic changes. Verified against the LIVE required_status_checks: every required-context carrier keeps its merge_group trigger; no cut workflow produces a required context. * ci(OMN-14078): refresh gates after OCC evidence binding * ci(OMN-14078): route sibling lock refresh on trusted runners * ci(OMN-14078): raise uv timeout on required install gates * ci(OMN-14078): align runner disk preflight trigger test * ci(OMN-14078): retrigger checks after runner reset * ci(OMN-14078): fix url authority workflow env block
…ice 2, the §1 fix) (#2217) * feat(OMN-13997): verification-receipts raw ledger projection (WS-L slice 2, the §1 fix) Second migration slice of the event-sourced ledger substrate (epic OMN-13989, plan §2.5 / §6 Phase 1). Replicates the proven slice-1 receiving-end pattern. verification-receipts (.onex_state/verification-receipts/*.yaml) is THE ledger the initiative exists to fix: plan §1.1 names it the direct doctrine §1 contradiction (completion-evidence ledger on local disk); the hostile review re-ordered it to Phase 1 "delivered early". Higher current-gap value than dispatch-log. Pure DB projection over the existing ProjectorShell + ModelProjectorContract engine: ZERO new node, ZERO bespoke class (rule 7a). Reference: overseer_tick_ledger (088), decision_store (046). Artifacts (omnibase_infra): - docker/migrations/forward/089_create_verification_receipt_ledger.sql (089 — 088 reserved by in-flight #2216) — append-only verification_receipt_ledger; envelope_id PK idempotency; single_partition ordering; queryable NULLABLE core columns + phases JSONB + receipt_body JSONB (lossless full-fidelity capture). - rollback + restamped schema_fingerprint.sha256. - src/omnibase_infra/projectors/contracts/verification_receipt_projector.yaml — consumes onex.evt.omniclaude.verification_receipt.v1, append mode. - tests/unit/runtime/test_verification_receipt_projector.py. Doc-discrepancy reconcile (verified on-disk): - On-disk receipts are the payload shape, not full ModelEventEnvelopes (as slice-1). - HETEROGENEOUS shapes: ticket receipts + overseer-verify-tick share a core; one legacy baseline snapshot omits ticket_id/phases. Handled by nullable core columns + lossless receipt_body JSONB. - ticket_id nullable (1/9 files lack it); overseer_verdict on only 2/9. - Plan §6 topic onex.evt.omniclaude.verification-receipt.v1 differs from the existing node_verification_receipt_generator topic (onex.evt.omnimarket.verification-receipt-completed.v1) — that node is not this skill-written flat-file ledger. Event-type uses underscore per contract pattern. Net-negative: adds only the target projection surface (no new flat-file writer). Deferred (follow-up children of OMN-13989): emit-side dual-write (WS-6 MSK-IAM cutover, not this lane); golden-chain replay-equivalence (T15); cutover of the receipt-gate reader onto the projection. dod_evidence: 4/4 new tests pass; 457 projector suites unaffected; ruff + SPDX + migration-sequence + writer-coupling + schema-fingerprint green. Closes OMN-13997 * ci(OMN-13997): refresh stuck checks * ci(OMN-13997): refresh stale PR checks * ci(OMN-13997): refresh duplicate cancelled guard contexts * fix(OMN-13997): require raw receipt body projection * ci(OMN-13997): isolate receipt honesty validator checkout * ci(OMN-13997): route sibling lock refresh via runner selector * ci(OMN-13997): retrigger stale canceled checks * ci(OMN-13997): refresh wedged docker build gate * ci(OMN-13997): retry receipt honesty core clone
…schema silent-zero-parse (#2235) * fix(OMN-14141): fail-closed guard + CI gate for handler_routing flat-schema silent-zero-parse The flat handler_class:/handler_module: schema silently parsed to zero handlers, then auto-wiring reported WIRED with zero dispatchers while still subscribing to and committing Kafka offsets on the topic — silent phantom-wiring (the WI-14 root cause, OMN-14139/OMN-14135). Enforcement (CLAUDE.md Rule #5 — gate ships WITH the fixes): - Guard A (parse-time): discovery._parse_handler_routing raises on a flat/ malformed handlers[] entry instead of silently skipping it. Legacy top-level handler: fallback preserved (empty handlers list never raises). - Guard B (wire-time): _commit_contract_wiring reports FAILED (not WIRED) and does NOT subscribe when a contract declares subscribe topics but registers zero dispatchers. Never fires on legacy fallbacks (>=1 dispatcher) or resolver-ownership/quarantine skips. - CI gate + pre-commit hook: handler_routing_schema validator rejects flat entries across all node contracts (SYNC'd ci.yml step + pre-commit hook). Contract fixes (7 infra contracts the gate would reject; ledger done in #2234): node_savings_estimation_compute, node_build_loop_write_effect, node_session_state_effect, node_pattern_lifecycle_effect, node_validation_executor, node_decision_store_query_compute, node_baseline_comparison_compute. Verified: 111/111 contracts discover with zero errors; Guard B fires on zero real contracts; 354 auto-wiring/kernel tests + 11 new guard tests green. Follow-up (separate PR): 3 omnimarket flat-schema contracts + omnimarket-side gate. * test(OMN-14141): refresh dispatch parity oracle
* ci(OMN-14078): remove duplicate validator workflow env * ci(OMN-14078): retrigger after OCC evidence merge
…t + repair tick (#2223) * fix(OMN-14060): omnimarket venv drift guard — dynamic ref + pre-flight + repair tick Closes the OMN-13829 recurrence: install-node-skill-package.sh baked in a hand-edited omnimarket SHA that went stale within days, and nothing re-asserted the venv's install state afterward, so it silently reverted to a stale PyPI install (missing the operation: field fix, OMN-13530). - install-node-skill-package.sh now resolves OMNIMARKET_REF dynamically from omnimarket's live dev HEAD (git ls-remote), falling back to the local canonical clone at $OMNI_HOME/omnimarket when offline. An explicit OMNIMARKET_REF override still wins outright (pinned/offline use). Kills the stale-pin-layer-two problem the OMN-14060 investigation surfaced. - New src/omnibase_infra/cli/omnimarket_drift_guard.py: a cheap, LOCAL-ONLY (no network) pre-flight check wired into `onex skill <name>` that compares the current interpreter's installed omnimarket commit against the already-checked-out $OMNI_HOME/omnimarket clone. Fails open whenever either side can't be determined locally (CI, fresh machines); raises a clear, actionable error pointing at the repair command on a real mismatch. Never re-installs anything itself (detect only). - New scripts/check-omnimarket-venv-drift.sh: the repair half, meant for a session/cron tick. Refreshes the canonical clone from origin/dev, compares against the target venv, and with --repair re-runs install-node-skill-package.sh pinned to the fresh SHA. Verified locally end-to-end: installed a deliberately stale SHA, confirmed `onex skill aislop_sweep` hard-fails with the STALE message, ran check-omnimarket-venv-drift.sh --repair, confirmed it fixed the venv and the skill dispatches again. 21 new tests (drift guard unit tests + hermetic script tests using a local bare-repo remote and a fake python shim, no network); all pre-existing cli/scripts tests still pass (582 total in tests/unit/cli/ + tests/scripts/); ruff format/check, mypy, and pre-commit all clean on the touched files. Companion to OMN-14064 (separate lane: the release-side gate for the PyPI-uninstallable omnimarket 0.4.6 pin) — this PR is the venv-side guard only. * ci(OMN-14060): refresh cancelled gate rollup
) * fix(OMN-13992): inject _topic into projection dispatch input_data HandlerProjectionLiveEvents.handle() requires a non-empty input_data['_topic'] (docstring: "Expects input_data to contain ... _topic: source Kafka topic string"), but _make_projection_dispatch_callback computed topic locally (for logging only) and never injected it into input_data alongside _db/_event_type. Every real dispatch on the .201 dev lane raised ValueError and the event was dropped, non-fatally but silently, because the contract also had no DLQ topic declared. The 6 subscribed topics all hit this; node-heartbeat is the only one with steady traffic on the idle dev lane, producing the ~30s drop cadence observed in OMN-13992. Fix: inject input_data["_topic"] = topic next to the existing _db/ _event_type injection. Other projection handlers tolerate a missing _topic via a topics[0] fallback, so they are unaffected; this closes a real correctness gap for any handler (now or future) that requires the actual dispatched topic rather than a same-node guess. Companion fix in omnimarket adds event_bus.dlq_topics to node_projection_live_events/contract.yaml so any future malformed event is dead-lettered instead of dropped. * ci(OMN-13992): retry runtime npm CLI install * ci(OMN-13992): refresh cancelled node migration check * ci(OMN-13992): retrigger stuck node migration workflow * ci(OMN-13992): refresh cancelled required gate contexts * fix(OMN-13992): preserve npm retry failure status * ci(OMN-13992): refresh kafka boundary gate after runner install casualty
* fix(OMN-14028): raise hot runtime service memory caps * ci(OMN-14028): refresh cancelled status rollup * ci(OMN-14028): refresh cancelled required gates * ci(OMN-14028): refresh cancelled runner contexts * ci(OMN-14028): refresh cancelled lightweight gates * ci(OMN-14028): refresh kafka boundary gate after runner install casualty
* chore(OMN-14030): consolidate host cleanup installer * ci(OMN-14030): refresh cancelled status rollup * fix(OMN-14030): consolidate host cleanup and redpanda volume gc * ci(OMN-14030): refresh cancelled runner checks * ci(OMN-14030): refresh cancelled node migration sync * chore(OMN-14030): retrigger cancelled CI
…-only bypass leak) (#2225) Shift defect detection left by closing the dominant bypass leak found in the OMN-14099 audit: the local pre-commit git hook was never installed in 6 of 7 canonical clones under $OMNI_HOME, so every repo's .pre-commit-config.yaml was pure decoration. No --no-verify needed -- the hook simply never ran, so every commit silently skipped ALL local enforcement (hardcoded IPs/topics, banned constructs, URL/model-literal authority, skip tokens, PEP-604 unions, ...) and CI became the first (most expensive) catch point. Fix: wire an idempotent `pre-commit install` (+ best-effort `install-hooks`) into scripts/pull-all.sh -- the sync entrypoint every session already runs before ticket work. It activates the already-written, correctly-scoped hooks across every repo that ships a config, at commit time. Guarantees: - Idempotent: skips repos whose hook is already pre-commit-managed (fast no-op). - Scoped: only touches repos that ship a .pre-commit-config.yaml. - Fail-soft: a hook-install problem never fails the pull; left out of FAILED. - Offline-safe: writing the hook script is the load-bearing step (no network); env pre-build is best-effort and envs otherwise install lazily at first commit. This is NOT a new pattern check -- it closes a leak so already-existing gates (URL-authority, canonical-inference, topic/IP/path guards, skip-token rejection) fire pre-commit instead of first failing in CI/CodeRabbit/merge-sweep. Net-negative surface: adds no new CI gate; instead it makes CI the BACKSTOP for ~400 already-written hooks that were previously CI-only on this machine. Tests: TestPreCommitHookInstall (install-when-config-present, idempotent-noop, no-config-no-hook) drive the real script via subprocess against real git repos; all 28 tests in the module pass. E2E-verified that the installed hook blocks a deliberately-bad commit. Relates OMN-13979 (CI audit), OMN-13981 (validator telemetry).
* build(deps): bump omnibase-core from 0.46.3 to 0.46.5 Bumps [omnibase-core](https://github.com/OmniNode-ai/omnibase_core) from 0.46.3 to 0.46.5. - [Release notes](https://github.com/OmniNode-ai/omnibase_core/releases) - [Changelog](https://github.com/OmniNode-ai/omnibase_core/blob/dev/CHANGELOG.md) - [Commits](OmniNode-ai/omnibase_core@v0.46.3...v0.46.5) --- updated-dependencies: - dependency-name: omnibase-core dependency-version: 0.46.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): refresh runner image identity for core 0.46.5 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jonah Gray <jonah@omninode.ai>
…rd-drift in workspace builds (OMN-14138) (#2233) * fix(OMN-13902): stop sibling-pin guard false-blocking registry forward-drift in workspace builds (OMN-14138) The workspace-build sibling-pin preflight (check_sibling_lock_pins.py) treated ANY version mismatch as fatal. But OMN-13929's post-publish release-identity disarm bumps a sibling's DEV pyproject version to N+1 the instant version N is published, so every registry-sourced sibling's dev clone is PERMANENTLY one version ahead of the last-published pin a consumer's uv.lock can carry. A workspace build vendors the clone (newer by design), so the guard reported [DRIFT/forward] and aborted EVERY workspace runtime build from dev. Fix: in workspace mode, a registry-sourced pin (git_rev is None) whose clone version is strictly FORWARD of the lock is recorded as a non-fatal forward_drift_allowed note -- the registry-sourced analogue of the OMN-13403 git-rev clone_ahead exemption. Backward drift (stale clone -- the 2026-06-11 crash shape), non-comparable versions, and git-sourced drift all stay FATAL, and release-mode (the strict default) stays fully strict. The workspace callers (stage_workspace.sh, deploy-runtime.sh) pass --build-source workspace; any other caller fails closed to strict. Proven behavior (unit + CLI): core lock=0.46.5 clone=0.46.6 (registry forward) PASSES in workspace / FAILS in release; spi lock=0.23.1 clone=0.23.0 (registry backward) FAILS in both; git-sourced forward stays fatal. The in-build re-checks (compute_workspace_provenance _load_pin_comparison drift_count + resolve_workspace_pins.compare_pin, which already classified forward as allowed "ahead") are consistent with the fix. OMN-13902 OMN-14138 * chore(OMN-13902): retrigger OCC preflight after core workflow fix
…32.0,<0.51.0 (#2227) * build(deps): update uvicorn requirement Updates the requirements on [uvicorn](https://github.com/Kludex/uvicorn) to permit the latest version. - [Release notes](https://github.com/Kludex/uvicorn/releases) - [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md) - [Commits](Kludex/uvicorn@0.32.0...0.50.2) --- updated-dependencies: - dependency-name: uvicorn dependency-version: 0.50.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): refresh runner image identity for uvicorn bump --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jonah Gray <jonah@omninode.ai>
…ings (#2240) Vendors omnimarket's new node-owned migrations (source of truth: omnimarket#1649) into this repo's forward-migration tree via scripts/sync-node-migrations.sh, so a clean redeploy picks them up: - docker/migrations/forward/nodes/node_projection_delegation/ 0022_delegation_events_tenant_id.sql - docker/migrations/forward/nodes/node_projection_savings/ 080_savings_estimates_tenant_id.sql Both are ALTER TABLE ... ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'omninode', closing a HIGH-severity defect found by independent adversarial verification of the OMN-14058 interim tenant_id stamp (omnibase_core#1404 / omnimarket#1648): neither delegation_events nor savings_estimates had a tenant_id column, so PostgresSyncProjectionAdapter. upsert() raised `column "tenant_id" does not exist` against real Postgres the moment ONEX_TENANT_ID was set. Verified in sync with the omnimarket dev tip's node migration source via `scripts/sync-node-migrations.sh --check` (0 drift beyond these 2 files); node-scoped migrations under nodes/ are excluded from the flat schema_fingerprint.sha256 (non-recursive glob), so no fingerprint restamp is required. Sequencing: this repo's node-migration-sync CI check (and local onex-check-node-migration-sync pre-commit hook) resolves against omnimarket's dev tip, so it will read as OUT OF SYNC until omnimarket#1649 merges to dev -- expected, same pattern as the existing omnibase_core#1404 -> omnimarket#1648 dependency. Do not merge this PR before omnimarket#1649. Closes OMN-14058 (infra vendoring half; see omnimarket#1649 for the source-of-truth migration + real-Postgres regression test).
…0.120.1,<0.140.0 (#2228) * build(deps): update fastapi requirement Updates the requirements on [fastapi](https://github.com/fastapi/fastapi) to permit the latest version. - [Release notes](https://github.com/fastapi/fastapi/releases) - [Commits](fastapi/fastapi@0.120.1...0.139.0) --- updated-dependencies: - dependency-name: fastapi dependency-version: 0.139.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): refresh runner image identity for fastapi bump * fix: refresh runner identity after fastapi merge * fix: align build loop append wiring * fix: sync vendored node migrations * fix: refresh fastapi gate evidence * fix: refresh dispatch parity fixture --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jonah Gray <jonah@omninode.ai>
Merged canonical omniweb Keycloak desired-state alignment with reconciler attribute support.
Merged CI Summary run_attempt scoping fix.
…late Remove the hardcoded LAN-only Kafka bootstrap default from docs/env-master-template.env and document the LAN/Tailscale choices. Evidence-Source: OCC#3738.
Add shared GHCR registry cache for Docker Build, gate informational Docker integration tests off PRs, and refresh workflow shell quoting after rebase. Verification: tests/ci/test_ci_workflow_resilience.py passed, actionlint clean, PR checks green. Evidence-Source: OCC#3616.
…ka construction sites (#2238) * fix(OMN-14155): wire MSK-IAM auth kwargs into remaining direct aiokafka construction sites OMN-2793 built the MSK-IAM OAUTHBEARER foundation (kafka_auth.py, ModelKafkaEventBusConfig, 8 call sites) but ~14 other direct AIOKafkaConsumer/AIOKafkaProducer construction sites bypassed it and passed only bootstrap_servers= (implicit PLAINTEXT). Several are docker-catalog-deployed cloud runtime containers (context-audit, llm-cost-aggregation, skill-lifecycle, agent-actions, infra-routing-decisions, consumer-health-projection, injection-effectiveness, waitlist-signup-notifier, plus the registration-orchestrator snapshot producer) that would fail the SASL handshake outright once the cloud dev broker is cut over to KAFKA_SASL_MECHANISM=AWS_MSK_IAM. Spread the existing build_aiokafka_auth_kwargs_from_env() helper into every remaining site (no-op today under PLAINTEXT; becomes load-bearing once the Infisical cloud-k8s secrets flip). Adds an AST-based CI regression guard (tests/ci/test_no_raw_aiokafka_construction_without_auth.py) so a new direct construction site can't silently skip auth kwargs again, with a documented allowlist for cli_kafka.py (explicit V2 SASL/TLS deferral, pre-existing). Design: docs/plans/2026-07-08-runtime-msk-iam-oauthbearer-design.md Closes OMN-14155 * fix(OMN-14155): sync kafka replay contract for auth kwargs
…ra (#2242) * ci(OMN-14172): roll out integration silent-skip guard to omnibase_infra Enforcement-not-detection rollout of the OMN-14172 silent-skip false-green guard (omnimarket canary #1652, MERGED) to omnibase_infra — CI gate + pre-commit hook ship in the same PR (Operating Rule #5): - scripts/ci/check_integration_skips.py + integration_skip_guard.yaml, calibrated for infra's real Postgres-absence skip vocabulary (grepped from tests/); allowlists Kafka/Consul/Vault/Qdrant/live/catalog skips - new `integration-guard` CI job: provisions postgres:16-alpine (mirrors migration-integration), applies all migrations, exports OMNIBASE_INFRA_DB_URL + POSTGRES_* env, runs the curated Postgres-only proofs with --junitxml, then enforces check_integration_skips.py (fail-closed) - wired BLOCKING via ci_summary_gate.py SKIPPABLE_GATE_JOBS (the CI Summary umbrella required context); NO new branch-protection required context is registered here — deferred to operator/Codex once green on real PRs - integration-skip-guard pre-commit hook (--selftest, no DB needed) - tests/ci/test_check_integration_skips.py: case-(a) PASS + case-(b) RED regression proof plus full-vocabulary coverage OCC companion owed: omnibase_infra verify/receipt-gate needs Evidence-Source: OCC#<n> (Codex authors). * fix(ci): narrow integration skip guard proofs * fix(ci): make integration guard proof self-contained * ci(OMN-14172): fix integration guard review follow-ups
…defect) (#2207) * fix(OMN-13946): add libatomic1 to runner image (Pyright node runtime defect) The self-hosted CI runner image's bundled GitHub Actions node runtime (used by node-based actions, e.g. pyright) dlopens libatomic.so.1 at load time. Ubuntu 22.04 does not pull libatomic1 in transitively, so every node-based action fails with "node: libatomic.so.1: cannot open shared object file" — deterministic, not transient. Blocks omniclaude PR #1860 (OMN-13502) and any omniclaude PR that runs pyright. Add libatomic1 to the runner image apt install list, bump image_version 5->6 (real image content change), and regenerate the bound identity (docker/runners/runner-image.lock.json). The Dockerfile apt-list is not itself a binding input, so identity_digest only moves because image_version does; shared_env_digest is unchanged. Updates the OMN-12765 release-backmerge identity-pin test to the regenerated digest. Rebuild + fleet redeploy on .201 is a separate gated live-runtime step, out of scope here. Evidence-Source: OCC#TBD Evidence-Ticket: OMN-13946 * chore(OMN-13946): retrigger occ-preflight after PR body Evidence-Source update * chore(OMN-13946): retrigger required PR checks * ci(OMN-13946): harden uv sync validator gates * ci(OMN-13946): refresh kafka gates after runner install casualty
…ency cap — canary (#2244) Canary (omnibase_infra only) for OMN-14027. Turns the shovel-ready egress-caching spec into real code. Adds INDEPENDENT runner-fleet throughput (removing redundant PyPI egress + capping the download stampede), not just more concurrency. C3 — fleet-wide uv concurrency cap (ACTIVE): - Add UV_CONCURRENT_DOWNLOADS/BUILDS/INSTALLS + UV_HTTP_TIMEOUT to the x-runner-env anchor so raw `uv sync` paths (the 18 workflows that bypass the hardened setup-python-uv composite, OMN-14193) inherit the stampede ceiling that the composite already applies per-step. Value pinned to the pre-cache fail-safe of 1 (never looser than the composite's own `${...:-1}`=1) so no path is loosened; raise to 2 only after C1 is active + measured. C1 — PyPI pull-through cache (INERT / shovel-ready, activated only at soak-gated rollout): - docker/pypi-cache/{Dockerfile,entrypoint.sh}: devpi-server image (build-at-rollout). - docker/docker-compose.pypi-cache.yml: standalone cache service, NOT part of the runner fleet — bringing up the fleet does not require/start it. - config/runner_fleet.yaml: pypi_cache endpoint recorded as source-of-truth, active: false. Typed via new ModelPyPICacheConfig (optional field on the strict ModelRunnerFleetConfig so pre-cache configs still validate). - docker-compose.runners.yml: UV_DEFAULT_INDEX/PIP_INDEX_URL wiring kept as an INERT comment so a merge cannot point 64 runners at a not-yet-stood-up cache. - docs/runbooks/pypi-cache-egress-rollout.md: gated rollout + rollback runbook. C2 (Actions/uv-binary acceleration) deferred to rollout: it touches the hardened composite / OMN-14193 guard surface, and uv is already baked in the runner image. Tests: fleet cap present, index wiring inert, pypi_cache recorded-but-inert + optional. No raw astral-sh/setup-uv introduced (OMN-14193). proof_class=code-only.
* fix(OMN-13947): suppress runner drift alert noise * ci(OMN-13947): retrigger after wedged runner jobs * ci(OMN-13947): bypass corrupted uv cache in URL authority gate * ci(OMN-13947): host infra ownership lint * ci(OMN-13947): retry URL authority core fetch
Refs OMN-15181
Refs OMN-15181
Refs OMN-15181
Refs OMN-15181
Refs OMN-15185
Refs OMN-15181
…loys Refs OMN-15181
… repo Refs OMN-15179
Merged by Codex merge sweep after OCC#4991 companion landed and branch protection reported CLEAN.
Merged by Codex merge sweep after OCC#4992 companion landed and rerun CI Summary passed.
Merged by Codex merge sweep after OCC#4993 landed and required CI Summary passed; backmerge unblocks omnibase_infra dev-to-main promotion.
…me merge-commit exception; heals squash-severed merge-base (OMN-15195)
…2480 Empty commit — no tree change. #2478/#2480 shared the prior commit SHA (3b67018) with this PR's now-closed duplicate #2480, which made GitHub's commit->PR resolution in occ-preflight/receipt-gate ambiguous (kept resolving to the closed #2480). This commit gives #2479 a unique head SHA while leaving origin/dev's tree untouched (git diff --quiet against the parent confirms zero diff).
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
❓ Hostile Reviewer — UNKNOWNBlocking findings (critical): 0 Gate semantics (pilot phase)
Powered by omniintelligence.review_pairing.cli_review — node-based adversarial review via HandlerLlmCliSubprocess (OMN-8468/OMN-8524) |
Deviation note (branch rename, hotfix/* path; parallel-session collision recovery)
The recipe's suggested branch name (
promotion/omn-15195-devwins-bridge, used on the now-closed #2477) fails the repo's requiredmain-target-guardcheck, which only accepts head refs that are literallydevor matchhotfix/*(withhotfix-evidence:/backmerge:body lines) — see.github/workflows/main-target-guard.yml. This bridge cannot be head=dev(that would force-move the livedevbranch). Renamed tohotfix/*; content and recipe are otherwise unchanged from #2477 (same bridge SHA3b67018b8e4815eaa23bffa35ecb56dddfbcc569, plus one disambiguating empty commita09a48a6— zero tree diff — described below).Collision + recovery, documented for the record: a parallel process (GitHub identity
jonahgabriel, consistent with the codex-merge-controller automation referenced elsewhere in this repo's history) independently closed the first hotfix-branch PR #2479 and deleted its branch at 18:46:39Z, then opened its own #2480 on the identical bridge SHA at 18:49:29Z. Unaware #2479 was already closed by that process, this session closed #2480 as an apparent duplicate at ~18:56Z — leaving both closed. Both #2479 and (closed) #2480 shared head SHA3b67018b8e4815eaa23bffa35ecb56dddfbcc569, which also made GitHub's commit->PR resolution inocc-preflight/receipt-gate ambiguous (kept resolving to the closed PR). This PR (branchhotfix/omn-15195-devwins-bridge-v2) adds one empty commit (a09a48a6, verified zero tree diff against its parent) on top of the same bridge to give the head a unique SHA, breaking that ambiguity, and supersedes #2477, #2479, and #2480 (all closed, same underlying bridge commit).hotfix-evidence: OCC-5002
backmerge: #2476
Operator ruling (verbatim, ~18:10Z 2026-07-26)
This is a one-time, per-repo exception.
allow_merge_commit/required_linear_historywill be restored byte-exact onmainimmediately after this PR merges, with before/after readbacks posted to OMN-15195.Why a bridge commit, not a normal merge
PR #2475 (
dev→main, direct) isCONFLICTING— GitHub cannot self-merge it becausedev's squash-history severed the merge-basemainneeds to fast-forward/3-way-merge cleanly. This PR supersedes #2475 (closed with cross-link).The bridge is built with
git commit-tree, notgit merge:origin/dev's tree exactly (dev-wins-wholesale).origin/main(first) +origin/dev(second) — this is what heals the ancestry: after merge,merge-base(origin/dev, origin/main) == origin/devtip, somainis a normal fast-forward-capable descendant ofdevgoing forward.3b67018b8e4815eaa23bffa35ecb56dddfbcc569(verified byte-identical across all three PR attempts). This PR's head adds one empty disambiguating commit on top (a09a48a6).Phase 1 — subsumption proof (dev-wins is conditional on this)
git compare dev...mainshows 8 commits unique tomain(not reachable fromdev's squash-rewritten history). Dev-wins is only safe if each is content-present ondev— i.e. dev's tree already carries the substantive change, even though the commit object itself isn't in dev's ancestry. All 8 confirmed:origin/dev7200315b844cde5adocker/entrypoint-runtime.shin dev carries the OMN-13666 stamp-tolerance logic (OMN-13666: Required vs best-effort stamp policy)2cd72081docker/Dockerfile.runtimein dev:uv-with-retry pip install "cryptography>=48.0.1"(GHSA-537c-gmf6-5ccf)ca8ebf96.github/workflows/build-and-push-runtime.ymlin dev carriespush_with_retry()(OMN-13687, back-ported again under OMN-14196)49927fd0pyproject.tomlin dev pinsomnibase-core==0.46.8/omnibase-spi==0.23.1— strictly newer, supersedes00e5a02a824a8fadmodel_llm_inference_request.pyin dev carriesmax_retries/timeout_secondsfields per the same schemae3c43206docker/Dockerfile.runtimein dev carries the pyasn1/transformers CVE force-upgrade block (backmerged via #2462, per operator note)8/8 confirmed content-present on
origin/dev. No commit's content is genuinely absent — dev-wins does not silently revert any prod-relevant hotfix.Post-merge proof obligations (to be executed after merge, before settings restore)
git merge-base origin/dev origin/main == origin/devtip (history healed)git diff origin/dev origin/main --statempty (tree identity)main:SERVICE_HEALTH_TARGET_INDEXinexecutor.pyimage:params indocker-compose.prod.ymlembeddings-201 :8002incontracts/llm_endpoints.yamlScope / guardrails
mainvia this PR. No other bypass.deploy-agent/ lanes / prod are never touched by this change — this is ancestry/tree healing only, not a deploy.Refs: OMN-15181 (Finding-15 critical path), OMN-15195 (structural blocker this PR resolves), supersedes #2475, #2477, #2479, #2480 (same underlying bridge commit; all superseded by rename/disambiguation).
Evidence-Ticket: OMN-15195
Evidence-Ticket: OMN-15181
Evidence-Source: OCC#5025
Evidence-Class: hotfix
Hotfix-Receipt: OCC#5002
Evidence-Commit: dbc85db1905356f6cf216fcf048cba66a78d2534
Evidence-Bind-Refresh: 2026-07-26T21:49Z