atuinsh/atuin · error
failed to set absolute path override for {key}
Error message
failed to set absolute path override for {key} What it means
During config loading, atuin merges config values that are absolute filesystem paths into the `config` crate builder via `set_override`. If the config crate rejects the override (malformed dotted key, type conflict with the schema, or a value that cannot be coerced), the code panics with this message naming the offending key.
Source
Thrown at crates/atuin-client/src/settings.rs:1708
"logs.search.file",
"logs.daemon.file",
]
.iter()
.map(|key| (key, built.get_string(key).unwrap_or_default()))
// An unset optional path (`daemon.socket_path`) must stay unset rather
// than be overridden with an empty one.
.filter(|(_, value)| !value.is_empty())
.filter_map(|(key, value)| match Self::expand_path(&value) {
Ok(expanded) => Some((key, expanded)),
Err(e) => {
tracing::warn!("failed to expand path for {key}: {e}");
None
}
})
.fold(config_builder, |builder, (key, value)| {
builder
.set_override(key, value)
.unwrap_or_else(|_| panic!("failed to set absolute path override for {key}"))
});
config_builder.build().map_err(Into::into)
}
/// Look up a single config value by dotted key (e.g. `"daemon.sync_frequency"`).
///
/// Returns the effective value after merging defaults, config file, and
/// environment — without the side-effects of full `Settings` construction
/// (meta store init, path expansion, etc.).
pub fn get_config_value(key: &str) -> Result<String> {
use config::Value;
#[cfg_attr(not(unix), allow(unused_mut))]
let mut config = Self::build_config()?;
// When unset, `daemon.socket_path` is calculated dynamically by [`Daemon::socket_path`] and
// wouldn't show up in `atuin config get --resolved daemon.socket_path`. However, it may beView on GitHub (pinned to c0c717ab04)
Solutions
- Open config.toml and find the key printed in the panic message; fix or remove it
- Ensure the key path matches the settings schema (check crates/atuin-client/src/settings.rs structs)
- If the value should be a path, confirm it is a plain string, not a nested table
- Bisect by commenting out config sections until the panic disappears
Example fix
# before (config.toml) [sync] records = true sync.records = true # after (config.toml) [sync] records = true
Defensive patterns
Strategy: validation
Validate before calling
// validate config keys against the schema before loading
let known: Vec<String> = Settings::structured_config().keys().collect();
for key in user_config_keys {
assert!(known.contains(&key), "unknown config key: {key}");
} Prevention
- Validate config.toml keys after every upgrade (`atuin doctor` or a dry load)
- Keep key paths matching the settings structs exactly
- Avoid nesting tables where the schema expects scalars
When it happens
Trigger: A config.toml entry whose dotted key path collides with a non-map value in the settings schema (e.g. overriding a scalar field as a table), or a key that `config::Builder::set_override` cannot parse/insert during the `absolute path` fold in load
Common situations: Hand-edited config.toml with a typo'd or malformed key like `extra_header..foo`, or nesting a table where the schema expects a string, after moving to a config layout not supported by the current atuin version
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- issue in stats average query
- issue in stats exits query
- issue in stats day of week query
- issue in stats duration over time query
- the vector is not empty
AI-assisted analysis of atuinsh/atuin@c0c717ab04 (2026-09-12).
Data as JSON: /api/errors/572bf656792f0725.
Report an issue: GitHub.