Index: ruff/crates/ruff_linter/src/checkers/ast/analyze/definitions.rs
===================================================================
--- ruff.orig/crates/ruff_linter/src/checkers/ast/analyze/definitions.rs
+++ ruff/crates/ruff_linter/src/checkers/ast/analyze/definitions.rs
@@ -56,7 +56,6 @@ pub(crate) fn definitions(checker: &mut
         Rule::NoBlankLineBeforeFunction,
         Rule::NoBlankLineBeforeSection,
         Rule::NoSignature,
-        Rule::NonImperativeMood,
         Rule::OneBlankLineAfterClass,
         Rule::OneBlankLineBeforeClass,
         Rule::OverIndentation,
@@ -242,13 +241,6 @@ pub(crate) fn definitions(checker: &mut
             if checker.enabled(Rule::EndsInPeriod) {
                 pydocstyle::rules::ends_with_period(checker, &docstring);
             }
-            if checker.enabled(Rule::NonImperativeMood) {
-                pydocstyle::rules::non_imperative_mood(
-                    checker,
-                    &docstring,
-                    &checker.settings.pydocstyle.property_decorators,
-                );
-            }
             if checker.enabled(Rule::NoSignature) {
                 pydocstyle::rules::no_signature(checker, &docstring);
             }
Index: ruff/crates/ruff_linter/src/rules/pydocstyle/rules/non_imperative_mood.rs
===================================================================
--- ruff.orig/crates/ruff_linter/src/rules/pydocstyle/rules/non_imperative_mood.rs
+++ ruff/crates/ruff_linter/src/rules/pydocstyle/rules/non_imperative_mood.rs
@@ -1,115 +0,0 @@
-use std::collections::BTreeSet;
-
-use imperative::Mood;
-use once_cell::sync::Lazy;
-
-use ruff_diagnostics::{Diagnostic, Violation};
-use ruff_macros::{derive_message_formats, violation};
-use ruff_python_ast::call_path::{from_qualified_name, CallPath};
-use ruff_python_semantic::analyze::visibility::{is_property, is_test};
-use ruff_source_file::UniversalNewlines;
-use ruff_text_size::Ranged;
-
-use crate::checkers::ast::Checker;
-use crate::docstrings::Docstring;
-use crate::rules::pydocstyle::helpers::normalize_word;
-
-static MOOD: Lazy<Mood> = Lazy::new(Mood::new);
-
-/// ## What it does
-/// Checks for docstring first lines that are not in an imperative mood.
-///
-/// ## Why is this bad?
-/// [PEP 257] recommends that the first line of a docstring be written in the
-/// imperative mood, for consistency.
-///
-/// Hint: to rewrite the docstring in the imperative, phrase the first line as
-/// if it were a command.
-///
-/// This rule may not apply to all projects; its applicability is a matter of
-/// convention. By default, this rule is enabled when using the `numpy` and
-/// `pep257` conventions, and disabled when using the `google` conventions.
-///
-/// ## Example
-/// ```python
-/// def average(values: list[float]) -> float:
-///     """Returns the mean of the given values."""
-/// ```
-///
-/// Use instead:
-/// ```python
-/// def average(values: list[float]) -> float:
-///     """Return the mean of the given values."""
-/// ```
-///
-/// ## Options
-/// - `pydocstyle.convention`
-///
-/// ## References
-/// - [PEP 257 – Docstring Conventions](https://peps.python.org/pep-0257/)
-///
-/// [PEP 257]: https://peps.python.org/pep-0257/
-#[violation]
-pub struct NonImperativeMood {
-    first_line: String,
-}
-
-impl Violation for NonImperativeMood {
-    #[derive_message_formats]
-    fn message(&self) -> String {
-        let NonImperativeMood { first_line } = self;
-        format!("First line of docstring should be in imperative mood: \"{first_line}\"")
-    }
-}
-
-/// D401
-pub(crate) fn non_imperative_mood(
-    checker: &mut Checker,
-    docstring: &Docstring,
-    property_decorators: &BTreeSet<String>,
-) {
-    let Some(function) = docstring.definition.as_function_def() else {
-        return;
-    };
-
-    let property_decorators = property_decorators
-        .iter()
-        .map(|decorator| from_qualified_name(decorator))
-        .collect::<Vec<CallPath>>();
-
-    if is_test(&function.name)
-        || is_property(
-            &function.decorator_list,
-            &property_decorators,
-            checker.semantic(),
-        )
-    {
-        return;
-    }
-
-    let body = docstring.body();
-
-    // Find first line, disregarding whitespace.
-    let first_line = match body.trim().universal_newlines().next() {
-        Some(line) => line.as_str().trim(),
-        None => return,
-    };
-
-    // Find the first word on that line and normalize it to lower-case.
-    let first_word_norm = match first_line.split_whitespace().next() {
-        Some(word) => normalize_word(word),
-        None => return,
-    };
-    if first_word_norm.is_empty() {
-        return;
-    }
-
-    if matches!(MOOD.is_imperative(&first_word_norm), Some(false)) {
-        checker.diagnostics.push(Diagnostic::new(
-            NonImperativeMood {
-                first_line: first_line.to_string(),
-            },
-            docstring.range(),
-        ));
-    }
-}
Index: ruff/crates/ruff_linter/Cargo.toml
===================================================================
--- ruff.orig/crates/ruff_linter/Cargo.toml
+++ ruff/crates/ruff_linter/Cargo.toml
@@ -38,7 +38,6 @@ colored = { workspace = true }
 fern = { version = "0.6.1" }
 glob = { workspace = true }
 globset = { workspace = true }
-imperative = { version = "1.0.4" }
 is-macro = { workspace = true }
 itertools = { workspace = true }
 libcst = { workspace = true }
Index: ruff/crates/ruff_linter/src/codes.rs
===================================================================
--- ruff.orig/crates/ruff_linter/src/codes.rs
+++ ruff/crates/ruff_linter/src/codes.rs
@@ -516,7 +516,6 @@ pub fn code_to_rule(linter: Linter, code
         (Pydocstyle, "300") => (RuleGroup::Unspecified, rules::pydocstyle::rules::TripleSingleQuotes),
         (Pydocstyle, "301") => (RuleGroup::Unspecified, rules::pydocstyle::rules::EscapeSequenceInDocstring),
         (Pydocstyle, "400") => (RuleGroup::Unspecified, rules::pydocstyle::rules::EndsInPeriod),
-        (Pydocstyle, "401") => (RuleGroup::Unspecified, rules::pydocstyle::rules::NonImperativeMood),
         (Pydocstyle, "402") => (RuleGroup::Unspecified, rules::pydocstyle::rules::NoSignature),
         (Pydocstyle, "403") => (RuleGroup::Unspecified, rules::pydocstyle::rules::FirstLineCapitalized),
         (Pydocstyle, "404") => (RuleGroup::Unspecified, rules::pydocstyle::rules::DocstringStartsWithThis),
Index: ruff/crates/ruff_linter/src/rules/pydocstyle/mod.rs
===================================================================
--- ruff.orig/crates/ruff_linter/src/rules/pydocstyle/mod.rs
+++ ruff/crates/ruff_linter/src/rules/pydocstyle/mod.rs
@@ -51,7 +51,6 @@ mod tests {
     #[test_case(Rule::UnderIndentation, Path::new("D.py"))]
     #[test_case(Rule::EmptyDocstring, Path::new("D.py"))]
     #[test_case(Rule::EmptyDocstringSection, Path::new("sections.py"))]
-    #[test_case(Rule::NonImperativeMood, Path::new("D401.py"))]
     #[test_case(Rule::NoBlankLineAfterSection, Path::new("D410.py"))]
     #[test_case(Rule::OneBlankLineAfterClass, Path::new("D.py"))]
     #[test_case(Rule::OneBlankLineBeforeClass, Path::new("D.py"))]
Index: ruff/crates/ruff_linter/src/rules/pydocstyle/settings.rs
===================================================================
--- ruff.orig/crates/ruff_linter/src/rules/pydocstyle/settings.rs
+++ ruff/crates/ruff_linter/src/rules/pydocstyle/settings.rs
@@ -29,7 +29,6 @@ impl Convention {
                 Rule::MultiLineSummarySecondLine,
                 Rule::SectionUnderlineNotOverIndented,
                 Rule::EndsInPeriod,
-                Rule::NonImperativeMood,
                 Rule::DocstringStartsWithThis,
                 Rule::NewLineAfterSectionName,
                 Rule::DashedUnderlineAfterSection,
Index: ruff/crates/ruff_linter/src/rules/pydocstyle/rules/mod.rs
===================================================================
--- ruff.orig/crates/ruff_linter/src/rules/pydocstyle/rules/mod.rs
+++ ruff/crates/ruff_linter/src/rules/pydocstyle/rules/mod.rs
@@ -11,7 +11,6 @@ pub(crate) use multi_line_summary_start:
 pub(crate) use newline_after_last_paragraph::*;
 pub(crate) use no_signature::*;
 pub(crate) use no_surrounding_whitespace::*;
-pub(crate) use non_imperative_mood::*;
 pub(crate) use not_empty::*;
 pub(crate) use not_missing::*;
 pub(crate) use one_liner::*;
@@ -32,7 +31,6 @@ mod multi_line_summary_start;
 mod newline_after_last_paragraph;
 mod no_signature;
 mod no_surrounding_whitespace;
-mod non_imperative_mood;
 mod not_empty;
 mod not_missing;
 mod one_liner;
