This moves qbit-collaboration onto QQQ 4.1.0-RC.7 and adopts two core additions.
Followers SPI (qqq#1164).CollaborationFollowersProvider returns a record's followers who want each event: CHANGE and ALERT use notifyOnChange, COMMENT uses notifyOnComment, and muted follows are excluded. It runs system-scoped for the one record and is registered on RecordFeaturesMetaData. qbit-alerts calls RecordFollowers.get(..., ALERT) and checks recipients' access itself.
Secured data (qqq#1172):
Cached favorite and recent labels are stored only when FieldAccessHelper.isRecordLabelFullAccess holds for the session; otherwise null. Lists still re-read labels as the viewer.
Comment and share notification titles fall back to " #" for recipients without FULL label access.
The timeline relies on core masking. Tests prove a MASKED field shows the mask, a HIDDEN field is omitted, and the canary value never appears.
Test plan
./mvnw verify: 146 tests, coverage 96.3% instructions and 99.1% classes; checkstyle and guardrails pass.
This moves qbit-collaboration onto QQQ 4.1.0-RC.7 and adopts two core additions.
- **Followers SPI (qqq#1164).** `CollaborationFollowersProvider` returns a record's followers who want each event: CHANGE and ALERT use `notifyOnChange`, COMMENT uses `notifyOnComment`, and muted follows are excluded. It runs system-scoped for the one record and is registered on `RecordFeaturesMetaData`. qbit-alerts calls `RecordFollowers.get(..., ALERT)` and checks recipients' access itself.
- **Secured data (qqq#1172):**
- Cached favorite and recent labels are stored only when `FieldAccessHelper.isRecordLabelFullAccess` holds for the session; otherwise null. Lists still re-read labels as the viewer.
- Comment and share notification titles fall back to "<Table> #<id>" for recipients without FULL label access.
- The timeline relies on core masking. Tests prove a MASKED field shows the mask, a HIDDEN field is omitted, and the canary value never appears.
## Test plan
- [x] `./mvnw verify`: 146 tests, coverage 96.3% instructions and 99.1% classes; checkstyle and guardrails pass.
- [ ] 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.
This moves qbit-collaboration onto QQQ 4.1.0-RC.7 and adopts two core additions.
CollaborationFollowersProviderreturns a record's followers who want each event: CHANGE and ALERT usenotifyOnChange, COMMENT usesnotifyOnComment, and muted follows are excluded. It runs system-scoped for the one record and is registered onRecordFeaturesMetaData. qbit-alerts callsRecordFollowers.get(..., ALERT)and checks recipients' access itself.FieldAccessHelper.isRecordLabelFullAccessholds for the session; otherwise null. Lists still re-read labels as the viewer.Test plan
./mvnw verify: 146 tests, coverage 96.3% instructions and 99.1% classes; checkstyle and guardrails pass.test_only.🤖 Generated with Claude Code