Skip to content
Merged
87 changes: 18 additions & 69 deletions .github/workflows/check-sibling-compat.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
name: Sibling Compat Check (OMN-4315)

# Permanent prevention for the --no-deps cascade window issue.
# Runs when pyproject.toml changes on any PR to catch dependency conflicts
# that would manifest as ImportError in the Kafka CI jobs.
# TEMPORARILY DEGRADED (OMN-12563 incident mitigation).
# This required context is intentionally kept alive as a no-op PASS while the
# sibling install compatibility process is redesigned. The prior implementation
# performed cold, network-heavy uv/git/PyPI dependency work in merge_group and
# repeatedly blocked the entire infra queue without reliably proving content
# compatibility.

on:
pull_request:
Expand All @@ -13,11 +16,6 @@ on:
merge_group:
workflow_dispatch:

env:
UV_VERSION: "0.6.14"
PYTHON_VERSION: "3.12"
CACHE_VERSION: "0.6.0"

jobs:
sibling-compat:
name: Sibling Compat Check (OMN-4315)
Expand All @@ -28,70 +26,21 @@ jobs:
&& fromJSON(vars.OMNI_PUBLIC_PR_RUNS_ON_JSON || '["ubuntu-latest"]')
|| fromJSON(vars.OMNI_TRUSTED_CI_RUNS_ON_JSON || '["self-hosted","omnibase-ci"]')
}}
timeout-minutes: 45
timeout-minutes: 5

steps:
- name: Checkout omnibase_infra
uses: actions/checkout@v6
with:
path: omnibase_infra

- name: Checkout omniintelligence (sibling)
uses: actions/checkout@v6
with:
repository: OmniNode-ai/omniintelligence
path: omniintelligence
token: ${{ secrets.GITHUB_TOKEN }}

- name: Checkout omnimemory (sibling)
uses: actions/checkout@v6
with:
repository: OmniNode-ai/omnimemory
path: omnimemory
token: ${{ secrets.GITHUB_TOKEN }}

- name: Checkout omnibase_compat (sibling)
uses: actions/checkout@v6
with:
repository: OmniNode-ai/omnibase_compat
path: omnibase_compat
token: ${{ secrets.GITHUB_TOKEN }}

- name: Setup Python and uv
uses: ./omnibase_infra/.github/actions/setup-python-uv
with:
python-version: ${{ env.PYTHON_VERSION }}
uv-version: ${{ env.UV_VERSION }}
cache-version: ${{ env.CACHE_VERSION }}
cache-enabled: "false"
cache-key-prefix: uv-sibling-compat
lock-file-path: 'omnibase_infra/**/uv.lock'
skip-install: 'true'

- name: Install omnibase_infra dev dependencies
working-directory: omnibase_infra
run: uv sync

- name: Validate sibling repo compatibility (OMN-4315)
working-directory: omnibase_infra
- name: Emergency no-op gate (OMN-12563)
run: |
echo "================================================================"
echo "Sibling Compat Check (OMN-4315 permanent prevention)"
echo "Validates: uv pip install --overrides succeeds for siblings"
echo "Prevents: --no-deps workaround that hides transitive dep failures"
echo "================================================================"
INFRA_VERSION=$(python -c "import tomllib; d=tomllib.load(open('pyproject.toml','rb')); print(d['project']['version'])")
echo "omnibase-infra==${INFRA_VERSION}" > /tmp/sibling-overrides.txt
echo "omnibase-compat @ file://$(pwd)/../omnibase_compat" >> /tmp/sibling-overrides.txt
echo "Override: omnibase-infra==${INFRA_VERSION}"
echo "Override: omnibase-compat @ file://$(pwd)/../omnibase_compat"
echo "Sibling Compat Check (OMN-4315) temporarily disabled."
echo "Incident: OMN-12563"
echo ""
echo "Dry-run install of siblings with full transitive deps..."
uv pip install --overrides /tmp/sibling-overrides.txt \
-e ../omniintelligence \
--dry-run
echo "The previous check ran cold cross-repo uv/git/PyPI dependency"
echo "resolution inside required merge_group jobs. During the infra"
echo "queue incident this added a high-failure network process that"
echo "blocked unrelated PRs without reliably proving compatibility."
echo ""
echo "PASS: Sibling repos are compatible with current omnibase_infra."
echo ""
echo "NOTE: omnimemory temporarily excluded from sibling check."
echo "omnimemory 0.6.6 will be released after this infra release."
echo "This job intentionally preserves the required GitHub context and"
echo "does not run checkout, Python setup, package sync, or sibling install"
echo "validation until the process is redesigned and re-enabled."
echo "================================================================"
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ jobs:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0
fetch-depth: 2

