Skip to content

v1.6.14: capture-gap batch (silent losses and report honesty) - #95

Merged
wolfgang-aura merged 19 commits into
mainfrom
fix/capture-gaps-batch
Oct 18, 2026
Merged

wolfgang-aura merged 19 commits into
mainfrom
fix/capture-gaps-batch

Conversation

@wolfgang-aura

@wolfgang-aura wolfgang-aura commented Oct 18, 2026 •

Copy link
Copy Markdown
Owner

One branch and one version bump (v1.6.14), so Tampermonkey users get one update instead of one per fix.

Fixes

Verification

Filed, not in this batch

#103 non-Chromium "Capture saved" timing: library-share has no entry point any more, so it is not reachable today.

🤖 Generated with Claude Code

wolfgang-aura and others added 11 commits October 19, 2026 01:17
)

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 wolfgang-aura changed the title Capture-gap batch: silent losses and report honesty v1.6.14: capture-gap batch (silent losses and report honesty) Oct 18, 2026
@wolfgang-aura
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>
wolfgang-aura and others added 2 commits October 19, 2026 02:34
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>
wolfgang-aura and others added 5 commits October 19, 2026 02:46
…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>
@wolfgang-aura
wolfgang-aura merged commit 313ff9b into main Oct 18, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant