feat: QQQ RC.7 followers provider and secured-data label rules #23

Merged
KofTwentyTwo merged 1 commits from feature/qqq-rc7 into develop 2026-10-14 21:33:34 +00:00
KofTwentyTwo commented 2026-10-14 21:29:17 +00:00 (Migrated from github.com)

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.
      • CircleCI test_only.

      🤖 Generated with Claude Code

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)
Sign in to join this conversation.