"Preprint" in the venue line directly above a PREPRINT chip was a labelling
error: the venue says what the document is, so the chip should say what the
link yields. All four paper links are the full text, hosted here, so they
are labelled that way; Code, Calculator, and Artifact are unchanged. Fixes
the same redundancy on the CV, which read "Preprint. [Preprint]" and
"Technical report … [Report]".
The venue line is now roman. Citation convention italicizes journal and book
titles but not conference names or status words, and publications.yml
already marks the journal names it wants italic — so a blanket italic on the
line flattened that distinction (italic nested in italic reads as nothing)
and set "Preprint" in a register reserved for titles. Roman lets the data
carry the emphasis, and JAMIA's full name now actually renders italic inside
a roman line.
Role and degree lines lose their italic too. The size step down from the
title and the muted ink already separate them, so it was emphasis on a line
that only labels. The two font-style resets that existed solely to escape
these italics are gone with them.
Italic on these pages is now either data-level <em> or the dagger footnote.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SUGesXiMmACsLBTGG1xuEU
Two specificity collisions, both invisible in the markup and both my fault
for styling with bare class selectors on a surface that typography.css owns
through #markdownBody:
#markdownBody :is(h1..h6) (1,0,1) beat .vita-entry-title (0,1,0)
#markdownBody p + p (1,0,2) beat .vita-role etc. (0,1,0)
So entry titles rendered at 1.45rem sans with 2.475rem heading margins
instead of 1rem serif — the "too much space" and the odd text sizes — and
every second paragraph in a card picked up the 1.5em essay prose indent,
which is the strange horizontal offset on the date lines.
now.css never hits either, because Now uses no heading elements inside its
cards and emits one paragraph per card. The vita keeps its headings, since a
record page wants a real document outline, and pays with specificity: every
rule is now #markdownBody-scoped, and card paragraphs reset text-indent
outright.
Also restructured onto the layout item-card.css already establishes: title
and date share a baseline with the date flush right, and role, location and
GPA collapse onto one line beneath it, instead of stacking title / role /
lone indented date. Dates moved from <time> to <span> — half of them are
"Fall 2024", "expected 2028" or "Present", which have no valid datetime
value, and a <time> without one is worse than none.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SUGesXiMmACsLBTGG1xuEU
The vita page carried a hand-typed duplicate of education, publications,
presentations, and experience, and had drifted from the PDFs in about
fifteen places — Shu Lab still one entry titled "Undergraduate
Researcher" three months after the degree, Weenix at ~7,000 lines, CHASE
still "accepted" after being presented, a preprint missing entirely, and
two different code URLs for the same paper.
build/Vita.hs reads yaml-source/data/*.yml — the same files the PDF
pipeline builds from — and renders education, experience (keeping the
CV's research/industry split), publications, presentations, and contact.
Drift is now structurally impossible rather than merely discouraged.
Notes on the implementation:
- The YAML is LaTeX-flavoured because xelatex is its first consumer, so
values pass through a small closed converter (\textbf, \textit,
\texttt, \href, $\times$, $\delta$, \#, {,}, ~, --, ---). Escaping
happens before conversion; unhandled commands pass through visibly
rather than silently dropping their argument.
- Scalars are parsed loosely: the same logical field is sometimes a YAML
number and sometimes a string (`year: 2026` vs `year: "2026--2027"`),
and the PDF pipeline does not care, so this does not force it to.
- personal.yml's phone number is deliberately not read. It is printed on
the CV, which is handed to a chosen reader; this page is crawled.
- Contact chips carry labels (ORCID, Forgejo, GitHub) rather than the
CV's full display values, which exist because paper cannot be clicked.
The page keeps only what nothing else on the site owns: the pointers and
the four research threads. In-progress work belongs to /current, the
engineering index to /cv/projects/, and the narrative to /me/ — whose
abstract already described this page as the formal record.
vita.css composes on item-card.css and mirrors now.css's headings and
chip geometry, so /about and /current read as one system. Link chips get
the only interaction polish on the page, being the one affordance a
printed CV cannot offer.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SUGesXiMmACsLBTGG1xuEU