feat: a tick keeps looking back 30 days, so an EDITED post is reached (4386)
CI and images / extension-version (push) Successful in 3s
CI and images / lint (push) Successful in 3s
CI and images / frontend-build (push) Successful in 19s
CI and images / backend-lint-and-test (push) Successful in 40s
CI and images / integration (push) Failing after 2m17s
CI and images / sign-extension (push) Skipped
CI and images / build-web (push) Skipped
CI and images / smoke-web (push) Skipped
CI and images / promote (push) Skipped
CI and images / build-agent (push) Skipped
CI and images / extension-version (push) Successful in 3s
CI and images / lint (push) Successful in 3s
CI and images / frontend-build (push) Successful in 19s
CI and images / backend-lint-and-test (push) Successful in 40s
CI and images / integration (push) Failing after 2m17s
CI and images / sign-extension (push) Skipped
CI and images / build-web (push) Skipped
CI and images / smoke-web (push) Skipped
CI and images / promote (push) Skipped
CI and images / build-agent (push) Skipped
Operator, 2026-09-23, on a Floppystack post: "this post has been updated as he implements hot fixes — any chance we have a way to scan for or see updated posts so we can update ours to match and pull the new attachments and pictures etc." The download half already worked: extract_media reads the media list off the LIVE feed response every walk, so a newly attached hotfix build is a ledger key we have never seen. Only REACHING the post was missing — a tick stopped after 20 contiguous already-have-it items, and a post edited three days after publication sits well below twenty. Not a bug in the early-out; a count cannot express "recent". The early-out now needs BOTH conditions: the run of seen items AND a post published before the horizon. Strictly a widening — window 0 is exactly the old behaviour, and no window can make a tick stop EARLIER than it used to, so a source paused for months still walks its whole unseen backlog. The horizon is a floor on how far to look, never a ceiling. Inside the window the post-record gate is bypassed too (write_post_record revisit=True): the body is re-read from the feed response already in hand, so a revisit costs zero requests, and a body that comes back empty writes NOTHING rather than blanking one a detail-fetch had filled. Revisits are kept out of the #862 body-drift canary's sample for the same reason — an empty revisit is healthy, and counting it would walk the alarm toward firing on good ticks. The run summary names what changed ("3 post(s) updated (5 new file(s))") with a line per post; the ask was to SEE updated posts, not only to end up with their bytes. download_revisit_days is a settings row, not a constant (rule 25) — how long a creator keeps editing is a property of the creator. Default 30, 0 turns it off. Migration 0108. Also corrects two stale docstrings: both clients described post_meta as feeding an Ingester.preview that no longer calls it. It had no consumer at all until this change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
This commit is contained in:
@@ -453,6 +453,29 @@ def test_write_post_record(tmp_path):
|
||||
assert rec.body_chars > 0
|
||||
|
||||
|
||||
def test_a_revisit_with_an_empty_body_writes_nothing(tmp_path):
|
||||
"""The revisit contract's second half, which applies here even though the
|
||||
first (no detail-fetch) is free on SubscribeStar — there is no detail
|
||||
endpoint. A chunk that parsed with no content must not overwrite a body we
|
||||
already have, so a walk behaves the same on both platforms."""
|
||||
dl = _downloader(tmp_path)
|
||||
post = _post("222")
|
||||
post["attributes"]["content"] = ""
|
||||
rec = dl.write_post_record(post, "artist-x", revisit=True)
|
||||
|
||||
assert rec.path is None
|
||||
assert rec.body_chars == 0
|
||||
assert not list(tmp_path.rglob("_post.json"))
|
||||
|
||||
|
||||
def test_a_revisit_that_still_has_a_body_writes_it(tmp_path):
|
||||
dl = _downloader(tmp_path)
|
||||
rec = dl.write_post_record(_post("333"), "artist-x", revisit=True)
|
||||
|
||||
assert rec.path is not None
|
||||
assert "body text" in json.loads(rec.path.read_text())["content"]
|
||||
|
||||
|
||||
def test_skip_seen_does_not_download(tmp_path):
|
||||
session = _FakeSession()
|
||||
dl = _downloader(tmp_path, session=session)
|
||||
|
||||
Reference in New Issue
Block a user