ci(nightly-next): the watchers read the one cmux NIGHTLY feed

Merged
TE
1d ago
+20-17

nightly-next is moving to one app and one feed. Every build is signed once, as cmux NIGHTLY (com.cmuxterm.app.nightly), the app the team runs. It is published to the bare feed https://files-next.cmux.com/nightly-next/appcast-arm64.xml, which that app polls (cmuxterm-hq#7156). Leo, 2026-11-05: "THERE SHOULDN'T BE 2". The feat-cmux-next PR that signs once follows; after it, the /next/ cmux NEXT-identity appcast gets no builds.

The feed watch runs from main on a schedule, so it moves here:

  • Feed watch (scripts/ci/nightly_next_feed_watch.py): freshness was the older of the bare and /next/ paths. A frozen /next/ would raise the stale alarm and dispatch starvation ticks every 25 minutes, so it now reads the bare feed only.
  • The legacy-copy repair (legacy_lag) still compares /next/ with the bare feed, so a failed copy job is still re-run while nightly-next runs the copy. Once nightly-next signs once, /next/ freezes behind the bare feed, nothing is missing and nothing is re-run (review at 55f5dabb).

The canary and launch smoke are left on /next/ for now. They dispatch nightly-next-rollback.yml on the nightly-next ref, and that ref's rollback edits /next/ until nightly-next carries the one-feed change. Moving them first would roll back a feed they did not judge (review at 45a3c6c5). They move to the bare feed in a follow-up once nightly-next has the change.

This is safe to land before the switch, because the bare feed already carries every build.

Tests: python3 tests/test_nightly_next_feed_watch.py (95 OK: two pins updated, plus a test that a frozen /next/ behind the bare feed re-runs nothing); tests/test_nightly_next_canary_feed_origin.py OK.

Agent session: agent session

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Updated release-feed monitoring to distinguish the current feed from the legacy feed, improving detection of outdated feed data.
    • The current feed is now monitored independently rather than being compared across both feed paths.