Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8dff48c
feat(cron): persist conservative transport receipts
Kinkoolino-Hermes Aug 23, 2026
4e5d24d
Merge upstream main into fix/cron-transport-receipts-v2
Aug 24, 2026
be1119c
fix(cron): preserve empty-payload validation detail
Kinkoolino-Hermes Aug 25, 2026
551b448
fix(cron): require delivered media receipts
Kinkoolino-Hermes Aug 25, 2026
eb8875a
Merge commit '02c7ae956e42891d5e337a921b45de0a6067146d' into fix/cron…
Kinkoolino-Hermes Aug 25, 2026
b319446
fix(cron): avoid retry after ambiguous media failure
Kinkoolino-Hermes Aug 25, 2026
21cdc46
Merge upstream main into fix/cron-transport-receipts-v2
Kinkoolino-Hermes Aug 26, 2026
e0f16b8
Merge latest upstream main into fix/cron-transport-receipts-v2
Kinkoolino-Hermes Aug 26, 2026
823c7f6
fix(cron): reject non-boolean session attachment
Kinkoolino-Hermes Aug 26, 2026
5fd308b
Merge latest upstream main into fix/cron-transport-receipts-v2
Kinkoolino-Hermes Aug 26, 2026
83ea5fb
test(cron): reject malformed attachment on create
Kinkoolino-Hermes Aug 26, 2026
c823ec0
chore(ci): retrigger checks after Actions outage
Kinkoolino-Hermes Aug 27, 2026
2d0fa4c
Merge latest upstream main into fix/cron-transport-receipts-v2
Kinkoolino-Hermes Aug 27, 2026
3f42d2b
Merge remote-tracking branch 'upstream/main' into conflict-recovery-9…
Kinkoolino-Hermes Aug 30, 2026
6aea9e9
Merge remote-tracking branch 'upstream/main' into conflict-recovery-9…
Kinkoolino-Hermes Aug 30, 2026
bb5fb20
Merge remote-tracking branch 'upstream/main' into conflict-recovery-9…
Kinkoolino-Hermes Aug 30, 2026
50de785
Merge remote-tracking branch 'upstream/main' into conflict-recovery-9…
Kinkoolino-Hermes Sep 1, 2026
29ff912
Merge remote-tracking branch 'upstream/main' into conflict-recovery-9…
Kinkoolino-Hermes Sep 1, 2026
53ba565
Merge remote-tracking branch 'upstream/main' into conflict-recovery-9…
Kinkoolino-Hermes Sep 1, 2026
a0172de
Merge remote-tracking branch 'upstream/main' into conflict-recovery-9…
Kinkoolino-Hermes Sep 1, 2026
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
7 changes: 6 additions & 1 deletion agent/monitoring/cron_health.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,12 @@
_KNOWN_STATUSES = {"claimed", "running", "completed", "failed", "unknown"}
_KNOWN_SOURCES = {"builtin", "direct", "external"}
_KNOWN_DELIVERY_OUTCOMES = {
"delivered", "failed", "suppressed", "suppressed_acked", "not_configured",
"delivered",
"failed",
"unknown",
"suppressed",
"suppressed_acked",
"not_configured",
}


Expand Down
602 changes: 583 additions & 19 deletions cron/executions.py

Large diffs are not rendered by default.

11 changes: 10 additions & 1 deletion cron/jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -3523,6 +3523,7 @@ def _claim_job_for_fire_locked(
return False
now = _hermes_now()
existing = job.get("fire_claim")
fire_at = now.isoformat()
if existing:
try:
claimed_at = _ensure_aware(datetime.fromisoformat(existing["at"]))
Expand All @@ -3537,6 +3538,10 @@ def _claim_job_for_fire_locked(
return False # someone holds a fresh claim
except Exception:
pass # malformed claim → overwrite
if not force:
existing_fire_at = existing.get("fire_at")
if isinstance(existing_fire_at, str) and existing_fire_at:
fire_at = existing_fire_at
if force:
job["enabled"] = True
job["state"] = "scheduled"
Expand All @@ -3546,7 +3551,11 @@ def _claim_job_for_fire_locked(
# stale lease, and the previous runner must not heartbeat the new
# claim merely because hostname + PID are unchanged.
owner = f"{_machine_id()}:{uuid.uuid4().hex}"
job["fire_claim"] = {"at": now.isoformat(), "by": owner}
job["fire_claim"] = {
"at": now.isoformat(),
"fire_at": fire_at,
"by": owner,
}
kind = job.get("schedule", {}).get("kind")
if kind in {"cron", "interval"}:
nxt = compute_next_run(job["schedule"], now.isoformat())
Expand Down
Loading
Loading