feat(FN-4761): finalize review auto-move docs and release note

Fusion-Task-Id: FN-4761
Fusion-Task-Lineage: b6b1ed73-c396-4dd2-b97f-366272d05c7f
This commit is contained in:
Fusion (runfusion.ai)
2026-05-17 10:58:34 -07:00
committed by gsxdsm
parent 9cee0ef083
commit 3d7e737fbe
3 changed files with 12 additions and 1 deletions

View File

@@ -0,0 +1,5 @@
---
"@runfusion/fusion": patch
---
Sync GitHub PR reviews and review comments into Fusion task comments, expose a PR reviews API for dashboard threading, and auto-move in-review tasks back to todo when GitHub review decision changes to CHANGES_REQUESTED while preserving progress/worktree and saving reviewer feedback context.

View File

@@ -1582,6 +1582,12 @@ The GitHub tracking state listener now attaches to every registered project stor
- `404` when the task has no associated PR - `404` when the task has no associated PR
- `429` when `githubRateLimiter` denies the repo request window, including `retryAfter`/`resetAt` details - `429` when `githubRateLimiter` denies the repo request window, including `retryAfter`/`resetAt` details
#### PR review ingestion and auto-transition
- `POST /api/tasks/:id/pr/refresh` and background `refreshPrInBackground()` call `getPrReviewSnapshot()` and sync review data into task comments with idempotency on `(source, externalId)`.
- Synced comment sources are `github-review` and `github-review-comment`; refinement auto-creation is skipped for these external comments.
- `GET /api/tasks/:id/pr/reviews` returns the live GitHub review snapshot plus the Fusion-threaded stored review comments for the task.
- When review decision transitions to `CHANGES_REQUESTED` while the task is in `in-review`, Fusion auto-moves the task back to `todo` with `preserveProgress` and `preserveWorktree`, writes a `review-feedback` task document, and records run-audit mutation `pr:changes-requested-auto-move`.
--- ---
## 14) Key Design Decisions ## 14) Key Design Decisions

View File

@@ -3368,7 +3368,7 @@ export function registerGitGitHubRoutes(ctx: ApiRoutesContext): void {
const retryAfter = resetTime const retryAfter = resetTime
? Math.max(0, Math.ceil((resetTime.getTime() - Date.now()) / 1000)) ? Math.max(0, Math.ceil((resetTime.getTime() - Date.now()) / 1000))
: undefined; : undefined;
throw rateLimited("GitHub API rate limit exceeded for this repository", { throw new ApiError(429, "GitHub API rate limit exceeded for this repository", {
retryAfter, retryAfter,
resetAt: resetTime?.toISOString(), resetAt: resetTime?.toISOString(),
}); });