Repository: Automattic/harper (2026-03-19T16:15:12Z)

Issue:
Flag "date/dates back from" used when "date from" or "date back to" is meant
I saw "date back from" used somewhere today. It seems to be the result of confusing "date from" and "date back to".

Examples:
- there are too many open issues that **date back from** 4 years ago
- We have Perl scripts because they **date back from** back when Perl was a lot more popular than Python.
- However this code looks to **date back from** 2014.
- Seen a few occurrences of this error, but **date back from** several years ago
- The names setUp() and tearDown() also **date back from** this historical root.
- he licence here supercedes any licencing terms in the other READMEs, which **date back from** 1997 when I didn't understand licencing.
- This behavior **dates back from** 8.4 at least, and presumably since the beginning.
- Use of go-bindata **dates back from** times when people ran Cilium as static binary.
- misconfiguration message **dates back from** a time where LightningDataModule did not exist

Typical false positives:
- Is there any extension to this class which can calculate **Date back from** output of this program
- calculate **Date back from** Year , Month and ...
- This means when getting the **date back from** a client, it is a string
- The problem occurs when the pg adapter parses the **date back from** a WITHOUT TIME ZONE column
- Another option is a helper function to extract the **date back from** the encoded int column
- However, when I do this, I get **dates back from** Mongoid that are UTC + 4 hours instead of UTC.
- Convert **dates back from** ISO when parsed.

Ambiguous/unclear/confusing:
- Attributes **date back from** sometime around the start of this project.


Discussion:

Patch:
diff --git a/harper-core/src/linting/phrase_set_corrections/mod.rs b/harper-core/src/linting/phrase_set_corrections/mod.rs
index d9727a1a63..b518419872 100644
--- a/harper-core/src/linting/phrase_set_corrections/mod.rs
+++ b/harper-core/src/linting/phrase_set_corrections/mod.rs
@@ -574,6 +574,15 @@ pub fn lint_group() -> LintGroup {
             "Corrects `copywrite` to `copyright`. `Copywrite` refers to writing copy, while `copyright` is the legal right to creative works.",
             LintKind::WordChoice
         ),
+        "DateBackFrom" => (
+            &[
+                (&["date back from"], &["date from", "date back to"]),
+                (&["dates back from"], &["dates from", "dates back to"]),
+            ],
+            "Use `date from` or `date back to`, not `date back from`.",
+            "Corrects the blend of `date from` and `date back to` into the nonstandard `date back from`.",
+            LintKind::Usage
+        ),
         "DoubleEdgedSword" => (
             &[
                 (&["double edge sword", "double-edge sword", "double edge-sword", "double-edge-sword",


Test patch:
diff --git a/harper-core/src/linting/phrase_set_corrections/tests.rs b/harper-core/src/linting/phrase_set_corrections/tests.rs
index 9734ddfd09..3751ce79c7 100644
--- a/harper-core/src/linting/phrase_set_corrections/tests.rs
+++ b/harper-core/src/linting/phrase_set_corrections/tests.rs
@@ -1880,6 +1880,46 @@ fn copywrote() {
     );
 }
 
+// DateBackFrom
+
+#[test]
+fn corrects_date_back_from() {
+    assert_good_and_bad_suggestions(
+        "There are too many open issues that date back from 4 years ago.",
+        lint_group(),
+        &[
+            "There are too many open issues that date from 4 years ago.",
+            "There are too many open issues that date back to 4 years ago.",
+        ],
+        &[],
+    );
+}
+
+#[test]
+fn corrects_dates_back_from() {
+    assert_good_and_bad_suggestions(
+        "This code dates back from 2014.",
+        lint_group(),
+        &[
+            "This code dates from 2014.",
+            "This code dates back to 2014.",
+        ],
+        &[],
+    );
+}
+
+#[test]
+fn allows_date_back_to() {
+    assert_no_lints(
+        "These scripts date back to when Perl was popular.",
+        lint_group(),
+    );
+}
+
+// Note: "the date back from" and "get dates back from" are known false
+// positives where "date" is a noun (retrieving data). Phrase set matching
+// cannot distinguish these from the verb form. See issue #2864.
+
 // DoubleEdgedSword
 
 #[test]