zhiheng-zhang-Mera/dsh-health-scheduler ↗★ 0
dsh-health-scheduler
Health monitoring, pressure scoring, maintenance scheduling and action decisions for DeepSeek Harness. It never restarts anything itself. 用于系统状态监控与维护决策。适合需要监控运行压力、合理调度维护任务的系统。
インストール
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zhiheng-zhang-Mera/dsh-health-schedulerドキュメント
README 全文を読む ↗Configuration
Configuration is a partial document. It is deep-merged onto the selected preset, so every
leaf you omit comes from the preset; arrays replace rather than merge. The plugin registers
the settings namespace health-scheduler when the profile provides a settings service,
and runs from the bundle patch alone when it does not.
One caveat belongs here rather than in the configuration reference: the profile patch layer
is not a deep merge. A cordis.patch.yml row replaces the targeted row's whole config, so an
override that restates only part of a nested object loses the rest. The deep merge described in
this section applies to the document the plugin actually receives. See
What the bundle contributes.
The complete key-by-key reference, including the stats-file format and the command-probe format, is in docs/configuration.md.
| Group | Keys | Default |
|---|---|---|
| Master | enabled, preset | true, balanced |
sampling | intervalMs, trendIntervalMs, summaryIntervalMs, providerBackoffMs, providerBackoffMaxMs | 15 s, 60 s, 300 s, 30 s, 600 s |
windows | rawMs, windowsMs, aggregateBucketMs, aggregateRetentionMs, dailyRetentionMs | 30 min, [5m,30m,2h,6h], 5 min, 24 h, 14 d |
trend | minSamples, minSpanMs, minRSquared | 3, 5 min, 0.5 |
weights | time, thermal, memory, runtime, worker, computer_use_ui | 0.15 / 0.20 / 0.25 / 0.15 / 0.15 / 0.10 |
thresholds | one {enter, exit} band per action | 55/45, 70/60, 80/68, 95/85 |
metrics | per canonical metric: band, weight, sustainMs, trendPointsPerHour, trendCap | see docs/metrics.md |
cooldowns | throttleMs, maintenanceMs, escalationMs | 5 min, 30 min, 60 min |
throttle | concurrencyLimit, concurrencyFactor | null, 0.5 |
maintenance | enabled, targetTime, windowStart, windowEnd, maxDeferMs, urgentOverridePressure, allowAppRestart, safePointRequired | false, 04:00, 03:30, 05:00, 60 min, 92, true, true |
antiFlap | minStateDwellMs, minRepeatActionMs, debounceEvaluations | 120 s, 10 min, 2 |
resilience | providerFailureLimit, providerRetryAfterBackoff, reportDegradedCapability | 3, true, true |
storage | enabled, directory, maxLogBytes, maxRecentDecisions | true, null, 4 MiB, 50 |
| Providers | disabledProviders, providerOptions | [], see docs |
A configuration that cannot be acted on is rejected loudly. resolveConfig throws a
ConfigError naming the dotted path; the plugin's apply catches it, logs it and continues
on the balanced preset rather than failing the boot.
How much history you get
Three horizons, all bounded, all configurable:
| Horizon | Where | Default | Answers |
|---|---|---|---|
| Raw samples | windows.rawMs | 30 min, raised to the longest windowsMs entry | Percentiles, slopes, consecutive-band duration. |
| Aggregate buckets | windows.aggregateRetentionMs, aggregateBucketMs | 24 h, 5 min buckets | Long-horizon movement without keeping raw points. |
| Daily summaries | windows.dailyRetentionMs | 14 days | "Was last Tuesday worse than today?" — one {count, mean, max, min} per metric per local day. |
Daily summaries are rolled up from the aggregate buckets on demand, so their cost is
proportional to the number of buckets, not to uptime. They are published on every
HealthSnapshot as dailySummaries and in the JSON payload as daily_summaries, and they are
frozen at local midnight boundaries so a day is comparable across a DST change.