diff --git a/cmd/antidriftd/main.go b/cmd/antidriftd/main.go index 6f5e920..ebbd144 100644 --- a/cmd/antidriftd/main.go +++ b/cmd/antidriftd/main.go @@ -82,7 +82,9 @@ func main() { if err := applyFn(cfg); err != nil { log.Printf("settings: %v; falling back to claude backend", err) cfg.AIBackend = "claude" - _ = settings.Save(settingsPath, cfg) + if err := settings.Save(settingsPath, cfg); err != nil { + log.Printf("settings: could not persist claude fallback to %s: %v", settingsPath, err) + } if err := applyFn(cfg); err != nil { log.Fatalf("settings: apply failed even with claude: %v", err) } diff --git a/internal/web/settings_handlers.go b/internal/web/settings_handlers.go index 31d0729..33b889e 100644 --- a/internal/web/settings_handlers.go +++ b/internal/web/settings_handlers.go @@ -40,6 +40,8 @@ func (s *Server) handlePostSettings(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid json"}) return } + s.applyMu.Lock() + defer s.applyMu.Unlock() s.settingsMu.Lock() apply := s.applyFn path := s.settingsPath diff --git a/internal/web/web.go b/internal/web/web.go index 0cde5f0..965494a 100644 --- a/internal/web/web.go +++ b/internal/web/web.go @@ -35,6 +35,7 @@ type Server struct { settings settings.Settings settingsPath string applyFn func(settings.Settings) error + applyMu sync.Mutex // serializes POST /settings apply+save } func NewServer(ctrl *session.Controller) *Server {