From d38f580e00d75a7b01e20434f9e32315e358d809 Mon Sep 17 00:00:00 2001 From: Thales Maciel Date: Sun, 19 Apr 2026 17:35:27 -0300 Subject: [PATCH] doctor: surface state store open failure as failing check Previously store.Open errors were silently swallowed, so `banger doctor` could report green while the default-image check (and any other store-dependent diagnostic) was silently skipped because d.store was nil. Co-Authored-By: Claude Opus 4.7 (1M context) --- internal/daemon/doctor.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/internal/daemon/doctor.go b/internal/daemon/doctor.go index 1dfe608..055c1e0 100644 --- a/internal/daemon/doctor.go +++ b/internal/daemon/doctor.go @@ -27,17 +27,27 @@ func Doctor(ctx context.Context) (system.Report, error) { config: cfg, runner: system.NewRunner(), } - db, err := store.Open(layout.DBPath) - if err == nil { + db, storeErr := store.Open(layout.DBPath) + if storeErr == nil { defer db.Close() d.store = db } - return d.doctorReport(ctx), nil + return d.doctorReport(ctx, storeErr), nil } -func (d *Daemon) doctorReport(ctx context.Context) system.Report { +func (d *Daemon) doctorReport(ctx context.Context, storeErr error) system.Report { report := system.Report{} + if storeErr != nil { + report.AddFail( + "state store", + fmt.Sprintf("open %s: %v", d.layout.DBPath, storeErr), + "remove or restore the file if corrupt; otherwise check its permissions", + ) + } else { + report.AddPass("state store", "readable at "+d.layout.DBPath) + } + report.AddPreflight("host runtime", d.runtimeChecks(), runtimeStatus(d.config)) report.AddPreflight("core vm lifecycle", d.coreVMLifecycleChecks(), "required host tools available") report.AddPreflight("vsock guest agent", d.vsockChecks(), "vsock guest agent prerequisites available")