- 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
360 lines
9.8 KiB
Markdown
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
|