feat(FN-4890): complete Step 1 — settings and notification types

Fusion-Task-Id: FN-4890
Fusion-Task-Lineage: d1ae6585-7df0-481f-83c3-c7cdd45daf4f
This commit is contained in:
Fusion (runfusion.ai)
2026-05-17 09:40:46 -07:00
committed by gsxdsm
parent 46cd63796f
commit 6624adf110
3 changed files with 25 additions and 1 deletions

View File

@@ -35,6 +35,7 @@ export const DEFAULT_GLOBAL_SETTINGS = {
"message:agent-to-agent",
"message:room",
"gridlock",
"board-stall-unrecovered",
"fallback-used",
"memory-dreams-processed",
"token-budget",
@@ -271,6 +272,10 @@ export const DEFAULT_PROJECT_SETTINGS = {
taskStuckTimeoutMs: 600_000,
inReviewStallDeadlockThreshold: 3,
stalePausedReviewThresholdMs: 24 * 60 * 60_000,
pausedScopeDecayMs: 30 * 60_000,
metaTaskStallAutoCloseMs: 2 * 60 * 60_000,
boardStallSweepWindowMs: 2 * 60 * 60_000,
boardStallBlockedGrowthThreshold: 3,
// Capacity risk warning default: only warn once todo is meaningfully backlogged.
capacityRiskBannerEnabled: false,
capacityRiskTodoThreshold: 20,

View File

@@ -352,6 +352,7 @@ export type NtfyNotificationEvent =
| "awaiting-user-review"
| "planning-awaiting-input"
| "gridlock"
| "board-stall-unrecovered"
| "fallback-used"
| "memory-dreams-processed"
| "token-budget"
@@ -369,6 +370,7 @@ export const NOTIFICATION_EVENTS = [
"awaiting-user-review",
"planning-awaiting-input",
"gridlock",
"board-stall-unrecovered",
"fallback-used",
"memory-dreams-processed",
"token-budget",
@@ -2891,6 +2893,22 @@ export interface ProjectSettings {
* Age is measured from columnMovedAt when present, otherwise updatedAt.
* Default: 86400000 (24 hours). Set to 0 or undefined to disable surfacing. */
stalePausedReviewThresholdMs?: number;
/** Minimum age in milliseconds that a paused in-progress task may continue holding
* file-scope reservation while one or more followers are blocked by it.
* Self-healing rebounds qualifying holders to todo when this threshold is met.
* Default: 1800000 (30 minutes). Set to 0 to disable. */
pausedScopeDecayMs?: number;
/** Maximum age in milliseconds a meta-task may remain blocked without its target
* advancing before self-healing auto-archives it as superseded.
* Default: 7200000 (2 hours). Set to 0 to disable. */
metaTaskStallAutoCloseMs?: number;
/** Rolling window in milliseconds for board-stall auto-recovery evaluation.
* Default: 7200000 (2 hours). */
boardStallSweepWindowMs?: number;
/** Minimum blocked-edge growth within the board-stall window that qualifies as a
* stall signal when there are zero transitions out of in-progress.
* Default: 3. */
boardStallBlockedGrowthThreshold?: number;
/** Age threshold in milliseconds before a blocker with high todo fan-out is escalated.
* Blocker age is measured from columnMovedAt when available, otherwise updatedAt.
* Only blockers currently in in-progress or in-review are eligible. */

View File

@@ -28,6 +28,7 @@ export const DEFAULT_NTFY_EVENTS: readonly NtfyNotificationEvent[] = [
"awaiting-user-review",
"planning-awaiting-input",
"gridlock",
"board-stall-unrecovered",
"fallback-used",
"token-budget",
"message:agent-to-user",
@@ -66,7 +67,7 @@ interface NtfyConfig {
/** Event types for task notification deduplication */
type TaskNotificationEvent = "in-review" | "merged" | "failed" | "awaiting-approval" | "awaiting-user-review";
type AnyNotificationEvent = TaskNotificationEvent | "gridlock" | "fallback-used";
type AnyNotificationEvent = TaskNotificationEvent | "gridlock" | "board-stall-unrecovered" | "fallback-used";
/**
* Format a task identifier for notifications.