[interactive] Consumers inline the Telegram alert instead of using the action library, and the reason has expired #975

Open
opened 2026-08-08 17:23:54 +00:00 by coilyco-ops · 1 comment
Member

The action library already exists, and consumers do not use it

agentic-os/actions/ ships 8 composite actions (_lib, bump-formula, create-release, dev-base-build, publish-dev-base, tag-bump, telegram-alert, upload-release-asset). telegram-alert is complete: action.yml, telegram_alert.py, a --dry-run path the unit tests use, and defaults.json as a machine-readable rollout contract.

docs/telegram-ci-alerts.md declares the canonical consumer form:

uses: https://forgejo.coilysiren.me/coilyco-flight-deck/agentic-os/actions/telegram-alert@main

That form has never been used anywhere in the fleet. A grep for uses: https://forgejo.coilysiren.me across every workflow in every on-disk repo returns nothing. The only consumers of the action are 4 call sites inside this repo using the local ./actions/telegram-alert path, which no other repo can reach.

Instead, 41 workflow files carry 47 copies of a ~1.9KB single-line python3 -c payload with escaped newlines. It is effectively unreadable and unreviewable, and a fix means re-running a fleet rollout.

Why it ended up this way, and why the reason has expired

coilyco-flight-deck/infrastructure#522 (2026-07-10) moved consumers off the action after a fleet-wide CI outage. Every consumer failed before checkout with failed to read action ... no files found.

The root cause was not the shared action. It was the bare owner/repo ref form:

uses: coilysiren/agentic-os/actions/telegram-alert@main

The Forgejo runner resolved that against github.com, where the mirror was stale at 4dbb587 and its actions/ tree contained only bump-formula, create-release, tag-bump, and upload-release-asset. Inlining was the correct emergency fix for a red fleet.

That root cause is now gone twice over:

  1. The GitHub mirror has caught up. coilysiren/agentic-os/actions/ now contains telegram-alert, verified against the GitHub API today.
  2. The fully-qualified https://forgejo.coilysiren.me/... form this repo already documents bypasses mirror resolution entirely, which is exactly what the doc says it is for.

The contract is orphaned and the docs contradict

This repo says a rollout tool should consume defaults.json "instead of restating those deployment defaults." infrastructure/scripts/telegram-ci-alert-rollout.py reads neither defaults.json nor the action URL, and restates the payload, the secret names, and the ref policy inline.

The two docs now state opposite policies:

  • aos: "Forgejo consumers use its fully qualified URL."
  • infra: "Consumer repos no longer depend on an external action for this alert."

Nothing reconciles them, so defaults.json is a contract with no consumer.

Proposed

Keep authoring here and rollout in infrastructure, per the standing split. Change only what the rollout emits: the fully-qualified uses: URL plus the two secrets, sourced from defaults.json rather than restated.

One inline call site should survive on purpose. This repo notes that its own workflows inline the payload so a failure before checkout can still alert. That rationale applies to local ./actions/ refs, which need the checkout. Confirm whether it also applies to a remote URL ref before removing the last inline copy.

Why this needs a live operator, not an engineer push

Action resolution is a runner behavior. It cannot be proven from the repo, and this exact change took the whole fleet red once. Verification needs a real Forgejo Actions run, which is outside the engineer and QA boundary.

Acceptance

  • One consumer repo migrated as a canary, with a fresh Forgejo Actions run reaching real job steps rather than failing during action resolution.
  • A deliberately failed run on main in that repo delivers a Telegram message.
  • Only then, telegram-ci-alert-rollout.py emits the URL form and sources defaults.json.
  • The two docs are reconciled to one stated policy.
  • The surviving inline call sites, if any, carry the reason inline.

Related: infrastructure#522, infrastructure#521, agentic-os#632.

