Skip to content

docs: merge the duplicated printed-documents entry in AGENTS.md - #17

Merged
eduardstan merged 1 commit into
mainfrom
fm/lp-agents-printed-duplication
Jul 30, 2026
Merged

eduardstan merged 1 commit into
mainfrom
fm/lp-agents-printed-duplication

Conversation

@eduardstan

@eduardstan eduardstan commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Intent

AGENTS.md stated the printed-documents contract twice: two paragraphs both opening 'Three documents are printed: cv/cv.tex, cv/short.tex and cv/teaching.tex', which disagreed about what the contract promises. The user asked to resolve them into ONE entry with every claim from either paragraph surviving - explicitly NOT a plain deduplication. Required survivals, all preserved in the merged paragraph: (1) the second paragraph's GENERAL rule that a block too particular for a macro is a body fragment the documents \input, with cv/header.tex (contact block) and cv/supervision.tex (hand-set section) kept as its named instances - the general rule wins over the first paragraph's instance-only phrasing; (2) the first paragraph's constraint that only cv/cv.tex prints \cvAutoSections, that a variant is a curated subset, and that it still honours printed: false because it reaches every section through \cvpart; (3) the second paragraph's warning that a section declared under publications.sections for one document's sake changes the full CV AND the website, because each section subtracts the ones declared before it; (4) the layout-vs-curation line both paragraphs drew (entry count on \cvpart and a single-document \defbibfilter are layout; curation is marked on the fact, as selected is in content/publications.bib) - stated once instead of twice. Every claim was verified against the code before writing: cv/cv.tex:79 prints \cvAutoSections and neither variant does; cv/preamble.tex:243-249 shows \cvpart guards on \cvPrinted; scripts/build-cv-data.mjs:334-342 (afterEarlier) shows each section subtracts earlier ones; web/src/lib/cv-schema.ts:200-203 shows the website labels by first match, so the same declaration moves website labels too; cv/supervision.tex:4-7 states the body-fragment rule itself. No claim was found stale. Scope was deliberately limited to this one documentation entry: no TeX, generator, content or check was touched, and the printed PDFs must stay byte-identical. Verified locally: npm run check, npm test and npm run check:maintainer all exit 0, and all three built PDFs still match their data/cv-baseline/ entries. The diff is AGENTS.md only, 11 insertions and 18 deletions. Prose style intentionally follows the surrounding AGENTS.md voice (em dashes, the existing terminology), and AGENTS.md's own 'Maintaining this file' rule to prefer rewriting existing entries over appending is what this change carries out.

What Changed

  • Collapsed the two Three documents are printed: paragraphs in AGENTS.md into one entry, keeping every claim either paragraph made rather than dropping one wholesale.
  • The surviving paragraph keeps the general rule that a block too particular for a macro is a body fragment the documents \input (with cv/header.tex and cv/supervision.tex as its named instances), the constraint that only cv/cv.tex prints \cvAutoSections while still honouring printed: false through \cvpart, and the warning that a section declared under publications.sections for one document changes the full CV and the website; the layout-versus-curation line is now stated once instead of twice.
  • Documentation only — no TeX, generator, content or check was touched, and npm run check:maintainer still matches all three built PDFs against their data/cv-baseline/ entries.

Risk Assessment

✅ Low: Single documentation paragraph merge in AGENTS.md with every claim verified against the code it describes and no executable file touched.

Testing

Ran the repository's own AGENTS.md path check and the full targeted test set (npm test) after installing missing dependencies, then built all three printed documents with XeLaTeX and ran npm run check:maintainer, which confirmed every PDF still matches its recorded baseline — consistent with the diff touching only AGENTS.md, a file no build input reads. Because the change is prose, I also wrote a focused manual verification script proving the printed-documents entry now occurs exactly once, that all four required claims (general body-fragment rule with cv/header.tex and cv/supervision.tex as named instances, the \cvAutoSections-only-in-cv.tex constraint with its printed: false honouring, the publications.sections warning about the full CV and the website, and the layout-vs-curation line stated once) survive in the merged paragraph, and that each claim still matches the code it describes. Reviewer-visible visual evidence is a screenshot of the section rendered at both commits side by side, showing two contradicting entries before and one merged entry after. Everything passed; no findings.

  • Evidence: AGENTS.md printed-documents entry rendered before vs after (screenshot) (local file: /tmp/no-mistakes-evidence/01KYT21800MWRW550NAKXYKY5C/agents-md-before-after.png)
