Repository navigation
v1.6.14: capture-gap batch (silent losses and report honesty) - #95
Merged
Merged
Conversation
) captureShare started its deadline only after chrome.windows.create resolved, so a slow create sat outside the bound and a 3s request published a capsule 9s later. The deadline now starts first, a capture never starts after it fired, and a window that opens late is still closed without delaying the timeout reply. The launcher's -Verify ping also runs with a local ErrorActionPreference of Continue, so a caller that captures the script's output no longer aborts the loop on the CLI's stderr progress line. Fixes #79 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A poll survived only when X had mounted it in the DOM. Deeper quote-chain levels, reply-context cards, unmounted quote cards and a focused post whose poll was virtualized away all lost it, and the capsule still said COMPLETE. syndicationPollBlock maps the payload's card.binding_values to a poll block with votes, percentages and an honest status (final, closed, or open with the snapshot time). A DOM poll that showed results still wins; one that showed none takes the payload's counts. Fixes #94 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…own payload (#94) A real payload's nested quoted_tweet carries no card and no note_tweet, so every chain level built from it lost its poll and its truncation flag: a long-form post two levels down read as complete preview text. The follower already fetches each leaf by id to find the next hop; it now applies that payload's poll and note_tweet to the leaf (and recovers captured full text). Refs #94 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…reported (#96) The share modal said only "AI readable link ready" when the uploaded .md said INCOMPLETE, an open receipt kept the local "Complete", and AI_LINK.txt had no verdict. All three now report captureVerdict(created.sharedModel). The unattended warning counts come from the shared copy as well, so they agree with the complete field beside them. Fixes #96 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Text gaps captureGaps counts (truncated main or embedded post, a quote chain cut short) are now listed under Missing / Incomplete Content and in the manifest, which also gains a completeness field. A truncated main post used to send the reader to a section that said "None". - Main text is judged at depth 0, so a quote or reply-context card's paragraph no longer hides a reply whose own text was lost. - Reply-context cards and gone parents have their own counters instead of inflating "Embedded posts" and "quoted posts gone on X"; the unattended warning says "unavailable (deleted, protected or suspended)", not "deleted". - Media counters count media only; a failed avatar and poster-only videos are notes, matching captureGaps, not warnings on a COMPLETE capture. Fixes #97 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…98) - A failed root fetch leaves a note that the conversation could not be checked; it used to look like a reply to nothing. - An ancestor built from the reply's slim inline parent copy (text and next hop, no mediaDetails) says it is shown without its media. - Quote chains inside reply-context cards are followed like any other; one cut short there is a note, since the context is not the exported post. Fixes #98 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The per-post syndication check recovers media, link cards and quotes that never mounted in the DOM. A failed fetch only logged a warning, so the capture read COMPLETE with nothing saying it went unchecked. Each failure is now recorded on the model and listed as a note naming the post and the reason. It stays a note, not a gap or a strict blocker: the capture is unverified, not known incomplete, and a blocker would turn every unattended capture under a 429 into needs_owner. Fixes #99 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A GIF's poster and MP4 are tweet_video_thumb/<key>.jpg and video.twimg.com/tweet_video/<key>.mp4 with an alphanumeric key (checked on 14 real payloads). mediaKeyFromUrl and xVideoMediaKey only matched numeric ids, so a GIF that never mounted was skipped by the syndication pass and its network candidates could not be matched by key. Fixes #100 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A quote that kept its DOM text but whose syndication fetch failed shipped with whatever media never loaded and no note; only an empty card reached the strict repair round. It now gets the same unchecked-post note as a failed per-post check. Refs #99 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w it (#94) Live capture of a reply to 2111862427415650671 flagged the poll post's context card as possibly truncated: the heuristic read the poll's "counts as of ... UTC" line as the end of the post's text. It now looks at paragraphs, headings and lists only. Refs #94 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
wolfgang-aura
marked this pull request as ready for review
October 18, 2026 18:20
Every host test/native-host.test.mjs spawned appended to the same %TEMP% log an owner reads to diagnose live captures, leaving fake "arrived after the CLI disconnected ... viewUrl=https://share.test/..." lines that look exactly like the #79 late-publish bug. The host now honours SOURCECAPSULE_HOST_LOG, and the test points every host at a temp file and asserts the real log never gets its link. Fixes #105 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 18, 2026
A video whose poster and source link survived is an accepted outcome, and archiveStats already notes it. llmVideoWarnings still pushed the same line into Warnings, so the .md listed it twice: once as a gap, once as a note. Found on a live two-GIF capture. Refs #97 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The receipt copied the library-bundle .md, which tells the reader the images are in a media/ folder a paste does not carry. In the html path it copied "Markdown-only export" wording although an HTML file was saved, and after a share the copy still had no link. - Copy renders at click time. Before a share it is a pasted copy that says it holds no media bytes and names where the capture saved its files. After a share it is the shared capsule's own Markdown: absolute media URLs, link included. - archiveStats owns the one source-link list. The .md listed link-card URLs the HTML and manifest did not count, and missed poll URLs they did. Fixes #104 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ting survives (#102) - syndicationToQuoteBlock built an empty quote with no URL from a quoted_tweet that has no author (TweetTombstone). That is a strict-mode blocker no repair can clear. It now becomes a quote-tombstone, through the same helper the chain follower uses. - mergeQuoteAfterSyndication dropped a DOM tombstone or nested quote whenever the payload omitted it. The payload only overrides nesting when it names some; when it names none, the DOM's is kept. This also stops a repair-round rebuild from a one-level payload wiping chain levels that were already followed. The TweetTombstone shape is the one syndication returns for a deleted post at top level; a real quoted_tweet tombstone has not been observed yet. Refs #102 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
) 099a119 kept a followed chain's deeper levels through a one-level rebuild, which made the repair round's re-follow skip them (they are no longer leaves). The nested quoted_tweet never carries note_tweet, so B's recovered long-form text reverted to the preview and read as complete. - The nested merge keeps the old quote's recovered text, its preview-only flag and its quote-chain-note. - A quote whose own fetch answers 200 with a tombstone keeps its DOM card, as before, and is now named as not cross-checked, like a 404 (#99). Refs #102 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…PLETE (#101) forceLoadMedia gives up at 45 s or 800 steps and only logged it. The capsule then numbered its posts "Post n of N" and its Status line said COMPLETE, and model.thread.completeness reached only the manifest. The flag rests on evidence, not on the deadline alone: the scroll stopped before the bottom of the column AND the same-author run reached the last post the scroll saw. A reply from someone else or a boundary heading after the run means the thread ended, so a slow-media or long-reply capture is not flagged. When flagged: a captureGaps entry, a `thread` record in Missing / Incomplete Content and the manifest, and "Post n of at least N" in both files. Refs #101 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ey made (#106) waitForConversation counted same-author posts anywhere in the column, so an author answering commenters made a one-post capture warn "only the root post was captured, though 3 post(s) by the same author were on the page". Found live on hibtc37/status/2111240021563056451, where the capsule was right. sameAuthorRunFromRoot counts the posts that follow the root with nobody else in between, the run buildTweetSequence reads as the thread. Fixes #106 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The earlier test's share result had no publicMedia, so it exercised the fallback. This one is shaped like createShareLink's result and reaches the shared-capsule branch production takes. Refs #104 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
One branch and one version bump (v1.6.14), so Tampermonkey users get one update instead of one per fix.
Fixes
windows.create, and on timeout the window is closed andcapture-shareis never sent. The launcher's-Verifyping also no longer aborts when its output is captured.note_tweetflag from its own by-id payload, because the nestedquoted_tweetcopy carries neither (checked on a real payload). Truncation is judged on a post's own text, not on a poll below it (found in live verification).completeness.parentcopy says it is shown without its media.needs_owner.tweet_video(_thumb)/<key>, checked on 14 real payloads), so syndication can recover them.quoted_tweetwith no author (TweetTombstone) becomes a tombstone note, not an empty card that blocks the export. The merge keeps DOM nesting the payload leaves out, and a nested rebuild keeps what a deeper level learned from its own payload (recovered long-form text, preview flag, chain note). A quote whose own fetch answers 200 with a tombstone keeps its card and is noted as not cross-checked..md, HTML and manifest share one source-link list.npm testno longer writes fake capture replies into the real native-host log (SOURCECAPSULE_HOST_LOGoverride).Verification
npm test, lint and Prettier pass locally. Each fix has a test that failed before it.complete: truewith no warnings. Screenshot taken.-Verifywith captured output exits 0.--timeout 1returnstimeout, and the host log shows no late reply in the next 2.5 minutes.sameAuthor: 1). The 8-post thread finkd/status/2097402101332590646 captured all 8 posts as "Post n of 8", COMPLETE. Screenshot taken.Filed, not in this batch
#103 non-Chromium "Capture saved" timing:
library-sharehas no entry point any more, so it is not reachable today.🤖 Generated with Claude Code