Files
2026-07-13 12:58:18 +08:00

47 lines
1.7 KiB
YAML

id: image-drift
name: "GHCR image drift vs showcase/ or examples/integrations/ HEAD"
owner: "@oss"
signal:
dimension: image_drift
triggers:
# set_changed catches stale-set transitions (services newly out of date).
# set_errored catches the pure-error case: a service flips stale→errored
# without changing the stale set, so set_changed stays false but the
# template's {{signal.errored.length}} would silently render 0 without
# firing. deriveSignalFlags emits set_errored when signal.errored is
# non-empty; StringTriggerEnum accepts it (rules/schema.ts R5 C4).
- set_changed
- set_errored
conditions:
guards:
- minDeployAgeMin: 20
actions:
- kind: rebuild
target: railway_redeploy
forEach: "{{signal.staleServices}}"
targets:
- kind: slack_webhook
webhook: oss_alerts
# Template only references fields the ImageDriftSignal probe actually
# emits. The `rebuildFailures` branch (present in an earlier revision)
# was dead code — the probe never sets that field, so the {{#...}}
# section never rendered. Removed to prevent another reviewer from
# trusting dead UI.
#
# Split text reflects F6.6: triggeredCount historically summed stale +
# errored, but `forEach` only redeploys stale. Render both counts
# distinctly so the Slack message matches what actions took place.
# Coordination with cluster 4: probe should keep emitting
# `staleCount` and `erroredCount` (or the template needs updating to
# derive them from the arrays). Template below falls back to array
# lengths via mustache `.length` for robustness.
template:
text: |
:package: *Image drift detected* — {{signal.staleServices.length}} {{signal.rebuildNoun}} triggered, {{signal.errored.length}} errored (<{{{event.runUrl}}}|run>)