Skip to content

feat(board): claim limits, similar-issue details, admin toolbar with prompt comments, issues as Markdown (T-10) - #22

Merged
vlidholt merged 3 commits into
serverpod:mainfrom
vlidholt:feat/board-claim-limits-t10
Oct 20, 2026
Merged

vlidholt merged 3 commits into
serverpod:mainfrom
vlidholt:feat/board-claim-limits-t10

Conversation

@vlidholt

Copy link
Copy Markdown
Contributor

Wonky-Task: T-10
Wonky-Claim: 9MXR-5MFP

Improvements to the contribution system (#10, #14, #15, #20): claim limits and blocks, similar-issue details while reporting, a Done tab without tasks, choosing the comments a task prompt is written from, and every issue as Markdown. Spec 16 is updated (§4.2.2, §4.3, §4.4, §4.5, §6.4, §8.1, new §8.4, §9.3, §10.1, §11, §12, §14).

Acceptance criteria

  • Max 3 concurrent claims. maxActiveClaimsPerUser is 3; claimTask answers limitExceeded for a 4th. BoardMe.maxActiveClaims tells the client.
  • 2-week block after 3 expired claims. A claim that runs out without a linked PR or an unclaim leaves an expired activity row. Every 3 of them block claiming for 14 days from the last one (BoardTaskClaims.claimBlock, config expiredClaimsToBlock, claimBlockDays). claimTask answers forbidden with the reason. BoardMe.claimBlockedUntil / claimBlockedReason drive the task page: Claim this task is disabled and a notice says until when and why.
  • 2-week block after 2 invalid issues. "Invalid" means removed by a moderator (moderation: removed); declined issues are valid reports. Two removals block claiming for 14 days (invalidPostsToBlock). The block is computed from the record, not stored, so restoring a removed issue (undo) lifts it. Admins are exempt.
  • Similar posts while typing, without completed ones. board.similar returns open / planned issues only (the triage's duplicate check still sees done). The client also drops done and shipped issues, for older servers.
  • Details popup. In Similar issues, the #412 Title is a link (hover underline, focus ring, Enter/Space, screen-reader label). It opens dialog.board.similarPost over the report dialog: chips, status, votes, author and the Markdown body, with Close and Vote instead.
  • Done tab. It lists only done and shipped bugs and improvements; the Finished tasks section is gone. In the breadcrumb trail, Done no longer holds tasks.
  • Comment checkboxes when creating a task. On the issue page every visible comment gets a checkbox for admins, all checked, so they read the comments in full and uncheck the ones the prompt should not see. Select for building sends the unchecked ones as excludedComments. Creating a task from several issues on the board lists their comments in the task dialog (ChecklistFieldSpec, MCP-operable). The issue page also gets an admin toolbar with the common actions and ⋮ on one row; buttons that don't fit move into ⋮, least important first (ToolbarOverflowLayout, as in the editors).
  • Prompt uses only the selected comments. Left-out comments are stored on the task (BoardTask.promptExcludedCommentIds, migration 20261019202955634-board-claim-limits). Every AI pass (first prompt, Regenerate, rewrites after issue changes, merged tasks) leaves them out.
  • Markdown route. /improvements/p/<n>.md (text/markdown, no-cache) gives the title, the facts, the body, the included details and the visible comments. Public content only; anything not public answers 404 (BoardMarkdown, ImprovementsRedirectRoute).
  • Prompt links use .md. Reports this task comes from links https://wonky.work/improvements/p/<n>.md.
  • Light and dark for the popup, the comment checkboxes and the admin toolbar (screenshots below; widget tests run in both themes).
  • Screenshots below (rendered from the widget harness with the app's fonts).

Screenshots

Issue page for an admin: the toolbar with ⋮ on one row, and the comment checkboxes (one unchecked)

issue page light
issue page dark

A narrow window: Merge into… and Decline… moved into ⋮

issue narrow light
issue narrow dark

Similar issues in the report dialog, and the details popup

similar panel light
similar popup light
similar popup dark

A claim-blocked user on a task page

claim blocked light
claim blocked dark

Done tab: issues only

done tab light
done tab dark

Tests

  • Server: board_claim_limits_test (limit of 3, 3 expiries, 2 removals, restore lifts the block, the block ends after 14 days), board_task_context_test (only selected comments reach the prompt, also after a merge; foreign comment uuids are refused; .md links in the prompt; the Markdown content; held and missing issues have none), improvements_redirect_route_test (.md → 200 text/markdown, 404), task_prompt_template_test. Full suite: 2287 passed.
  • wonky_app: report dialog (done/shipped not suggested, popup in light and dark, Vote instead from the popup), Done tab without tasks (light and dark), issue page (toolbar and ⋮ on one row, overflow on a narrow window, comment checkboxes, the unchecked comment left out, no checkboxes when not buildable or not an admin), the board's task dialog checklist, createTask with excludedComments through undo/redo, trail parsing. flutter test -x golden,slow,e2e: 907 passed.
  • Verified by hand in the Drive release build.

The screenshots live in their own commit (ee2f1c25) and are removed in the next one, so the squash merge adds no images.

🤖 Generated with Claude Code

vlidholt and others added 3 commits October 20, 2026 07:08
…prompt comments, issues as Markdown (T-10)

- Claims: at most 3 at a time; 3 expired claims or 2 issues removed by a
  moderator block claiming for 2 weeks (computed from the record, so
  restoring an issue lifts its block). BoardMe tells the client; the task
  page disables Claim and shows why (specs/16 §8.4).
- Report dialog: similar issues are open or planned only; a title opens the
  issue's details in a popup with Close and Vote instead.
- Done lists finished bugs and improvements only, no tasks.
- Issue page: admins get a toolbar with the common actions and ⋮ on one
  row; buttons that don't fit move into ⋮ (ToolbarOverflowLayout). Visible
  comments get checkboxes; Select for building leaves the unchecked ones
  out of the task prompt (BoardTask.promptExcludedCommentIds). Creating a
  task from several issues lists their comments in the task dialog
  (ChecklistFieldSpec).
- /improvements/p/<n>.md serves the issue as Markdown; task prompts link
  the issues there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@wonky-work-bot

Copy link
Copy Markdown

Wonky task review: T-10: Improvements to contribution system

Screenshot: the description has an image of the changed UI.

This PR properly delivers the expected features for T-10, adding UI popups and filters to board workflows, limiting task claims dynamically, and granting control over comment context in task prompts. Testing coverage is thorough and directly addresses the requirements. An additional layout refactor for the admin actions menu was implemented smoothly alongside the task creation upgrades.

Acceptance criterion Verdict Evidence Note
Users can claim a maximum of 3 tasks concurrently; the server rejects claims beyond this limit. Met wonky_server/lib/src/platform/board/board_config.dart, wonky_server/lib/src/platform/board/board_task_claims.dart The maxActiveClaimsPerUser limit is updated to 3 and the checks appropriately refuse further claims.
Users are blocked from claiming tasks for 2 weeks if they fail to deliver or unclaim a task within the deadline 3 times. Met wonky_server/lib/src/platform/board/board_task_claims.dart The system calculates expired claims on-the-fly and blocks claiming dynamically for 14 days when the threshold is hit.
Users are blocked from claiming tasks for 2 weeks if they have submitted multiple (2 or more) bugs or improvements that are marked as invalid. Met wonky_server/lib/src/platform/board/board_task_claims.dart Like expired claims, moderation removals dynamically block the user from claiming tasks for 14 days.
In the issue report dialog, the system suggests similar posts as the user types, excluding completed tasks. Met packages/wonky_app/lib/src/board/report/similar_posts.dart, wonky_server/lib/src/platform/board/board_posts.dart Completed/shipped issues are excluded from the suggestions in the UI, and the server defaults to open/planned.
Users can view the details of a suggested similar post in a popup dialog. Met packages/wonky_app/lib/src/board/report/similar_posts.dart Added an interactive hoverable/clickable title that opens a _SimilarPostDialog with the issue's full details.
The "Done" page of the board only displays completed features and bugs, excluding completed tasks. Met packages/wonky_app/lib/src/board/pages/board_page.dart The _DoneLayout that displayed finished tasks was removed from the "Done" tab view.
When admins create a task from an issue, the UI provides checkboxes to select which comments to include in the task context. Met packages/wonky_app/lib/src/board/pages/post_page.dart, packages/wonky_app/lib/src/shell/form_dialog.dart Admins now see a checkbox next to each visible comment on the issue page and in the task creation dialog when bundling.
The generated task prompt only includes the selected comments and ignores unselected ones. Met wonky_server/lib/src/platform/board/board_tasks.dart The promptExcludedCommentIds are successfully saved during task creation and ignored when generating AI prompts.
The web server exposes a route that provides a Markdown representation of an improvement/bug ticket when .md is appended to its URL (or via a dedicated Markdown route). Met wonky_server/lib/src/platform/board/board_markdown.dart, wonky_server/lib/src/web/routes/improvements_redirect_route.dart The route handles .md URL requests and renders safe, public information in Markdown format using BoardMarkdown.post.
The generated task prompt uses the .md URL when linking to the associated issues. Met wonky_server/lib/src/platform/board/ai/task_prompt_template.dart Prompt links now append the .md suffix.
Light and dark mode are supported for the new similar post popup and comment selection UI. Met packages/wonky_app/test/board/pages/post_page_test.dart, packages/wonky_app/test/board/report/report_dialog_test.dart Tested effectively in both modes within widget tests.
The pull request description includes a screenshot of the changed UI (light and dark where both change). Met <pr_data> Screenshots are included correctly.

Scope:

  • packages/wonky_app/lib/src/board/pages/post_page.dart: Refactoring of admin actions on the post page into an overflow toolbar layout (ToolbarOverflowLayout). Although mentioned in T-10's spec updates, it isn't listed directly in the task's criteria.

Tests: Added. Server and widget tests successfully cover all new conditions, including blocks, prompts, MD routes, and widget popups.

Specs: Updated. The specs file was correctly updated.

Risks:

  • Security in wonky_server/lib/src/platform/board/board_markdown.dart: The new .md route correctly evaluates permissions using a signed-out mock user session to prevent leaking internal/sensitive issue content.
  • Migration in wonky_server/migrations/20261019202955634-board-claim-limits/migration.json: Database migration adding promptExcludedCommentIds is generated properly and safe.
Facts
  • Changed files: 60 (+40638 −241)
  • Tests changed: yes
  • specs/ changed: yes
  • pubspec.yaml changed: no
  • Migrations added: 20261019202955634-board-claim-limits
  • Workflow or tooling changes: none
  • Security-sensitive paths: none

Reviewed commit f43b3ce47320. This review is advisory; CI and the maintainers decide.

@vlidholt
vlidholt merged commit 4b0f799 into serverpod:main Oct 20, 2026
42 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 20, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant