feat(FN-4092): complete Step 5 — document unavailable recovery contract
Fusion-Task-Id: FN-4092 Fusion-Task-Lineage: fcee3a44-5c36-4899-bf9d-835d36abdf2e
This commit is contained in:
5
.changeset/fn-4092-plan-review-unavailable-recovery.md
Normal file
5
.changeset/fn-4092-plan-review-unavailable-recovery.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@runfusion/fusion": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fix plan-review UNAVAILABLE silently stalling tasks in-progress by retrying reviewer verdict extraction once (preferring validator fallback model) and degrading plan/spec UNAVAILABLE outcomes to advisory when retries are exhausted.
|
||||||
@@ -553,9 +553,20 @@ See [Memory Plugin Contract](./memory-plugin-contract.md) for the full plan.
|
|||||||
### Agent roles
|
### Agent roles
|
||||||
- **Planning**: the planning processor generates task plans (`PROMPT.md`) and selects eligible planning tasks by priority first, then FIFO (`createdAt` ascending) within each priority tier.
|
- **Planning**: the planning processor generates task plans (`PROMPT.md`) and selects eligible planning tasks by priority first, then FIFO (`createdAt` ascending) within each priority tier.
|
||||||
- **Executor**: `TaskExecutor` (`executor.ts`) implements tasks in worktrees
|
- **Executor**: `TaskExecutor` (`executor.ts`) implements tasks in worktrees
|
||||||
- **Reviewer**: `reviewStep()` (`reviewer.ts`) performs plan/code reviews
|
- **Reviewer**: `reviewStep()` (`reviewer.ts`) performs plan/code/spec reviews
|
||||||
- **Merger**: `aiMergeTask()` (`merger.ts`) merges approved work
|
- **Merger**: `aiMergeTask()` (`merger.ts`) merges approved work
|
||||||
|
|
||||||
|
#### Reviewer verdict recovery contract (FN-4092)
|
||||||
|
- Reviewer verdicts are `APPROVE`, `REVISE`, `RETHINK`, or `UNAVAILABLE`.
|
||||||
|
- For non-pause `UNAVAILABLE` or non-context reviewer prompt errors, `reviewStep()` retries once:
|
||||||
|
- Prefer configured validator fallback model (`validatorFallbackProvider` + `validatorFallbackModelId`, including project overrides), or
|
||||||
|
- Retry once on the same model with stricter `Verdict:` output instructions when no fallback model is configured.
|
||||||
|
- Pause/engine-pause short-circuits still return `UNAVAILABLE` immediately and do not spawn/retry reviewer sessions.
|
||||||
|
- Executor handling in `createReviewStepTool()` is now explicit:
|
||||||
|
- `plan`/`spec` `UNAVAILABLE` is advisory after retry exhaustion (`UNAVAILABLE (advisory)`), and execution proceeds.
|
||||||
|
- `code` `UNAVAILABLE` remains blocking; step completion must wait for a usable review verdict.
|
||||||
|
- Advisory and blocking paths are both logged to task logs for operator visibility.
|
||||||
|
|
||||||
### Scheduling and execution
|
### Scheduling and execution
|
||||||
- `Scheduler` (`scheduler.ts`) — dependency-aware task scheduling that dispatches eligible todo tasks by priority first, then FIFO (`createdAt` ascending) within each priority tier.
|
- `Scheduler` (`scheduler.ts`) — dependency-aware task scheduling that dispatches eligible todo tasks by priority first, then FIFO (`createdAt` ascending) within each priority tier.
|
||||||
- `blockedBy` invariant (FN-3924/FN-4091): the field is only durable when it references a current unresolved explicit dependency (or, for dependency-free tasks, an active overlap blocker). Completion gating now validates `blockedBy` through live task resolution: missing blockers and blockers already in `done`/`archived` are treated as stale, while only still-active blockers continue to prevent `fn_task_done`. If no current blocker remains, scheduler/event reconciliation clears `blockedBy` to `null` and re-evaluates from live task state.
|
- `blockedBy` invariant (FN-3924/FN-4091): the field is only durable when it references a current unresolved explicit dependency (or, for dependency-free tasks, an active overlap blocker). Completion gating now validates `blockedBy` through live task resolution: missing blockers and blockers already in `done`/`archived` are treated as stale, while only still-active blockers continue to prevent `fn_task_done`. If no current blocker remains, scheduler/event reconciliation clears `blockedBy` to `null` and re-evaluates from live task state.
|
||||||
|
|||||||
@@ -229,8 +229,8 @@ Override precedence for direct merges is:
|
|||||||
| `executionModelId` | `string` | `undefined` | Model ID for task execution agents. |
|
| `executionModelId` | `string` | `undefined` | Model ID for task execution agents. |
|
||||||
| `validatorProvider` | `string` | `undefined` | Provider for plan/code reviewers. |
|
| `validatorProvider` | `string` | `undefined` | Provider for plan/code reviewers. |
|
||||||
| `validatorModelId` | `string` | `undefined` | Model ID for plan/code reviewers. |
|
| `validatorModelId` | `string` | `undefined` | Model ID for plan/code reviewers. |
|
||||||
| `validatorFallbackProvider` | `string` | `undefined` | Fallback provider for reviewers. |
|
| `validatorFallbackProvider` | `string` | `undefined` | Fallback provider for reviewers; also used by reviewer UNAVAILABLE/error recovery retry before returning terminal UNAVAILABLE. |
|
||||||
| `validatorFallbackModelId` | `string` | `undefined` | Fallback model ID for reviewers. |
|
| `validatorFallbackModelId` | `string` | `undefined` | Fallback model ID for reviewers; paired with `validatorFallbackProvider` for reviewer recovery retry. |
|
||||||
| `modelPresets` | `ModelPreset[]` | `[]` | Reusable executor/reviewer model presets. |
|
| `modelPresets` | `ModelPreset[]` | `[]` | Reusable executor/reviewer model presets. |
|
||||||
| `autoSelectModelPreset` | `boolean` | `false` | Auto-select presets by task size. |
|
| `autoSelectModelPreset` | `boolean` | `false` | Auto-select presets by task size. |
|
||||||
| `defaultPresetBySize` | `{ S?: string; M?: string; L?: string }` | `{}` | Mapping for `S`/`M`/`L` → preset ID. |
|
| `defaultPresetBySize` | `{ S?: string; M?: string; L?: string }` | `{}` | Mapping for `S`/`M`/`L` → preset ID. |
|
||||||
|
|||||||
Reference in New Issue
Block a user