Generate the clusters data from the Google Doc, with no hand edits
data/clusters_v4.json now comes straight from the Clusters v4.1 Google Doc, with no hand edits. Before this change, re-running the parser would have emptied Cluster 11, added false sub-clusters and undone earlier hand fixes.
Parser fixes
- Handles four formatting quirks in the doc, in Clusters 2, 7, 10 and 11.
- Keeps references separate when two sub-clusters share a name. Both "Reflexivity and positionality" sections were showing one combined list.
- Tidies citations returned by doi.org: stray whitespace, "Portico" given as the publisher, surnames in capitals, and a conference title cut off at a line break.
Corrections made in the Google Doc
- The Cluster 2 count, now 7.
- All nine reference fixes from #838, which existed only in the JSON.
- The doubled DOI prefix on Hong & Reed.
What visitors will notice
- The stated sub-cluster count now matches the list on every cluster page, which replaces #980.
- Cluster 10's description no longer starts with the editor's note.
- Clusters 3 and 10 drop from 133 to 115 and from 194 to 180 references, because each now lists only its own. Total entries go from 1,330 to 1,300.
- Three new references from the doc appear: Wuttke 2018, Krähmer 2026 and Kwon 2026.
- Hicks et al. loses its "Ten principles…" note, because entries with a working DOI use the looked-up citation.
Keeping it this way: CONTRIBUTING.md and the parser's docstring now say not to edit the generated files by hand. A new workflow runs the parser tests and the count test (moved from #980) on PRs that touch this data. It can't detect a hand edit that passes those tests, so that part is a rule, not a check.
Verified: the output comes from running the parser against the live doc, using the local DOI cache. All 11 stated counts match, where a cluster states one. The cluster tests pass, a local build (Hugo 0.164) succeeds, and check_seo_html.py exits cleanly.
Timing: data/clusters_v4.json is in the data artifact, so the new text reaches forrt.org after the next data-processing run on main.
🤖 Generated with Claude Code