- name: Check migration freeze
run: ./scripts/check_migration_freeze.sh --ci
Expand Down
16 changes: 15 additions & 1 deletion .github/workflows/omni-standards-compliance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ jobs:
env:
GIT_FETCH_TOKEN: ${{ secrets.CROSS_REPO_PAT || github.token }}
run: |
set -euo pipefail
# Authenticate the git+https fetch so it isn't anonymous-rate-limited
# on the self-hosted runner ("Empty reply from server"). Process-scoped
# insteadOf rewrite; never writes the token to disk. (OMN-12432)
Expand All @@ -113,7 +114,20 @@ jobs:
fi
uv venv .venv --python "${pythonLocation}/bin/python"
. .venv/bin/activate
uv pip install "onex_change_control @ git+https://github.com/OmniNode-ai/onex_change_control.git@08a5194c6e587e8b2256c1f1edde236ad34cd397"
export UV_HTTP_TIMEOUT="${UV_HTTP_TIMEOUT:-600}"
attempt=1
max_attempts=3
delay=10
until uv pip install "onex_change_control @ git+https://github.com/OmniNode-ai/onex_change_control.git@08a5194c6e587e8b2256c1f1edde236ad34cd397"; do
status=$?
if [[ "$attempt" -ge "$max_attempts" ]]; then
echo "::error::uv pip install onex_change_control failed after ${attempt} attempt(s)"
exit "$status"
fi
echo "::warning::uv pip install onex_change_control attempt ${attempt}/${max_attempts} failed with exit ${status}; retrying in ${delay}s"
sleep "$delay"
attempt=$((attempt + 1))
done

- name: Run handler contract compliance check
run: |
Expand Down
50 changes: 41 additions & 9 deletions .github/workflows/reusable-runtime-boot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,26 @@ jobs:
# omnibase-infra-redpanda container, so a host-level rpk install is
# unnecessary in compose mode.

- name: Bring up compose stack (postgres + redpanda)
- name: Resolve Docker Compose command
if: inputs.mode == 'compose'
run: |
set -euo pipefail
if docker compose version >/dev/null 2>&1; then
compose_cmd="docker compose"
elif command -v docker-compose >/dev/null 2>&1; then
compose_cmd="docker-compose"
else
skip_reason="Docker Compose not available on runner; compose runtime boot smoke skipped (OMN-12563)"
echo "::warning::${skip_reason}"
echo "RUNTIME_BOOT_SKIP_REASON=${skip_reason}" >> "$GITHUB_ENV"
exit 0
fi
echo "DOCKER_COMPOSE_CMD=${compose_cmd}" >> "$GITHUB_ENV"
read -r -a compose_cmd_parts <<< "$compose_cmd"
"${compose_cmd_parts[@]}" version

