The hourly deploy.yml schedule re-deployed the same commit repeatedly because it always diffed HEAD~1..HEAD — once a commit touching lib//pubspec.* became HEAD, every hourly tick would detect "android changes" and deploy again.
Fix: at the start of the check-changes job, query the Forgejo workflow runs API for the last successful deploy.yml run. If its head_sha matches current HEAD, output android=false / linux=false immediately, skipping all downstream jobs.
workflow_dispatch bypasses this check (always deploys), matching the existing behaviour.
Test plan
Verify the check-changes job exits early on the next scheduled run after a successful deploy of the same commit
Verify a new commit still triggers deployment normally
Verify workflow_dispatch still deploys unconditionally
## Summary
- The hourly `deploy.yml` schedule re-deployed the same commit repeatedly because it always diffed `HEAD~1..HEAD` — once a commit touching `lib/`/`pubspec.*` became HEAD, every hourly tick would detect "android changes" and deploy again.
- Fix: at the start of the `check-changes` job, query the Forgejo workflow runs API for the last successful `deploy.yml` run. If its `head_sha` matches current HEAD, output `android=false` / `linux=false` immediately, skipping all downstream jobs.
- `workflow_dispatch` bypasses this check (always deploys), matching the existing behaviour.
## Test plan
- [ ] Verify the `check-changes` job exits early on the next scheduled run after a successful deploy of the same commit
- [ ] Verify a new commit still triggers deployment normally
- [ ] Verify `workflow_dispatch` still deploys unconditionally
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
deploy.ymlschedule re-deployed the same commit repeatedly because it always diffedHEAD~1..HEAD— once a commit touchinglib//pubspec.*became HEAD, every hourly tick would detect "android changes" and deploy again.check-changesjob, query the Forgejo workflow runs API for the last successfuldeploy.ymlrun. If itshead_shamatches current HEAD, outputandroid=false/linux=falseimmediately, skipping all downstream jobs.workflow_dispatchbypasses this check (always deploys), matching the existing behaviour.Test plan
check-changesjob exits early on the next scheduled run after a successful deploy of the same commitworkflow_dispatchstill deploys unconditionally🤖 Generated with Claude Code