AppSettings — snake_case Codable model at ~/Library/Application Support/com.gronod.iccery2/settings.json (v1 path never read): argyll_binary_dir, default_instrument (stored, never applied to argv — docs/04 §0.1), log_level (nil → Debug debug / Info release), delta_e_good_max 2.0 / delta_e_warning_max 5.0, custom_presets, enable_i1pro2_leds, calibration_stale_days 30, default_install_locationuser, ask_before_overwrite_profile, open_color_panel_after_install.
Validation with the exact contract strings; invalid settings are never written; corrupt/missing JSON → defaults; settingsDidChange posted on save (for #20).
LogSink — rolling ~/Library/Logs/com.gronod.iccery2/iccery.log, 5 MiB × 5 segments; setLevel is runtime state applied at startup and on save (#158); AppLogger gates os_log + file through it; tailExcerpt for the copy button.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements issue #5 (M1).
AppSettings— snake_caseCodablemodel at~/Library/Application Support/com.gronod.iccery2/settings.json(v1 path never read):argyll_binary_dir,default_instrument(stored, never applied to argv — docs/04 §0.1),log_level(nil → Debug debug / Info release),delta_e_good_max2.0 /delta_e_warning_max5.0,custom_presets,enable_i1pro2_leds,calibration_stale_days30,default_install_locationuser,ask_before_overwrite_profile,open_color_panel_after_install.settingsDidChangeposted on save (for #20).LogSink— rolling~/Library/Logs/com.gronod.iccery2/iccery.log, 5 MiB × 5 segments;setLevelis runtime state applied at startup and on save (#158);AppLoggergates os_log + file through it;tailExcerptfor the copy button.SettingsViewsheet — Argyll dir picker (#6selectDirectory), default instrument (display-only caveat), i1Pro2 LEDs toggle, ΔE fields + inline errors, stale days, install location, overwrite + ColorSync toggles, log level picker, open-log-folder / copy-path / copy-excerpt.Verified: 60/60 tests pass (validation strings, corrupt JSON, rotation, live level change).
Closes #5