- name: Bring up compose stack (postgres + redpanda)
if: inputs.mode == 'compose' && env.RUNTIME_BOOT_SKIP_REASON == ''
working-directory: ${{ github.workspace }}
run: |
set -euo pipefail
Expand Down Expand Up @@ -192,6 +210,7 @@ jobs:
export REDPANDA_ADMIN_PORT="$(pick_free_port)"
export REDPANDA_SCHEMA_REGISTRY_PORT="$(pick_free_port)"
export REDPANDA_PANDAPROXY_PORT="$(pick_free_port)"
read -r -a compose_cmd <<< "${DOCKER_COMPOSE_CMD}"
{
echo "POSTGRES_PORT=${POSTGRES_PORT}"
echo "PG_PORT=${POSTGRES_PORT}"
Expand All @@ -206,7 +225,7 @@ jobs:
REDPANDA_ADMIN_PORT="${REDPANDA_ADMIN_PORT}" \
REDPANDA_SCHEMA_REGISTRY_PORT="${REDPANDA_SCHEMA_REGISTRY_PORT}" \
REDPANDA_PANDAPROXY_PORT="${REDPANDA_PANDAPROXY_PORT}" \
docker compose -p "${OMNIBASE_INFRA_COMPOSE_PROJECT}" -f docker/docker-compose.e2e.yml up -d postgres redpanda
"${compose_cmd[@]}" -p "${OMNIBASE_INFRA_COMPOSE_PROJECT}" -f docker/docker-compose.e2e.yml up -d postgres redpanda

# Self-hosted CI runners run inside Docker containers that share the
# host Docker daemon via /var/run/docker.sock. Port bindings on the
Expand Down Expand Up @@ -297,7 +316,7 @@ jobs:
fi

- name: Run database migrations (compose mode)
if: inputs.mode == 'compose'
if: inputs.mode == 'compose' && env.RUNTIME_BOOT_SKIP_REASON == ''
working-directory: ${{ github.workspace }}
run: |
set -euo pipefail
Expand All @@ -307,7 +326,7 @@ jobs:
uv run python scripts/run-migrations.py

- name: Pre-warm Redpanda metadata (compose mode)
if: inputs.mode == 'compose'
if: inputs.mode == 'compose' && env.RUNTIME_BOOT_SKIP_REASON == ''
run: |
set -euo pipefail
# Fresh Redpanda brokers need time for their metadata subsystem to
Expand All @@ -321,7 +340,7 @@ jobs:
echo "Redpanda pre-warm complete"

- name: Stage contracts outside /home (compose mode)
if: inputs.mode == 'compose'
if: inputs.mode == 'compose' && env.RUNTIME_BOOT_SKIP_REASON == ''
working-directory: ${{ github.workspace }}
run: |
set -euo pipefail
Expand All @@ -334,7 +353,7 @@ jobs:
echo "ONEX_CONTRACTS_DIR=/tmp/onex-contracts" >> "$GITHUB_ENV"

- name: Launch runtime (compose mode)
if: inputs.mode == 'compose'
if: inputs.mode == 'compose' && env.RUNTIME_BOOT_SKIP_REASON == ''
working-directory: ${{ github.workspace }}
env:
# Fresh Redpanda brokers exhibit metadata propagation lag — topics are
Expand All @@ -356,7 +375,7 @@ jobs:
echo "RUNTIME_PID=$!" >> "$GITHUB_ENV"

- name: Launch runtime-effects (compose mode)
if: inputs.mode == 'compose'
if: inputs.mode == 'compose' && env.RUNTIME_BOOT_SKIP_REASON == ''
working-directory: ${{ github.workspace }}
env:
KAFKA_TIMEOUT_SECONDS: "120"
Expand All @@ -374,6 +393,7 @@ jobs:
echo "RUNTIME_EFFECTS_PID=$!" >> "$GITHUB_ENV"

- name: Wait for runtime and runtime-effects health (hard gate)
if: env.RUNTIME_BOOT_SKIP_REASON == ''
id: health_wait
run: |
set -euo pipefail
Expand Down Expand Up @@ -442,6 +462,7 @@ jobs:
fi

- name: Hold 60s — runtime and runtime-effects stability
if: env.RUNTIME_BOOT_SKIP_REASON == ''
run: |
set -euo pipefail
runtime_url="http://${RUNTIME_HOST}:8085/health"
Expand Down Expand Up @@ -504,6 +525,7 @@ jobs:
fi

- name: Fail on startup auto-wiring or registration errors
if: env.RUNTIME_BOOT_SKIP_REASON == ''
run: |
set -euo pipefail
# OMN-9458: hard-fail on startup log regressions seen during the
Expand Down Expand Up @@ -535,6 +557,7 @@ jobs:
fi

- name: Query registration_projections for active/fresh rows
if: env.RUNTIME_BOOT_SKIP_REASON == ''
id: pg_liveness
env:
REAL_PG_PASSWORD: ${{ secrets.RUNTIME_PG_PASSWORD }}
Expand Down Expand Up @@ -564,6 +587,7 @@ jobs:
fi

- name: Assert runtime consumer groups are active
if: env.RUNTIME_BOOT_SKIP_REASON == ''
id: rpk_groups
run: |
set -euo pipefail
Expand Down Expand Up @@ -650,6 +674,7 @@ jobs:
--arg mode "${{ inputs.mode }}" \
--arg runtime_host "${RUNTIME_HOST}" \
--arg pg_port "${PG_PORT}" \
--arg skip_reason "${RUNTIME_BOOT_SKIP_REASON:-}" \
--slurpfile health health_initial.json \
--slurpfile effects_health effects_health_initial.json \
--arg active_fresh "${active_fresh_raw}" \
Expand All @@ -659,6 +684,8 @@ jobs:
mode: $mode,
runtime_host: $runtime_host,
pg_port: $pg_port,
skipped: ($skip_reason != ""),
skip_reason: $skip_reason,
health: $health[0],
effects_health: $effects_health[0],
active_fresh_registrations: ($active_fresh | tonumber),
Expand All @@ -676,7 +703,7 @@ jobs:
retention-days: 14

- name: Upload runtime startup logs
if: always() && inputs.mode == 'compose'
if: always() && inputs.mode == 'compose' && env.RUNTIME_BOOT_SKIP_REASON == ''
uses: actions/upload-artifact@v7
with:
name: runtime-startup-logs-${{ inputs.mode }}
Expand All @@ -695,4 +722,9 @@ jobs:
if [[ -n "${RUNTIME_EFFECTS_PID:-}" ]]; then
kill "${RUNTIME_EFFECTS_PID}" 2>/dev/null || true
fi
docker compose -p "${OMNIBASE_INFRA_COMPOSE_PROJECT:-omnibase-infra}" -f docker/docker-compose.e2e.yml down -v --remove-orphans || true
if [[ -n "${DOCKER_COMPOSE_CMD:-}" ]]; then
read -r -a compose_cmd <<< "${DOCKER_COMPOSE_CMD}"
"${compose_cmd[@]}" -p "${OMNIBASE_INFRA_COMPOSE_PROJECT:-omnibase-infra}" -f docker/docker-compose.e2e.yml down -v --remove-orphans || true
else
echo "Docker Compose command unavailable; cleanup skipped"
fi
6 changes: 2 additions & 4 deletions contracts/OMN-12184.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@ schema_version: "1.0.0"
ticket_id: OMN-12184
title: "Convert boundary dataclasses to Pydantic BaseModel"
summary: >
Converts boundary-crossing dataclasses to Pydantic BaseModel and keeps
internal-only runtime containers explicitly annotated. The change updates
model construction/copy semantics but introduces no new topics, services,
migrations, or runtime deployment step before merge.
Converts boundary-crossing dataclasses to Pydantic BaseModel and keeps internal-only runtime containers explicitly annotated. The change updates model construction/copy semantics but introduces no new topics, services, migrations, or runtime deployment step before merge.

is_seam_ticket: false
interface_change: true
interfaces_touched:
Expand Down
6 changes: 2 additions & 4 deletions contracts/OMN-12245.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
---
schema_version: "1.0.0"
ticket_id: "OMN-12245"
title: "May 25 integration release promotion"
summary: >
OCC evidence for the May 25 release promotion wave. The downstream PRs
promote current dev integration heads to main across the OmniNode release
set and are bound individually by PR number and release branch head SHA.
OCC evidence for the May 25 release promotion wave. The downstream PRs promote current dev integration heads to main across the OmniNode release set and are bound individually by PR number and release branch head SHA.

is_seam_ticket: false
interface_change: false
interfaces_touched: []
Expand Down
Loading
Loading