ca-grow-ops-manager/specs/communications-and-notifications.md
fullsizemalt da7729d6e4
Some checks failed
Deploy to Production / deploy (push) Failing after 0s
Test / backend-test (push) Failing after 0s
Test / frontend-test (push) Failing after 0s
Initial commit: Spec Kit foundation complete
- Constitution and project spec (spec.yml)
- 7 comprehensive feature specs (tasks, batches, labor, compliance, inventory, integrations, comms)
- Phase 1 implementation plan (6-week roadmap)
- Week 1 task breakdown (15 concrete tasks)
- Architecture and compliance documentation
- Backend and frontend setup guides
- Deployment guide for nexus-vector
- CI/CD workflows (Forgejo Actions)
- Quick start guide for developers

Project is ready for implementation with:
- Automated testing on every push
- Automatic deployment to nexus-vector on push to main
- Database migrations handled automatically
- Health checks and monitoring

Stack: TypeScript, Fastify, React, Vite, PostgreSQL, Prisma, Docker
2025-12-08 23:54:12 -08:00

360 lines
9.8 KiB
Markdown

# Feature Spec: Communications and Notifications
**Domain**: Communications
**Status**: Draft
**Version**: 0.1.0
**Last Updated**: 2025-12-08
---
## Overview
The Communications and Notifications module provides team collaboration tools and notification channels to keep facility staff aligned. It includes task comments with @mentions, daily digest emails/notifications, an announcements channel for SOP changes and inspection dates, and role-based notification preferences.
---
## User Stories
### As a Staff Member
- I want to comment on tasks and @mention teammates so we can collaborate
- I want to receive a daily digest of my tasks so I know what's due today
- I want to see facility announcements so I'm aware of SOP changes and inspection dates
### As a Head Grower
- I want to post announcements about SOP changes so the team stays informed
- I want to @mention staff in task comments so they're notified of important updates
- I want to see which tasks have unresolved comments so I can follow up
### As a Compliance Manager
- I want to announce upcoming inspections so the team can prepare
- I want to ensure all staff acknowledge critical announcements
### As an Owner
- I want to configure notification preferences per role so users aren't overwhelmed
- I want to see communication history for audit purposes
---
## Requirements
### Functional Requirements
#### Task Comments and @Mentions
- **Comment on tasks**:
- Markdown-supported text
- @mention users (autocomplete)
- Attach photos (optional)
- Edit/delete own comments
- **Notifications**:
- @mentioned users receive notification
- Task assignee notified of new comments
- Notification channels: in-app, email, mobile push (optional)
- **Comment history**:
- Chronological display
- User attribution and timestamp
- Immutable after 5 minutes (edit window)
#### Daily Digest
- **Content**:
- Tasks due today
- Overdue tasks
- Upcoming key events (e.g., day-21 defoliation, harvest dates)
- Unread announcements
- **Delivery**:
- Email (default)
- In-app notification
- Mobile push (optional)
- **Timing**:
- Configurable per user (default: 7 AM)
- Skip if no tasks/events
#### Announcements Channel
- **Post announcements**:
- Title and body (markdown-supported)
- Priority (normal, important, critical)
- Target audience (all, specific roles)
- Expiration date (optional)
- **Acknowledgment**:
- Critical announcements require acknowledgment
- Track who has acknowledged
- Reminder notifications for unacknowledged
- **Display**:
- Announcement feed (chronological)
- Unread badge
- Pin important announcements
#### Notification Preferences
- **Per user**:
- Enable/disable daily digest
- Digest delivery time
- Enable/disable @mention notifications
- Enable/disable announcement notifications
- Preferred channels (email, in-app, mobile push)
- **Per role** (admin-configured defaults):
- Default notification settings for new users
### Non-Functional Requirements
- **Performance**: Notifications delivered within 1 minute
- **Reliability**: Email delivery with retry logic
- **Accessibility**: WCAG 2.1 AA compliant
- **Privacy**: Users can opt out of non-critical notifications
---
## Out of Scope (v1)
- Real-time chat (Slack/Discord-style)
- Video calls or screen sharing
- File sharing beyond task attachments
- Integration with external communication tools (Slack, Teams)
---
## Acceptance Criteria
### Task Comments
- [ ] Users can comment on tasks with markdown
- [ ] Users can @mention teammates with autocomplete
- [ ] @mentioned users receive notifications
- [ ] Comments can be edited within 5 minutes
- [ ] Comment history is chronological with timestamps
### Daily Digest
- [ ] Users receive daily digest at configured time
- [ ] Digest includes tasks due today and overdue
- [ ] Digest includes upcoming key events
- [ ] Digest includes unread announcements
- [ ] Users can configure digest time or disable
### Announcements
- [ ] Admins can post announcements with priority
- [ ] Critical announcements require acknowledgment
- [ ] Unacknowledged users receive reminders
- [ ] Announcements can be pinned
- [ ] Announcements can expire automatically
### Notification Preferences
- [ ] Users can configure notification preferences
- [ ] Admins can set default preferences per role
- [ ] Users can opt out of non-critical notifications
- [ ] Notification channels (email, in-app, push) are configurable
---
## Technical Notes
### Data Model (Prisma Schema)
```prisma
model TaskComment {
id String @id @default(cuid())
taskId String
task Task @relation(fields: [taskId], references: [id])
content String // markdown
authorId String
author User @relation(fields: [authorId], references: [id])
mentions String[] // user IDs
photos String[] // URLs
editedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Announcement {
id String @id @default(cuid())
title String
content String // markdown
priority AnnouncementPriority @default(NORMAL)
targetRoles String[] // role IDs, empty = all
requiresAck Boolean @default(false)
expiresAt DateTime?
pinned Boolean @default(false)
authorId String
author User @relation(fields: [authorId], references: [id])
acknowledgments AnnouncementAck[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model AnnouncementAck {
id String @id @default(cuid())
announcementId String
announcement Announcement @relation(fields: [announcementId], references: [id])
userId String
user User @relation(fields: [userId], references: [id])
acknowledgedAt DateTime @default(now())
}
model NotificationPreference {
id String @id @default(cuid())
userId String @unique
user User @relation(fields: [userId], references: [id])
dailyDigest Boolean @default(true)
digestTime String @default("07:00") // HH:MM
mentions Boolean @default(true)
announcements Boolean @default(true)
channels Json // { email: true, inApp: true, push: false }
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Notification {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
type NotificationType
title String
content String
link String? // deep link to related entity
read Boolean @default(false)
readAt DateTime?
createdAt DateTime @default(now())
}
enum AnnouncementPriority {
NORMAL
IMPORTANT
CRITICAL
}
enum NotificationType {
TASK_ASSIGNED
TASK_DUE
TASK_OVERDUE
TASK_COMMENT
MENTION
ANNOUNCEMENT
DIGEST
ALERT
}
```
### API Endpoints
- `GET /api/communications/comments/:taskId` - Get comments for task
- `POST /api/communications/comments` - Post comment
- `PATCH /api/communications/comments/:id` - Edit comment
- `DELETE /api/communications/comments/:id` - Delete comment
- `GET /api/communications/announcements` - List announcements
- `POST /api/communications/announcements` - Post announcement
- `POST /api/communications/announcements/:id/acknowledge` - Acknowledge announcement
- `GET /api/communications/notifications` - Get user notifications
- `PATCH /api/communications/notifications/:id/read` - Mark notification as read
- `GET /api/communications/preferences` - Get user notification preferences
- `PATCH /api/communications/preferences` - Update notification preferences
- `POST /api/communications/digest/send` - Trigger daily digest (cron job)
### UI Components
- `TaskCommentThread` - Comment thread for tasks
- `CommentForm` - Comment input with @mention autocomplete
- `AnnouncementFeed` - Announcement list with filters
- `AnnouncementCard` - Announcement display with acknowledgment
- `AnnouncementForm` - Announcement creation/editing
- `NotificationBell` - In-app notification dropdown
- `NotificationPreferences` - User notification settings
- `DigestPreview` - Preview of daily digest
---
## Dependencies
- **Tasks** module (for task comments)
- **Authentication** (for user mentions and RBAC)
---
## Risks & Mitigations
| Risk | Impact | Mitigation |
|------|--------|------------|
| Notification fatigue | High | Configurable preferences; smart batching; daily digest |
| Email deliverability | Medium | Use reputable email service (SendGrid, Mailgun); retry logic |
| Spam/abuse of @mentions | Medium | Rate limiting; admin moderation tools |
| Missed critical announcements | High | Require acknowledgment; reminder notifications |
---
## Email Templates
### Daily Digest
```
Subject: Your tasks for [Date]
Hi [Name],
Here's your daily summary:
**Tasks Due Today** (3)
- [Task 1] - [Room/Batch]
- [Task 2] - [Room/Batch]
- [Task 3] - [Room/Batch]
**Overdue Tasks** (1)
- [Task 4] - [Room/Batch] (due [Date])
**Upcoming Events**
- Day-21 defoliation for Batch #123 (tomorrow)
- Harvest for Batch #456 (in 3 days)
**Unread Announcements** (1)
- [Announcement Title] (posted [Date])
[View Full Dashboard]
```
### @Mention Notification
```
Subject: [User] mentioned you in a task comment
Hi [Name],
[User] mentioned you in a comment on "[Task Name]":
"[Comment excerpt...]"
[View Task]
```
### Critical Announcement
```
Subject: [IMPORTANT] [Announcement Title]
Hi [Name],
A critical announcement has been posted:
[Announcement content]
Please acknowledge this announcement by [Date].
[Acknowledge Now]
```
---
## Future Enhancements (Post-v1)
- Real-time chat (Slack/Discord-style)
- Video calls or screen sharing
- File sharing beyond task attachments
- Integration with external communication tools (Slack, Teams, Discord)
- Mobile app with push notifications
- Voice-to-text for comments
- Translation for multilingual teams