gastownhall/beads · error

record bd_version

Error message

record bd_version: %w

What it means

Wraps failure of cfg.SetLocalMetadata(ctx, workapi.MetadataKeyVersion, Version) — recording the bd binary version in LOCAL (clone-only) metadata during proxied init. Unlike the shared metadata keys, this one is per-clone, so failure points at the local side of the store. The wrapped error is the actual cause.

Solutions

  1. Check the local working directory is writable (mounts, permissions, disk space)
  2. Inspect/repair the local .bd metadata store (bd doctor) and re-run bd init
  3. Read the wrapped underlying error for the storage-level cause

Example fix

// before
err: "record bd_version: permission denied"
chmod u+w .bd  # or fix the read-only mount
// after
bd init
Defensive patterns

Strategy: validation

Validate before calling

// ensure the local .bd store is writable before init
info, err := os.Stat(filepath.Join(root, ".bd"))
if err == nil && info.IsDir() {
    if f, e := os.CreateTemp(filepath.Join(root, ".bd"), "w"); e != nil {
        return fmt.Errorf(".bd not writable: %w", e)
    } else { f.Close(); os.Remove(f.Name()) }
}

Try / catch

if err != nil && strings.Contains(err.Error(), "record bd_version:") {
    log.Printf("local metadata write failed: %v", errors.Unwrap(err))
    // check filesystem permissions/mounts, run bd doctor, retry
}

Prevention

When it happens

Trigger: bd init in team-server mode where the local metadata write of the bd version fails — local .bd metadata store corrupted, disk full, or local transaction failure after the shared writes succeeded.

Common situations: Corrupted or partially-migrated local metadata file; read-only working directory or filesystem; running init from a container with a read-only mount.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/8152008f86f3faea. Report an issue: GitHub.

Appendix: source

Thrown at cmd/bd/init_proxied_server.go:383

		cfg := uw.ConfigUseCase()
		// An absent fingerprint is recorded as nothing rather than as "": an
		// empty row reads back to cross-project verification as a clone whose
		// fingerprint failed to compute.
		if repoID != "" {
			if err := cfg.SetMetadata(ctx, "repo_id", repoID); err != nil {
				return "", fmt.Errorf("record repo_id: %w", err)
			}
		}
		if cloneID != "" {
			if err := cfg.SetMetadata(ctx, "clone_id", cloneID); err != nil {
				return "", fmt.Errorf("record clone_id: %w", err)
			}
		}
		if err := cfg.SetMetadata(ctx, "last_import_time", time.Now().UTC().Format(time.RFC3339)); err != nil {
			return "", fmt.Errorf("record last_import_time: %w", err)
		}
		if err := cfg.SetLocalMetadata(ctx, workapi.MetadataKeyVersion, Version); err != nil {
			return "", fmt.Errorf("record bd_version: %w", err)
		}
		return "bd init", nil
	})
}

// configureProxiedInitDoltRemote adds the sync remote, skipping a name that is
// already taken.
func configureProxiedInitDoltRemote(ctx context.Context, provider uow.UnitOfWorkProvider, remoteURL string) error {
	return uow.RunTx(ctx, provider, func(ctx context.Context, uw uow.UnitOfWork) (string, error) {
		remotes, err := uw.DoltRemoteUseCase().ListRemotes(ctx)
		if err != nil {
			return "", fmt.Errorf("list remotes: %w", err)
		}
		for _, r := range remotes {
			if r.Name == "origin" {
				return "", nil
			}
		}

View on GitHub (pinned to 71377f2769)