Two bugs prevented check-dagger from failing fast when checks failed:
Hygiene + Layers checked sequentially — they are cheap structural checks with no dependency on each other. Running them in parallel (errgroup.Group) means failures are reported sooner.
Spurious retries from errgroup.WithContext — the backend and integration tests previously shared a derived context via errgroup.WithContext. When one test failed, the context was cancelled, causing the sibling test to emit "context canceled" in Dagger's --progress=plain output. The retry_dagger function in Taskfile.yml matched that string as a transient network error and re-ran the entire pipeline up to 3 times — a real test failure could take 30+ minutes to be reported instead of ~10.
Fix in ci/main.go:
Hygiene + layers now run in parallel with errgroup.Group
Backend + integration tests now use errgroup.Group (no shared cancel context), so a failure in one does not emit "context canceled" for the other
Fix in Taskfile.yml:
Removed context canceled from the retry_dagger grep pattern; the remaining patterns (connection reset, context deadline exceeded, connection refused, invalid return status code) still cover genuine network/engine transients
Test plan
Confirm the Forgejo CI run completes and, when a check fails, it fails fast (no 3× retry loop in logs)
Verify task check-dagger still retries on actual connection errors
## Summary
Closes #349
Two bugs prevented `check-dagger` from failing fast when checks failed:
- **Hygiene + Layers checked sequentially** — they are cheap structural checks with no dependency on each other. Running them in parallel (`errgroup.Group`) means failures are reported sooner.
- **Spurious retries from `errgroup.WithContext`** — the backend and integration tests previously shared a derived context via `errgroup.WithContext`. When one test failed, the context was cancelled, causing the sibling test to emit `"context canceled"` in Dagger's `--progress=plain` output. The `retry_dagger` function in `Taskfile.yml` matched that string as a transient network error and re-ran the entire pipeline up to 3 times — a real test failure could take 30+ minutes to be reported instead of ~10.
**Fix in `ci/main.go`:**
- Hygiene + layers now run in parallel with `errgroup.Group`
- Backend + integration tests now use `errgroup.Group` (no shared cancel context), so a failure in one does not emit `"context canceled"` for the other
**Fix in `Taskfile.yml`:**
- Removed `context canceled` from the `retry_dagger` grep pattern; the remaining patterns (`connection reset`, `context deadline exceeded`, `connection refused`, `invalid return status code`) still cover genuine network/engine transients
## Test plan
- [ ] Confirm the Forgejo CI run completes and, when a check fails, it fails fast (no 3× retry loop in logs)
- [ ] Verify `task check-dagger` still retries on actual connection errors
🤖 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
Closes #349
Two bugs prevented
check-daggerfrom failing fast when checks failed:errgroup.Group) means failures are reported sooner.errgroup.WithContext— the backend and integration tests previously shared a derived context viaerrgroup.WithContext. When one test failed, the context was cancelled, causing the sibling test to emit"context canceled"in Dagger's--progress=plainoutput. Theretry_daggerfunction inTaskfile.ymlmatched that string as a transient network error and re-ran the entire pipeline up to 3 times — a real test failure could take 30+ minutes to be reported instead of ~10.Fix in
ci/main.go:errgroup.Grouperrgroup.Group(no shared cancel context), so a failure in one does not emit"context canceled"for the otherFix in
Taskfile.yml:context canceledfrom theretry_daggergrep pattern; the remaining patterns (connection reset,context deadline exceeded,connection refused,invalid return status code) still cover genuine network/engine transientsTest plan
task check-daggerstill retries on actual connection errors🤖 Generated with Claude Code