## The action library already exists, and consumers do not use it `agentic-os/actions/` ships 8 composite actions (`_lib`, `bump-formula`, `create-release`, `dev-base-build`, `publish-dev-base`, `tag-bump`, `telegram-alert`, `upload-release-asset`). `telegram-alert` is complete: `action.yml`, `telegram_alert.py`, a `--dry-run` path the unit tests use, and `defaults.json` as a machine-readable rollout contract. [docs/telegram-ci-alerts.md](docs/telegram-ci-alerts.md) declares the canonical consumer form: ```yaml uses: https://forgejo.coilysiren.me/coilyco-flight-deck/agentic-os/actions/telegram-alert@main ``` **That form has never been used anywhere in the fleet.** A grep for `uses: https://forgejo.coilysiren.me` across every workflow in every on-disk repo returns nothing. The only consumers of the action are 4 call sites inside this repo using the local `./actions/telegram-alert` path, which no other repo can reach. Instead, 41 workflow files carry 47 copies of a ~1.9KB single-line `python3 -c` payload with escaped newlines. It is effectively unreadable and unreviewable, and a fix means re-running a fleet rollout. ## Why it ended up this way, and why the reason has expired `coilyco-flight-deck/infrastructure#522` (2026-07-10) moved consumers off the action after a fleet-wide CI outage. Every consumer failed before checkout with `failed to read action ... no files found`. The root cause was **not** the shared action. It was the **bare** `owner/repo` ref form: ```yaml uses: coilysiren/agentic-os/actions/telegram-alert@main ``` The Forgejo runner resolved that against `github.com`, where the mirror was stale at `4dbb587` and its `actions/` tree contained only `bump-formula`, `create-release`, `tag-bump`, and `upload-release-asset`. Inlining was the correct emergency fix for a red fleet. That root cause is now gone twice over: 1. The GitHub mirror has caught up. `coilysiren/agentic-os/actions/` now contains `telegram-alert`, verified against the GitHub API today. 2. The fully-qualified `https://forgejo.coilysiren.me/...` form this repo already documents bypasses mirror resolution entirely, which is exactly what the doc says it is for. ## The contract is orphaned and the docs contradict This repo says a rollout tool should consume `defaults.json` "instead of restating those deployment defaults." `infrastructure/scripts/telegram-ci-alert-rollout.py` reads neither `defaults.json` nor the action URL, and restates the payload, the secret names, and the ref policy inline. The two docs now state opposite policies: - aos: "Forgejo consumers use its fully qualified URL." - infra: "Consumer repos no longer depend on an external action for this alert." Nothing reconciles them, so `defaults.json` is a contract with no consumer. ## Proposed Keep authoring here and rollout in infrastructure, per the standing split. Change only what the rollout emits: the fully-qualified `uses:` URL plus the two secrets, sourced from `defaults.json` rather than restated. One inline call site should survive on purpose. This repo notes that its own workflows inline the payload so a failure before checkout can still alert. That rationale applies to local `./actions/` refs, which need the checkout. Confirm whether it also applies to a remote URL ref before removing the last inline copy. ## Why this needs a live operator, not an engineer push Action resolution is a runner behavior. It cannot be proven from the repo, and this exact change took the whole fleet red once. Verification needs a real Forgejo Actions run, which is outside the engineer and QA boundary. ## Acceptance - One consumer repo migrated as a canary, with a fresh Forgejo Actions run reaching real job steps rather than failing during action resolution. - A deliberately failed run on `main` in that repo delivers a Telegram message. - Only then, `telegram-ci-alert-rollout.py` emits the URL form and sources `defaults.json`. - The two docs are reconciled to one stated policy. - The surviving inline call sites, if any, carry the reason inline. Related: infrastructure#522, infrastructure#521, agentic-os#632.
Author
Member

Rollout leg filed as coilyco-flight-deck/infrastructure#768, per the authoring-vs-rollout split. This issue keeps the action, the defaults.json contract, and the docs policy. #768 owns telegram-ci-alert-rollout.py, the canary, and the fleet re-roll.

Rollout leg filed as `coilyco-flight-deck/infrastructure#768`, per the authoring-vs-rollout split. This issue keeps the action, the `defaults.json` contract, and the docs policy. #768 owns `telegram-ci-alert-rollout.py`, the canary, and the fleet re-roll.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os#975
No description provided.