feat(FN-5091): complete Step 2 — wire settings and exports

Fusion-Task-Id: FN-5091
Fusion-Task-Lineage: f59dc7dd-abc2-4d1d-a755-1fe446314131
This commit is contained in:
Fusion (runfusion.ai)
2026-05-19 03:00:18 -07:00
committed by gsxdsm
parent e97efc9f3c
commit 8e3e71744b
3 changed files with 45 additions and 0 deletions

View File

@@ -206,6 +206,32 @@ describe("settings key parity", () => {
expect(isGlobalSettingsKey("backlogPressureAlertCooldownMs")).toBe(false);
});
it("keeps dependency-blocked todo report settings project-scoped with documented defaults", () => {
expect(DEFAULT_PROJECT_SETTINGS.dependencyBlockedTodoReportEnabled).toBe(true);
expect(DEFAULT_PROJECT_SETTINGS.dependencyBlockedTodoFreshAgeMs).toBe(30 * 60_000);
expect(DEFAULT_PROJECT_SETTINGS.dependencyBlockedTodoStaleAgeMs).toBe(4 * 60 * 60_000);
expect(DEFAULT_PROJECT_SETTINGS.dependencyBlockedTodoMinCount).toBe(1);
expect(DEFAULT_PROJECT_SETTINGS.dependencyBlockedTodoReportCooldownMs).toBe(6 * 60 * 60_000);
expect(PROJECT_SETTINGS_KEYS).toContain("dependencyBlockedTodoReportEnabled");
expect(PROJECT_SETTINGS_KEYS).toContain("dependencyBlockedTodoFreshAgeMs");
expect(PROJECT_SETTINGS_KEYS).toContain("dependencyBlockedTodoStaleAgeMs");
expect(PROJECT_SETTINGS_KEYS).toContain("dependencyBlockedTodoMinCount");
expect(PROJECT_SETTINGS_KEYS).toContain("dependencyBlockedTodoReportCooldownMs");
expect(isProjectSettingsKey("dependencyBlockedTodoReportEnabled")).toBe(true);
expect(isProjectSettingsKey("dependencyBlockedTodoFreshAgeMs")).toBe(true);
expect(isProjectSettingsKey("dependencyBlockedTodoStaleAgeMs")).toBe(true);
expect(isProjectSettingsKey("dependencyBlockedTodoMinCount")).toBe(true);
expect(isProjectSettingsKey("dependencyBlockedTodoReportCooldownMs")).toBe(true);
expect(isGlobalSettingsKey("dependencyBlockedTodoReportEnabled")).toBe(false);
expect(isGlobalSettingsKey("dependencyBlockedTodoFreshAgeMs")).toBe(false);
expect(isGlobalSettingsKey("dependencyBlockedTodoStaleAgeMs")).toBe(false);
expect(isGlobalSettingsKey("dependencyBlockedTodoMinCount")).toBe(false);
expect(isGlobalSettingsKey("dependencyBlockedTodoReportCooldownMs")).toBe(false);
});
it("keeps github tracking keys in expected scopes with documented defaults", () => {
expect(DEFAULT_PROJECT_SETTINGS.githubTrackingEnabledByDefault).toBe(false);
expect(DEFAULT_PROJECT_SETTINGS.githubTrackingDefaultRepo).toBeUndefined();

View File

@@ -298,6 +298,11 @@ export const DEFAULT_PROJECT_SETTINGS = {
backlogPressureRatioThreshold: 10,
backlogPressureMinTodoCount: 5,
backlogPressureAlertCooldownMs: 24 * 60 * 60_000,
dependencyBlockedTodoReportEnabled: true,
dependencyBlockedTodoFreshAgeMs: 30 * 60_000,
dependencyBlockedTodoStaleAgeMs: 4 * 60 * 60_000,
dependencyBlockedTodoMinCount: 1,
dependencyBlockedTodoReportCooldownMs: 6 * 60 * 60_000,
staleHighFanoutBlockerAgeThresholdMs: 2 * 60 * 60 * 1000,
staleInProgressWarningMs: 4 * 60 * 60_000,
staleInProgressCriticalMs: 24 * 60 * 60_000,

View File

@@ -3034,6 +3034,20 @@ export interface ProjectSettings {
/** Minimum cooldown in milliseconds between backlog-pressure alerts.
* Default: 24 * 60 * 60_000. */
backlogPressureAlertCooldownMs?: number;
/** Enables dependency-blocked todo backlog-health reporting. Default: true. */
dependencyBlockedTodoReportEnabled?: boolean;
/** Blocker age in milliseconds below which dependency-blocked todo groups are fresh.
* Default: 30 * 60_000 (30 minutes). */
dependencyBlockedTodoFreshAgeMs?: number;
/** Blocker age in milliseconds at or above which dependency-blocked todo groups are stale.
* Default: 4 * 60 * 60_000 (4 hours). */
dependencyBlockedTodoStaleAgeMs?: number;
/** Minimum dependency-blocked todo count required to include a blocker group.
* Default: 1. */
dependencyBlockedTodoMinCount?: number;
/** Minimum cooldown in milliseconds between dependency-blocked todo insight emissions.
* Default: 6 * 60 * 60_000. */
dependencyBlockedTodoReportCooldownMs?: number;
/** TTL in milliseconds for persisted AI planning/subtask/mission interview sessions.
* Sessions older than this cutoff are expired by the dashboard session cleanup loop.
* Valid range: 600000 (10 minutes) to 2592000000 (30 days).