Promotes dev at 42a60e3 (CI run 7516 green end to end) to main.
A worker restart no longer strands downloads. The download lane closes its predecessor's runs as interrupted and frees the platform locks at boot (#4433).
A non-image file lands on the source it was downloaded for. Migration 0114 folds the undated shell posts this left (#4435).
A post record is marked seen only after it is upserted. An hourly sweep dates posts left undated by killed walks (#4436).
Release notes: no internal rule numbers, and no miscounted image list.
Promotes dev at 42a60e3 (CI run 7516 green end to end) to main.
- A worker restart no longer strands downloads. The download lane closes its predecessor's runs as interrupted and frees the platform locks at boot (#4433).
- A non-image file lands on the source it was downloaded for. Migration 0114 folds the undated shell posts this left (#4435).
- A post record is marked seen only after it is upserted. An hourly sweep dates posts left undated by killed walks (#4436).
- Release notes: no internal rule numbers, and no miscounted image list.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
A walk that outlives the 90s stop grace is SIGKILLed: its event never
finalizes and its platform lock is held for the 27-min TTL. The 30-min
sweep then errored every stranded event and bumped consecutive_failures,
backing sources off (and blocking backfills) as if the platform failed.
On worker_ready, the process consuming 'download' ends pre-boot
pending/running events as skipped with error_type 'interrupted', leaves
the source untouched so the next tick resumes it, and releases the
serialized platforms' locks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
The attachment path looked the post's source up by (artist, platform),
taking the artist's lowest-id source. A Discord artist has one source per
channel, so every archive or pdf from a later channel became an undated
second post on the first channel's source. _post_for_sidecar now takes
the downloading source, as upsert_post_record and _apply_sidecar already
did. Migration 0114 re-points each shell's attachments to its dated twin
and deletes the shell.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
ingest_core marked a post's record key seen when it wrote _post.json, but
the record reaches the database (and dates the post and its images) only
in phase 3. A walk killed before phase 3 left posts the ledger called
recorded and the database never dated; ticks early-out long before
reaching them again. Keys now join the media in mark_seen_after_import.
date_posts_from_records finds each undated native post's record under
its artist's folder and upserts it with the post's own source. Hourly on
maintenance_long; an empty query once everything is dated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
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.
Promotes dev at
42a60e3(CI run 7516 green end to end) to main.🤖 Generated with Claude Code
https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR