Skip to content

Commit 87ad2ff

Browse files
Trecekclaude
andauthored
Implementation Plan: Fix Infinite CI Loop — flake_suspected Routing Escape for is_fixable=false (#4116)
## Summary When `diagnose_ci` returns `is_fixable=false` for env-type CI failures, the `resolve-failures` skill maps them to `flake_suspected`, causing an infinite re-push loop. This plan fixes the root cause in the skill's decision table and adds a loop guard in all three pipeline recipes (`implementation.yaml`, `implementation-groups.yaml`, `remediation.yaml`). Two complementary fixes: 1. **Skill fix**: `resolve-failures/SKILL.md` — extract `is_fixable` from the diagnosis file and route unfixable env/unknown failures to `ci_only_failure` instead of `flake_suspected` 2. **Recipe fix**: Add `check_flake_loop` guard step (following the existing `check_ci_rebase_loop` pattern) to bound the `flake_suspected → re_push` path to 3 iterations, and capture `is_fixable` from `diagnose_ci` output 3. **Test fix**: Update `tests/skills/test_resolve_failures_ci_aware.py` — the `_find_table_row_verdict` parser and verdict assertions must handle the new 4-column table with `is_fixable` Closes #4113 ## Implementation Plan Plan file: `/home/talon/projects/autoskillit-runs/impl-20260626-100257-768257/.autoskillit/temp/make-plan/fix_flake_suspected_infinite_ci_loop_plan_2026-06-26_103000.md` 🤖 Generated with [Claude Code](https://claude.com/claude-code) via AutoSkillit <!-- autoskillit:pipeline-signature steps=prepare_pr,run_arch_lenses,compose_pr,annotate_pr_diff,review_pr --> ## Token Usage Summary | Step | Model | count | uncached | output | cache_read | peak_ctx | turns | cache_write | time | |------|-------|-------|----------|--------|------------|----------|-------|-------------|------| | plan* | opus[1m] | 2 | 5.7k | 21.6k | 1.4M | 110.3k | 54 | 106.7k | 23m 32s | | review_approach* | sonnet | 1 | 6.6k | 6.2k | 222.7k | 54.9k | 16 | 40.4k | 8m 55s | | verify* | opus[1m] | 1 | 66 | 15.7k | 2.2M | 100.2k | 55 | 81.5k | 10m 33s | | implement* | MiniMax-M3 | 1 | 107.7k | 22.4k | 5.3M | 0 | 144 | 0 | 8m 32s | | fix* | sonnet | 1 | 438 | 25.9k | 4.6M | 112.1k | 122 | 93.7k | 11m 16s | | audit_impl* | sonnet | 1 | 70 | 20.0k | 354.6k | 72.5k | 23 | 55.8k | 9m 48s | | prepare_pr* | MiniMax-M3 | 1 | 47.1k | 2.5k | 161.2k | 0 | 13 | 0 | 39s | | compose_pr* | MiniMax-M3 | 1 | 36.4k | 1.4k | 140.8k | 0 | 11 | 0 | 30s | | **Total** | | | 204.1k | 115.7k | 14.4M | 112.1k | | 378.2k | 1h 13m | \* *Step used a non-Anthropic provider; caching behavior may differ.* ## Token Efficiency | Step | LoC Changed | cache_read/LoC | cache_write/LoC | output/LoC | |------|-------------|----------------|-----------------|------------| | plan | 0 | — | — | — | | review_approach | 0 | — | — | — | | verify | 0 | — | — | — | | implement | 389 | 13601.9 | 0.0 | 57.5 | | fix | 35 | 131817.6 | 2676.3 | 740.9 | | audit_impl | 0 | — | — | — | | prepare_pr | 0 | — | — | — | | compose_pr | 0 | — | — | — | | **Total** | **424** | 33897.5 | 891.9 | 272.9 | ## Model Usage Breakdown | Model | steps | uncached | output | cache_read | cache_write | time | |-------|-------|----------|--------|------------|-------------|------| | opus[1m] | 2 | 5.7k | 37.3k | 3.6M | 188.2k | 34m 6s | | sonnet | 3 | 7.1k | 52.1k | 5.2M | 189.9k | 29m 59s | | MiniMax-M3 | 3 | 191.2k | 26.3k | 5.6M | 0 | 9m 42s | --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent d3a8bd7 commit 87ad2ff

13 files changed

Lines changed: 320 additions & 55 deletions

src/autoskillit/recipes/diagrams/implementation-groups.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- autoskillit-recipe-hash: sha256:c8e501dca905a687bfceb05c903a86d7f4bdb9d0057fe39dc510a303d595e1bf -->
1+
<!-- autoskillit-recipe-hash: sha256:f0b9b6a9aaeedd513a73303b939fda5cfc2c287e9c3dd060bb79df7a99a48c41 -->
22
<!-- autoskillit-diagram-format: v7 -->
33
## implementation-groups
44
Group-based implementation with per-group plan/implement/test cycles and PR gates.

src/autoskillit/recipes/diagrams/implementation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- autoskillit-recipe-hash: sha256:6387790f3513145bccf0f7c64f4d1ac8e3b807f61bd3ff217da33b1bdefef946 -->
1+
<!-- autoskillit-recipe-hash: sha256:e5972fabca3a0bb471f4f99688ceaa78127056b33100574f05f355712fe50ffb -->
22
<!-- autoskillit-diagram-format: v7 -->
33
# implementation
44

src/autoskillit/recipes/diagrams/remediation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- autoskillit-recipe-hash: sha256:3a11f66644f46f34ca24a05b186d0d2c7421a6c331a9440d764d0450f9a8ac27 -->
1+
<!-- autoskillit-recipe-hash: sha256:98efa055bc27ca8057fe1dc01887cbe1e2094b036a71bd34a6469cc52d637c18 -->
22
<!-- autoskillit-diagram-format: v7 -->
33
## remediation
44
Investigate, rectify, implement, and merge a bug fix with CI and PR gates.

src/autoskillit/recipes/implementation-groups.json

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,7 @@
15271527
},
15281528
{
15291529
"when": "${{ result.verdict }} == 'flake_suspected'",
1530-
"route": "re_push"
1530+
"route": "check_flake_loop"
15311531
},
15321532
{
15331533
"when": "${{ result.verdict }} == 'ci_only_failure'",
@@ -1542,7 +1542,7 @@
15421542
}
15431543
],
15441544
"on_failure": "release_issue_failure",
1545-
"note": "Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci structured output to avoid redundant CI failure re-investigation. Routes via on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses (sibling fix may have landed), flake_suspected retries via re_push (bounded by retries: 2 / on_exhausted: release_issue_failure), ci_only_failure escalates to human. Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.\n"
1545+
"note": "Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci structured output to avoid redundant CI failure re-investigation. Routes via on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses (sibling fix may have landed), flake_suspected routes to check_flake_loop (bounded by ci_flake_count <= 3, shared across all diagnose_ci callers; escalates to release_issue_failure when exceeded), ci_only_failure escalates to human. Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.\n"
15461546
},
15471547
"pre_resolve_rebase": {
15481548
"tool": "run_python",
@@ -1618,6 +1618,31 @@
16181618
],
16191619
"note": "Guards the resolve_ci(already_green) → pre_resolve_rebase → diagnose_ci cycle. Caps at 3 rebase-rediagnose iterations. If CI keeps reporting already_green after 3 rebases, a structural issue requires human intervention.\n"
16201620
},
1621+
"check_flake_loop": {
1622+
"tool": "run_python",
1623+
"with": {
1624+
"callable": "autoskillit.smoke_utils.check_loop_iteration",
1625+
"current_iteration": "${{ context.ci_flake_count }}",
1626+
"max_iterations": "3"
1627+
},
1628+
"capture": {
1629+
"ci_flake_count": "${{ result.next_iteration }}"
1630+
},
1631+
"on_result": [
1632+
{
1633+
"when": "${{ result.max_exceeded }} == true",
1634+
"route": "release_issue_failure"
1635+
},
1636+
{
1637+
"route": "re_push"
1638+
}
1639+
],
1640+
"on_failure": "release_issue_failure",
1641+
"optional_context_refs": [
1642+
"ci_flake_count"
1643+
],
1644+
"note": "Guards ALL resolve_ci(flake_suspected) → re_push cycles. The ci_flake_count counter is shared across all entry points into diagnose_ci, including CI watch retries, merge queue ejections, dropped-CI-group paths, and conflict resolution escalations. Caps at 3 total flake_suspected verdicts per pipeline run. If CI keeps failing with the same flake_suspected verdict after 3 iterations from any combination of callers, the failure requires human intervention.\n"
1645+
},
16211646
"re_push": {
16221647
"tool": "push_to_remote",
16231648
"with": {

src/autoskillit/recipes/implementation-groups.yaml

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,7 +1373,7 @@ steps:
13731373
- when: "${{ result.verdict }} == 'already_green'"
13741374
route: pre_resolve_rebase
13751375
- when: "${{ result.verdict }} == 'flake_suspected'"
1376-
route: re_push
1376+
route: check_flake_loop
13771377
- when: "${{ result.verdict }} == 'ci_only_failure'"
13781378
route: release_issue_failure
13791379
- when: "${{ result.verdict }} == 'no_test_infrastructure'"
@@ -1385,8 +1385,9 @@ steps:
13851385
Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci
13861386
structured output to avoid redundant CI failure re-investigation. Routes via
13871387
on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses
1388-
(sibling fix may have landed), flake_suspected retries via re_push (bounded by
1389-
retries: 2 / on_exhausted: release_issue_failure), ci_only_failure escalates to human.
1388+
(sibling fix may have landed), flake_suspected routes to check_flake_loop (bounded
1389+
by ci_flake_count <= 3, shared across all diagnose_ci callers; escalates to
1390+
release_issue_failure when exceeded), ci_only_failure escalates to human.
13901391
Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.
13911392
13921393
pre_resolve_rebase:
@@ -1449,6 +1450,29 @@ steps:
14491450
Caps at 3 rebase-rediagnose iterations. If CI keeps reporting already_green
14501451
after 3 rebases, a structural issue requires human intervention.
14511452
1453+
check_flake_loop:
1454+
tool: run_python
1455+
with:
1456+
callable: "autoskillit.smoke_utils.check_loop_iteration"
1457+
current_iteration: "${{ context.ci_flake_count }}"
1458+
max_iterations: "3"
1459+
capture:
1460+
ci_flake_count: "${{ result.next_iteration }}"
1461+
on_result:
1462+
- when: "${{ result.max_exceeded }} == true"
1463+
route: release_issue_failure
1464+
- route: re_push
1465+
on_failure: release_issue_failure
1466+
optional_context_refs:
1467+
- ci_flake_count
1468+
note: >
1469+
Guards ALL resolve_ci(flake_suspected) → re_push cycles. The ci_flake_count
1470+
counter is shared across all entry points into diagnose_ci, including CI watch
1471+
retries, merge queue ejections, dropped-CI-group paths, and conflict resolution
1472+
escalations. Caps at 3 total flake_suspected verdicts per pipeline run. If CI
1473+
keeps failing with the same flake_suspected verdict after 3 iterations from any
1474+
combination of callers, the failure requires human intervention.
1475+
14521476
re_push:
14531477
tool: push_to_remote
14541478
with:

src/autoskillit/recipes/implementation.json

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2336,7 +2336,7 @@
23362336
},
23372337
{
23382338
"when": "${{ result.verdict }} == 'flake_suspected'",
2339-
"route": "re_push"
2339+
"route": "check_flake_loop"
23402340
},
23412341
{
23422342
"when": "${{ result.verdict }} == 'ci_only_failure'",
@@ -2351,7 +2351,7 @@
23512351
}
23522352
],
23532353
"on_failure": "release_issue_failure",
2354-
"note": "Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci structured output to avoid redundant CI failure re-investigation. Routes via on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses (sibling fix may have landed), flake_suspected retries via re_push (bounded by retries: 2 / on_exhausted: release_issue_failure), ci_only_failure escalates to human. Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.\n"
2354+
"note": "Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci structured output to avoid redundant CI failure re-investigation. Routes via on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses (sibling fix may have landed), flake_suspected routes to check_flake_loop (bounded by ci_flake_count <= 3, shared across all diagnose_ci callers; escalates to release_issue_failure when exceeded), ci_only_failure escalates to human. Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.\n"
23552355
},
23562356
"pre_resolve_rebase": {
23572357
"tool": "run_python",
@@ -2427,6 +2427,31 @@
24272427
],
24282428
"note": "Guards the resolve_ci(already_green) → pre_resolve_rebase → diagnose_ci cycle. Caps at 3 rebase-rediagnose iterations. If CI keeps reporting already_green after 3 rebases, a structural issue requires human intervention.\n"
24292429
},
2430+
"check_flake_loop": {
2431+
"tool": "run_python",
2432+
"with": {
2433+
"callable": "autoskillit.smoke_utils.check_loop_iteration",
2434+
"current_iteration": "${{ context.ci_flake_count }}",
2435+
"max_iterations": "3"
2436+
},
2437+
"capture": {
2438+
"ci_flake_count": "${{ result.next_iteration }}"
2439+
},
2440+
"on_result": [
2441+
{
2442+
"when": "${{ result.max_exceeded }} == true",
2443+
"route": "release_issue_failure"
2444+
},
2445+
{
2446+
"route": "re_push"
2447+
}
2448+
],
2449+
"on_failure": "release_issue_failure",
2450+
"optional_context_refs": [
2451+
"ci_flake_count"
2452+
],
2453+
"note": "Guards ALL resolve_ci(flake_suspected) → re_push cycles. The ci_flake_count counter is shared across all entry points into diagnose_ci, including CI watch retries, merge queue ejections, dropped-CI-group paths, and conflict resolution escalations. Caps at 3 total flake_suspected verdicts per pipeline run. If CI keeps failing with the same flake_suspected verdict after 3 iterations from any combination of callers, the failure requires human intervention.\n"
2454+
},
24302455
"re_push": {
24312456
"tool": "push_to_remote",
24322457
"with": {

src/autoskillit/recipes/implementation.yaml

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,7 +2103,7 @@ steps:
21032103
- when: ${{ result.verdict }} == 'already_green'
21042104
route: pre_resolve_rebase
21052105
- when: ${{ result.verdict }} == 'flake_suspected'
2106-
route: re_push
2106+
route: check_flake_loop
21072107
- when: ${{ result.verdict }} == 'ci_only_failure'
21082108
route: release_issue_failure
21092109
- when: ${{ result.verdict }} == 'no_test_infrastructure'
@@ -2114,9 +2114,10 @@ steps:
21142114
note: 'Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci
21152115
structured output to avoid redundant CI failure re-investigation. Routes via
21162116
on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses
2117-
(sibling fix may have landed), flake_suspected retries via re_push (bounded
2118-
by retries: 2 / on_exhausted: release_issue_failure), ci_only_failure escalates
2119-
to human. Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.
2117+
(sibling fix may have landed), flake_suspected routes to check_flake_loop (bounded
2118+
by ci_flake_count <= 3, shared across all diagnose_ci callers; escalates to
2119+
release_issue_failure when exceeded), ci_only_failure escalates to human.
2120+
Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.
21202121
21212122
'
21222123
pre_resolve_rebase:
@@ -2178,6 +2179,29 @@ steps:
21782179
cycle. Caps at 3 rebase-rediagnose iterations. If CI keeps reporting already_green
21792180
after 3 rebases, a structural issue requires human intervention.
21802181
2182+
'
2183+
check_flake_loop:
2184+
tool: run_python
2185+
with:
2186+
callable: autoskillit.smoke_utils.check_loop_iteration
2187+
current_iteration: ${{ context.ci_flake_count }}
2188+
max_iterations: '3'
2189+
capture:
2190+
ci_flake_count: ${{ result.next_iteration }}
2191+
on_result:
2192+
- when: ${{ result.max_exceeded }} == true
2193+
route: release_issue_failure
2194+
- route: re_push
2195+
on_failure: release_issue_failure
2196+
optional_context_refs:
2197+
- ci_flake_count
2198+
note: 'Guards ALL resolve_ci(flake_suspected) → re_push cycles. The ci_flake_count
2199+
counter is shared across all entry points into diagnose_ci, including CI watch
2200+
retries, merge queue ejections, dropped-CI-group paths, and conflict resolution
2201+
escalations. Caps at 3 total flake_suspected verdicts per pipeline run. If CI
2202+
keeps failing with the same flake_suspected verdict after 3 iterations from any
2203+
combination of callers, the failure requires human intervention.
2204+
21812205
'
21822206
re_push:
21832207
tool: push_to_remote

src/autoskillit/recipes/remediation.json

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2472,7 +2472,7 @@
24722472
},
24732473
{
24742474
"when": "${{ result.verdict }} == 'flake_suspected'",
2475-
"route": "re_push"
2475+
"route": "check_flake_loop"
24762476
},
24772477
{
24782478
"when": "${{ result.verdict }} == 'ci_only_failure'",
@@ -2487,7 +2487,7 @@
24872487
}
24882488
],
24892489
"on_failure": "release_issue_failure",
2490-
"note": "Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci structured output to avoid redundant CI failure re-investigation. Routes via on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses (sibling fix may have landed), flake_suspected retries via re_push (bounded by retries: 2 / on_exhausted: release_issue_failure), ci_only_failure escalates to human. Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.\n"
2490+
"note": "Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci structured output to avoid redundant CI failure re-investigation. Routes via on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses (sibling fix may have landed), flake_suspected routes to check_flake_loop (bounded by ci_flake_count <= 3, shared across all diagnose_ci callers; escalates to release_issue_failure when exceeded), ci_only_failure escalates to human. Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.\n"
24912491
},
24922492
"pre_resolve_rebase": {
24932493
"tool": "run_python",
@@ -2563,6 +2563,31 @@
25632563
],
25642564
"note": "Guards the resolve_ci(already_green) → pre_resolve_rebase → diagnose_ci cycle. Caps at 3 rebase-rediagnose iterations. If CI keeps reporting already_green after 3 rebases, a structural issue requires human intervention.\n"
25652565
},
2566+
"check_flake_loop": {
2567+
"tool": "run_python",
2568+
"with": {
2569+
"callable": "autoskillit.smoke_utils.check_loop_iteration",
2570+
"current_iteration": "${{ context.ci_flake_count }}",
2571+
"max_iterations": "3"
2572+
},
2573+
"capture": {
2574+
"ci_flake_count": "${{ result.next_iteration }}"
2575+
},
2576+
"on_result": [
2577+
{
2578+
"when": "${{ result.max_exceeded }} == true",
2579+
"route": "release_issue_failure"
2580+
},
2581+
{
2582+
"route": "re_push"
2583+
}
2584+
],
2585+
"on_failure": "release_issue_failure",
2586+
"optional_context_refs": [
2587+
"ci_flake_count"
2588+
],
2589+
"note": "Guards ALL resolve_ci(flake_suspected) → re_push cycles. The ci_flake_count counter is shared across all entry points into diagnose_ci, including CI watch retries, merge queue ejections, dropped-CI-group paths, and conflict resolution escalations. Caps at 3 total flake_suspected verdicts per pipeline run. If CI keeps failing with the same flake_suspected verdict after 3 iterations from any combination of callers, the failure requires human intervention.\n"
2590+
},
25662591
"re_push": {
25672592
"tool": "push_to_remote",
25682593
"with": {

src/autoskillit/recipes/remediation.yaml

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2209,7 +2209,7 @@ steps:
22092209
- when: ${{ result.verdict }} == 'already_green'
22102210
route: pre_resolve_rebase
22112211
- when: ${{ result.verdict }} == 'flake_suspected'
2212-
route: re_push
2212+
route: check_flake_loop
22132213
- when: ${{ result.verdict }} == 'ci_only_failure'
22142214
route: release_issue_failure
22152215
- when: ${{ result.verdict }} == 'no_test_infrastructure'
@@ -2219,9 +2219,10 @@ steps:
22192219
note: 'Runs when ci_watch reports a CI failure. Receives ci_failed_jobs from wait_for_ci
22202220
structured output to avoid redundant CI failure re-investigation. Routes via
22212221
on_result: verdict dispatch — real_fix pushes, already_green rebases and re-diagnoses
2222-
(sibling fix may have landed), flake_suspected retries via re_push (bounded
2223-
by retries: 2 / on_exhausted: release_issue_failure), ci_only_failure escalates
2224-
to human. Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.
2222+
(sibling fix may have landed), flake_suspected routes to check_flake_loop (bounded
2223+
by ci_flake_count <= 3, shared across all diagnose_ci callers; escalates to
2224+
release_issue_failure when exceeded), ci_only_failure escalates to human.
2225+
Retries up to 2 times (3 total attempts) before exhausting to release_issue_failure.
22252226
22262227
'
22272228
pre_resolve_rebase:
@@ -2282,6 +2283,29 @@ steps:
22822283
cycle. Caps at 3 rebase-rediagnose iterations. If CI keeps reporting already_green
22832284
after 3 rebases, a structural issue requires human intervention.
22842285
2286+
'
2287+
check_flake_loop:
2288+
tool: run_python
2289+
with:
2290+
callable: autoskillit.smoke_utils.check_loop_iteration
2291+
current_iteration: ${{ context.ci_flake_count }}
2292+
max_iterations: '3'
2293+
capture:
2294+
ci_flake_count: ${{ result.next_iteration }}
2295+
on_result:
2296+
- when: ${{ result.max_exceeded }} == true
2297+
route: release_issue_failure
2298+
- route: re_push
2299+
on_failure: release_issue_failure
2300+
optional_context_refs:
2301+
- ci_flake_count
2302+
note: 'Guards ALL resolve_ci(flake_suspected) → re_push cycles. The ci_flake_count
2303+
counter is shared across all entry points into diagnose_ci, including CI watch
2304+
retries, merge queue ejections, dropped-CI-group paths, and conflict resolution
2305+
escalations. Caps at 3 total flake_suspected verdicts per pipeline run. If CI
2306+
keeps failing with the same flake_suspected verdict after 3 iterations from any
2307+
combination of callers, the failure requires human intervention.
2308+
22852309
'
22862310
re_push:
22872311
tool: push_to_remote

0 commit comments

Comments
 (0)