Evidence: Same before/after render as standalone HTML
<!doctype html><meta charset="utf-8"><title>AGENTS.md — printed-documents entry, before and after</title>
<style>
 body{font:15px/1.6 -apple-system,Segoe UI,Helvetica,Arial,sans-serif;color:#1f2328;background:#fff;margin:0;padding:32px}
 .cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:28px;align-items:start}
 .col{min-width:0;border:1px solid #d1d9e0;border-radius:8px;padding:20px}
 .tag{font:600 12px/1 ui-monospace,monospace;letter-spacing:.06em;text-transform:uppercase;padding:5px 9px;border-radius:999px;display:inline-block;margin-bottom:14px}
 .b .tag{background:#fff1e5;color:#9a3412}.a .tag{background:#e6f4ea;color:#0f5132}
 h1{font-size:20px;margin:0 0 6px}h2{font-size:17px;margin:0 0 12px;border-bottom:1px solid #d1d9e0;padding-bottom:6px}
 .lede{color:#59636e;margin:0 0 24px}
 code{background:#eff1f3;border-radius:5px;padding:.14em .35em;font:13px ui-monospace,SFMono-Regular,monospace}
 .entry{background:#fffdf3;border-left:3px solid #d4a72c;padding:2px 14px;margin:12px 0}
 .a .entry{background:#f2fbf5;border-left-color:#2da44e}
 p{margin:12px 0}
</style>
<h1>AGENTS.md — “Three documents are printed…” entry</h1>
<p class="lede">Rendered from the repository file at each commit. Highlighted blocks are the printed-documents entry: two contradicting copies before, one merged entry after.</p>
<div class="cols">
 <div class="col b"><span class="tag">before · 1f205fe</span><h2>One record, several publications</h2>
<p><code>content/</code> owns the record: every fact about the adopter, and which sections the CV prints. <code>content/README.md</code> documents it. The website in <code>web/</code> and every printed document in <code>cv/</code> consume the same <code>content/cv.yaml</code>, <code>content/publications.bib</code>, and <code>content/talks.bib</code>; posts and media live beside them. Replacing the record must not require editing outside <code>content/</code> — that is what <code>npm run check:adopter</code> proves.</p>
<p>Design is code, deliberately: the theme, the printed layout and its curated section headings, routes, redirects and announcement wording are all edited outside <code>content/</code>, and <code>README.md</code>'s "Make it yours" lists where. Do not move any of them into <code>content/</code>: that was considered and rejected, because layout and routes cannot follow and the boundary would blur again. The boundary is facts versus design — keep every document saying the same thing about it.</p>
<div class="entry"><p>Three documents are printed: <code>cv/cv.tex</code>, <code>cv/short.tex</code> and <code>cv/teaching.tex</code>. <code>cv/preamble.tex</code> holds every package, style and macro they share, <code>cv/header.tex</code> the contact block and <code>cv/supervision.tex</code> that hand-set section, so the printed design is written once. A document body is only which sections it curates, in what order, and how many entries of each. No fact is repeated per variant, and none may be. Only <code>cv/cv.tex</code> prints <code>\cvAutoSections</code>: a variant is a curated subset, so printing every section the body did not name is what it exists not to do — it still honours <code>printed: false</code>, because it reaches every section through <code>\cvpart</code>. An entry count on <code>\cvpart</code> and a <code>\defbibfilter</code> only one document prints are layout; curation is marked on the fact, as <code>selected</code> is in <code>content/publications.bib</code>.</p></div>
<div class="entry"><p>Three documents are printed: <code>cv/cv.tex</code>, <code>cv/short.tex</code> and <code>cv/teaching.tex</code>. <code>cv/preamble.tex</code> holds every package, style and macro they share; a block too particular for a macro is a body fragment they <code>\input</code>, as <code>cv/header.tex</code> and <code>cv/supervision.tex</code> are. The printed design is therefore written once, and a document body is only which sections it prints, in what order, and how many of each. No fact is repeated per variant, and none may be: a variant carrying its own copy of an appointment breaks the premise. What belongs to a variant is layout — including the entry count on <code>\cvpart</code> and any <code>\defbibfilter</code> only that document prints. What belongs to the record is curation, marked on the fact itself, as <code>selected</code> is in <code>content/publications.bib</code>. A section declared under <code>publications.sections</code> for one document's sake changes the full CV and the website, because each section subtracts the ones declared before it.</p></div>
<p><code>web/src/lib/record.ts</code> owns the complete list of source paths. It locates the repository by walking up for <code>content/cv.yaml</code>, the file no build can work without. <code>web/src/lib/record.test.ts</code> fails if a record source points outside <code>content/</code>.</p>
<p><code>scripts/build-cv-data.mjs</code> turns <code>content/cv.yaml</code> into the committed <code>cv/generated/cv-data.tex</code>. Never hand-edit generated data. Every top-level list becomes a macro family without the generator naming the section, and <code>\cvAutoSections</code> carries the printed section sequence, so a section added to the record reaches the PDF with no <code>.tex</code> edit: <code>cv/cv.tex</code> prints that sequence and skips the keys it lays out by hand, which <code>\cvdeclare</code> records. Publication and talk grouping is declared under <code>publications.sections</code> and <code>talks.sections</code>; no BibTeX type or grouping policy belongs in <code>cv/cv.tex</code> or the website publication reader.</p></div>
 <div class="col a"><span class="tag">after · 9243845</span><h2>One record, several publications</h2>
<p><code>content/</code> owns the record: every fact about the adopter, and which sections the CV prints. <code>content/README.md</code> documents it. The website in <code>web/</code> and every printed document in <code>cv/</code> consume the same <code>content/cv.yaml</code>, <code>content/publications.bib</code>, and <code>content/talks.bib</code>; posts and media live beside them. Replacing the record must not require editing outside <code>content/</code> — that is what <code>npm run check:adopter</code> proves.</p>
<p>Design is code, deliberately: the theme, the printed layout and its curated section headings, routes, redirects and announcement wording are all edited outside <code>content/</code>, and <code>README.md</code>'s "Make it yours" lists where. Do not move any of them into <code>content/</code>: that was considered and rejected, because layout and routes cannot follow and the boundary would blur again. The boundary is facts versus design — keep every document saying the same thing about it.</p>
<div class="entry"><p>Three documents are printed: <code>cv/cv.tex</code>, <code>cv/short.tex</code> and <code>cv/teaching.tex</code>. <code>cv/preamble.tex</code> holds every package, style and macro they share; a block too particular for a macro is a body fragment they <code>\input</code>, as <code>cv/header.tex</code> (the contact block) and <code>cv/supervision.tex</code> (that hand-set section) are. The printed design is therefore written once, and a document body is only which sections it curates, in what order, and how many entries of each. No fact is repeated per variant, and none may be: a variant carrying its own copy of an appointment breaks the premise. Only <code>cv/cv.tex</code> prints <code>\cvAutoSections</code>: a variant is a curated subset, so printing every section the body did not name is what it exists not to do — it still honours <code>printed: false</code>, because it reaches every section through <code>\cvpart</code>. What belongs to a variant is layout — including the entry count on <code>\cvpart</code> and any <code>\defbibfilter</code> only that document prints. What belongs to the record is curation, marked on the fact itself, as <code>selected</code> is in <code>content/publications.bib</code>. A section declared under <code>publications.sections</code> for one document's sake changes the full CV and the website, because each section subtracts the ones declared before it.</p></div>
<p><code>web/src/lib/record.ts</code> owns the complete list of source paths. It locates the repository by walking up for <code>content/cv.yaml</code>, the file no build can work without. <code>web/src/lib/record.test.ts</code> fails if a record source points outside <code>content/</code>.</p>
<p><code>scripts/build-cv-data.mjs</code> turns <code>content/cv.yaml</code> into the committed <code>cv/generated/cv-data.tex</code>. Never hand-edit generated data. Every top-level list becomes a macro family without the generator naming the section, and <code>\cvAutoSections</code> carries the printed section sequence, so a section added to the record reaches the PDF with no <code>.tex</code> edit: <code>cv/cv.tex</code> prints that sequence and skips the keys it lays out by hand, which <code>\cvdeclare</code> records. Publication and talk grouping is declared under <code>publications.sections</code> and <code>talks.sections</code>; no BibTeX type or grouping policy belongs in <code>cv/cv.tex</code> or the website publication reader.</p></div>
</div>
Evidence: Claim-survival and code-agreement verification transcript

entry occurrences: 1 (expected 1) surviving claims in the merged entry PASS 1. general body-fragment rule (2nd para) with both named instances PASS 2a. only cv/cv.tex prints \cvAutoSections; a variant is a curated subset PASS 2b. it still honours printed: false, reaching every section through \cvpart PASS 3. one document's publications.sections declaration changes the full CV AND the website PASS 4. layout vs curation, stated once PASS 5. no fact repeated per variant (both paragraphs) claims checked against the code they describe PASS cv/cv.tex prints \cvAutoSections and neither variant does PASS \cvpart guards on \cv<Key>Printed (so \cvAutoSections honours printed: false) PASS generator subtracts every earlier section predicate PASS website labels a publication by its FIRST matching section PASS cv/supervision.tex states the body-fragment rule itself ALL CHECKS PASS

entry occurrences: 1 (expected 1)

surviving claims in the merged entry
  PASS  1. general body-fragment rule (2nd para) with both named instances
  PASS  2a. only cv/cv.tex prints \cvAutoSections; a variant is a curated subset
  PASS  2b. it still honours printed: false, reaching every section through \cvpart
  PASS  3. one document's publications.sections declaration changes the full CV AND the website
  PASS  4. layout vs curation, stated once
  PASS  5. no fact repeated per variant (both paragraphs)

claims checked against the code they describe
  PASS  cv/cv.tex prints \cvAutoSections and neither variant does
  PASS  \cvpart guards on \cv<Key>Printed (so \cvAutoSections honours printed: false)
  PASS  generator subtracts every earlier section predicate
  PASS  website labels a publication by its FIRST matching section
  PASS  cv/supervision.tex states the body-fragment rule itself

ALL CHECKS PASS
Evidence: Verification script used for the manual check
// Manual verification of the AGENTS.md printed-documents merge.
// 1. the entry exists exactly once
// 2. every required claim from either original paragraph survives in it
// 3. each claim still matches the code it describes
import { readFileSync } from "node:fs";

const root = process.argv[2];
const read = (p) => readFileSync(`${root}/${p}`, "utf8");
const agents = read("AGENTS.md");

const opening = "Three documents are printed: `cv/cv.tex`, `cv/short.tex` and `cv/teaching.tex`.";
const occurrences = agents.split(opening).length - 1;

// the merged entry: from the opening sentence to the next blank-line paragraph break
const start = agents.indexOf(opening);
const entry = agents.slice(start, agents.indexOf("\n\n", start)).replace(/\n/g, " ");

const claims = [
  [
    "1. general body-fragment rule (2nd para) with both named instances",
    /a block too particular for a macro is a body fragment they `\\input`, as `cv\/header\.tex` \(the contact block\) and `cv\/supervision\.tex` \(that hand-set section\) are/,
  ],
  [
    "2a. only cv/cv.tex prints \\cvAutoSections; a variant is a curated subset",
    /Only `cv\/cv\.tex` prints `\\cvAutoSections`: a variant is a curated subset/,
  ],
  [
    "2b. it still honours printed: false, reaching every section through \\cvpart",
    /still honours `printed: false`, because it reaches every section through `\\cvpart`/,
  ],
  [
    "3. one document's publications.sections declaration changes the full CV AND the website",
    /A section declared under `publications\.sections` for one document's sake changes the full CV and the website, because each section subtracts the ones declared before it/,
  ],
  [
    "4. layout vs curation, stated once",
    /layout — including the entry count on `\\cvpart` and any `\\defbibfilter` only that document prints\. What belongs to the record is curation, marked on the fact itself, as `selected` is in `content\/publications\.bib`/,
  ],
  ["5. no fact repeated per variant (both paragraphs)", /No fact is repeated per variant, and none may be/],
];

const codeChecks = [
  [
    "cv/cv.tex prints \\cvAutoSections and neither variant does",
    () => {
      const prints = (f) => read(f).split("\n").some((l) => l.trim() === "\\cvAutoSections");
      return prints("cv/cv.tex") && !prints("cv/short.tex") && !prints("cv/teaching.tex");
    },
  ],
  [
    "\\cvpart guards on \\cv<Key>Printed (so \\cvAutoSections honours printed: false)",
    () => /\\newcommand\{\\cvpart\}[\s\S]{0,400}csname cv#3Printed\\endcsname>0/.test(read("cv/preamble.tex")),
  ],
  [
    "generator subtracts every earlier section predicate",
    () => /const afterEarlier = \(own, earlier\)[\s\S]{0,200}not \( \$\{predicate\} \)/.test(read("scripts/build-cv-data.mjs")),
  ],
  [
    "website labels a publication by its FIRST matching section",
    () => /bibSectionFor[\s\S]{0,200}sections\.find\(\(section\) => matchesBibSection/.test(read("web/src/lib/cv-schema.ts")),
  ],
  [
    "cv/supervision.tex states the body-fragment rule itself",
    () => /body fragment rather than a macro, so it is\s*\n% shared the way cv\/header\.tex is/.test(read("cv/supervision.tex")),
  ],
];

let bad = 0;
console.log(`entry occurrences: ${occurrences} (expected 1)`);
if (occurrences !== 1) bad++;
console.log("\nsurviving claims in the merged entry");
for (const [label, re] of claims) {
  const ok = re.test(entry);
  if (!ok) bad++;
  console.log(`  ${ok ? "PASS" : "FAIL"}  ${label}`);
}
console.log("\nclaims checked against the code they describe");
for (const [label, fn] of codeChecks) {
  const ok = fn();
  if (!ok) bad++;
  console.log(`  ${ok ? "PASS" : "FAIL"}  ${label}`);
}
console.log(`\n${bad === 0 ? "ALL CHECKS PASS" : bad + " CHECK(S) FAILED"}`);
process.exit(bad === 0 ? 0 : 1);
Evidence: Merged AGENTS.md entry as committed (plain text)
# Project agent memory

This file is the committed map of ledgerpress: the build, data boundary, release path, and
load-bearing constraints that should travel with the template.

## One record, several publications

`content/` owns the record: every fact about the adopter, and which sections the CV prints.
`content/README.md` documents it. The website in `web/` and every printed document in `cv/` consume
the same `content/cv.yaml`, `content/publications.bib`, and `content/talks.bib`; posts and media live
beside them. Replacing the record must not require editing outside `content/` — that is what
`npm run check:adopter` proves.

Design is code, deliberately: the theme, the printed layout and its curated section headings, routes,
redirects and announcement wording are all edited outside `content/`, and `README.md`'s "Make it
yours" lists where. Do not move any of them into `content/`: that was considered and rejected,
because layout and routes cannot follow and the boundary would blur again. The boundary is facts
versus design — keep every document saying the same thing about it.

Three documents are printed: `cv/cv.tex`, `cv/short.tex` and `cv/teaching.tex`. `cv/preamble.tex`
holds every package, style and macro they share; a block too particular for a macro is a body
fragment they `\input`, as `cv/header.tex` (the contact block) and `cv/supervision.tex` (that
hand-set section) are. The printed design is therefore written once, and a document body is only
which sections it curates, in what order, and how many entries of each. No fact is repeated per
variant, and none may be: a variant carrying its own copy of an appointment breaks the premise.
Only `cv/cv.tex` prints `\cvAutoSections`: a variant is a curated subset, so printing every section
the body did not name is what it exists not to do — it still honours `printed: false`, because it
reaches every section through `\cvpart`. What belongs to a variant is layout — including the entry
count on `\cvpart` and any `\defbibfilter` only that document prints. What belongs to the record is
curation, marked on the fact itself, as `selected` is in `content/publications.bib`. A section
declared under `publications.sections` for one document's sake changes the full CV and the website,
because each section subtracts the ones declared before it.

`web/src/lib/record.ts` owns the complete list of source paths. It locates the repository by walking
up for `content/cv.yaml`, the file no build can work without. `web/src/lib/record.test.ts` fails if a

Claim-by-claim survival

The two paragraphs this change replaced, and the single paragraph that replaces them:

Removed (two paragraphs)Replacement (one paragraph)

Three documents are printed: cv/cv.tex, cv/short.tex and cv/teaching.tex. cv/preamble.tex
holds every package, style and macro they share, cv/header.tex the contact block and
cv/supervision.tex that hand-set section, so the printed design is written once. A document body
is only which sections it curates, in what order, and how many entries of each. No fact is repeated
per variant, and none may be. Only cv/cv.tex prints \cvAutoSections: a variant is a curated
subset, so printing every section the body did not name is what it exists not to do — it still
honours printed: false, because it reaches every section through \cvpart. An entry count on
\cvpart and a \defbibfilter only one document prints are layout; curation is marked on the fact,
as selected is in content/publications.bib.

Three documents are printed: cv/cv.tex, cv/short.tex and cv/teaching.tex. cv/preamble.tex
holds every package, style and macro they share; a block too particular for a macro is a body
fragment they \input, as cv/header.tex and cv/supervision.tex are. The printed design is
therefore written once, and a document body is only which sections it prints, in what order,
and how many of each. No fact is repeated per variant, and none may be: a variant carrying its own
copy of an appointment breaks the premise. What belongs to a variant is layout — including the
entry count on \cvpart and any \defbibfilter only that document prints. What belongs to the
record is curation, marked on the fact itself, as selected is in content/publications.bib. A
section declared under publications.sections for one document's sake changes the full CV and the
website, because each section subtracts the ones declared before it.

Three documents are printed: cv/cv.tex, cv/short.tex and cv/teaching.tex. cv/preamble.tex
holds every package, style and macro they share; a block too particular for a macro is a body
fragment they \input, as cv/header.tex (the contact block) and cv/supervision.tex (that
hand-set section) are. The printed design is therefore written once, and a document body is only
which sections it curates, in what order, and how many entries of each. No fact is repeated per
variant, and none may be: a variant carrying its own copy of an appointment breaks the premise.
Only cv/cv.tex prints \cvAutoSections: a variant is a curated subset, so printing every section
the body did not name is what it exists not to do — it still honours printed: false, because it
reaches every section through \cvpart. What belongs to a variant is layout — including the entry
count on \cvpart and any \defbibfilter only that document prints. What belongs to the record is
curation, marked on the fact itself, as selected is in content/publications.bib. A section
declared under publications.sections for one document's sake changes the full CV and the website,
because each section subtracts the ones declared before it.

Every claim either paragraph made, where it survived, and the code that was read to confirm it is
still true today:

Claim From Where it survived Verified against
Three documents are printed: cv/cv.tex, cv/short.tex, cv/teaching.tex both opening sentence all three files exist and each is a full \begin{document}
cv/preamble.tex holds every shared package, style and macro both sentence 1 all three \input{preamble.tex}
A block too particular for a macro is a body fragment they \input (general rule) 2nd only sentence 1, kept in its general form cv/supervision.tex:4-7 states exactly this rule about itself
cv/header.tex is the contact block; cv/supervision.tex is that hand-set section (instances) 1st only sentence 1, as parenthesised instances of the general rule cv/header.tex:1-2, cv/supervision.tex:2-7
The printed design is written once both sentence 1 no style or package is defined in any document body
A document body is only which sections it curates, in what order, how many entries of each both sentence 2 cv/cv.tex:8-14, cv/short.tex:9-13, cv/teaching.tex:9-12
No fact is repeated per variant, and none may be both sentence 3 cv/short.tex:4-7, cv/teaching.tex:5-7
…a variant carrying its own copy of an appointment breaks the premise (the gloss) 2nd only sentence 3 every variant reaches appointments through \cvpart{...}{Appointments} only
Only cv/cv.tex prints \cvAutoSections; a variant is a curated subset, and printing every unnamed section is what it exists not to do 1st only sentence 4 cv/cv.tex:79 prints it; cv/short.tex:17-24 and cv/teaching.tex:16-23 document not printing it, and neither does
It still honours printed: false, because it reaches every section through \cvpart 1st only sentence 4 cv/preamble.tex:243-249\cvpart calls \cvdeclare then guards on \ifnum\csname cv#3Printed\endcsname>0; scripts/build-cv-data.mjs:24,569-570 emits 0 for printed: false
An entry count on \cvpart and a \defbibfilter only one document prints are layout both sentence 5, stated once cv/short.tex:66,68 (\cvpart[2]), cv/teaching.tex:50 (\cvpart[3]), cv/short.tex:40 (\defbibfilter{shortselected}, used by no other document)
Curation is marked on the fact itself, as selected is in content/publications.bib both sentence 6, stated once cv/short.tex:29-31; selected is a keyword on the entries themselves
A section declared under publications.sections for one document's sake changes the full CV and the website, because each section subtracts the ones declared before it 2nd only sentence 7 scripts/build-cv-data.mjs:334-342 (afterEarlier subtracts every earlier predicate, printed: false ones included); web/src/lib/cv-schema.ts:200-203 labels an entry by the first matching section, so the same declaration moves website labels too; cv/short.tex:33-39 is the worked warning

No claim was found stale. Every statement in both paragraphs is still true of the code as it
stands, so nothing had to be rewritten or dropped for accuracy — the merge is purely about saying
each thing once, in the stronger of the two phrasings.

Scope and proof

Scope was one documentation entry. No TeX, generator, content or check changed: the diff is
AGENTS.md only (11 insertions, 18 deletions).

The printed documents are unchanged. All three were rebuilt with
latexmk -xelatex -cd cv/<doc>.tex and npm run check:maintainer — which compares every built PDF
against its data/cv-baseline/ entry — exits 0, so cv.pdf, short.pdf and teaching.pdf all
still match their recorded baselines.

Check Result
npm run check (adopter checks) exit 0
npm test (repository + website self-checks, generated-data freshness) exit 0
npm run check:maintainer (all three PDFs vs data/cv-baseline/) exit 0
git status --porcelain after all builds M AGENTS.md only

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • npm ci and npm --prefix web ci (dependencies were absent; setup fix only)
  • node --test scripts/agents-md.test.mjs — the repository's own AGENTS.md check that every repository path named in the file exists (covers cv/cv.tex, cv/short.tex, cv/teaching.tex, cv/preamble.tex, cv/header.tex, cv/supervision.tex, content/publications.bib)
  • npm test — website self-checks, generator contract tests, baseline-script tests and the generated-data freshness gate
  • latexmk -xelatex -cd cv/cv.tex, cv/short.tex, cv/teaching.tex then npm run check:maintainer — all three built PDFs compared against data/cv-baseline/ entries, exit 0
  • node /tmp/no-mistakes-evidence/01KYT21800MWRW550NAKXYKY5C/verify-merge.mjs $PWD — manual check that the 'Three documents are printed' entry occurs exactly once, that all four required claims plus the no-fact-repeated line survive in the merged paragraph, and that each claim still holds in cv/cv.tex, cv/preamble.tex (\cvpart printed guard), scripts/build-cv-data.mjs (afterEarlier), web/src/lib/cv-schema.ts (bibSectionFor first-match) and cv/supervision.tex
  • grep -c on AGENTS.md confirming the layout-vs-curation line and the \defbibfilter clause each appear once in the whole file
  • git diff --name-only 1f205fe 9243845 plus a grep of scripts/, web/, cv/, .github/ confirming no build input reads AGENTS.md, so no printed output can change
  • Manual render of the AGENTS.md section at both commits to HTML, opened in Chrome and screenshotted for a reader-visible before/after
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

AGENTS.md stated the printed-documents contract twice, in two paragraphs
that disagreed about what it promises. This resolves them into one entry
carrying every claim either made:

- the general rule that a block too particular for a macro is a body
  fragment documents `\input`, with cv/header.tex and cv/supervision.tex
  named as its instances;
- that only cv/cv.tex prints \cvAutoSections, that a variant is a curated
  subset, and that it still honours `printed: false` because it reaches
  every section through \cvpart;
- that a section declared under `publications.sections` for one
  document's sake changes the full CV and the website, because each
  section subtracts the ones declared before it;
- the layout/curation line, stated once.

Every claim was checked against cv/cv.tex, cv/short.tex, cv/teaching.tex,
cv/preamble.tex and scripts/build-cv-data.mjs; all still hold. No TeX,
generator, content or check changed, and all three PDFs still match their
baselines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@eduardstan
eduardstan merged commit 8f515b9 into main Jul 30, 2026
2 checks passed
eduardstan added a commit that referenced this pull request Jul 31, 2026
AGENTS.md stated the printed-documents contract twice, in two paragraphs
that disagreed about what it promises. This resolves them into one entry
carrying every claim either made:

- the general rule that a block too particular for a macro is a body
  fragment documents `\input`, with cv/header.tex and cv/supervision.tex
  named as its instances;
- that only cv/cv.tex prints \cvAutoSections, that a variant is a curated
  subset, and that it still honours `printed: false` because it reaches
  every section through \cvpart;
- that a section declared under `publications.sections` for one
  document's sake changes the full CV and the website, because each
  section subtracts the ones declared before it;
- the layout/curation line, stated once.

Every claim was checked against cv/cv.tex, cv/short.tex, cv/teaching.tex,
cv/preamble.tex and scripts/build-cv-data.mjs; all still hold. No TeX,
generator, content or check changed, and all three PDFs still match their
baselines.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant