The extractor hard-comments that Sonnet is required for extraction quality:
- module docstring: "runs the document extractor prompt per window via
claude -p (Sonnet — forced for extraction quality)"
extract_deep_documents.py:~1112: # Extract any window not already cached (FORCE Sonnet for quality).
The model is in fact env-tunable (CLAUDE_P_MODEL, :80), so this is a documentation/default問題 rather than a code limitation — but the comment is load-bearing: it discourages tuning the single biggest latency lever, and it does not appear to be backed by a measurement.
Measured A/B (2026-07-16)
Same pipeline, --tier thorough, one paper per row; Sonnet rows are papers ingested the same night.
| model |
paper |
chars |
facts |
facts/1k chars |
throughput |
| Sonnet 4.6 |
coecke-discocat (1003.4394) |
69,551 |
27 |
0.39 |
~87 chars/s |
| Sonnet 4.6 |
contextual-fraction (1705.07918) |
73,049 |
30 |
0.41 |
~87 chars/s |
| Sonnet 4.6 |
over-squashing MPNN (2302.02941) |
82,093 |
48 |
0.58 |
~87 chars/s |
| Sonnet 4.6 |
sheaf-nonlocality (1102.0264) |
108,235 |
45 |
0.42 |
~87 chars/s |
| Haiku 4.5 |
MPSN (2103.03212) |
127,118 |
60 |
0.47 |
312 chars/s |
Haiku: ~equal fact density (0.47 vs 0.45 Sonnet mean), 3.6x faster (407s vs ~800s/paper).
Not count-inflation — spot-checked Haiku facts are specific and technical, same register as Sonnet:
- "The k-Folklore WL procedure (k-FWL) is equivalent to (k+1)-WL for k ≥ 2."
- "The Hodge Laplacian operator for dimension p can be expressed as a function of boundary operators…"
- "The ocean drifter trajectories dataset is collected around the island of Madagascar." (a real detail from the paper)
Honest limits of this evidence
n=1 for Haiku, on a geometric-deep-learning paper, and it compares fact density, not fact correctness against source text. It does not establish "Haiku ≥ Sonnet" in general — only that the Sonnet default is unexamined and costs ~3.6x latency on at least one common document class.
Proposal
- Correct the docstring/comment — replace the "forced for quality" assertion with the actual state: model is
CLAUDE_P_MODEL-tunable; Sonnet is a conservative default, not a measured requirement.
- Support per-tier / per-document model selection (e.g.
DOC_EXTRACTOR_MODEL_BY_TIER, or honor an existing per-call override) so callers can tier: cheap model for surveys/empirical papers, stronger model for subtle formal math.
- Optionally run a broader benchmark (N papers × both models, facts scored against source) before changing the shipped default. Happy to share the harness — a caller-side tiering drainer is at
~/Documents/Research/Papers/tools/drain_remaining.py locally.
Note this is the only real speed lever available: extraction is globally serialized by the advisory lock in #35, so parallelism buys nothing.
Related: #35 (global lock), #36 (dead-socket wedge), #32/#33/#34.
The extractor hard-comments that Sonnet is required for extraction quality:
claude -p(Sonnet — forced for extraction quality)"extract_deep_documents.py:~1112:# Extract any window not already cached (FORCE Sonnet for quality).The model is in fact env-tunable (
CLAUDE_P_MODEL,:80), so this is a documentation/default問題 rather than a code limitation — but the comment is load-bearing: it discourages tuning the single biggest latency lever, and it does not appear to be backed by a measurement.Measured A/B (2026-07-16)
Same pipeline,
--tier thorough, one paper per row; Sonnet rows are papers ingested the same night.Haiku: ~equal fact density (0.47 vs 0.45 Sonnet mean), 3.6x faster (407s vs ~800s/paper).
Not count-inflation — spot-checked Haiku facts are specific and technical, same register as Sonnet:
Honest limits of this evidence
n=1 for Haiku, on a geometric-deep-learning paper, and it compares fact density, not fact correctness against source text. It does not establish "Haiku ≥ Sonnet" in general — only that the Sonnet default is unexamined and costs ~3.6x latency on at least one common document class.
Proposal
CLAUDE_P_MODEL-tunable; Sonnet is a conservative default, not a measured requirement.DOC_EXTRACTOR_MODEL_BY_TIER, or honor an existing per-call override) so callers can tier: cheap model for surveys/empirical papers, stronger model for subtle formal math.~/Documents/Research/Papers/tools/drain_remaining.pylocally.Note this is the only real speed lever available: extraction is globally serialized by the advisory lock in #35, so parallelism buys nothing.
Related: #35 (global lock), #36 (dead-socket wedge), #32/#33/#34.