Per-channel publish interval #130
Labels
No labels
bug
devops
duplicate
enhancement
good first issue
layout
next major release
next minor release
question
research
testing
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lvl0/fedi-feed-router#130
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Let each channel override the global
article_publishing_interval, so a community that tolerates frequent posts isn't held to the pace of one that doesn't.Split out of #90 "Publishing schedule control", which bundled four independent features.
Current behaviour
PublishNextArticleJobgates on a global last-published timestamp:One slow channel therefore paces every other channel.
Design
Add a nullable
platform_channels.publish_interval_minutes.null= use the global setting.Channel level, not route level. A route is a feed→channel pair, so a route-level override would give two feeds routed to the same channel a separate budget each — and the channel could still be flooded. The community is what gets flooded, so the limit belongs where the posts land.
article_publications.platform_channel_idalready exists, so the per-channel "last published" query needs no schema change beyond the override column.Head-of-line blocking — the main risk
PublishNextArticleJobselects the oldest eligible route article and publishes one per run. If that article's channel is inside its interval and the job simply returns, every other channel stalls behind it until the throttled one is ready.This is the same head-of-line problem already documented for failing publishes (see #119 and
.claude/PLATFORM.md).A throttled channel must be skipped over — the job should fall through to the oldest candidate whose channel is free — not block the queue. This needs an explicit test: a throttled channel must not delay a non-throttled one.
Tasks
platform_channels.publish_interval_minutesPublishNextArticleJob, falling back to the global settingTests that matter
nulloverride = global interval, i.e. today's behaviour exactly0= no pacing for that channelConstraints
Do not weaken #123 (
Cache::lockduplicate guard) or #119 (scopeDueForPublishingis the single source of truth for publish eligibility — do not re-express that threshold in a new query).