[WIP] Block self-assignment for a cooldown after an inactivity removal
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 58/100
- issue の種類
- 機能追加
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- github, javascript
調査の方向性
Start with scripts/contributor-issue-comment.js and scripts/utils.js to trace how /assign checks recent unassignments, then read scripts/constants.js and scripts/unassign-inactive-issues.js for the cooldown window and bot message. Test the contributor cases in test-actions using the linked automation testing guide. Done means bot inactivity removals block self-assignment across community repos for seven days, while maintainer removals and self-drops keep their specified behavior.
索引モデルが issue の本文から書いたものです。
説明
Overview
The weekly sweep unassigns a contributor for inactivity. The contributor comments /assign and
the bot assigns them again within hours. The removal carries no weight, and a contributor who was
waiting loses the issue.
Block self-assignment for a cooldown period after the bot removes a contributor for inactivity.
During the cooldown, only a maintainer can assign them. The block covers every issue in the
community repos, not only the issue they left.
Context
On learningequality/kolibri#14261, a maintainer unassigned a contributor on 2026-10-23 at 13:07
UTC. Someone else asked for the issue the next morning. At 05:04 UTC the removed contributor
asked to be assigned again, the bot replied "Comment /assign to assign yourself", and at 05:07
the bot assigned them. The maintainer removed them a second time on 2026-10-26.
scripts/contributor-issue-comment.js reads recent unassignments and adds them to the
assignment count instead of blocking:
const totalSlots = assignedIssues.length + filteredUnassignments.length;
if (totalSlots >= MAX_ASSIGNED_ISSUES) { ... }
MAX_ASSIGNED_ISSUES is 2, so one removal leaves a free slot and /assign passes.
getRecentUnassignments in scripts/utils.js reads event.assignee.login and ignores
event.actor.login, so it cannot tell who removed the contributor.
Two bot messages send the contributor back. BOT_MESSAGE_KEYWORD_GOOD_FIRST_ISSUE tells any
contributor to comment /assign, and the unassignment comment in
scripts/unassign-inactive-issues.js says "please message us here, and we'll assign you again".
The Change
Classify each unassignment by actor. Return unassignedBy from event.actor.login:
| Actor | Meaning | Effect |
|---|---|---|
| The contributor | Self-drop | Consumes a slot, as it does today |
learning-equality-bot[bot] |
Inactivity removal | Starts the cooldown |
| Anyone else | Not an inactivity removal | No cooldown |
Unassignment for inactivity belongs to the sweep, so the bot is the actor and no marker is
needed. A maintainer using the assignee menu starts no cooldown, because that removal was not
for inactivity.
Block /assign during the cooldown. Check it in handleAssignCommand before the limit
check. A block is not a slot, and the issue the contributor left is no exception. Only a
maintainer can assign them during the cooldown, by hand.
Add REMOVAL_COOLDOWN_DAYS to scripts/constants.js, set to 7.
getRecentUnassignments takes the longer of the two windows, and each rule reads its own.
Add a block message that names the days remaining and says that a maintainer can assign them
by hand. Send BOT_MESSAGE_KEYWORD_GOOD_FIRST_ISSUE only to a contributor who is not under
cooldown, and reword the unassignment comment to name the cooldown instead of promising
re-assignment.
Out of Scope
- Changing
MAX_ASSIGNED_ISSUES,ASSIGN_COOLDOWN_DAYS, or the 30-day inactivity threshold. - Blocking an assignment that a maintainer makes by hand.
- What counts as inactivity. That is #128.
Acceptance Criteria
- A contributor whom the bot removed for inactivity within the cooldown cannot self-assign
the issue they left, or any other issue in a community repo. - A maintainer can assign a contributor under cooldown by hand.
- A removal by a maintainer through the assignee menu starts no cooldown.
- A self-drop keeps the current behaviour, that is it consumes a slot and does not block.
- Once the cooldown expires,
/assignworks again. - The block message names the days remaining and does not tell the contributor to comment
/assign. - The bot does not post
BOT_MESSAGE_KEYWORD_GOOD_FIRST_ISSUEto a contributor under
cooldown. - The unassignment comment names the cooldown and promises no re-assignment.
Testing
Test in test-actions. See
testing the automations.
The contributor cases need an account outside the organization.
- Label an issue
help wantedandgood first issue, then comment/assignfrom the
contributor account. Expect an assignment. - Dispatch the sweep so that the bot unassigns the contributor, then comment
/assignagain.
Expect a refusal that names the days remaining. - Comment
/assignon a secondgood first issue. Expect the same refusal. - Assign the contributor by hand. Expect the assignment to hold.
- Unassign the contributor through the assignee menu, then comment
/assign. Expect an
assignment, because a maintainer removal starts no cooldown. - Unassign yourself from the contributor account, then comment
/assignon a second issue.
Expect an assignment, because one slot is free.
References
The real case is learningequality/kolibri#14261. #128 fixes what the sweep counts as inactivity,
and this issue depends on it, because the sweep is the actor that starts the cooldown.
AI usage
I used Claude Code to read the assignment gate, to trace the timeline of kolibri#14261, and to
confirm that getRecentUnassignments ignores the actor. I decided that the cooldown blocks
rather than consumes a slot, that it covers every issue, and that only an inactivity removal by
the bot starts it.
- 主要言語
- JavaScript
- スター
- 1
- フォーク
- 7
- 平均マージ
- 2日 8時間
- マージ済み PR(30日)
- 10
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
learningequality/.github のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
learningequality/.github#112 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 42/100
learningequality/.github#130 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
learningequality/.github#129 ·
メンテナーはふだん 1 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 24/100
learningequality/.github#128 ·
メンテナーはふだん 1 日以内に返信
-
Migrate generate-automation.js to js-yaml 5対応中かも @rtibblesbot が 5 日前に担当しました。 オープンcommunity-contribution-in-progress dependencies javascript
learningequality/.github#122 · コメント 1 件 · リアクション 1 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
learningequality/.github の issue をすべて見る
似ている issue
-
44-x-y bug :beetle:
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
electron/electron#55528 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
react/react-native#59699 ·
メンテナーはふだん 2 日以内に返信
-
status: needs triage
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
mastra-ai/mastra#29053 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
enhancement triage
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
fjaeckel/seriesoftubes#230 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信