feat(FN-4398): complete remaining dashboard visibility and docs

Fusion-Task-Id: FN-4398
Fusion-Task-Lineage: 8b898b2e-3468-4fa7-8546-b8f6ba52cf46
This commit is contained in:
Fusion
2026-05-14 15:23:49 -07:00
committed by gsxdsm
parent 233c5bbd8e
commit 652e820f7d
25 changed files with 210 additions and 34 deletions

View File

@@ -1,6 +1,7 @@
import { describe, expect, it, vi } from "vitest";
import {
DEFAULT_PROJECT_SETTINGS,
RetryStormError,
serializeRetryStormError,
type TaskDetail,
@@ -50,6 +51,7 @@ describe("executor retry storm integration", () => {
await recordRetry({
store: store as never,
settings: {
...DEFAULT_PROJECT_SETTINGS,
maxReviewerContextRetries: 2,
maxTotalRetriesBeforeFail: 25,
},

View File

@@ -1,6 +1,6 @@
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
import { RetryStormError, type TaskDetail } from "@fusion/core";
import { DEFAULT_PROJECT_SETTINGS, RetryStormError, type TaskDetail } from "@fusion/core";
import { recordRetry } from "../retry-burned-logger.js";
function makeTask(overrides: Partial<TaskDetail> = {}): TaskDetail {
@@ -22,6 +22,7 @@ function makeTask(overrides: Partial<TaskDetail> = {}): TaskDetail {
describe("recordRetry", () => {
const baseSettings = {
...DEFAULT_PROJECT_SETTINGS,
maxBranchConflictRecoveries: 5,
maxReviewerContextRetries: 2,
maxReviewerFallbackRetries: 2,

View File

@@ -4294,7 +4294,7 @@ export class TaskExecutor {
task: taskForRetry,
category: "branchConflict",
role: "executor",
agentId: this.agentId,
agentId: task.assignedAgentId ?? undefined,
attempt,
});
}

View File

@@ -261,6 +261,8 @@ export interface ReviewOptions {
store?: TaskStore;
/** Task ID for agent log persistence. Required alongside `store`. */
taskId?: string;
/** Optional reviewer agent id for retry-burn telemetry. */
agentId?: string;
/** Optional task title for fallback-used notification context. */
taskTitle?: string;
/** Task with optional assignedAgentId for skill selection. */
@@ -595,12 +597,12 @@ export async function reviewStep(
? "code review hit context limit — retrying with compacted request"
: `${reviewType} review hit context limit — retrying with compacted request`;
reviewerLog.warn(`${taskId}: ${retryLogMessage}`);
if (options.store && options.taskId) {
if (options.store && options.taskId && retrySettings && typeof options.store.getTask === "function") {
await options.store.logEntry(options.taskId, retryLogMessage).catch(() => undefined);
const taskForRetry = await options.store.getTask(options.taskId);
await recordRetry({
store: options.store,
settings: liveSettings ?? options.settings ?? {},
settings: retrySettings,
task: taskForRetry,
category: "reviewerContext",
role: "reviewer",
@@ -657,6 +659,7 @@ export async function reviewStep(
};
const hasConfiguredFallback = Boolean(validatorFallbackProvider && validatorFallbackModelId);
const retrySettings = liveSettings ?? options.settings;
let firstAttempt: { verdict: ReviewVerdict; summary: string; review: string };
try {
@@ -664,11 +667,11 @@ export async function reviewStep(
} catch (err) {
if (hasConfiguredFallback) {
await logFallbackRetry("reviewer error", `${validatorFallbackProvider}/${validatorFallbackModelId}`);
if (options.store && options.taskId) {
if (options.store && options.taskId && retrySettings && typeof options.store.getTask === "function") {
const taskForRetry = await options.store.getTask(options.taskId);
await recordRetry({
store: options.store,
settings: liveSettings ?? options.settings ?? {},
settings: retrySettings,
task: taskForRetry,
category: "reviewerFallback",
role: "reviewer",
@@ -686,11 +689,11 @@ export async function reviewStep(
}
await logFallbackRetry("reviewer error", "same-model strict prompt");
if (options.store && options.taskId) {
if (options.store && options.taskId && retrySettings && typeof options.store.getTask === "function") {
const taskForRetry = await options.store.getTask(options.taskId);
await recordRetry({
store: options.store,
settings: liveSettings ?? options.settings ?? {},
settings: retrySettings,
task: taskForRetry,
category: "reviewerFallback",
role: "reviewer",
@@ -710,11 +713,11 @@ export async function reviewStep(
if (hasConfiguredFallback) {
await logFallbackRetry("UNAVAILABLE verdict", `${validatorFallbackProvider}/${validatorFallbackModelId}`);
if (options.store && options.taskId) {
if (options.store && options.taskId && retrySettings && typeof options.store.getTask === "function") {
const taskForRetry = await options.store.getTask(options.taskId);
await recordRetry({
store: options.store,
settings: liveSettings ?? options.settings ?? {},
settings: retrySettings,
task: taskForRetry,
category: "reviewerFallback",
role: "reviewer",
@@ -728,11 +731,11 @@ export async function reviewStep(
}
await logFallbackRetry("UNAVAILABLE verdict", "same-model strict prompt");
if (options.store && options.taskId) {
if (options.store && options.taskId && retrySettings && typeof options.store.getTask === "function") {
const taskForRetry = await options.store.getTask(options.taskId);
await recordRetry({
store: options.store,
settings: liveSettings ?? options.settings ?? {},
settings: retrySettings,
task: taskForRetry,
category: "reviewerFallback",
role: "reviewer",