atuinsh/atuin · error

expected to decode {version} record, found v{real_version}

Error message

expected to decode {version} record, found v{real_version}

What it means

Error "expected to decode {version} record, found v{real_version}" thrown in atuinsh/atuin.

Source

Thrown at crates/atuin-client/src/history.rs:291

            self.deleted_at.map(|d| d.unix_timestamp_nanos() as u64),
            encode::write_u64,
        )?;
        encode::write_str(&mut output, self.author.as_str())?;
        encode::write_optional(&mut output, self.intent.as_deref(), encode::write_str)?;
        encode::write_optional(&mut output, self.shell.as_deref(), encode::write_str)?;
        Ok(DecryptedData(output.into_vec()))
    }

    pub fn deserialize(bytes: &[u8], version: &str) -> Result<History> {
        let Some(version) = Version::from_name(version) else {
            bail!("unknown version {version:?}");
        };

        let mut bytes = Bytes::new(bytes);

        let real_version = decode::read_u16(&mut bytes).map_err(DecodeError::from)?;
        if real_version != version.as_int() {
            bail!("expected to decode {version} record, found v{real_version}");
        }

        let nfields = decode::read_array_len(&mut bytes).map_err(DecodeError::from)?;
        let min_fields = version.min_fields();
        if nfields < min_fields || version.max_fields().is_some_and(|max| nfields > max) {
            bail!("unexpected number of fields ({nfields}) for history version {version}");
        }

        let id = decode::read_string(&mut bytes)?;
        let timestamp = decode::read_u64(&mut bytes).map_err(DecodeError::from)?;
        let duration = decode::read_int(&mut bytes).map_err(DecodeError::from)?;
        let exit = decode::read_int(&mut bytes).map_err(DecodeError::from)?;

        let command = decode::read_string(&mut bytes)?;
        let cwd = decode::read_string(&mut bytes)?;
        let session = decode::read_string(&mut bytes)?;
        let hostname = decode::read_string(&mut bytes)?;
        let deleted_at = decode::read_optional(&mut bytes, decode::read_u64)?;

View on GitHub (pinned to 15fe1318f1)

Solutions

  1. The record was encoded with a different version than expected; upgrade atuin or re-sync the store.

When it happens

Trigger: Fires when a record advertises one history version but the decoded data carries a different version.

Common situations: See trigger scenarios.


AI-assisted analysis of atuinsh/atuin@15fe1318f1 (2026-08-19). Data as JSON: /api/errors/a3b4ec7fd93a416b. Report an issue: GitHub.