v2 chunk 2a iter 1: rules 6+18 — ed. invariant, expand publishers

Two prompt edits to SYSTEM_PROMPT_NOTES driven by chunk 1 smoke test
gaps on chapter_first_doyle.toml.

Rule 6 (chapter form) expanded with an explicit invariance statement:
"ed." is the canonical abbreviation regardless of editor count — do
NOT pluralize to "eds." for multiple editors. CMOS NB treats it as
an invariant abbreviation, not a number-agreeing word.

New rule 18 (publisher expansion) mirrors v1 formatter.py rule 14:
publisher names must be in full canonical form, with note-form-
specific examples ("U of Chicago Press" → "University of Chicago
Press"). Includes the same MIT Press / ALA Editions / MLA carve-out
for publishers whose canonical self-presentation legitimately uses
initials.

Two new prompt-content unit tests added to tests/test_note_formatter.py
following the v1 test_formatter.py discipline. TDD cycle: red-green-
verified end-to-end.

Real-API smoke test, 3 v2 exemplars × 2 runs each: 6/6 byte-perfect
matches (was 4/6 in chunk 1; chapter_first_doyle went 0/2 → 2/2,
book and journal still 2/2). v1 untouched, 96/96 v1 tests still
passing. Total suite: 116/116.
This commit is contained in:
Mark Eaton
2026-04-11 18:27:55 -04:00
parent 28ca3ac928
commit d061f78b7f
2 changed files with 53 additions and 3 deletions
+21 -3
View File
@@ -99,9 +99,13 @@ Rules you must follow (CMOS 18th edition specifically, NOTE form):
6. CHAPTER IN EDITED BOOK NOTE FORM: 6. CHAPTER IN EDITED BOOK NOTE FORM:
Author, "Chapter Title," in *Book Title*, ed. Editor Names Author, "Chapter Title," in *Book Title*, ed. Editor Names
(Publisher, Year), specific-page. (Publisher, Year), specific-page.
Use "ed." (abbreviated), NOT "Edited by". The lowercase "in" Use "ed." (abbreviated), NOT "Edited by". The abbreviation "ed."
before the italicized book title is part of CMOS note form is INVARIANT — use "ed." even when there are multiple editors.
and should appear as shown. Do NOT pluralize to "eds." regardless of editor count. CMOS NB
note form treats "ed." as an unchanging abbreviation, not a
grammatical word that agrees in number with its referent.
The lowercase "in" before the italicized book title is part of
CMOS note form and should appear as shown.
7. TRANSLATED WORKS use "trans." (abbreviated), NOT "Translated by". 7. TRANSLATED WORKS use "trans." (abbreviated), NOT "Translated by".
@@ -168,6 +172,20 @@ Rules you must follow (CMOS 18th edition specifically, NOTE form):
missing in the source, leave it missing. Do not fabricate missing in the source, leave it missing. Do not fabricate
authors, publishers, years, page numbers, URLs, or DOIs. authors, publishers, years, page numbers, URLs, or DOIs.
18. PUBLISHER NAMES must be in FULL canonical form. Do NOT abbreviate.
If the messy input contains an abbreviated form, EXPAND it to the
canonical full name. Examples:
- "U of Chicago Press""University of Chicago Press"
- "OUP""Oxford University Press"
- "CUP""Cambridge University Press"
- "HMC""Houghton Mifflin Company"
- "Random House" stays "Random House" (already canonical)
- "Pantheon Books" stays "Pantheon Books" (already canonical)
The exception: publishers whose canonical self-presentation
legitimately uses initials (e.g., "MIT Press", "ALA Editions",
"MLA") stay in that form. When in doubt, prefer the longer
form over the abbreviation.
Output ONLY the single reformatted note. No preamble, no explanation, Output ONLY the single reformatted note. No preamble, no explanation,
no leading number, no code fences. no leading number, no code fences.
""" """
+32
View File
@@ -53,6 +53,38 @@ def test_system_prompt_mentions_no_ibid():
assert "Ibid" in SYSTEM_PROMPT_NOTES or "ibid" in SYSTEM_PROMPT_NOTES.lower() assert "Ibid" in SYSTEM_PROMPT_NOTES or "ibid" in SYSTEM_PROMPT_NOTES.lower()
def test_system_prompt_mentions_publisher_full_form():
"""Surfaced by chunk 1 smoke test on chapter_first_doyle: the formatter
preserved 'U of Chicago Press' from the messy input instead of
expanding it to 'University of Chicago Press'. v1 formatter.py rule 14
covers this; the v2 prompt must too. The rule is "publisher names must
be in full canonical form, not abbreviated."
"""
lower = SYSTEM_PROMPT_NOTES.lower()
assert "publisher" in lower
# Either "do not abbreviate" or "full canonical" or "full form" — any
# phrasing that conveys the prohibition.
assert (
"do not abbreviate" in lower
or "not abbreviated" in lower
or "full canonical" in lower
or "full form" in lower
)
def test_system_prompt_mentions_ed_invariant_for_multiple_editors():
"""Surfaced by chunk 1 smoke test on chapter_first_doyle: the formatter
pluralized 'ed.' to 'eds.' when there were two editors. CMOS NB form
uses 'ed.' invariantly regardless of editor count. The prompt must
explicitly state this so the model does not grammatically pluralize
by default.
"""
# Search for an explicit mention of "eds." being wrong, OR an explicit
# statement that "ed." is invariant / not pluralized.
lower = SYSTEM_PROMPT_NOTES.lower()
assert "eds." in lower or "invariant" in lower or "do not pluralize" in lower or "not pluralize" in lower
def test_build_user_message_contains_the_messy_input(): def test_build_user_message_contains_the_messy_input():
msg = build_user_message("yu, charles. interior chinatown. 2020, 45") msg = build_user_message("yu, charles. interior chinatown. 2020, 45")
assert "yu, charles. interior chinatown. 2020, 45" in msg assert "yu, charles. interior chinatown. 2020, 45" in msg