Files
Mason Daugherty 34aaab8682 chore(ci): make talon check failures advisory on PRs that don't touch libs/talon (#5808)
## Problem

`talon` editable-installs `deepagents-code`
(`libs/talon/pyproject.toml`, `[tool.uv.sources]`), so the `talon`
filter in `ci.yml` includes `libs/code/**` and every libs/code PR runs
`lint-talon`/`test-talon`. When a libs/code change breaks talon,
`ci_success` fails, and because branch protection requires ` CI
Success`, the libs/code PR cannot merge until the author also fixes the
talon regression — inside the same PR. That combined PR then makes
release-please fan out changelog entries across both packages.

It is acceptable for PRs that don't touch `libs/talon` to merge with
talon broken at HEAD; the breakage gets fixed in a follow-up
`fix(talon): ...` PR (ideally in a stack). talon is the only consumer of
the libs/code path source, so no other package's CI is affected by this
policy.

## Approach

Advisory, not skipped: talon CI still *runs* on libs/code PRs (the
signal is valuable) — only its blocking effect changes.

- The waiver decision lives in a new helper script,
`.github/scripts/checks/ci_gate.py`, which `ci_success` calls instead of
grepping the `toJSON(needs.*.result)` blob. On `pull_request` runs where
the `talon` filter output is not `'true'`, `failure` results from
`lint-talon`/`test-talon` are waived with a loud `::warning::` per
waived job; every other job still blocks. `cancelled` results are never
waived, genuine talon PRs (`talon == 'true'`) stay strict, and
`push`/`merge_group` runs stay fully strict — main runs every job
unconditionally, so a broken talon is still visible there and cannot
silently go red.
- A new `talon-failure-advisory` job posts/updates a sticky PR comment
(`<!-- talon-ci-advisory -->`) when the waiver fires, naming the failed
jobs, linking the workflow run, and calling out the required
`fix(talon)` follow-up; it deletes the sticky once talon is green again.
It mirrors the sticky-comment pattern in
`release_fanout_bypass_warn.yml`, including the `core.warning` +
job-summary fallback when commenting fails (fork tokens, rate limits).
The job is advisory-only and is deliberately not in `ci_success.needs`,
so it can never gate.
- Unit tests in `.github/scripts/tests/checks/test_ci_gate.py` cover the
waiver matrix (waived lint/test failures, non-talon failures still
blocking, talon PRs and push/merge_group staying strict, cancelled never
waived). They run in the existing `check-release-options` job, which is
unchanged.

No branch-protection settings change is needed: the repo already
requires only ` CI Success` and `validate release dependencies against
PyPI`, both compatible with this change.

Note on scope: the waiver keys off `talon != 'true'`. SDK-only PRs
(`libs/deepagents/**`) also flip the `talon` filter on via fan-out, so
an SDK PR that breaks talon still blocks — only PRs where talon CI runs
*solely* because of the libs/code path source get the waiver.
2026-08-25 11:36:55 -04:00
..