{"record":{"id":"dac1dc32e00f90b2","repo":"jdx/mise","slug":"history-is-disabled-history-enabled-false-dac1dc","errorCode":null,"errorMessage":"history is disabled (history.enabled = false)","messagePattern":"history is disabled \\(history\\.enabled = false\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/dotfiles/save.rs","lineNumber":73,"sourceCode":"        match self.capture(store, tracked, draft) {\n            Ok(()) => Ok(()),\n            Err(err) if self.best_effort => {\n                warn!(\"history save: {err:#}\");\n                Ok(())\n            }\n            Err(err) => Err(err),\n        }\n    }\n\n    async fn save(self) -> Result<()> {\n        let trigger = match self.trigger.as_str() {\n            \"save\" => Trigger::Save,\n            \"agent\" => Trigger::Agent,\n            \"update\" => Trigger::Update,\n            other => bail!(\"unknown trigger {other:?}; use save, agent, or update\"),\n        };\n        if !crate::config::Settings::get().history.enabled {\n            bail!(\"history is disabled (history.enabled = false)\");\n        }\n        let (store, tracked, entries) = super::history::open().await?;\n        if !self.paths.is_empty() {\n            let walk = tracked.walk()?;\n            for path in &self.paths {\n                let path = normalize_target(path);\n                let captured = walk.files.keys().any(|file| file.starts_with(&path));\n                if !captured {\n                    // saving a deleted manual-save path saves the deletion,\n                    // provided the path was captured before (a path that\n                    // never existed is not a deletion)\n                    let deletion = tracked\n                        .entry_for(&path)\n                        .is_some_and(|entry| !entry.policy.autosave)\n                        && std::fs::symlink_metadata(&path)\n                            .is_err_and(|err| err.kind() == std::io::ErrorKind::NotFound)\n                        && previously_captured(&store, &entries, &path)?;\n                    if deletion {","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/cli/dotfiles/save.rs#L55-L91","documentation":"Dotfile checkpoint saving requires the history subsystem to be enabled via the history.enabled setting. When the setting is false, save refuses to run because checkpoints could not be recorded. This is an explicit opt-out guard, not a malfunction.","triggerScenarios":"Running any `mise dot save ...` while `history.enabled = false` in mise settings (settings.toml, config, or MISE_ env override).","commonSituations":"Users who disabled dotfile history earlier and forgot; shared config files with history disabled; CI environments where history is disabled by default policy.","solutions":["Enable history: run `mise settings set history.enabled true` or set it in the active config","If history should stay disabled, do not use dot save; manage dotfiles manually"],"exampleFix":"# before (~/.config/mise/config.toml)\n[history]\nenabled = false\n# after\n[history]\nenabled = true","handlingStrategy":"validation","validationCode":"enabled=$(mise settings get history.enabled)\n[ \"$enabled\" = \"true\" ] || { echo \"history disabled\"; exit 1; }","typeGuard":null,"tryCatchPattern":"if ! mise dot save update 2>err.log; then\n  grep -q 'history is disabled' err.log && mise settings set history.enabled true\nfi","preventionTips":["Keep history.enabled true on machines that use dot commands","Document the dependency of dot save/sync/track --encrypt on history","Check settings after applying shared configs"],"tags":["cli","config","dotfiles","history-disabled"],"backgroundTag":"feature-not-enabled","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}