Skip to content

fix(OMN-16367): evict per-run compose proof images at source and gate the invariant (retention wave 1) - #3121

Merged
jonahgabriel merged 1 commit into
devfrom
jonah/omn-16367-retention-wave1-eviction-at-source
Sep 1, 2026
Merged

jonahgabriel merged 1 commit into
devfrom
jonah/omn-16367-retention-wave1-eviction-at-source

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Sep 1, 2026 •

Copy link
Copy Markdown
Collaborator

OMN-16367 — wave 1 of the .201 CI image-retention permanent fix

/data on .201 repeatedly fills to 100% and reds the whole 88-runner fleet plus every lane on the host. The 2026-08-21 audit traced it: seven docker compose ... up --build CI steps mint a per-run image set (project name embeds run_id/attempt) that nothing ever removes — tagged (never dangling, so image prune misses them), uniquely named (never enumerable in a static keep list), and tagged latest (unconditionally kept by the disk GC's first guard). ~2,986 images / ~2.2 TB at audit time; re-measured today at +53 orphan images in 16 minutes of normal CI traffic.

This is wave 1 (items 1+2+9) of the rev-2 plan (omni_home/docs/plans/2026-08-21-201-ci-image-retention-permanent-fix-plan.md), landed together so no unguarded window exists. Workflow-only: zero host GC change, zero .201 mutation — takes effect through CI on merge.

Item 1 — eviction at source

All seven per-run teardowns now run down --volumes --remove-orphans --rmi local:

Workflow Project
application-acl-postgres16-proof.yml application-acl-proof-<run>-<attempt>
ci.yml × 4 omn15361-{domain,adapter,acl,legacy}-<run>-<attempt>
docker-build.yml omn15421-<run>-<attempt>
legacy-rds-fixture-proof.yml omn15422-<run>-<attempt>

The plan counted six; legacy-rds-fixture-proof.yml postdates it — literally the "seventh proof workflow" its own item 9 predicted. --rmi local (never --rmi all) is verified correct for all four compose files: it evicts exactly the per-run built images and leaves the shared pulled postgres:16-alpine alone (plan §2.7).

Item 2 — durable ownership label

Every built service in the four proof compose files stamps org.omninode.retention: disposable + org.omninode.run-id + org.omninode.workflow under build.labels — the ownership fact the wave-2 GC classifier will key on (a name shape is not an ownership claim). The pulled postgres in domain-adapter-proof takes no label. The pinned .proof-dependencies checkouts can't receive labels retroactively; their images are still evicted by item 1, and the label gap there is exactly what the plan's prefix bridge (item 3, wave 2) covers.

Item 9 — the gate, in the same wave

tests/ci/test_compose_proof_teardown_policy.py: every up --build step must have a later same-job teardown bound to the same compose file with if: always(), --volumes, and --rmi local; --rmi all never appears; every built service in a referenced live-tree compose file carries the disposable label; runtime-lane compose files (prod/stability-test/judge/infra) never carry it. Escape hatch: # compose-image-retention-ok: <reason> annotation (the no-raw-prod-bypass convention). Wired as a ci.yml step (compose-required-env-coverage job) and a pre-commit hook in this same PR. The plan's four failure fixtures are in the test and each provably bites.

dod_evidence

  • New policy test: 10/10 pass locally (live tree + 4 negative fixtures + annotated-exception fixture).
  • The gate caught a real violation during its own construction (an illustrative --rmi all echo string in the new ci.yml step) — proof it bites on this tree.
  • Governed pre-push selector: 2094 impacted tests passed (253.96s), zero bypass flags; full pre-commit hook chain green.
  • Before baseline recorded on OMN-16367 (2026-09-01T12:48:10Z): /data 55% used, avail_kb 1,744,544,940, 1381 images, 1293 matching disposable patterns, 0 labeled. Read-only 15-min sampler armed on .201 (recorded on the ticket before install).
  • 48h free-space floor (DoD feat: Complete infrastructure containers operational with Docker secrets #4) is the named remainder on OMN-16367 — the formal window opens after the host-affecting waves (2–4) pass their operator-gated item-10 deploys; this PR is deliberately host-inert.

Refs: OMN-16367

Evidence-Ticket: OMN-16367
Evidence-Source: OCC#7968

… the invariant

Seven 'docker compose up --build' steps mint per-run images (project name
embeds run_id/attempt) that nothing ever removed: tagged (never dangling),
uniquely named (never enumerable in a keep list), tagged latest (hard-kept
by the disk GC's first guard). ~2.2 TB of orphans and the fleet-wide ENOSPC
red on .201 trace to exactly this (2026-08-21 audit; plan rev 2 in
omni_home docs/plans/2026-08-21-201-ci-image-retention-permanent-fix-plan.md).

Wave 1 of the plan (items 1+2+9), workflow-only — zero host GC change:

- item 1: all seven teardowns now carry '--rmi local' (the plan counted six;
  legacy-rds-fixture-proof.yml postdates it — the seventh proof workflow its
  own item 9 predicted). Never '--rmi all', which would remove shared pulled
  bases (postgres:16-alpine).
- item 2: every built service in the four proof compose files stamps
  org.omninode.retention=disposable + run-id + workflow build labels; the
  pulled postgres in domain-adapter-proof takes no label.
- item 9: tests/ci/test_compose_proof_teardown_policy.py enforces both
  invariants (plus the --rmi-all ban and lane-compose label ban) as a CI
  step in the compose-required-env-coverage job and a pre-commit hook, same
  PR, with the compose-image-retention-ok annotation escape.

Refs OMN-16367
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

⚠️ Hostile Reviewer — DEGRADED (informational)

Blocking findings (critical): 0
Total findings: 0
Models succeeded: none

Note: All reviewer models failed or were unavailable. Degraded results are informational during the pilot phase (OMN-8468/OMN-8524) and do not block merge. Error: all review endpoints [192.168.86.201:8000 192.168.86.201:8000 ] unreachable — preflight short-circuit (no models available)


Gate semantics (pilot phase)

Verdict Meaning Blocks merge?
passed No critical findings No
blocked CRITICAL findings found Yes
degraded All models unavailable (infra) No (pilot)

Powered by omniintelligence.review_pairing.cli_review — multi-model adversarial review (OMN-8468/OMN-8524)

jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 1, 2026
#7968)

* evidence: OCC companion pass 1 for OmniNode-ai/omnibase_infra#3121

* evidence: OCC companion self-bind for #7968

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
@jonahgabriel
jonahgabriel merged commit 178fdfe into dev Sep 1, 2026
119 of 128 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-16367-retention-wave1-eviction-at-source branch September 1, 2026 13:50
jonahgabriel added a commit that referenced this pull request Sep 2, 2026
…gate

Adds glm-review (z.ai GLM Coding Plan) as a third, independent-hardware
adversarial reviewer alongside the two local qwen3-review keys, and fixes
the finder-never-gate wiring: the shipped hostile-reviewer.yml verdict
parser read merged_findings/total_input_findings, fields
ModelMultiReviewResult never had, so every finding was silently
discarded and "blocked" was dead code.

- scripts/ci/post_hostile_review_threads.py: publishes findings as
  resolvable PR review threads (dedupe by fingerprint, diff-anchored
  where possible, capped with a truncation banner, REQUEST_CHANGES
  posture on critical/major findings).
- scripts/ci/check_hostile_review_threads.py: the new deterministic
  merge surface -- fails while unresolved hostile-reviewer-marker
  threads exist, ignores outdated/foreign threads, fail-closed on any
  GraphQL fetch error.
- hostile-reviewer.yml: wires glm-review into the model roster, adds a
  scheme-aware preflight reachability probe, posts findings via the new
  poster, and adds the "Hostile Review Thread Gate" job (not yet a
  required context -- OMN-17492 canary).
- Incident replays (tests/incident_replays/registry.yaml): verbatim
  captured bytes from the real omnibase_infra PR #3121 review (10
  findings the old parser reported as 0) and the real omnibase_core
  PR #1604 thread state (the OMN-16823 false-red CodeRabbit-prose
  incident), each pinned by sha256 and driving the real guard code.

Companion leg (omniintelligence PR #875, glm-review model registry
entry) is already merged to dev.

OMN-17492

Claude-Session: https://claude.ai/code/session_01TdrxtHYgVT1oNUYis2brcQ
jonahgabriel added a commit that referenced this pull request Sep 2, 2026
…gate (#3135)

Adds glm-review (z.ai GLM Coding Plan) as a third, independent-hardware
adversarial reviewer alongside the two local qwen3-review keys, and fixes
the finder-never-gate wiring: the shipped hostile-reviewer.yml verdict
parser read merged_findings/total_input_findings, fields
ModelMultiReviewResult never had, so every finding was silently
discarded and "blocked" was dead code.

- scripts/ci/post_hostile_review_threads.py: publishes findings as
  resolvable PR review threads (dedupe by fingerprint, diff-anchored
  where possible, capped with a truncation banner, REQUEST_CHANGES
  posture on critical/major findings).
- scripts/ci/check_hostile_review_threads.py: the new deterministic
  merge surface -- fails while unresolved hostile-reviewer-marker
  threads exist, ignores outdated/foreign threads, fail-closed on any
  GraphQL fetch error.
- hostile-reviewer.yml: wires glm-review into the model roster, adds a
  scheme-aware preflight reachability probe, posts findings via the new
  poster, and adds the "Hostile Review Thread Gate" job (not yet a
  required context -- OMN-17492 canary).
- Incident replays (tests/incident_replays/registry.yaml): verbatim
  captured bytes from the real omnibase_infra PR #3121 review (10
  findings the old parser reported as 0) and the real omnibase_core
  PR #1604 thread state (the OMN-16823 false-red CodeRabbit-prose
  incident), each pinned by sha256 and driving the real guard code.

Companion leg (omniintelligence PR #875, glm-review model registry
entry) is already merged to dev.

OMN-17492

Claude-Session: https://claude.ai/code/session_01TdrxtHYgVT1oNUYis2brcQ
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