
Operating The Frank Papers — Research, Dossiers, and Publishing
Last updated 2026-07-15 ·faa3f99
This is the operational companion to Building The Frank Papers. That post explains why there’s a third series and what the dossier gate is for. This one is the cookbook: scaffold, dossier, prose, cover, ship.
graph TD
subgraph repo["Repository"]
scaffold["blog/content/docs/papers/NN-slug/index.md"]
dossier["docs/papers-dossiers/NN-slug/dossier.md"]
cover["blog/static/images/papers/NN-*.png"]
end
subgraph gate["Dossier Gate"]
validate["scripts/validate-dossier.py"]
sections["§1–§6 skeleton<br/>frontmatter checks"]
bib["§8 bibliography<br/>references correct"]
end
subgraph publish["Publish"]
hugo["hugo build<br/>0 errors"]
shortcodes["papers/ shortcodes<br/>6 available"]
commit["commit + push<br/>(CI rebuilds blog)"]
end
scaffold --> validate
dossier --> validate
validate -->|"passes"| shortcodes
shortcodes --> hugo
cover --> hugo
hugo --> commit
What Ready to Write Looks Like
blog/content/docs/papers/NN-slug/index.mdexists withseries: papersfrontmatter and the §1–§6 skeleton.docs/papers-dossiers/NN-slug/dossier.mdexists.python scripts/validate-dossier.py docs/papers-dossiers/NN-slug/dossier.mdexits 0.
Steps
Scaffold a New Paper
# Create the paper bundle
hugo new content/docs/papers/NN-slug/index.md
# Create the dossier directory
mkdir -p docs/papers-dossiers/NN-slug/
touch docs/papers-dossiers/NN-slug/dossier.mdWrite and Validate the Dossier
The dossier.md has sections: Problem Statement, Existing Solutions, Vendors Considered, Selection Criteria, Selected Approach, Open Questions.
python scripts/validate-dossier.py docs/papers-dossiers/NN-slug/dossier.mdThe gate checks that every required section is present and above a minimum length. It exits non-zero if anything is missing — the PR check enforces this before review.
Use the Paper Shortcodes
| Shortcode | When to Use |
|---|---|
{{< papers/capability-matrix data="vendors" >}} | Vendor comparison table from data/vendors.yaml |
{{< papers/dossier-link paper="NN-slug" >}} | Link to the paper’s dossier |
{{< papers/landscape title="..." >}}...{{< /papers/landscape >}} | Mermaid architecture landscape |
{{< papers/pullquote source="..." >}}...{{< /papers/pullquote >}} | Key insight quote |
{{< papers/references-index >}} | Auto-generates §8 from dossier refs |
{{< papers/scar date="2026-Q1" >}}...{{< /papers/scar >}} | Notable decision scar |
Generate a Cover Image
The cover image lives at blog/static/images/papers/NN-descriptive-slug.png. Each Paper gets a unique AI-generated cover from a prompt composed by the blog-craft metaphor system. The prompt encodes the Paper’s central metaphor into Stable Diffusion syntax.
# The cover is generated as part of the blog-craft pipeline.
# See the building post for the prompt composition method.Publish
hugo # Must exit 0
git add blog/content/docs/papers/NN-slug/ \
docs/papers-dossiers/NN-slug/ \
blog/static/images/papers/NN-*.png
git commit -m "feat(papers): Paper NN — Title"Recover
Dossier Validation Fails
python scripts/validate-dossier.py docs/papers-dossiers/NN-slug/dossier.md --verboseCommon failures:
- Section below minimum word count — expand the analysis.
- Missing required section — add the section header and content.
- References don’t match
[@key]usage in prose — check §6 and §8 are in sync.
Cover Image Not Appearing
# Check the file exists at the expected path
ls -la blog/static/images/papers/NN-*.png
# Check the frontmatter reference
grep cover blog/content/docs/papers/NN-slug/index.mdWeight Collision with Another Paper
# Check weights across all papers
grep -h "weight:" blog/content/docs/papers/*/index.md | sort -t: -k2 -nWeights should be unique. If two papers share a weight, the sidebar ordering is undefined. faa3f993 was a dedicated fix for weight sorting bugs.
Missteps
| What we assumed | Why it was wrong | What it cost |
|---|---|---|
| Sidebar ordering follows directory numbering | Hugo uses weight: frontmatter for sidebar order, not the directory prefix. Duplicate weights caused random ordering in the Papers TOC. | Dedicated PR to fix weights and add a validator. |
| Dossier validation is a nice-to-have | Without the gate, papers reached review with missing sections or underdeveloped vendor analysis, wasting review cycles. | The CI check now blocks PRs with failing dossiers. |
| Mermaid diagrams render identically in Papers as in operating posts | Papers navigate via prev/next, not a sidebar, and the Mermaid CSS theme was tuned for operating posts initially. | Cross-series Mermaid styling had to be unified in custom.css. |
