From ea95f37d73c558b78b654e1c48f705f73a539b36 Mon Sep 17 00:00:00 2001 From: Chuck <33324927+ChuckBuilds@users.noreply.github.com> Date: Mon, 25 May 2026 17:09:26 -0400 Subject: [PATCH] fix(reconciler): add sync, github, youtube to _SYSTEM_CONFIG_KEYS (#351) config_manager.load_config() deep-merges config_secrets.json into the main config before returning it. This means secrets top-level keys (github, youtube) appear alongside structural config keys (sync) in the dict that _get_config_state() iterates. _SYSTEM_CONFIG_KEYS was missing all three, so the reconciler treated them as plugin IDs and flagged them as PLUGIN_MISSING_ON_DISK on every startup, showing the "Stale plugin config entries found" warning banner to users on a fresh install where those plugins have never existed. Add the three keys with brief comments explaining which file each comes from so the distinction is clear when the list grows. Co-authored-by: Chuck Co-authored-by: Claude Sonnet 4.6 --- src/plugin_system/state_reconciliation.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugin_system/state_reconciliation.py b/src/plugin_system/state_reconciliation.py index d94f42ca..70b32458 100644 --- a/src/plugin_system/state_reconciliation.py +++ b/src/plugin_system/state_reconciliation.py @@ -185,13 +185,19 @@ class StateReconciliation: message=f"Reconciliation failed: {str(e)}" ) - # Top-level config keys that are NOT plugins + # Top-level config keys that are NOT plugins. + # Includes both config.json structural keys and config_secrets.json top-level + # keys (load_config() deep-merges secrets in, so secrets keys appear here too). _SYSTEM_CONFIG_KEYS = frozenset({ 'web_display_autostart', 'timezone', 'location', 'display', 'plugin_system', 'vegas_scroll_speed', 'vegas_separator_width', 'vegas_target_fps', 'vegas_buffer_ahead', 'vegas_plugin_order', 'vegas_excluded_plugins', 'vegas_scroll_enabled', 'logging', 'dim_schedule', 'network', 'system', 'schedule', + # Multi-display sync config (config.json structural key) + 'sync', + # Secrets file top-level keys (merged in by load_config) + 'github', 'youtube', }) def _get_config_state(self) -> Dict[str, Dict[str, Any]]: