Repository navigation
[4/10] Join a project by asking to take one of its tasks - #356
Merged
Merged
Conversation
hturnbull93
force-pushed
the
team-name-link
branch
from
October 21, 2026 13:15
2b33808 to
523a5c7
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 21, 2026 13:15
7926aff to
a4b0f18
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 22, 2026 17:17
a4b0f18 to
d4ec93e
Compare
hturnbull93
force-pushed
the
timeline-access
branch
from
October 22, 2026 17:17
e3f4e4a to
7dbae60
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 22, 2026 17:36
d4ec93e to
56ce373
Compare
hturnbull93
force-pushed
the
timeline-access
branch
from
October 22, 2026 17:36
7dbae60 to
3f0be6f
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 23, 2026 09:02
56ce373 to
cddd7d9
Compare
hturnbull93
force-pushed
the
timeline-access
branch
2 times, most recently
from
October 23, 2026 09:16
d994f96 to
d3683b5
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 23, 2026 09:16
cddd7d9 to
59d5ef9
Compare
The patch sent once the create lands read the user from the render that started it, which can be before the session has loaded, so "I want to lead this project" saved no owner. Read the signed-in user when the create lands. This made ProjectEditor.test.tsx "saves edits made while the draft is still being created" fail about half the time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove the bare Join this project button. A volunteer joins by asking to take a task (Ask to take this), reached from a Pick a task to join button in the project header; with no open task the header says No open tasks yet. Offer to lead opens the lead-only request, and shows only while the project seeks an owner. expressInterest without a task now takes only want_to_own, on a project that has no owner; a plain want_to_contribute join is refused. Withdrawing, or turning down an invite, no longer blocks claiming, since claiming is now the only way back in. Tests that set up an applicant ask for a task instead (askToJoin, askToJoinViaApi). Closes #338 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 23, 2026 09:17
59d5ef9 to
ca9ea27
Compare
Offering to lead an ownerless project created a pending interest but never told anyone: admin triage only surfaces pending_review/ needs_discussion projects, which don't overlap with the statuses a project seeks an owner in. Chapter staff now get a project_lead_offer notification, cleared when the offer is answered. Holding a second task while an earlier request was still pending skipped notifying the owner entirely, because the self-claim branch only ran its notify/interest-update block for a brand new interest row. Each held task is new information to the owner regardless, so the block now always runs. Claiming a task can now carry an optional message to the owner, shown on the interest and in its email. Replaces the "Pick a task to join" tab-switch with a task-picker modal (full screen on mobile) listing open tasks with an inline claim action, so joining doesn't require leaving the Overview tab. The picker and the Tasks tab now share one ProjectTaskList component. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…cation The owner's Inbox notification only said "X asked to help out on the project", so an owner answering from the Inbox never saw which task was asked for or what the volunteer wrote. Its body now reads "X asked to take 'Task': message" (cut to 200 characters, like contact requests). The email names the task in its subject and opening line, and shows the "Their message" box only when there is one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Screenshots: https://fedora.taila91c66.ts.net:8444/docs/20261023-114405-pr-356-join-and-claim-a-task.html
A volunteer now joins a project by asking to take one of its tasks. The bare "Join this project" button is gone. Offering to lead an ownerless project still works, from its own button.
UI (project page)
ProjectTaskListcomponent as the picker.isSeekingOwner). It opens a lead-only dialog ("Offer to lead this project") with an optional message.API
projects.expressInterestwithout ataskIdnow only acceptswant_to_own, and only on a project that has no owner. A plainwant_to_contributegets a BAD_REQUEST: "Join a project by claiming one of its tasks". Joining a task as a helper with ataskIdis unchanged.CLAIM_BLOCKING_INTEREST). Claiming is now the only way back onto a project, and the "You can ask again at any time" toast now holds true.notifyOwnerOfInterestis only used by the claim path now. The owner's notification names the task and carries the volunteer's message: "Hal asked to take 'Design flyer': happy to do this", so it can be answered from the Inbox without opening the project. The email names the task in its subject and opening line, and shows "Their message" only when there is one.project_lead_offer), cleared when the offer is answered. Previously nothing told anyone: admin triage only surfacespending_review/needs_discussionprojects, which never overlap with the statuses a project seeks an owner in, so this was the only way to request leadership on an approved project and it went unheard.updateTask's self-claim path takes an optionalmessage, shown on the interest and in the owner's email.Tests
askToJoinhelper intest/rpc.tssets up applicants through the claim path.09): joining through the task-picker modal from the project page, Offer to lead on an ownerless project, and the no-open-tasks state. Old Join-button flows moved to these. API setup in11,20,38,42,43and44uses the newaskToJoinViaApi.Decisions
want_to_contributethroughexpressInterest. Invites useinvite, admins useassign, claims go throughupdateTask, and MCP and import don't touch interests. Leaving the endpoint open would keep a way round the new rule. Only test setup used it, and that now goes through the claim path.want_to_ownrequest on an owned project would be a back door to a plain join. An old pendingwant_to_ownon a project that has since found an owner is still accepted as a helper.lib/action-labels.ts), which the picker's own per-task action keeps.Data impact: None. No migration. Existing pending plain-join requests can still be accepted or declined.
Closes #338
🤖 Generated with Claude Code