Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 35 additions & 2 deletions .github/workflows/evidence-autoclose-sweep.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,40 @@ on:
lookback_hours:
description: 'Scan companions merged within this many hours of now.'
required: false
default: '2'
# 6h, raised from 2h (OMN-16792, landed with OMN-16808).
#
# `schedule` is best-effort: GitHub drops ticks under load rather than
# queueing them. Measured over 2026-08-22T20:03Z -> 2026-08-27T19:05Z,
# 194 scheduled runs fired against 238 expected at `*/30` (81%), and
# the discriminating measurement is createdAt->startedAt = 0s median
# AND 0s max across all 194: nothing was slow, the missing runs were
# never created. Observed inter-run gaps: median 30 min, p90 43 min,
# p100 236 min (3h56m).
#
# A 2h lookback is smaller than that p100 gap, so a companion merged
# inside the uncovered window was scanned by NO run, ever — the sweep
# only looks backwards a fixed window and never revisits. 6h clears the
# observed p100 by ~1.5x, so a dropped tick is absorbed rather than
# lost.
#
# The reason this is a safe one-line change NOW and was not before:
# widening the window widens the OVERLAP between consecutive runs, and
# before OMN-16808 every overlapping run re-posted an identical gap
# comment on every gapped ticket it re-saw. The read-before-write dedup
# in the handler makes re-scanning a companion cost nothing observable,
# so the lookback can be sized for the worst measured gap instead of
# for comment noise. That is OMN-16792 option 1, chosen because it
# removes the data-loss risk without deciding anything architectural;
# options 2 (event trigger) and 3 (runtime scheduler) stay open on that
# ticket.
#
# Residual, recorded not fixed here: `max_companions` is capped at 50
# per run. A 10h window hit that cap on 2026-08-28 (run 33128661860,
# companions_scanned=50), so a window wide enough to truncate would
# reintroduce the same loss by a different door. At the observed OCC
# merge rate (~50 per 10h) a 6h window lands around 30 companions,
# under the cap. Sizing the cap belongs to OMN-16792.
default: '6'
diagnose_tickets:
description: >-
OMN-16788 diagnostic. Comma-separated ticket ids (e.g.
Expand Down Expand Up @@ -481,7 +514,7 @@ jobs:
exit 1
fi
uv run onex skill evidence_autoclose_sweep \
--lookback-hours "${{ github.event.inputs.lookback_hours || '2' }}"
--lookback-hours "${{ github.event.inputs.lookback_hours || '6' }}"

- name: Post summary
if: always()
Expand Down
4 changes: 2 additions & 2 deletions docker/runners/runner-image.lock.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"base_image_digest": "sha256:3ba65aa20f86a0fad9df2b2c259c613df006b2e6d0bfcc8a146afb8c525a9751",
"gh_version": "2.67.0",
"identity_digest": "47224bdefe93869e4dd05501c506eb18",
"identity_digest": "7fae4af5f1fb6695a6e032a366e12613",
"image_version": 7,
"kubectl_version": "1.32.1",
"python_version": "3.12",
"runner_version": "2.336.0",
"shared_env_digest": "ac02631ce31562210f83ee2f",
"shared_env_digest": "a7a173a77e4d15465404b3b3",
"shared_env_install_args": "--frozen --all-extras --all-groups --no-install-project",
"uv_version": "0.6.14"
}
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "omnibase_infra"
version = "0.38.12"
version = "0.38.13"
description = "ONEX Infrastructure - Service integration and database infrastructure tools"
authors = [{ name = "OmniNode.ai", email = "contact@omninode.ai" }]
license = {text = "MIT"}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,18 @@ error_handling:
description: >
The verdict carried no `result.terminal_payload.behavior_proving_count` — the verifier predates OMN-15911 and cannot say whether any green check proved behavior. Fails closed as ERROR_VERIFY_UNPARSEABLE rather than inferring a value: reading the absence as "zero behavior proof" would post a Linear comment stating a finding the run never made, and reading it as satisfied would flip on exactly the arithmetic the guard exists to stop.

recoverable: true
retry_strategy: "none"
- name: "DUPLICATE_SWEEP_COMMENT"
description: >
The sweep reached a gap verdict it has ALREADY posted on this ticket and did not repeat it (OMN-16808). Enumeration is a bare `now - lookback_hours` window with no cursor, so one merged companion sits inside several consecutive scheduled windows; before this guard every one of them posted an identical comment. Every sweep comment now carries a stable marker keyed on (gap class, verdict fingerprint) — NOT on the companion PR, because the same verdict re-derived from a later companion is the same statement — and the ticket's existing comments are read before any write. Recorded as SKIPPED_DUPLICATE_COMMENT and counted under tickets_skipped: the gap is real and still open, but this run added no information, and counting it under tickets_gap_posted would report comments that were never written. A CHANGED verdict has a different fingerprint and IS posted.

recoverable: false
retry_strategy: "none"
- name: "COMMENT_HISTORY_UNREADABLE"
description: >
The ticket's existing comments could not be read (Linear API failure, an uninterpretable payload, or a history longer than the paginated read cap), so the sweep cannot establish whether it has already made this statement. Fails closed as ERROR_LINEAR_API and writes nothing (OMN-16808): "I could not check" must never resolve to "so I will post". The flip is withheld on this path regardless — it is only ever reached from a gap classification.

recoverable: true
retry_strategy: "none"
- name: "GITHUB_FILES_PAYLOAD_UNREADABLE"
Expand Down
Loading
Loading