Phases (h) and (i), qbit side, of QRun-IO/qqq#1136 (spec §4 rows 15 to 18, §6.4, §7.3, §7.4): sharing, tasks and reminders, and owner/assignee.
Sharing:
SharingService:
link returns the canonical app URL, using frontendBaseUrl when it's set;
preview reports per recipient whether they can read the record (true, false or unknown);
share sends to 1–25 recipients with a message. Readers are notified and made followers. Non-readers and unknowns get a notification with no record data (no label, no message) that links to the access-request page.
collaboration_share records each send, and markOpened is recipient-only.
AccessRequestService:
Any signed-in user can request access. The response is identical whether or not the record exists, and duplicates are reused.
Approvers are notified: collaboration.admin, the table's approver permission, and the record owner. Finding permission holders uses an optional PermissionHolderDirectory.
Mark granted and Decline record the outcome and notify the requester; they never change permissions.
collaboration_access_request rows are visible to the requester and collaboration.admin only, and show only the table and id.
Tasks:
collaboration_task and TasksService: create, update, complete, reopen, cancel, list, and mine (due date first).
The assignee must be able to read the record.
The hidden collaborationSendTaskReminders process sends one reminder and one overdue notice.
Mark done and Reopen record actions.
Owner/assignee:
collaboration_record_assignment and AssignmentService (assign, get, myRecords), for host tables without their own owner/assignee columns. Tables with their own columns use core RecordOwnership (QRun-IO/qqq phase i PR).
Bulk Assign to and Take ownership actions.
My work:MyWorkService.summary() returns open tasks, records assigned to me per table, and unread mentions (collaboration_mention.readAt plus markMentionsRead).
Also: home cards for access requests, open and overdue tasks, and shares this week; parent cleanup for tasks, assignments and shares; DDL for all of it. Endpoints come in the UI API PR.
Test plan
./mvnw -o verify: 84 tests, 96.9% instruction and 100% class coverage, checkstyle clean.
## Summary
Phases (h) and (i), qbit side, of QRun-IO/qqq#1136 (spec §4 rows 15 to 18, §6.4, §7.3, §7.4): sharing, tasks and reminders, and owner/assignee.
**Sharing:**
- `SharingService`:
- `link` returns the canonical app URL, using `frontendBaseUrl` when it's set;
- `preview` reports per recipient whether they can read the record (true, false or unknown);
- `share` sends to 1–25 recipients with a message. Readers are notified and made followers. Non-readers and unknowns get a notification with **no record data** (no label, no message) that links to the access-request page.
- `collaboration_share` records each send, and `markOpened` is recipient-only.
- `AccessRequestService`:
- Any signed-in user can request access. The response is identical whether or not the record exists, and duplicates are reused.
- Approvers are notified: `collaboration.admin`, the table's approver permission, and the record owner. Finding permission holders uses an optional `PermissionHolderDirectory`.
- **Mark granted** and **Decline** record the outcome and notify the requester; they never change permissions.
- `collaboration_access_request` rows are visible to the requester and `collaboration.admin` only, and show only the table and id.
**Tasks:**
- `collaboration_task` and `TasksService`: create, update, complete, reopen, cancel, list, and mine (due date first).
- The assignee must be able to read the record.
- The hidden `collaborationSendTaskReminders` process sends one reminder and one overdue notice.
- **Mark done** and **Reopen** record actions.
**Owner/assignee:**
- `collaboration_record_assignment` and `AssignmentService` (assign, get, myRecords), for host tables without their own owner/assignee columns. Tables with their own columns use core `RecordOwnership` (QRun-IO/qqq phase i PR).
- Bulk **Assign to** and **Take ownership** actions.
**My work:** `MyWorkService.summary()` returns open tasks, records assigned to me per table, and unread mentions (`collaboration_mention.readAt` plus `markMentionsRead`).
**Also:** home cards for access requests, open and overdue tasks, and shares this week; parent cleanup for tasks, assignments and shares; DDL for all of it. Endpoints come in the UI API PR.
## Test plan
- [x] `./mvnw -o verify`: 84 tests, 96.9% instruction and 100% class coverage, checkstyle clean.
- [ ] CircleCI `test_only`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Phases (h) and (i), qbit side, of QRun-IO/qqq#1136 (spec §4 rows 15 to 18, §6.4, §7.3, §7.4): sharing, tasks and reminders, and owner/assignee.
Sharing:
SharingService:linkreturns the canonical app URL, usingfrontendBaseUrlwhen it's set;previewreports per recipient whether they can read the record (true, false or unknown);sharesends to 1–25 recipients with a message. Readers are notified and made followers. Non-readers and unknowns get a notification with no record data (no label, no message) that links to the access-request page.collaboration_sharerecords each send, andmarkOpenedis recipient-only.AccessRequestService:collaboration.admin, the table's approver permission, and the record owner. Finding permission holders uses an optionalPermissionHolderDirectory.collaboration_access_requestrows are visible to the requester andcollaboration.adminonly, and show only the table and id.Tasks:
collaboration_taskandTasksService: create, update, complete, reopen, cancel, list, and mine (due date first).collaborationSendTaskRemindersprocess sends one reminder and one overdue notice.Owner/assignee:
collaboration_record_assignmentandAssignmentService(assign, get, myRecords), for host tables without their own owner/assignee columns. Tables with their own columns use coreRecordOwnership(QRun-IO/qqq phase i PR).My work:
MyWorkService.summary()returns open tasks, records assigned to me per table, and unread mentions (collaboration_mention.readAtplusmarkMentionsRead).Also: home cards for access requests, open and overdue tasks, and shares this week; parent cleanup for tasks, assignments and shares; DDL for all of it. Endpoints come in the UI API PR.
Test plan
./mvnw -o verify: 84 tests, 96.9% instruction and 100% class coverage, checkstyle clean.test_only.🤖 Generated with Claude Code