Skip to content

fix(OMN-18942): an unchanged finding inside the dedup window does not re-alert - #4000

Merged
jonahgabriel merged 3 commits into
devfrom
jonah/omn-18942-alert-dedup-window
Sep 23, 2026
Merged

jonahgabriel merged 3 commits into
devfrom
jonah/omn-18942-alert-dedup-window

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Sep 23, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

OMN-18942, the dedup-window acceptance criterion (AC-3).

Measured 2026-09-23. SLACK_BOT_TOKEN / SLACK_CHANNEL_ID were set on this repository at 10:43Z. After that, every scheduled run of pr-ci-zombie-detector.yml re-posted the same unchanged findings to the channel (runs 35850665037 10:46Z, 35851297482 10:53Z, 35852673260 11:07Z). At origin/dev c159b71 the evaluator called post_slack_alert(combined_alerts) whenever there was a finding. It kept no prior-alert state, had no window, and recorded no suppression.

Behaviour

  • Key: (repo, check) for the pull-request half ((repo, workflow) for the scheduled half, which this job does not run).
  • Suppressed: the failure count is unchanged or lower than the count last posted, and the post is inside alert_dedup_window_hours. Each suppression is logged (SUPPRESSED <key> failures=... window until ...), listed under dedup.suppressed in the report artifact, and shown as a row in a "Alert dedup (OMN-18942)" job-summary table. It also raises no ::warning annotation.
  • Posted: a new key, a higher count (worsened a->b), or an expired window. The message names how many unchanged findings it suppressed.
  • Resolved: recorded and not posted. The key is dropped, so a recurrence reads as new. If a repository is unreadable this run, its keys are carried rather than resolved, so a transient 403 does not cause a re-post later.
  • Window: 24h, declared as the required policy key route.nonrequired_check_alert.alert_dedup_window_hours (rule 8, no default). The justification is in the policy comment: an unchanged non-required-check failure is a triage item, not a page. Once a day keeps it visible, and any worsening re-posts at once. 6h (the .201 reporter's cadence) would put four copies a day in the channel for a class that blocks nothing.

State store and failure direction

  • Store: the previous run's own nonrequired-check-report artifact. Each report now carries alert_state. The next run lists this workflow's runs on its own ref (GITHUB_REF_NAME) through the Actions API, skips itself, takes the newest run with an unexpired report artifact, downloads the zip, and reads alert_state. The read uses GH_TOKEN, the App token the job already mints with permission-actions: read on this repository. There is no new credential and no workflow permissions: change. The same file that suppresses also records the suppression, so no second store can drift from the evidence.
  • Fails OPEN to the channel. Absent prior state (no artifact, or one that predates this change) and unreadable prior state (fetch refused, corrupt zip or JSON, wrong schema, malformed entry, a post timestamp in the future) suppress nothing. Every finding posts. An unreadable state adds a marker to the message and a ::warning annotation, and the summary says why. A duplicate post is noise; a wrongly suppressed one is the silent-gate defect.
  • A post counts only when acknowledged. Slack answers a refused post with HTTP 200 and ok:false. The post now counts only on ok:true. Otherwise the state is not advanced and the finding is retried on the next run instead of being suppressed for a window.
  • Serialised. The alerter job has a concurrency group without cancel-in-progress. Overlapping runs would otherwise each read the run before the other and re-post. The lookup accepts an in-progress run whose report is already uploaded.
  • Missing-destination refusal: unchanged. resolve_destination is checked whenever there is a finding, including when every finding is suppressed, so findings with no destination still exit 1.

Out of scope

  • The 3-vs-9 repository list (AC-2) is a separate B1 item. It is not touched here; the run step still names three repositories.
  • AC-4 and AC-5, and the ticket state, are unchanged by this PR.

Classification: not runtime-affecting

This is CI tooling: one workflow, one scripts/ci evaluator, and a policy key read only by that evaluator and the .201 probe (which reads failure_threshold only). I asked the rebuild trigger itself (trigger_rebuild_on_merge.py --dry-run over this diff's files): No rebuild trigger: no runtime_change label or runtime path changes detected. The positive control on src/omnibase_infra/runtime/service_kernel.py returns Runtime change detected. So rule 24's lab pass does not apply. The proof is the focused tests plus a live read-only run against the real Actions API, below, and the post-merge scheduled runs.

Lab readback

  • host: operator Mac. Surface: the live GitHub Actions API for OmniNode-ai/omnibase_infra, read-only, --dry-run (no post).
  • command: GITHUB_REF_NAME=dev GITHUB_REPOSITORY=OmniNode-ai/omnibase_infra GITHUB_RUN_ID=0 uv run python scripts/ci/nonrequired_check_failure_rate.py --owner OmniNode-ai --repo omnibase_infra --no-scheduled --policy config/runner_routing_policy.yaml --report <scratch>/report.json --prior-state-workflow pr-ci-zombie-detector.yml --dry-run
  • observation: exit 0. The fetch found the latest real report (run 35857023828), downloaded and parsed its zip, and classified it absent: prior report predates alert state (no alert_state key). Three live findings were marked due with reason prior_state_absent. The summary rendered Delivered: dry run, nothing sent and no state advanced and a DUE table with | escaped.
  • restored=yes: read-only; nothing mutated.
  • Expected first live runs after merge: the first scheduled run reads a pre-change artifact, so it reports absent and posts once. That post is the first carrying alert_state. Every later run inside 24h with unchanged counts should log SUPPRESSED and post nothing.

Tests

tests/ci/test_nonrequired_check_alert_dedup_omn18942.py: 26 tests, written RED first against origin/dev c159b71 (20 of 20 failed at the time of writing). They drive the real main() with _gh_json, _gh_bytes and urlopen replaced at the module boundary:

  • unchanged count inside the window: suppressed and recorded (report, summary, log line, no annotation). Positive control: the same finding with empty prior state posts.
  • a lower count is suppressed; a worsened count re-posts with worsened 3->4.
  • a new finding posts while an unchanged one is suppressed; a resolved finding is not posted and is dropped.
  • window expiry posts; the boundary control, 60s inside the window, is suppressed.
  • unreadable prior state (corrupt JSON, corrupt zip, wrong schema, runs listing refused) posts with the marker; absent state and a pre-change report post as absent.
  • ok:false from Slack does not advance the state; a missing destination still exits 1 when everything is suppressed.
  • an unreadable repository carries its keys, with a control that a readable one resolves them; a future post timestamp does not suppress.
  • a dry run posts nothing and advances no state; summary cells escape |.
  • the policy declares the window and fails loudly without it; the workflow passes --prior-state-workflow, scopes to the ref, is serialised, and rides the App token with actions: read.

Focused run, all evaluator suites: uv run pytest tests/ci/test_nonrequired_check_alert_dedup_omn18942.py tests/ci/test_nonrequired_check_failure_rate_omn18254.py tests/ci/test_scheduled_run_failure_rate_omn18322.py tests/unit/scripts/test_fleet_failure_sink_omn18942.py tests/ci/test_alert_token_source_omn18254.py tests/ci/test_incident_replay_omn18254.py tests/ci/test_ci_evidence_policy.py: 152 passed. mypy --strict is clean on the script, and pre-commit run --all-files is clean.

Evidence-Ticket: OMN-18942
Evidence-Source: OCC#10920

… re-alert

Once the channel secrets were set (2026-09-23 10:43Z), every scheduled run of
pr-ci-zombie-detector.yml re-posted the same unchanged findings (runs
35850665037, 35851297482, 35852673260): the evaluator posted whenever it had a
finding and remembered nothing.

- Each finding is keyed (repo, check). Unchanged-or-lower count inside the
  policy's alert_dedup_window_hours (24) since the last post is suppressed;
  new, worsened and window-expired findings post. Resolved keys are recorded,
  not posted, and dropped from state.
- Prior state is the `alert_state` block of the previous completed run's
  nonrequired-check-report artifact, read through the Actions API with the
  already-minted App token (actions: read on this repo). No new credential.
- Absent or unreadable prior state suppresses nothing: every finding posts
  with a marker, and the summary says why.
- Every suppression is logged and tabled in the report and job summary.
- A post is recorded only when Slack answers ok:true, so a refused post is
  retried next run rather than suppressed for a window.
- The missing-destination refusal is unchanged and still fires when every
  finding is suppressed.

Onex-Lane: omn18942-failure-sink-2315
Onex-Session: 3ff189d3b9964e82810ccf11dfe66592
…lise the job

Self-review findings: an unfiltered lookup let a feature-branch dispatch read
or seed the default branch alert state, and overlapping runs could each read
the run before the other and re-post. The lookup now filters to GITHUB_REF_NAME
and accepts an in-progress run with an uploaded report; the alerter job carries
a concurrency group without cancel-in-progress.

Onex-Lane: omn18942-failure-sink-2315
Onex-Session: 3ff189d3b9964e82810ccf11dfe66592
@onexbot-occ-writer

Copy link
Copy Markdown
Contributor

No OCC evidence companion was minted for this PR.

product PR is a draft; companion suppressed (F-17)

Matched in the state: draft

To clear this: Mark the PR ready for review. The ready_for_review trigger re-fires the born path and the companion mints then.

Reported by node_occ_companion_effect (decline code pr_draft, OMN-16665). This decision was made against the PR's LIVE state at compute time, not at publish time — a green publisher job only means the command reached the broker.

@jonahgabriel
jonahgabriel marked this pull request as ready for review September 23, 2026 12:06
@jonahgabriel
jonahgabriel enabled auto-merge (squash) September 23, 2026 12:06
jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 23, 2026
…ibase_infra#4000 (#10920)

* evidence(OMN-18942): author OCC companion for OmniNode-ai/omnibase_infra#4000

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 903934905a120bca41640228d1bc21ae17c3e737.

* evidence(OMN-18942): self-bind OCC#10920 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
@github-actions

github-actions Bot commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Hostile Reviewer — DEGRADED (informational)

Critical findings: 0
Major findings: 3
Total findings: 6
Models succeeded: glm-review

Note: Fewer than 2 reviewer models succeeded. Degraded results are informational (OMN-8468/OMN-8524) and do not block merge. Error: cli_review exit 2 (fewer than 2 models succeeded — partial/total outage)


Semantics (OMN-17492 — the model finds, thread resolution gates)

Surface Meaning Blocks merge?
Review threads Per-finding, posted by the reviewer No (informational)
Hostile Review Thread Gate Deterministic: unresolved hostile-reviewer threads exist Fails until resolved (not yet a required context)
degraded verdict Fewer than 2 models succeeded (infra) No

Powered by omniintelligence.review_pairing.cli_review — multi-model adversarial review: qwen3-review, qwen3-review-b, glm-review (OMN-8468/OMN-8524/OMN-17492)

…era rows

The head 9039349 carries cancelled draft-era check-runs that CI Summary
judges before its own replacement jobs exist, twice (attempts 1 and 2 of
run 35858399575). No content change.

Onex-Lane: omn18942-failure-sink-2315
Onex-Session: 3ff189d3b9964e82810ccf11dfe66592

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hostile Reviewer — adversarial findings (OMN-17492)

Models succeeded: glm-review
Models failed: codex
New finding threads: 0
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 6
Nit-level findings suppressed: 0

The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.

Below quorum: 6 finding(s) raised by one model only (OMN-18479)

These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.

  • [MAJOR] scripts/ci/nonrequired_check_failure_rate.py: fetch_prior_alert_state / main (glm-review) — Branch filter keyed on GITHUB_REF_NAME diverges from concurrency ref scoping | The concurrency group serialises on github.ref, but the prior-state fetch filters run history by GITHUB_REF_NAME. For pul
  • [MAJOR] scripts/ci/nonrequired_check_failure_rate.py: next_alert_state (glm-review) — Resolved keys are dropped from state even when delivery failed | next_alert_state guards the due findings' entries on delivered, so a failed Slack post leaves them retried next run. Resolved keys, h
  • [MAJOR] tests/ci/test_nonrequired_check_alert_dedup_omn18942.py (glm-review) — ScheduledAlert dedup path untested end to end | Every end-to-end harness run passes --no-scheduled, so the ScheduledAlert half (the 'scheduled|' key namespace, render_scheduled suppression, and the in
  • [MINOR] scripts/ci/nonrequired_check_failure_rate.py: REPORT_ARTIFACT; .github/workflows/pr-ci-zombie-detector.yml (glm-review) — Artifact-as-state couples dedup correctness to report upload success | The design stores dedup state inside the report artifact uploaded by a separate workflow step. The script writes the report file,
  • [MINOR] scripts/ci/nonrequired_check_failure_rate.py: fetch_prior_alert_state (glm-review) — Artifact zip downloaded without size bound | The artifact listing response includes size_in_bytes, which is not consulted before _gh_bytes pulls the entire zip into memory and json.loads the member. A
  • [MINOR] scripts/ci/nonrequired_check_failure_rate.py: post_slack_alert (glm-review) — Lost Slack acknowledgement yields duplicate post, state then suppresses | post_slack_alert returns False on a urlopen exception. If the post actually reached Slack but the response read timed out (tim

@jonahgabriel
jonahgabriel merged commit 0edf5c9 into dev Sep 23, 2026
137 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-18942-alert-dedup-window branch September 23, 2026 13:00
jonahgabriel added a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 23, 2026
…af18d9f4763cd27f__v1__run35849729150-1.yaml) (#10909)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2765/8476e372f64bd68c670c9410af18d9f4763cd27f__v1__run35849729150-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35849729150-1

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2767/9822bc67ed0d873afcd2d17b4002d1e7fd0514c8__v1__run35850160051-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35850160051-1

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2801/370944b2e3e3035d7fb51819f6f6754694a58bac__v1__run35850129385-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35850129385-1

* evidence(OMN-18595): OCC Evidence-Source autobind for OmniNode-ai/omniclaude#2314 (#10906)

* evidence(OMN-18595): author OCC companion for OmniNode-ai/omniclaude#2314

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 52e00abbdcecc21f899ee3d926e408f37ec885c5.

* evidence(OMN-18595): self-bind OCC#10906 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2781/94aadb47dbe4da21eae3016c722f53b0b9bc61ef__v1__run35850221602-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35850221602-1

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2802/4a278c06a98161ab5b170daf9d4c811ba9c53151__v1__run35850642935-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35850642935-1

* evidence(OMN-17374): record PR 2259 behavior proof (#10904)

* evidence(OMN-17374): record PR 2259 behavior proof

Record the existing dev migration and staging readbacks as manual AC4 evidence. Keep the receipt scoped to the recorded controls and checksum; do not claim M3 C19 is clear.

* docs(OMN-17374): include reviewed PR body

Carry the selfchecked evidence summary in the writer-App branch so the PR opens with the reviewed body.

* evidence(OMN-18921): mint the owed OCC self-bind for PR #10904

* docs(OMN-17374): correct PR body paths

Keep ticket links in prose while preserving literal repository paths for review.

* docs(OMN-17374): correct verification paths in PR body

Keep the ticket URL linked in prose while retaining literal contract paths in commands.

* chore(OMN-17374): remove transient PR body file

The writer App has already copied the reviewed text into the PR description; keep transport-only Markdown out of the repository tree.

---------

Co-authored-by: Lakshman Patel <Lakshmanp230@gmail.com>
Co-authored-by: onexbot-occ-writer[bot] <onexbot-occ-writer[bot]@users.noreply.github.com>

* evidence(OMN-18955): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2801 (#10910)

* evidence(OMN-18955): author OCC companion for OmniNode-ai/omnimarket#2801

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 370944b2e3e3035d7fb51819f6f6754694a58bac.

* evidence(OMN-18955): self-bind OCC#10910 + rebind contract_sha256

* evidence(OMN-16859): executed test_passes receipts for OmniNode-ai/omnimarket#2801

The declared checks were executed for real in the OmniNode-ai/omnimarket checkout at the PR head by the product-repo OCC receipt runner, and the results written append-only into this companion. Producer-minted PENDING receipts are superseded by a net-new record; no existing receipt was edited.

Ticket: OMN-16859 (AC3b)
Onex-Workflow: OCC Receipt Runner
Onex-Run: https://github.com/OmniNode-ai/omnimarket/actions/runs/35850100160

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: onexbot-occ-writer[bot] <307849072+onexbot-occ-writer[bot]@users.noreply.github.com>

* evidence(OMN-18595): OCC Evidence-Source autobind for OmniNode-ai/omnibase_infra#3970 (#10821)

* evidence(OMN-18595): author OCC companion for OmniNode-ai/omnibase_infra#3970

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 6e6f4600cfd1dac5d59b607b1ff1c54b18a0e663.

* evidence(OMN-18595): self-bind OCC#10821 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-13902): OCC Evidence-Source autobind for OmniNode-ai/omniclaude#2313 (#10900)

* evidence(OMN-13902): author OCC companion for OmniNode-ai/omniclaude#2313

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head db9673c22c6ed87494834f61f195306b7934248e.

* evidence(OMN-13902): self-bind OCC#10900 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: jonahgabriel <jonah@omninode.ai>

* evidence(OMN-19017): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2765 (#10911)

* evidence(OMN-19017): author OCC companion for OmniNode-ai/omnimarket#2765

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 8476e372f64bd68c670c9410af18d9f4763cd27f.

* evidence(OMN-19017): self-bind OCC#10911 + rebind contract_sha256

* evidence(OMN-16859): executed test_passes receipts for OmniNode-ai/omnimarket#2765

The declared checks were executed for real in the OmniNode-ai/omnimarket checkout at the PR head by the product-repo OCC receipt runner, and the results written append-only into this companion. Producer-minted PENDING receipts are superseded by a net-new record; no existing receipt was edited.

Ticket: OMN-16859 (AC3b)
Onex-Workflow: OCC Receipt Runner
Onex-Run: https://github.com/OmniNode-ai/omnimarket/actions/runs/35850455072

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: onexbot-occ-writer[bot] <307849072+onexbot-occ-writer[bot]@users.noreply.github.com>

* evidence(OMN-17292): OCC companion for OmniNode-ai/omnibase_infra#3994 (#10901)

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

* evidence: OCC companion self-bind for #10901

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>

* evidence(OMN-18595): OCC Evidence-Source autobind for OmniNode-ai/omniintelligence#937 (#10913)

* evidence(OMN-18595): author OCC companion for OmniNode-ai/omniintelligence#937

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 5652b4cc4d3a7cebfce8d77aad44a46128fd2c48.

* evidence(OMN-18595): self-bind OCC#10913 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-19235): OCC companion for OmniNode-ai/omniclaude#2315 (#10914)

* evidence: OCC companion pass 1 for OmniNode-ai/omniclaude#2315

* evidence: OCC companion self-bind for #10914

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>

* evidence(OMN-19091): OCC Evidence-Source autobind for OmniNode-ai/omnibase_infra#3946 (#10915)

* evidence(OMN-19091): author OCC companion for OmniNode-ai/omnibase_infra#3946

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head d0fb927b221a36a85533f8bee9453ecb066548fb.

* evidence(OMN-19091): self-bind OCC#10915 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2803/339fbd49abdf4083dc3c0a7c7f964c907e40f4f9__v1__run35855337780-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35855337780-1

* evidence(OMN-18202): OCC companion for OmniNode-ai/omnibase_infra#3998 (#10917)

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

* evidence: OCC companion self-bind for #10917

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>

* build(deps): bump the actions group with 8 updates (#10893)

* build(deps): bump the actions group with 8 updates

Bumps the actions group with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [OmniNode-ai/omniclaude/.github/workflows/advisory-job-gate-reusable.yml](https://github.com/omninode-ai/omniclaude) | `d062b74b1e60a3c86ec355d8736fa5d76c903c24` | `a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1` |
| [actions/checkout](https://github.com/actions/checkout) | `4` | `7` |
| [actions/setup-python](https://github.com/actions/setup-python) | `5` | `7` |
| [OmniNode-ai/omniclaude/.github/workflows/route-runner-reusable.yml](https://github.com/omninode-ai/omniclaude) | `b6ba84ef6c9ba3f220204c3d672de1da5131132c` | `a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1` |
| [OmniNode-ai/omnimarket/.github/workflows/merge-hold-gate-reusable.yml](https://github.com/omninode-ai/omnimarket) | `0.4.101` | `0.4.160` |
| [OmniNode-ai/omnibase_core/.github/workflows/validate-docs.yml](https://github.com/omninode-ai/omnibase_core) | `3dc4716019b07b060bb8864fb1ab18ef615ef6a5` | `ad4374f48647fa432ced4cf198f979a097e8ac7c` |
| [OmniNode-ai/omniclaude/.github/workflows/kb-doc-gate-reusable.yml](https://github.com/omninode-ai/omniclaude) | `1aaaa9fbd45f10b1e43101174d4adcdbade90761` | `a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1` |
| [OmniNode-ai/omniclaude/.github/workflows/public-repo-hygiene-reusable.yml](https://github.com/omninode-ai/omniclaude) | `0e89d098a94680c5d4dd0d43e69b1960dcd86cff` | `a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1` |


Updates `OmniNode-ai/omniclaude/.github/workflows/advisory-job-gate-reusable.yml` from d062b74b1e60a3c86ec355d8736fa5d76c903c24 to a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1
- [Release notes](https://github.com/omninode-ai/omniclaude/releases)
- [Changelog](https://github.com/OmniNode-ai/omniclaude/blob/dev/CHANGELOG.md)
- [Commits](OmniNode-ai/omniclaude@d062b74...a58fb5e)

Updates `actions/checkout` from 4 to 7
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](actions/checkout@v4...v7)

Updates `actions/setup-python` from 5 to 7
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v7)

Updates `OmniNode-ai/omniclaude/.github/workflows/route-runner-reusable.yml` from b6ba84ef6c9ba3f220204c3d672de1da5131132c to a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1
- [Release notes](https://github.com/omninode-ai/omniclaude/releases)
- [Changelog](https://github.com/OmniNode-ai/omniclaude/blob/dev/CHANGELOG.md)
- [Commits](OmniNode-ai/omniclaude@b6ba84e...a58fb5e)

Updates `OmniNode-ai/omnimarket/.github/workflows/merge-hold-gate-reusable.yml` from 0.4.101 to 0.4.160
- [Release notes](https://github.com/omninode-ai/omnimarket/releases)
- [Commits](OmniNode-ai/omnimarket@71785e6...bf88396)

Updates `OmniNode-ai/omnibase_core/.github/workflows/validate-docs.yml` from 3dc4716019b07b060bb8864fb1ab18ef615ef6a5 to ad4374f48647fa432ced4cf198f979a097e8ac7c
- [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@3dc4716...ad4374f)

Updates `OmniNode-ai/omniclaude/.github/workflows/kb-doc-gate-reusable.yml` from 1aaaa9fbd45f10b1e43101174d4adcdbade90761 to a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1
- [Release notes](https://github.com/omninode-ai/omniclaude/releases)
- [Changelog](https://github.com/OmniNode-ai/omniclaude/blob/dev/CHANGELOG.md)
- [Commits](OmniNode-ai/omniclaude@1aaaa9f...a58fb5e)

Updates `OmniNode-ai/omniclaude/.github/workflows/public-repo-hygiene-reusable.yml` from 0e89d098a94680c5d4dd0d43e69b1960dcd86cff to a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1
- [Release notes](https://github.com/omninode-ai/omniclaude/releases)
- [Changelog](https://github.com/OmniNode-ai/omniclaude/blob/dev/CHANGELOG.md)
- [Commits](OmniNode-ai/omniclaude@0e89d09...a58fb5e)

---
updated-dependencies:
- dependency-name: OmniNode-ai/omniclaude/.github/workflows/advisory-job-gate-reusable.yml
  dependency-version: a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1
  dependency-type: direct:production
  dependency-group: actions
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/setup-python
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: OmniNode-ai/omniclaude/.github/workflows/route-runner-reusable.yml
  dependency-version: a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1
  dependency-type: direct:production
  dependency-group: actions
- dependency-name: OmniNode-ai/omnimarket/.github/workflows/merge-hold-gate-reusable.yml
  dependency-version: 0.4.160
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: OmniNode-ai/omnibase_core/.github/workflows/validate-docs.yml
  dependency-version: ad4374f48647fa432ced4cf198f979a097e8ac7c
  dependency-type: direct:production
  dependency-group: actions
- dependency-name: OmniNode-ai/omniclaude/.github/workflows/kb-doc-gate-reusable.yml
  dependency-version: a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1
  dependency-type: direct:production
  dependency-group: actions
- dependency-name: OmniNode-ai/omniclaude/.github/workflows/public-repo-hygiene-reusable.yml
  dependency-version: a58fb5eab5ae66a8e7fcb7f6bcac8c3e48632ee1
  dependency-type: direct:production
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix(OMN-17427): repin vocabulary_ref to match merge-hold-gate uses: ref

The actions-group dependabot bump moved merge-hold-gate-reusable.yml's
uses: pin to bf88396b (omnimarket dev, OMN-18205 lineage) but left
vocabulary_ref at the prior pin (71785e6e), tripping
check-merge-hold-gate-wiring (OMN-15484): uses: and vocabulary_ref
must name the same ref. Repin vocabulary_ref to bf88396b, a verified
ancestor of omnimarket dev.

---------

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>

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2765/98c8bc8bbfd518b69fb895178a735fc8163a0b65__v1__run35857078444-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35857078444-1

* evidence(OMN-18874): OCC companion for OmniNode-ai/omniclaude#2316 (#10919)

* evidence: OCC companion pass 1 for OmniNode-ai/omniclaude#2316

* evidence: OCC companion self-bind for #10919

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>

* evidence(OMN-18942): OCC Evidence-Source autobind for OmniNode-ai/omnibase_infra#4000 (#10920)

* evidence(OMN-18942): author OCC companion for OmniNode-ai/omnibase_infra#4000

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 903934905a120bca41640228d1bc21ae17c3e737.

* evidence(OMN-18942): self-bind OCC#10920 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-19229): OCC companion for OmniNode-ai/omniclaude#2317 (#10921)

* evidence: OCC companion pass 1 for OmniNode-ai/omniclaude#2317

* evidence: OCC companion self-bind for #10921

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2804/c1b2ca1f9d7b107831a077e8c855bc99a121f752__v1__run35859722005-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35859722005-1

* evidence(OMN-15359): retire the four broken supersessions append-only (#10916)

* evidence(OMN-15359): retire the four broken supersessions append-only

dod_verify on OMN-15359 has failed 4 checks since the 2026-09-05 closeout
(Linear comment 585f8390), and none of them are product reds. Three items
name supersession targets that were never added to the contract
(DANGLING_SUPERSESSION), and dod-occ-evidence-validator-pr-2674 is
non-probative, so the supersession it declares never took effect and the
original PR #2674 binding, whose open head no longer exists, runs and fails.

Editing those items is not an option under the append-only gate. The
verifier already provides the repair (OMN-15708): a LATER item that
verifies in its own right retires the earlier one, whatever that item's own
marker says. So this appends four items, each binding the real final state:
PR #2674 merged at head 087567ca / merge 82c6381a (twice, one per stale
binding), the source-level proof re-read at the merge commit, and OCC PR
#6253 merged at head 0495f7f / merge 8c4bf7f. Each check was run, and
fails when one pinned fact is changed. Receipts carry the real probe
output.

dod_verify: 4 failed -> 0 failed; the retired items stay in the contract
for audit. No claim is made about OMN-15359's acceptance criteria.

* evidence(OMN-18921): mint the owed OCC self-bind for PR #10916

---------

Co-authored-by: Lakshman Patel <Lakshmanp230@gmail.com>
Co-authored-by: onexbot-occ-writer[bot] <onexbot-occ-writer[bot]@users.noreply.github.com>

* evidence(OMN-14888): OCC observation append (8c3b5c30e8a79135ef24451323f9d2f6cb6140e0__v1__run35857095811-1.yaml) (#10918)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2803/8c3b5c30e8a79135ef24451323f9d2f6cb6140e0__v1__run35857095811-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35857095811-1

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2805/c8b19453c42e7e4273c249d75ed82b1afd0a4032__v1__run35864001256-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run35864001256-1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: onexbot-occ-writer[bot] <307849072+onexbot-occ-writer[bot]@users.noreply.github.com>
Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: Lakshman Patel <Lakshmanp230@gmail.com>
Co-authored-by: onexbot-occ-writer[bot] <onexbot-occ-writer[bot]@users.noreply.github.com>
Co-authored-by: jonahgabriel <jonah@omninode.ai>
Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
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