Repository navigation
fix(quotes): follow quote chains past two levels (#85) - #86
Conversation
A syndication payload carries one level of quoted_tweet, and the nested
object has no id for the next hop, so a chain like main -> A -> B -> C
stopped at B while the receipt said COMPLETE.
followQuoteChainsViaSyndication runs after all syndication enrichment and
before inlineMedia. It fetches every leaf quote by id (through the
per-export cache) and appends its quoted_tweet until a post quotes nothing.
The leaf's own blocks are never replaced, so DOM-only polls and cards stay.
- Cap: CONFIG.quoteChainMaxDepth, 8 levels below the main post. The leaf
at the cap is still fetched, so only a chain that really continues gets
a quote-chain-note ("not followed past <id>").
- A non-404 failure also leaves a quote-chain-note. Both count in the
receipt, manifest and share warnings, so the receipt says INCOMPLETE.
- A 404 leaves a quote-tombstone (chainEnd). A cycle stops silently.
- Neither is a strict-mode blocker: a deeper hop is only discoverable by
fetching, and a blocker would turn unattended captures into needs_owner.
- Reply-context cards are not followed.
- On screens up to 520px, nested cards become a left rule instead of a
full box. At 375px a level-6 card was 117px wide with its handle
overflowing; it is now 257px.
Fixes #85
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
) repairExportBlockers rebuilds a quote the main pass could not fetch with one nested level and stopped there, so a chain recovered by the repair round (or the modal's Retry) shipped two levels deep and said COMPLETE. Run followQuoteChainsViaSyndication after the rebuild and before the media rescue, so the deeper cards' media is downloaded too. Refs #85 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Follow-up 9c3c94d: Checked against real syndication (read-only Node script, no browser, nothing published): Also seen in a screenshot at 375px: |
Fixes #85.
Problem
A syndication payload carries one level of
quoted_tweet, and that nested object has no id for the next hop. Capsule5eb7a4bf…kept 3 of a 7-post quote chain (main + 6 quotes) and still saidStatus: COMPLETE.Change
followQuoteChainsViaSyndicationruns last in the syndication block, beforeinlineMedia, so deeper levels' media and avatars get inlined. For every leaf quote with a canonical permalink (top level, thread segments, blockquotes) it fetches the leaf by id throughsyndicationSuccessCacheand appends itsquoted_tweetas a nested quote. It stops when a post quotes nothing.CONFIG.quoteChainMaxDepth = 8levels below the main post. The leaf at the cap is still fetched, so a chain that ends exactly there is not flagged. Cycles are caught against the ancestor path.quote-chain-note. It renders in the HTML and.llm.md, is counted inarchiveStats/manifest (quoteChainsUnfollowed), the capture summary, the share-result warnings and the in-page receipt, and makescaptureGapssay INCOMPLETE.quote-tombstonewithchainEnd, worded as "could not be followed", not "quoted post gone".assessExportCompletenessis unchanged, so unattended captures don't becomeneeds_owner.Checks
test/quote-chain.test.mjs(new, added tonpm test). It failed before the fix withfollowQuoteChainsViaSyndication is not a function. It covers:1…1.1.1.1.1.1distinct after headings stop at######cleaninlineMedia/rescue task collection,collectMediaManifest,collectBundleMediaFiles, the share-model media rewrite,enrichVideoCandidates,assignArchiveMediaIdsall recurse throughquotewithout a depth limit. No change needed.npm test,npm run lintandnpm run format:checkpass locally.@Diros009overflowing its border. After it, the card is 257px wide with no horizontal scroll. The cap note and "Incomplete capture" banner are visible on the capped fixture.Not live-verified. That needs a re-export of https://x.com/hibtc37/status/2111240021563056451 with the rebuilt extension, expecting main + 6 quotes ending at @Diros009's 2101125814888931800.
🤖 Generated with Claude Code