IW-513: phase-pr tells a forge that is down from a forge that refused #782

Merged
mph merged 20 commits from IW-513 into main 2026-10-11 07:07:58 +00:00
Member

Summary

phase-pr stopped an unattended batch with exit 1 when the forge did not answer (502, rate limit, network fault) before the CI gate. Inside the gate the same condition already exits 3 and the caller resumes. This branch makes the pre-gate path behave the same way, with a bound.

Changes

  • TrackerError (Unreachable / Refused / Malformed) on the GitHub, GitLab and Forgejo clients, ForgeGateway, and the 16 forge methods of TrackerOps. Linear and YouTrack stay Either[String, A]. Every message string is unchanged; only the classification is new.
  • Pre-gate budget: phase-pr retries a silent forge in the same run, then exits 3 with a resume report. The --timeout budget is held on the review-state card (forge_wait_started, forge_wait_branch), so it continues across runs. When it is spent, exit 1 with a headline that says how long the forge was silent. --no-wait behaves the same.
  • Only the PhasePr pre-gate path acts on isTransient. All other callers print .message and behave as before. The CI gate is unchanged.

Phases: #778 (clients and PR/CI/merge calls), #779 (pre-gate budget), #780 (issue calls).

Release order: iw-cli first, then kanon (ForgeCatchUp.scala, KanonForgejoIssue.scala, test-env fixtures), then the dev-docs skills. Start the dashboard from the same release, because the validator rejects unknown card fields.

Review packet: project-management/issues/IW-513/review-packet.md.

Testing

  • Unit: classifier tables (TrackerErrorTest, HttpCallFailureTest), budget (ForgeWaitTest), client cases including a real closed port, ~17 new PhasePrHarnessTest cases, card field set/keep/clear.
  • E2E: test/forgejo-phase-pr.bats against a real refused connection (exit 3 with stamp, then exit 1 after the budget).
  • Contract: gh/glab/Forgejo wording that the classifier depends on.
  • Each phase PR passed the full CI suite.

Follow-ups filed: #781, and comments on #569, #585, #762, #440.

Release notes

Výpadek forge už nezastaví automatické zpracování fází

Úkol: IW-513
Datum: 2026-10-11

Příkaz pro otevření pull requestu fáze nyní rozlišuje, zda mu forge (GitHub, GitLab nebo Forgejo) odpověď odmítl, nebo zda vůbec nebyl dosažitelný. Krátký výpadek serveru, přetížení nebo chvilkový problém se sítí proto už nezastaví celou automatickou dávku práce na úkolu. Dávka počká a pokračuje, jakmile je forge opět k dispozici.

Když forge při hledání nebo zakládání pull requestu neodpoví, příkaz to nejprve několikrát zkusí znovu s krátkou pauzou a na výstup vypíše, že se o spojení pokouší znovu. Pokud forge mlčí i potom, příkaz skončí s výsledkem „spusťte mě znovu“, který automatická dávka zná z čekání na CI a na který reaguje dalším pokusem. Doba, po kterou se takto čeká, je omezená stejným časovým limitem jako čekání na CI. Začátek čekání si nástroj zapisuje do stavu úkolu, takže limit platí napříč opakovanými spuštěními a nezačíná pokaždé znovu. Když limit vyprší, příkaz skončí chybou se zprávou, že forge je zřejmě mimo provoz a je třeba, aby se na něj podíval člověk. Stejně se příkaz chová i tehdy, když se na CI vůbec nečeká.

Odmítnutí zůstávají konečná, jako dosud. Chybějící nástroj příkazové řádky, nepřihlášený účet, neplatný nebo prošlý přístupový token, uzavřený či již sloučený pull request nebo odpověď, která si odporuje, zastaví práci hned a s původní zprávou. Takové chyby opakováním nezmizí, a nástroj je proto zbytečně neopakuje. Zprávy, které uživatel u ostatních příkazů pro práci s úkoly vidí, se nemění.

Při přechodu na tuto verzi není třeba nic nastavovat. Změna se týká jen autorů rozšíření, která volají jádro nástroje přímo: chyby z GitHubu, GitLabu a Forgejo nyní nesou druh chyby místo prostého textu, takže taková rozšíření je třeba upravit, aby text chyby četla z této nové podoby. Rozšíření pro Linear a YouTrack se změna netýká.

Closes #513

🤖 Generated with Claude Code

