Repository navigation
feat(remind): channel and role broadcast reminders (#1767) - #1807
Conversation
Add channel-wide and role-wide reminders to /remind as new subcommands,
gated by a runtime ManageGuild check (personal set/list/delete stay
ungated). Broadcasts are fire-once: no retry backoff, and a delivery
failure sets deliveryFailed for operator visibility. Role pings scope
the mention with allowedMentions: { roles: [roleId] }.
Schema: Reminder gains targetType, roleId, deliveryFailed (additive
migration + targetType CHECK constraint). ADR amended to record the
mixed-permission-subcommand runtime-check exception.
Closes #1767
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 59 minutes Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (10)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
Failed to generate code suggestions for PR |
There was a problem hiding this comment.
All reported issues were addressed across 10 files
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
|
Cubic review dispositions (commit
|
|
🤖 I have created a release *beep* *boop* --- <details><summary>2.35.0</summary> ## [2.35.0](v2.34.0...v2.35.0) (2026-07-13) ### Features * **bot:** /bulk-kick — proof-of-pattern for the bulk-* command family ([#1802](#1802)) ([1c11f3e](1c11f3e)) * **bot:** add lucky_bot_gateway_connected zombie-detection gauge ([#1774](#1774)) ([6cc5287](6cc5287)) * **bot:** playback progress bar in nowplaying/songinfo embed ([#1797](#1797)) ([1138b59](1138b59)) * **bot:** post server-count stats to Top.gg for listing visibility ([#1789](#1789)) ([e8ca6b9](e8ca6b9)) * **bot:** temporary support ticket channels (/ticket) ([#1803](#1803)) ([49601a1](49601a1)) * **live-notif:** youtube polling, message ttl cleanup, api backoff ([#1762](#1762)) ([a99b85a](a99b85a)) * **remind:** channel and role broadcast reminders ([#1767](#1767)) ([#1807](#1807)) ([83ade79](83ade79)) ### Bug Fixes * **backend:** artist suggestions 503 not 500 on upstream timeout ([#1787](#1787)) ([eadc20e](eadc20e)) * **bot:** guard skipReason telemetry against null prisma client ([#1773](#1773)) ([d73421e](d73421e)) * **ci:** stop auto-update workflow racing on merge push ([#1811](#1811)) ([2ddd202](2ddd202)) * **csp:** allow Cloudflare Insights beacon in script-src/connect-src ([#1788](#1788)) ([f20c4cf](f20c4cf)) * **deps:** bump eslint in lock to satisfy npm@12 ci (unblock release) ([#1809](#1809)) ([68fd0be](68fd0be)) * paginate bulk-move message fetch to respect discord api limit ([#1776](#1776)) ([5b5d2fc](5b5d2fc)) * **weekly-digest:** trigger on Sunday and add new-guides RSS section ([#1761](#1761)) ([f429fc6](f429fc6)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).



What
Extends
/remindbeyond personal reminders with two new subcommands:/remind channel <tempo> <mensagem> <canal>— posts a reminder embed to a channel./remind role <tempo> <mensagem> <cargo> <canal>— posts to a channel and pings a role.Both are gated by a runtime ManageGuild check; personal
set/list/deletestay ungated.Delivery semantics
Broadcasts are fire-once: unlike personal reminders (DM-first, 12-attempt 5-min backoff), a broadcast has no future scheduled run to retry against. On failure the scheduler logs a WARN and sets
deliveryFailed = truefor operator visibility, then marks it done — no retry storm. Role pings are hard-scoped withallowedMentions: { roles: [roleId] }so a ping can never expand to@everyone.Schema
RemindergainstargetType(user|channel|role, defaultuser),roleId, anddeliveryFailed. Migration20260712010000_reminder_scopeis additive (ADD COLUMN with defaults, safe on the populated table) plus atargetTypeCHECK constraint. Verified byprisma-migration-verifier: schema↔SQL↔generated-client parity, no destructive ops, no new index needed (the fields drive dispatch, not query filters).Permission tier
Per ADR
decisions/2026-07-12-reminder-scope-permission-tier.md(uniform ManageGuild). The ADR is amended here to document the subcommand exception:setDefaultMemberPermissionsis command-level only and can't gate individual subcommands without also gating personal reminders, so the ManageGuild intent is realized via a runtimepermissions.has()check on the gated subcommands.Tests
reminderScheduler.spec.ts— channel post (no ping,parse: []), role ping (<@&id>+ scopedallowedMentions), fire-once failure flagsdeliveryFailedand does not retry.remind.spec.ts— ManageGuild gate rejects non-managers; channel/role subcommands create with the righttargetType/roleId.ReminderService.spec.ts— default create writestargetType: 'user'; options path writes role scope;markDeliveryFailedsetsdeliveryFailed + delivered.Full
type:check(4 packages),eslint, and all affected jest suites green.Closes #1767
Summary by cubic
Adds channel-wide and role-wide reminders to
/remindso moderators can post to a channel or ping a role. Broadcasts deliver once with scoped mentions and flag failures; personal reminders stay the same. Closes #1767.New Features
/remind channel <tempo> <mensagem> <canal>and/remind role <tempo> <mensagem> <cargo> <canal>.set/list/deletestay open. ADR amended to document the mixed-permission subcommand exception.allowedMentions: { roles: [roleId] }with<@&roleId>; channel posts never ping and useparse: []. Failures setdeliveryFailedand are not retried.Migration
targetType(user|channel|role),roleId, anddeliveryFailedtoReminder, plus atargetTypeCHECK constraint. Additive with defaults; existing reminders default touser.Written for commit 116db68. Summary will update on new commits.