Migrate 26 high-value catch sites to AppError taxonomy (C6 wave 1)
Classify scheduler, orchestration, IPC read, and automation catch
blocks via logAppError + classifyUnknownError so each failure surfaces
a stable `module.subdomain.condition` code plus a kind. No behaviour
change — returns, throws, and fall-through are preserved; only log
prefixes and the taxonomy metadata are new.
Wave 1 coverage (26 sites, all non-database):
- orchestration/scheduler-lock-recovery (3)
- orchestration/scheduler-housekeeping (5)
- orchestration/scheduler-idle-automation (2)
- orchestration/scheduler-heartbeat (4)
- orchestration/turn-context (2)
- ipc-core-read-handlers (6)
- automation/automation-handlers (4)
Relax the Logger interface so `error` is optional, letting callers
whose deps expose only `{info, warn}` (scheduler contexts) pass in
directly without wrapping. The helper falls back to warn when error
is absent.
This commit is contained in:
1 parent
118e3d8795
commit
827f06f358
8 files changed
+158
-32
No files matched your search
@@ -3,6 +3,7 @@ import { sweepStaleReviews } from "../task-quality-gates";
|
||||
import type { SweepStaleReviewsDeps } from "../task-quality-gates";
|
||||
import { resolveApprovalDecision } from "../approval-policy";
|
||||
import { dispatchAgentMessage } from "../messaging/dispatch";
|
||||
import { logAppError } from "../errors/index.js";
|
||||
|
||||
export function createHousekeepingScheduler(
|
||||
deps: OrchestrationDependencies,
|
||||
@@ -73,10 +74,20 @@ export function createHousekeepingScheduler(
|
||||
publishDomainChanged();
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error(`[housekeeping] Stale review sweep failed: ${error instanceof Error ? error.message : String(error)}`);
|
||||
logAppError(logger, error, {
|
||||
kind: "recoverable",
|
||||
code: "scheduler.housekeeping.stale_review_sweep_failed",
|
||||
message: `Stale review sweep failed for company ${company.id}`,
|
||||
context: { companyId: company.id },
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error(`[housekeeping] Error processing company ${company.id}: ${error instanceof Error ? error.message : String(error)}`);
|
||||
logAppError(logger, error, {
|
||||
kind: "recoverable",
|
||||
code: "scheduler.housekeeping.company_tick_failed",
|
||||
message: `Housekeeping tick failed for company ${company.id}`,
|
||||
context: { companyId: company.id },
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +97,11 @@ export function createHousekeepingScheduler(
|
||||
logger.info(`[housekeeping] Purged ${staleWakeups} expired wakeup request(s)`);
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error(`[housekeeping] Wakeup purge failed: ${error instanceof Error ? error.message : String(error)}`);
|
||||
logAppError(logger, error, {
|
||||
kind: "recoverable",
|
||||
code: "scheduler.housekeeping.wakeup_purge_failed",
|
||||
message: "Expired wakeup request purge failed; next tick will retry",
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -102,10 +117,18 @@ export function createHousekeepingScheduler(
|
||||
logger.info(`[housekeeping] Purged ${purgedProjections} orphan inbox projection ledger row(s)`);
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error(`[housekeeping] Inbox projection purge failed: ${error instanceof Error ? error.message : String(error)}`);
|
||||
logAppError(logger, error, {
|
||||
kind: "recoverable",
|
||||
code: "scheduler.housekeeping.inbox_projection_purge_failed",
|
||||
message: "Orphan inbox projection purge failed; next tick will retry",
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error(`[housekeeping] Scheduler error: ${error instanceof Error ? error.message : String(error)}`);
|
||||
logAppError(logger, error, {
|
||||
kind: "recoverable",
|
||||
code: "scheduler.housekeeping.tick_failed",
|
||||
message: "Housekeeping scheduler tick raised; next interval will retry",
|
||||
});
|
||||
}
|
||||
}, 300_000);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user