Found during deep code review of pipeline orchestration
`src/review/pipeline/orchestrate/dag.rs`, lines 274-299:
```rust
execute_review_jobs(prepared.jobs, ReviewExecutionContext { ... }).await?
```
The `?` propagates the first error from any file review job, aborting the entire DAG execution. If one file review fails (e.g., one file is too large and causes an LLM timeout), all successful file reviews from the same batch are discarded.
For a 20-file PR where 19 files review successfully and 1 times out, the user gets zero review comments instead of 19 files worth.
Also found
- DAG stages consume inputs via `Option::take()` — retry would fail because the Option is already `None`, despite stages being marked `retryable: true`
- No timeout on individual DAG stages — a hanging LLM call consumes the entire 300s webhook budget
Fix: Collect results with `Result` per file, report partial results, and continue reviewing remaining files.
Acceptance
🤖 Generated with Claude Code
Found during deep code review of pipeline orchestration
`src/review/pipeline/orchestrate/dag.rs`, lines 274-299:
```rust
execute_review_jobs(prepared.jobs, ReviewExecutionContext { ... }).await?
```
The `?` propagates the first error from any file review job, aborting the entire DAG execution. If one file review fails (e.g., one file is too large and causes an LLM timeout), all successful file reviews from the same batch are discarded.
For a 20-file PR where 19 files review successfully and 1 times out, the user gets zero review comments instead of 19 files worth.
Also found
Fix: Collect results with `Result` per file, report partial results, and continue reviewing remaining files.
Acceptance
🤖 Generated with Claude Code