package daemonrunner import ( "context" "fmt" "github.com/steveyegge/beads" ) func (d *Daemon) validateDatabaseFingerprint() error { ctx := context.Background() // Get stored repo ID storedRepoID, err := d.store.GetMetadata(ctx, "repo_id") if err != nil && err.Error() != "metadata key not found: repo_id" { return fmt.Errorf("failed to read repo_id: %w", err) } // If no repo_id, this is a legacy database if storedRepoID == "" { return fmt.Errorf(` LEGACY DATABASE DETECTED! This database was created before version 0.17.5 and lacks a repository fingerprint. To continue using this database, you must explicitly set its repository ID: bd migrate --update-repo-id This ensures the database is bound to this repository and prevents accidental database sharing between different repositories. If this is a fresh clone, run: rm -rf .beads && bd init Note: Auto-claiming legacy databases is intentionally disabled to prevent silent corruption when databases are copied between repositories. `) } // Validate repo ID matches current repository currentRepoID, err := beads.ComputeRepoID() if err != nil { d.log.log("Warning: could not compute current repository ID: %v", err) return nil } if storedRepoID != currentRepoID { return fmt.Errorf(` DATABASE MISMATCH DETECTED! This database belongs to a different repository: Database repo ID: %s Current repo ID: %s This usually means: 1. You copied a .beads directory from another repo (don't do this!) 2. Git remote URL changed (run 'bd migrate --update-repo-id') 3. Database corruption 4. bd was upgraded and URL canonicalization changed Solutions: - If remote URL changed: bd migrate --update-repo-id - If bd was upgraded: bd migrate --update-repo-id - If wrong database: rm -rf .beads && bd init - If correct database: BEADS_IGNORE_REPO_MISMATCH=1 bd daemon (Warning: This can cause data corruption across clones!) `, storedRepoID[:8], currentRepoID[:8]) } d.log.log("Repository fingerprint validated: %s", currentRepoID[:8]) return nil }