Two commits fixing/diagnosing the empty-body posts the operator hit on StickySpoodge.
3df191e — full-fetch fallback (the fix). 9 body-only/poll/embed/announcement posts (no downloadable gallery media) had empty bodies in FC despite the body existing + being accessible. Patreon's detail endpoint returns content: null for these post types under the sparse fields[post]=content request. fetch_post_detail_content now re-fetches the full post resource once when the sparse request is empty — recovers the body, and logs post_type when even the full resource is empty. Only empty cases pay the extra GET.
b999480 — diagnostics. Per-post body-capture logging that was previously silent: detail-fetch outcome (fetched N / empty-null), per-post body captured/empty, run-summary post-record + relinked counts, phase-3 relink count.
No migrations. CI green on dev head 3df191e (run 1099).
After merge: re-pull :latest, re-run Recapture on StickySpoodge — the 9 empties should fill.
Two commits fixing/diagnosing the empty-body posts the operator hit on StickySpoodge.
**`3df191e` — full-fetch fallback (the fix).** 9 body-only/poll/embed/announcement posts (no downloadable gallery media) had empty bodies in FC despite the body existing + being accessible. Patreon's detail endpoint returns `content: null` for these post types under the sparse `fields[post]=content` request. `fetch_post_detail_content` now re-fetches the full post resource once when the sparse request is empty — recovers the body, and logs `post_type` when even the full resource is empty. Only empty cases pay the extra GET.
**`b999480` — diagnostics.** Per-post body-capture logging that was previously silent: detail-fetch outcome (fetched N / empty-null), per-post body captured/empty, run-summary post-record + relinked counts, phase-3 relink count.
No migrations. CI green on dev head `3df191e` (run 1099).
After merge: re-pull `:latest`, re-run **Recapture** on StickySpoodge — the 9 empties should fill.
Operator-flagged: a recapture 'caught nothing' for a post and there were no
logs explaining why. Three silent spots now log, so a recapture's per-post
outcome is diagnosable (retention bounds the volume):
- patreon_client.fetch_post_detail_content: the 200-OK-but-null-content branch
was silent — now logs 'fetched N chars' on success AND 'empty/null content
(tier-gated or no text)' on the empty case (the most common silent miss).
- patreon_downloader.write_post_record: logs each post's FINAL body outcome
(captured N chars / NO body) read off the memoized attrs after detail-fetch.
- ingest_core summary: appends post-record + relinked counts to the run summary
(surfaces on the event stdout the operator already reads).
- download_service phase3: logs how many on-disk images got source_filehash
relinked (N/total) per recapture.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Operator-flagged: 9 StickySpoodge posts had empty bodies in FC despite the body
plainly existing + being accessible (creds refresh didn't help). All 9 are
body-only / poll / embed / announcement posts with no downloadable gallery
media — Patreon's detail endpoint returns content:null for these under the
sparse fields[post]=content request even though the body exists.
fetch_post_detail_content now re-fetches the FULL post resource once when the
sparse request comes back empty: recovers the body when the sparse fieldset was
the cause, and logs post_type when even the full resource is empty (body lives
elsewhere). Only the empty cases pay the extra GET; the 126 already-working
posts keep the fast sparse path.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Two commits fixing/diagnosing the empty-body posts the operator hit on StickySpoodge.
3df191e— full-fetch fallback (the fix). 9 body-only/poll/embed/announcement posts (no downloadable gallery media) had empty bodies in FC despite the body existing + being accessible. Patreon's detail endpoint returnscontent: nullfor these post types under the sparsefields[post]=contentrequest.fetch_post_detail_contentnow re-fetches the full post resource once when the sparse request is empty — recovers the body, and logspost_typewhen even the full resource is empty. Only empty cases pay the extra GET.b999480— diagnostics. Per-post body-capture logging that was previously silent: detail-fetch outcome (fetched N / empty-null), per-post body captured/empty, run-summary post-record + relinked counts, phase-3 relink count.No migrations. CI green on dev head
3df191e(run 1099).After merge: re-pull
:latest, re-run Recapture on StickySpoodge — the 9 empties should fill.