diff --git a/.gitattributes b/.gitattributes
index bfa9acb..c740f4e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -7,3 +7,9 @@
# Shell scripts and the Node guard must stay LF even on Windows checkouts — bash chokes on
# CRLF (\r), which breaks the guard/install tests under Git Bash on windows-latest.
*.sh text eol=lf
+
+# Diagram sources and their SVG exports are content-addressed: docs/diagrams/diagrams.json
+# records each source's sha256 and the docs-site copies must be byte-identical. A Windows
+# checkout (core.autocrlf) would rewrite them with CRLF and every receipt would read stale.
+docs/diagrams/** text eol=lf
+mintlify/images/diagrams/*.svg text eol=lf
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f7c1f62..7980f5e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,13 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
+### Fixed
+
+- **The diagram check passes on a Windows checkout.** With `core.autocrlf`, Git checked the
+ diagram sources out with CRLF line endings. Their sha256 then differed from the receipts in
+ `docs/diagrams/diagrams.json`, so all thirteen diagrams read as changed. `.gitattributes` now
+ keeps `docs/diagrams/` and the docs-site SVG copies LF on every platform.
+
## [1.7.0] - 2026-09-26
### Fixed
diff --git a/mintlify/changelog/overview.mdx b/mintlify/changelog/overview.mdx
index 40a2abf..ce8e548 100644
--- a/mintlify/changelog/overview.mdx
+++ b/mintlify/changelog/overview.mdx
@@ -18,6 +18,16 @@ This page is generated from `CHANGELOG.md` by `forge docs render`, and `forge do
CI when it falls behind, so it cannot drift from the release notes again.
{/* forge:render:changelog:begin (generated by `forge docs render` — do not edit) */}
+
+
+**Fixed**
+
+- **The diagram check passes on a Windows checkout.**
+
+[Full notes for Unreleased →](https://github.com/CodeWithJuber/forgekit/blob/HEAD/CHANGELOG.md#unreleased)
+
+
+
**Fixed**
diff --git a/test/diagrams.test.js b/test/diagrams.test.js
index 5a0454d..eef0309 100644
--- a/test/diagrams.test.js
+++ b/test/diagrams.test.js
@@ -1,6 +1,7 @@
// The Archify diagram pipeline (scripts/diagrams.mjs): the offline receipt check, source
// naming, the gallery page, and the docs-check rules for embeds and hand-written Mermaid.
import assert from "node:assert/strict";
+import { execFileSync } from "node:child_process";
import { createHash } from "node:crypto";
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
@@ -160,3 +161,19 @@ test("the repository's diagrams match their receipts and are embedded where the
for (const d of manifest.diagrams)
assert.ok(d.usedIn.length >= 1, `${d.id} is embedded somewhere`);
});
+
+test("diagram sources and SVGs check out with LF everywhere (receipts hash exact bytes)", () => {
+ const paths = [
+ "docs/diagrams/src/core-loop.workflow.json",
+ "docs/diagrams/diagrams.json",
+ "docs/diagrams/core-loop.svg",
+ "mintlify/images/diagrams/system.svg",
+ ];
+ const out = execFileSync("git", ["check-attr", "eol", "--", ...paths], {
+ cwd: BRAND.root,
+ encoding: "utf8",
+ });
+ const lines = out.trim().split(/\r?\n/);
+ assert.equal(lines.length, paths.length);
+ for (const line of lines) assert.match(line, /: eol: lf$/, line);
+});