## Summary `phase-pr` stopped an unattended batch with exit 1 when the forge did not answer (502, rate limit, network fault) before the CI gate. Inside the gate the same condition already exits 3 and the caller resumes. This branch makes the pre-gate path behave the same way, with a bound. ## Changes - **`TrackerError`** (`Unreachable` / `Refused` / `Malformed`) on the GitHub, GitLab and Forgejo clients, `ForgeGateway`, and the 16 forge methods of `TrackerOps`. Linear and YouTrack stay `Either[String, A]`. Every message string is unchanged; only the classification is new. - **Pre-gate budget**: `phase-pr` retries a silent forge in the same run, then exits 3 with a resume report. The `--timeout` budget is held on the review-state card (`forge_wait_started`, `forge_wait_branch`), so it continues across runs. When it is spent, exit 1 with a headline that says how long the forge was silent. `--no-wait` behaves the same. - Only the `PhasePr` pre-gate path acts on `isTransient`. All other callers print `.message` and behave as before. The CI gate is unchanged. Phases: #778 (clients and PR/CI/merge calls), #779 (pre-gate budget), #780 (issue calls). **Release order:** iw-cli first, then kanon (`ForgeCatchUp.scala`, `KanonForgejoIssue.scala`, test-env fixtures), then the dev-docs skills. Start the dashboard from the same release, because the validator rejects unknown card fields. Review packet: `project-management/issues/IW-513/review-packet.md`. ## Testing - Unit: classifier tables (`TrackerErrorTest`, `HttpCallFailureTest`), budget (`ForgeWaitTest`), client cases including a real closed port, ~17 new `PhasePrHarnessTest` cases, card field set/keep/clear. - E2E: `test/forgejo-phase-pr.bats` against a real refused connection (exit 3 with stamp, then exit 1 after the budget). - Contract: gh/glab/Forgejo wording that the classifier depends on. - Each phase PR passed the full CI suite. Follow-ups filed: #781, and comments on #569, #585, #762, #440. ## Release notes # Výpadek forge už nezastaví automatické zpracování fází **Úkol:** IW-513 **Datum:** 2026-10-11 Příkaz pro otevření pull requestu fáze nyní rozlišuje, zda mu forge (GitHub, GitLab nebo Forgejo) odpověď odmítl, nebo zda vůbec nebyl dosažitelný. Krátký výpadek serveru, přetížení nebo chvilkový problém se sítí proto už nezastaví celou automatickou dávku práce na úkolu. Dávka počká a pokračuje, jakmile je forge opět k dispozici. Když forge při hledání nebo zakládání pull requestu neodpoví, příkaz to nejprve několikrát zkusí znovu s krátkou pauzou a na výstup vypíše, že se o spojení pokouší znovu. Pokud forge mlčí i potom, příkaz skončí s výsledkem „spusťte mě znovu“, který automatická dávka zná z čekání na CI a na který reaguje dalším pokusem. Doba, po kterou se takto čeká, je omezená stejným časovým limitem jako čekání na CI. Začátek čekání si nástroj zapisuje do stavu úkolu, takže limit platí napříč opakovanými spuštěními a nezačíná pokaždé znovu. Když limit vyprší, příkaz skončí chybou se zprávou, že forge je zřejmě mimo provoz a je třeba, aby se na něj podíval člověk. Stejně se příkaz chová i tehdy, když se na CI vůbec nečeká. Odmítnutí zůstávají konečná, jako dosud. Chybějící nástroj příkazové řádky, nepřihlášený účet, neplatný nebo prošlý přístupový token, uzavřený či již sloučený pull request nebo odpověď, která si odporuje, zastaví práci hned a s původní zprávou. Takové chyby opakováním nezmizí, a nástroj je proto zbytečně neopakuje. Zprávy, které uživatel u ostatních příkazů pro práci s úkoly vidí, se nemění. Při přechodu na tuto verzi není třeba nic nastavovat. Změna se týká jen autorů rozšíření, která volají jádro nástroje přímo: chyby z GitHubu, GitLabu a Forgejo nyní nesou druh chyby místo prostého textu, takže taková rozšíření je třeba upravit, aby text chyby četla z této nové podoby. Rozšíření pro Linear a YouTrack se změna netýká. Closes #513 🤖 Generated with [Claude Code](https://claude.com/claude-code)
phase-pr cannot tell a forge that is down from a forge that refused, so both stop a batch

Artifacts:
- analysis.md
- issue.md

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fPBZaKwU97SaaHzVo3ePq
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fPBZaKwU97SaaHzVo3ePq
phase-pr cannot tell a forge that is down from a forge that refused, so both stop a batch

Artifacts:
- tasks.md

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fPBZaKwU97SaaHzVo3ePq
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fPBZaKwU97SaaHzVo3ePq
Issue: IW-513
Phase: 1 - TrackerError on the forge clients and the port's PR/CI/merge calls

This commit marks the checkpoint for phase 1 context generation.
Use wf-implement IW-513 to return to this point.

The analysis is corrected where the context review found that gh's
"Could not resolve to a Repository" refusal and a bare 401 in a URL
would be classified as the wrong case.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TrackerError on the forge clients and the port's PR/CI/merge calls

Artifacts:
- phase-01-tasks.md

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Issue: IW-513
Phase: 2 - Pre-gate budget, so a forge that will not answer before the gate resumes

This commit marks the checkpoint for phase 2 context generation.
Use wf-implement IW-513 to return to this point.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pre-gate budget, so a forge that will not answer before the gate resumes

Artifacts:
- phase-02-tasks.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Issue: IW-513
Phase: 3 - TrackerError on the port's forge issue calls

This commit marks the checkpoint for phase 3 context generation.
Use wf-implement IW-513 to return to this point.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TrackerError on the port's forge issue calls

Artifacts:
- phase-03-tasks.md

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs(IW-513): point review packet at the filed follow-ups
All checks were successful
CI / changes (pull_request) Successful in 5s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 11s
CI / lint (pull_request) Successful in 14s
CI / compile (pull_request) Successful in 1m42s
CI / dashboard-build (pull_request) Successful in 1m30s
CI / test (pull_request) Successful in 20m1s
6c4ccb7bcb
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mph merged commit 8ad228597e into main 2026-10-11 07:07:58 +00:00
Sign in to join this conversation.
No description provided.