Workflows that disable themselves: GitHub Actions 60-day inactivity trap
Five of our repos had cron workflows that were supposed to run daily. They weren't. But not because of code failures — because GitHub silently disabled them after 60 days without a repository commit.
GitHub Actions auto-disables scheduled workflows in repositories that haven't received a push in 60 days. The workflow simply stops triggering. No notification. No alert. The state is called disabled_inactivity, and the only way to find it is to explicitly query gh workflow list and look for it.
Here's the insidious part: some workflows still showed recent run history even while disabled, because external triggers (workflow_dispatch) still worked. A workflow that appears to have runs can actually have a dead cron trigger, and you'd never know until the data stops arriving.
The fix is a monthly keep-alive workflow: a single YAML file on a 25-day cron that does an empty commit with [skip ci] in the message. This resets the 60-day counter without triggering any downstream builds.
We rolled this out to every repo with a schedule trigger. But the deeper lesson is: a disabled workflow produces zero run history. It's not a failing workflow — it's an invisible one. Monitoring must distinguish between "ran and failed" and "never ran at all."