Detection (#91/#93) previously ran only at profile load / server
selection, so a config.toml created or chmod-ed while BCC was running
stayed invisible until a restart. Make the view react on its own.
Core (pure, unit-tested — CI has no PySide6):
- sidecar_watch_paths(): the external paths worth watching for a server
— the resolved sidecar file, its directory (so create/delete and
atomic-rename replaces register), and the wrong-path/doc file — order-
stable and de-duplicated.
- sidecar_state_fingerprint(): a hashable snapshot folding the #91
sidecar status and #93 permission status, so the GUI can tell whether
the *observable* state actually changed and skip a redundant refresh.
- sidecar_state_changed(): explicit, named equality for that decision.
GUI (thin wiring, smoke-tested headlessly):
- QFileSystemWatcher over the selection's sidecar path(s) + BCC's own
loaded config; debounced (300 ms) so a burst of writes doesn't thrash.
- Re-arm on every event: an atomic-rename replace drops the inode from
the watcher, so wanted paths are re-added before the next check.
- Focus-in fallback via changeEvent(ActivationChange) — always works
where watchers miss (atomic replaces, not-yet-created files).
- recheck_advisories() only recomputes warning labels from the form +
filesystem; it never touches field values, so a live reload cannot
clobber unsaved edits.
- An external edit to BCC's own config surfaces a non-destructive
Reload banner (never a silent overwrite); confirm-on-dirty reuses the
existing load path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>