citefind: the references in a bibliography, and what could not be read off them

Cuts a reference list into entries — at the note numbers where there are any,
at the layout where there are not — and reads each as far as its punctuation
allows. Fields that would not parse are named in `unsettled` rather than
guessed at, and `--prompt` asks a model about exactly those and no others.

Over 202 real reference sections from the corpus: 8,566 references, 95% with
a title, 82% with a year, 46% settling every field with no model involved.
A title is refused where the entry was never divided, so no record reports
its own text back as the work it cites.

`ibid.` is flagged and left alone — it points at a work, and the entry does
not say which. A rule of dashes is filled in, because the style defines it as
the author above.

chunkmd gains `note_starts` and `cites_something`: recognising a page of
notes and splitting one are the same knowledge, and two copies of that
pattern would drift.
This commit is contained in:
funkpower
2026-09-20 10:38:48 -04:00
parent 30ff3361ee
commit c071f84829
22 changed files with 2612 additions and 6 deletions
+25
View File
@@ -88,6 +88,31 @@ char *catena_fuse_hits(const char *hits,
* record. */
char *catena_identify(const char *name, const uint8_t *data, size_t len);
/* The series a title belongs to. Returns a JSON proposal, or NULL when the
* title says nothing about a series — an answer, not an error. `author` may
* be NULL. */
char *catena_series_of(const char *title, const char *author);
/* Read an identifier — a DOI, ISSN, ISBN or arXiv id — out of whatever it
* arrived wrapped in. Returns a JSON record, or NULL when the string is not
* one — an answer, not an error. */
char *catena_parse_identifier(const char *text);
/* Read the references out of a bibliography or a page of notes. Returns a
* JSON array, one object per reference. */
char *catena_find_citations(const char *text);
/* The question to put to a model about the references that did not parse.
* `references` is the JSON array catena_find_citations returned. Returns the
* prompt as a JSON string, or NULL when every reference settled — an answer,
* not an error. */
char *catena_citation_prompt(const char *references);
/* Fill in what did not parse from a model's reply. Returns the JSON array
* with the answer applied, or NULL and an error when the reply is not one
* JSON object. */
char *catena_merge_citation_reply(const char *references, const char *reply);
#ifdef __cplusplus
} /* extern "C" */
#endif