aboutsummaryrefslogtreecommitdiff
path: root/configs/maintenance-thresholds.toml
blob: f729a019304934f670e050166dda1140990962b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# maintenance-thresholds.toml — every severity value the maintenance console
# and the system-health-check workflow grade against, plus the shipped
# curation defaults. Owned and installed by archsetup (canonical:
# configs/maintenance-thresholds.toml in the archsetup repo; installed to
# ~/.config/archsetup/maintenance-thresholds.toml). Both consumers read the
# installed path, so severity rules can never drift between them.
#
# User curation and overrides live in ~/.config/maint/curation.toml and merge
# over this file (scalars: user wins; [curation.*]: entries − disable + add).
# Never record user marks here — an archsetup update replaces this file.
#
# Seed values migrated 2026-07-07 from the system-health-check workflow's
# hard-won prose rules (the 2026-05-26 /home snapshot lesson, the 10 GB cache
# trigger, the 35/60-day scrub bands) and the maintenance-console design doc.

[storage]
df_warn_pct = 80
df_crit_pct = 90
btrfs_scrub_warn_days = 35
btrfs_scrub_crit_days = 60
btrfs_unalloc_warn_gb = 10          # chunk headroom floor before ENOSPC weirdness
zfs_scrub_warn_days = 35
zfs_scrub_crit_days = 60
zfs_capacity_warn_pct = 80          # ZFS performance degrades past 80
zfs_capacity_crit_pct = 90
zfs_frag_info_pct = 50
smart_wear_warn_pct = 80            # NVMe percentage_used (100 = rated life)
smart_temp_warn_c = 70
fstrim_stale_days = 10              # weekly timer + slack (continuous discard exempts)
hog_roots = ["/home/cjennings", "/var"] # disk top-consumers scan roots (slow-local); depth-1 of /home is just the user dir, so scan inside it
hog_top = 8                         # digest rows kept

[snapshots]
# Sane snapper TIMELINE limits — the 2026-05-26 /home pile-up fix.
timeline_hourly = 6
timeline_daily = 7
timeline_weekly = 2
timeline_monthly = 2
timeline_yearly = 0
single_keep = 2                     # DELETE STALE keeps the newest N singles
zfs_count_warn = 1000               # runaway retention
zfs_space_warn_pct = 20             # snapshot space vs pool capacity

[packages]
cache_warn_gb = 10                  # suggest paccache beyond the weekly keep-3

[updates]
pending_warn = 50                   # "a lot" — reddens the strip border
cache_stale_hours = 6               # network-tier cache older than this warns
topgrade_warn_days = 14             # topgrade freshness

[logs]
app_log_warn_days = 7               # log-cleanup cron should hold ~7 days
journal_digest_top = 10             # groups shown in the journal digest

[power]
battery_low_pct = 15                # feeds the diagnostic state (glyph red)
charge_limit_pct = 80               # the SET 80% longevity cap on velox

[backups]
rsyncshot_daily_crit_hours = 48     # daily backup older than this is a fire

[services]
docker_reclaim_warn_gb = 5
docker_reclaim_warn_pct = 50

[refresh]
# Cadence knobs (seconds unless named otherwise) — spec Decision 8.
live_secs = 3
fast_secs = 30
glyph_scan_mins = 30
net_scan_mins = 60

# --- shipped curation defaults (user layer adds/disables, never edits) ------

[curation.known_noise]
# Journal-noise patterns bind to identifier + message snippet, never a whole
# unit — a muted service's new errors still surface.
entries = [
  { identifier = "bluetoothd", pattern = "HFP" },
  { identifier = "pixman", pattern = "Invalid glyph" },
  { identifier = "xkbcomp", pattern = "Could not resolve keysym" },
]

[curation.expected_listeners]
entries = ["sshd", "mpd", "tailscaled"]

[curation.expected_containers]
entries = ["winvm"]

[curation.pacnew_safe_delete]
# Regenerated files whose .pacnew is safe to drop (reflector-managed / local).
entries = ["/etc/pacman.d/mirrorlist", "/etc/locale.gen"]