needs_enrichment puts answer_md under force (line 76), and enrich_one falls back to a placeholder when the re-fetched response carries no answer/formatted_answer (line 135), then writes unconditionally:
body = formatted_answer or answer or "(no answer field on this job's response type)"
(out_dir / f"{stem}.md").write_text(body)
Reproduced:
before: '# VALUABLE ANSWER\nlots of curated research text'
after --force: "(no answer field on this job's response type)"
-citations.md is clobbered the same way, to _No citations parsed._.
The .md is the deliverable the credits bought, and the overwrite is irrecoverable. It triggers whenever a re-fetch returns a response type that does not carry those fields — different job types have different response classes — so a run intended to add provenance destroys the primary artifact.
Fix: only write answer_md (and citations) when a non-empty body actually came back. --force should mean "re-fetch and refresh", never "replace real content with a placeholder".
needs_enrichmentputsanswer_mdunderforce(line 76), andenrich_onefalls back to a placeholder when the re-fetched response carries noanswer/formatted_answer(line 135), then writes unconditionally:Reproduced:
-citations.mdis clobbered the same way, to_No citations parsed._.The
.mdis the deliverable the credits bought, and the overwrite is irrecoverable. It triggers whenever a re-fetch returns a response type that does not carry those fields — different job types have different response classes — so a run intended to add provenance destroys the primary artifact.Fix: only write
answer_md(and citations) when a non-empty body actually came back.--forceshould mean "re-fetch and refresh", never "replace real content with a placeholder".