docs: organise by Diátaxis mode, and keep the old URLs working - #12
Merged
Conversation
The docs mixed modes within single pages. `getting-started.md` taught a path, offered alternatives, and explained Kohonen's reasoning; `training-modes.md` was half reference and half explanation. Each page now commits to one mode: tutorial, how-to, reference or explanation. Two pages are split rather than moved. The separability argument and the measurements behind it come out of the neighborhood reference into explanation/why-isotropy-matters.md, and the security section comes out of the save-and-load how-to into explanation/artifact-safety.md. Three how-to pages are added for tasks 0.4.0 made possible: reproducing a result, saving and loading a map, and supplying a custom strategy. Every URL changed, so mkdocs-redirects maps the seven old paths onto the new ones. Two of those URLs are frozen in 0.3.0's PyPI description, which cannot be edited, so they would otherwise 404 permanently. mkdocs-redirects is pinned to 1.2.2 rather than the latest 1.2.3. The canonical repository, github.com/mkdocs/mkdocs-redirects (245 stars, active, not archived), has tags up to v1.2.2 and no v1.2.3. PyPI's 1.2.3 was published on 2026-03-28 declaring its source as github.com/ProperDocs/properdocs-redirects, a repository created 2026-03-14 with 3 stars: a version upstream never tagged, released from a repository that appeared two weeks earlier. 1.2.2's declared source is the canonical repository and matches its own v1.2.2 tag. Also removes 17 em dashes from the changelog and the two docs pages added in 0.4.0, trims bold used for emphasis mid-prose, and corrects the README, which still described scikit-learn as a dependency after 0.4.0 removed it. Content preservation was checked by comparing word frequencies across the whole docs tree before and after: three words drop, all accounted for by the two renames.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Each docs page now commits to one Diátaxis mode, and every old URL still works.
The problem
Pages mixed modes.
getting-started.mdtaught a path, offered alternatives, and explainedKohonen's reasoning.
training-modes.mdwas half reference, half explanation. Mixing modes in onedocument is the failure mode Diátaxis exists to name.
The new shape
tutorial/first-map.mdsave-and-load-a-map,reproduce-a-result,use-a-custom-strategyoptions,neighborhood-functions,api,changelogwhy-isotropy-matters,batch-vs-stepwise,artifact-safetyTwo pages are split rather than moved, which is the actual work:
explanation/why-isotropy-matters.md. A table of constants and a 900-word argument about why anouter product of Ricker wavelets is wrong are not the same kind of document.
explanation/artifact-safety.md. Someone saving a map wants three lines; someone deciding whetherto trust a file from a colleague wants the boundary spelled out.
Three how-to pages are new, for tasks 0.4.0 made possible.
Every URL changed, and two of them cannot afford to
mkdocs-redirectsmaps all seven old paths. Verified in the built site:This matters more than it looks. 0.3.0's PyPI description contains
/getting-started/and/neighborhood-functions/, and a PyPI description can never be edited. Without redirects thosetwo links 404 permanently, from an artifact nobody can correct.
A supply-chain finding on the plugin itself
I said I would confirm the plugin's provenance before adding it. Doing so turned up something, so
it is pinned to 1.2.2, not the latest 1.2.3:
mkdocs/mkdocs-redirectsProperDocs/mkdocs-redirectsPyPI's 1.2.3, published 2026-03-28, declares its source as the second repository — a version the
canonical project never tagged, released from a repo that appeared 14 days earlier, while the
original stayed active and un-archived. The declared source also moved across recent releases:
1.2.1 →
datarobot/, 1.2.2 →mkdocs/, 1.2.3 →ProperDocs/.1.2.2's declared source is the canonical repository and matches its own
v1.2.2tag, so that is thelast release whose provenance can be checked.
pyproject.tomlrecords this and says not to bump itwithout re-checking who publishes it.
Writing quality
Scanned every page. The pre-existing pages were clean at zero; the two pages I added in #10 and
#11 carried 17 em dashes between them, along with bold used for mid-prose emphasis. That habit
was mine and it is now gone:
clause explains, comma where it continues, full stop where it was propping up two sentences) rather
than substituted uniformly.
[Unreleased]cut from 19 spans to the entry lead-ins. It had ~10× the density of theshipped 0.3.0 section.
enumerations — "Gaussian, bubble and Mexican hat" is the actual list of three functions — and are
left alone.
Severity-5 findings across all documentation: 0.
Also
Corrects the README, which still said the package was "built on NumPy, with scikit-learn for PCA and
standardization" — false since #8 removed scikit-learn.
Verification
mkdocs build --strictexits 0. Worth stating precisely: my first check grepped stdout forERRORand reported clean while the build was actually failing on a warning about a broken imagepath.
--strictturns warnings into errors, so the exit code is the check.Three words drop, all explained by the two renames (
training-modes→batch-vs-stepwise, "Customstrategies" → "Use a custom strategy"). Vocabulary grew from 859 to 1015 distinct words.
ruff format/mypy --strictclean, bandit clean,pip-auditreports no known vulnerabilities, architecture profile
--strictpasses.