Blog draft generation asks the model for "real, verifiable" source URLs, but nothing checks them — a past batch shipped multiple fabricated URLs that 404'd (discovered only by a manual curl sweep).
Proposal: after parsing generated essays, HEAD/GET each sources[].url (following redirects, browser UA, short timeout). On non-200: drop the source and warn, or ask the model once for a replacement. Could live in work.ts next to the existing em dash scrub, or as a standalone ship lint-sources command that the review flow runs.
Blog draft generation asks the model for "real, verifiable" source URLs, but nothing checks them — a past batch shipped multiple fabricated URLs that 404'd (discovered only by a manual curl sweep).
Proposal: after parsing generated essays, HEAD/GET each
sources[].url(following redirects, browser UA, short timeout). On non-200: drop the source and warn, or ask the model once for a replacement. Could live in work.ts next to the existing em dash scrub, or as a standaloneship lint-sourcescommand that the review flow runs.