gastownhall/beads · error

dolt.shared-server must be "true" or "false", got %q

Error message

dolt.shared-server must be "true" or "false", got %q

What it means

validateYamlConfigValue rejects a dolt.shared-server value that is not "true" or "false" (case-insensitive). The %q shows the rejected string. bd throws it because the key is stored as a string and later read as a strict boolean; anything else would silently misbehave.

Source

Thrown at internal/config/yaml_config.go:891

}

// validateYamlConfigValue validates a configuration value before setting.
// Returns an error if the value is invalid for the given key.
func validateYamlConfigValue(key, value string) error {
	switch key {
	case "hierarchy.max-depth":
		// Must be a positive integer >= 1 (GH#995)
		depth, err := strconv.Atoi(value)
		if err != nil {
			return fmt.Errorf("hierarchy.max-depth must be a positive integer, got %q", value)
		}
		if depth < 1 {
			return fmt.Errorf("hierarchy.max-depth must be at least 1, got %d", depth)
		}
	case "dolt.shared-server":
		lower := strings.ToLower(value)
		if lower != "true" && lower != "false" {
			return fmt.Errorf("dolt.shared-server must be \"true\" or \"false\", got %q", value)
		}
	case "dolt.debug":
		lower := strings.ToLower(value)
		if lower != "true" && lower != "false" {
			return fmt.Errorf("dolt.debug must be \"true\" or \"false\", got %q", value)
		}
	case "dolt.mode":
		lower := strings.ToLower(value)
		if lower != "server" && lower != "embedded" {
			return fmt.Errorf("dolt.mode must be \"server\" or \"embedded\", got %q", value)
		}
	case "prime.max-memories":
		n, err := strconv.Atoi(value)
		if err != nil {
			return fmt.Errorf("prime.max-memories must be a non-negative integer (0 = unlimited), got %q", value)
		}
		if n < 0 {
			return fmt.Errorf("prime.max-memories must be a non-negative integer (0 = unlimited), got %q", value)

View on GitHub (pinned to 71377f2769)

Solutions

  1. Set an explicit boolean string: bd config set dolt.shared-server true (or false)
  2. Normalize yes/no and 1/0 to true/false in scripts before calling
  3. Trim whitespace and surrounding quotes from the value
  4. Note case-insensitivity: True/FALSE are accepted; 'yes'/'on' are not

Example fix

// before
SetYamlConfig("dolt.shared-server", "yes") // error
// after
SetYamlConfig("dolt.shared-server", "true")
Defensive patterns

Strategy: validation

Validate before calling

l := strings.ToLower(strings.TrimSpace(v))
if l != "true" && l != "false" {
    return fmt.Errorf("dolt.shared-server must be true or false, got %q", v)
}

Type guard

func isBoolString(s string) bool {
    switch strings.ToLower(strings.TrimSpace(s)) {
    case "true", "false":
        return true
    }
    return false
}

Try / catch

if err := SetYamlConfig("dolt.shared-server", v); err != nil {
    if strings.Contains(err.Error(), "dolt.shared-server must be") {
        // normalize yes/1/on -> true, no/0/off -> false, retry
    }
    return err
}

Prevention

When it happens

Trigger: SetYamlConfig / SetYamlConfigInDir / SetUserYamlConfig with key "dolt.shared-server" and values like "yes", "1", "on", "TRUE " (trailing space), or empty string.

Common situations: Using YAML-style 'yes'/'no'; shell scripts passing 1/0; copy-pasting values with trailing whitespace or quotes from docs.

Related errors


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