Files
cmos/exemplars
Mark Eaton 1d970e84f9 exemplars: canary for CMOS 8.159 preposition rule (Huttunen, Mehra)
Two new real-draft-derived journal exemplars locking down prompt
rule 29 from the preceding commit. Follows the Hasanah precedent
for promoting real-draft failures into the canary corpus, per the
"defense in depth" feedback in project memory.

- journal_preposition_huttunen.toml exercises "among" mid-title,
  plus four other CMOS 8.159 lowercased words ("on", "in", "a",
  and implicitly "among"). Real article: Huttunen and Kortelainen,
  JASIST 72, no. 7 (2021). The messy_input uses the ASCII hyphen
  in "Meaning-Making" for clarity — the source draft actually had
  a U+2010 non-breaking hyphen from docx->txt conversion, but
  mixing Unicode hyphen normalization into this exemplar would
  have conflated two independent failure modes. The U+2010 issue
  is noted in the exemplar comment for a separate iteration.

- journal_preposition_mehra.toml exercises "beyond" mid-title,
  plus mid-title exclamation-point preservation (rule 25) and
  leading-"The" drop from "The Library Quarterly" (rule 17).
  Real article: Mehra, Library Quarterly 91, no. 2 (2021).

Both are canary-enabled and will block any future prompt iteration
that regresses on these patterns via the exact-match canary axis.
The canonical dicts additionally lock them down via the field-
level diff, per the upstream-refinement feedback in project
memory.

Canary corpus size: 15 -> 17.
2026-04-11 15:30:02 -04:00
..

Exemplars

Each .toml file is one exemplar: a messy input, a canonical structured record, and an expected CMOS 18 bibliography string.

Format

# IMPORTANT: all top-level keys (including expected_bibliography) must come
# BEFORE any [section] header, or TOML will absorb them into that section.
source = "Purdue OWL CMOS 18 NB PDF, p. X"   # provenance, required
type = "book"                                # book | journal | chapter | web | ai | ...
tags = ["book", "single-author"]
canary = false                               # if true, exact-string match required
messy_input = "..."
expected_bibliography = "Last, First. *The Book Title*. Publisher Name, 2023."

[canonical]
# Structured fields for the field-level diff. Fields vary by type.
author = "Last, First"
title = "The Book Title"
publisher = "Publisher Name"
year = 2023

Primary sources