704 lines
30 KiB
Markdown
704 lines
30 KiB
Markdown
<!-- DISCUSSION -->
|
|
<!-- Title: Notification System Brainstorm -->
|
|
<!-- Phase: decide -->
|
|
<!-- Status: READY_FOR_DESIGN -->
|
|
<!-- Template: brainstorm -->
|
|
<!-- Created: 2025-12-10T10:00:00Z -->
|
|
<!-- Participants: architect, security, pragmatist, moderator -->
|
|
|
|
# Notification System Brainstorm
|
|
|
|
## Problem Statement
|
|
|
|
Our application needs a way to notify users about important events (new messages, status changes, alerts). Currently we have no notification system at all.
|
|
|
|
## Known Constraints
|
|
|
|
- Small team (2 developers)
|
|
- Need something working within 2 weeks
|
|
- Must work on web and mobile
|
|
- Budget: minimal (prefer open source)
|
|
- Current stack: Python backend, React frontend
|
|
|
|
## What Success Looks Like
|
|
|
|
- Users get timely notifications about events they care about
|
|
- Users can control what notifications they receive
|
|
- System is reliable enough that important notifications aren't lost
|
|
|
|
---
|
|
|
|
*Discussion begins below. We're in the seed phase - clarifying questions only, no solutions yet.*
|
|
---
|
|
|
|
Name: AI-Architect
|
|
As an architect, I see the problem statement is clear, but we need to sharpen understanding before diverging into solutions.
|
|
|
|
**Problem Frame:** You're building a notification system where users receive timely alerts about events they care about, with control over preferences. This is solid.
|
|
|
|
**Critical Clarifications Needed:**
|
|
|
|
1. **Event Sources** - What systems/services generate these events? Are they:
|
|
- All from your Python backend, or distributed across multiple services?
|
|
- Real-time (WebSocket-like latency), or can they batch (minute/hour scale)?
|
|
- Sporadic or high-volume (100/sec, 10k/sec, 1M/sec)?
|
|
|
|
2. **Notification Delivery Priority** - Which matters most:
|
|
- Speed (sub-second latency)?
|
|
- Guaranteed delivery (never lose a notification)?
|
|
- Notification ordering (maintain sequence)?
|
|
- Cost efficiency?
|
|
|
|
3. **User Control Granularity** - What level of preference control:
|
|
- Simple mute all/all-on, or per-event-type?
|
|
- Do mobile/web notifications differ?
|
|
- Time-based (quiet hours)?
|
|
- Batching (weekly digest vs instant)?
|
|
|
|
4. **Mobile Delivery** - Using:
|
|
- Push notifications (native iOS/Android)?
|
|
- In-app only?
|
|
- Email as fallback?
|
|
- Which push provider (Firebase, OneSignal, in-house)?
|
|
|
|
5. **Data Retention** - How long keep notification history:
|
|
- Show last 30 days in UI?
|
|
- Permanent archive?
|
|
- Just transient (server doesn't store)?
|
|
|
|
6. **Team Context** - Two developers suggests:
|
|
- Pick existing service (Firebase, Pusher, Ably) over building?
|
|
- Or do you need full control/custom logic?
|
|
|
|
These answers will shape whether this is a thin orchestration layer, a message queue system, or a full event-driven platform.
|
|
|
|
---
|
|
|
|
Name: AI-Security
|
|
**Problem Statement (Security Framing):**
|
|
A notification system introduces several attack surfaces that need consideration early:
|
|
- User event subscriptions and filtering
|
|
- Message delivery channels and transport
|
|
- User data exposure (who notifies whom)
|
|
- System reliability under attack
|
|
|
|
**Clarifying Questions for the Seed Phase:**
|
|
|
|
1. **Scope of events**: What types of events will trigger notifications? (User actions, system alerts, third-party integrations?) This affects authorization requirements.
|
|
|
|
2. **Data sensitivity**: Do notifications contain sensitive data, or just pointers to resources? (e.g., 'New message from Alice' vs full message content)
|
|
|
|
3. **Delivery channels**: Beyond web/mobile - are you considering email, SMS, push notifications? Each has different security properties.
|
|
|
|
4. **User consent model**: How do users express notification preferences? Can they be manipulated into unwanted notifications?
|
|
|
|
5. **Authentication scope**: Can users subscribe others to notifications, or only themselves? Prevents griefing/harassment attacks.
|
|
|
|
6. **Reliability guarantees**: Does 'important notifications aren't lost' mean at-least-once delivery? This affects retry logic and duplicate handling.
|
|
|
|
7. **Access control**: Who can see the notification audit trail? Notification history could leak sensitive information about user activity.
|
|
|
|
8. **Rate limiting**: Will there be protection against notification spam or DoS (millions of events triggering millions of notifications)?
|
|
|
|
These questions help frame what security properties are actually required before diving into architecture.
|
|
|
|
---
|
|
|
|
Name: AI-Pragmatist
|
|
Problem is clear and constraints are realistic. Two weeks is tight but doable with an MVP approach.
|
|
|
|
Clarifying questions before we scope this:
|
|
|
|
1. **Event volume**: Are we talking 10s of notifications per user per day, or 100s? This affects whether we need async queues vs simple polling.
|
|
|
|
2. **Delivery model**: Do users need real-time push (within seconds), or is delayed delivery (minutes) acceptable for MVP? This changes architecture dramatically.
|
|
|
|
3. **User preferences**: When you say "control what notifications they receive" - is this simple on/off toggles, or complex filtering rules? Start with simple?
|
|
|
|
4. **Persistence requirements**: If notification delivery fails, do we retry forever or is best-effort acceptable?
|
|
|
|
5. **Current auth/user model**: Do we already have user accounts and a database? This affects whether we can ship in 2 weeks.
|
|
|
|
The 2-week timeline suggests we should be ruthless about MVP scope. Most notification systems start too complex.
|
|
|
|
---
|
|
|
|
Name: Human (Rob)
|
|
Thanks for the questions. Here are answers to help scope this:
|
|
|
|
**Event sources:** All from our Python backend. Single service. Low volume - maybe 50-100 notifications per user per day max. Not real-time critical - within 30 seconds is fine.
|
|
|
|
**Delivery priority:** Best-effort is acceptable for MVP. We can add guaranteed delivery later. Ordering doesn't matter.
|
|
|
|
**User control:** Simple on/off toggles per event type (messages, status, alerts). No quiet hours or digests for MVP.
|
|
|
|
**Mobile:** Web first. Mobile can come in phase 2. No email/SMS for now.
|
|
|
|
**Data sensitivity:** Notifications are pointers only ("You have a new message from Alice") - no sensitive content in the notification itself.
|
|
|
|
**Persistence:** Keep last 7 days of notification history. Best-effort delivery, no retries for MVP.
|
|
|
|
**Existing infrastructure:** Yes, we have users table in Postgres, JWT auth already working.
|
|
|
|
**Rate limiting:** Good point - let's cap at 100 notifications per user per hour.
|
|
|
|
Let's move to generating ideas.
|
|
---
|
|
|
|
Name: AI-Architect
|
|
Great scoping, Rob. Now we have concrete constraints - let me think architecturally about what this enables.
|
|
|
|
Phase note: I'm diverging here, building on what's been clarified. All ideas welcome.
|
|
|
|
**Architectural possibilities:**
|
|
|
|
1. **Notification event table + polling worker**
|
|
- New events insert into `notifications` table
|
|
- Simple background worker polls every 5-10 seconds, pushes to connected clients
|
|
- WebSocket for web clients, HTTP polling fallback
|
|
- Dead simple to understand and debug
|
|
|
|
2. **In-database event queue**
|
|
- Each event creates a notification record marked undelivered
|
|
- Worker processes batch, marks delivered
|
|
- 7-day TTL on records (database cleanup)
|
|
- No external message queue needed
|
|
|
|
3. **Redis pubsub + in-memory subscriptions**
|
|
- Redis channels per user
|
|
- Connected clients subscribe
|
|
- Events publish directly
|
|
- Notification history still lives in Postgres (separate concern)
|
|
|
|
4. **Event sourcing light**
|
|
- Events table is append-only event log
|
|
- Read models (materialized views) project user notification state
|
|
- Gives us audit trail + flexibility later
|
|
|
|
5. **Preference engine as middleware**
|
|
- Event dispatcher checks user preferences before creating notification
|
|
- Centralized logic: "should user X get notified about Y?"
|
|
- Scales horizontally because it's stateless
|
|
|
|
6. **Notification aggregation for bursts**
|
|
- If 10 events hit same user in 30 seconds, could batch into one notification
|
|
- Single notification instead of spam
|
|
- Rate limiting sits here
|
|
|
|
7. **Background job framework (Celery/RQ)**
|
|
- Overkill for MVP but patterns are cleaner
|
|
- Event triggers async job
|
|
- Job handles preference check + delivery
|
|
- Decouples event source from notification logic
|
|
|
|
8. **Hybrid: sync writes + async delivery**
|
|
- Event writes notification record synchronously
|
|
- Async worker handles preference filtering + client delivery
|
|
- If worker dies, notifications still in database
|
|
|
|
**Cross-cutting thoughts:**
|
|
- All approaches need preference checking (user toggled notifications?)
|
|
- All need delivery mechanism (WebSocket, polling, or push)
|
|
- All need 7-day cleanup strategy
|
|
- User preferences table is critical - schema choice matters
|
|
- Test approach: can we mock/fake notification delivery easily?
|
|
|
|
**Scalability thinking (2-5 year horizon):**
|
|
- Approaches 1-2 (database-centric) hit limits around 1M+ notifications/day
|
|
- Approaches 3-5 scale to 10M+ with minor tweaks
|
|
- Approach 7 is designed for scale from day one
|
|
- But for 50-100 notifications/user/day with small user base? All fine
|
|
|
|
Let's diverge - what other patterns am I missing?
|
|
|
|
---
|
|
|
|
Name: AI-Security
|
|
Security attack surface brainstorm for MVP:
|
|
|
|
**Diverge ideas (quantity, no judgment):**
|
|
|
|
- IDEA: Notification history as audit log - users can see "what happened to me" timeline (timestamps, event types). Helps detect compromised accounts.
|
|
|
|
- IDEA: Subscription tampering - what if attacker subscribes victim to spam event types? Need validation that preferences changes are by the account owner (not another user).
|
|
|
|
- IDEA: Notification injection attacks - if backend generates notifications from user input, could craft malicious event payloads. Validate event schema strictly.
|
|
|
|
- IDEA: Rate limit bypass - 100/hour per user is good, but what about per-event-type? Could someone spam one event type to drown out others?
|
|
|
|
- IDEA: Notification delivery channel poisoning - if web UI polls for notifications, attacker could inject fake ones via CSRF. Validate responses are from trusted backend.
|
|
|
|
- IDEA: Historical data leakage - 7-day history exposed in API? Users could enumerate other users' activity patterns. Add granular permissions.
|
|
|
|
- IDEA: WebSocket for real-time - simpler than polling, but introduces new auth challenges (JWT refresh on socket?). Worth considering for future phases.
|
|
|
|
- IDEA: Event type enumeration - if we expose list of all possible event types, attacker learns business logic. Could keep enum private to frontend.
|
|
|
|
- IDEA: Distributed denial of service - if one notification triggers cascading notifications (event loops), could amplify attacks. Prevent self-referential triggers.
|
|
|
|
- IDEA: Encryption of notification metadata - pointers are low-sensitivity, but encrypting with user's key prevents admin snooping on who notifies whom.
|
|
|
|
No blocking issues yet - just surface area to be aware of.
|
|
|
|
---
|
|
|
|
Name: AI-Pragmatist
|
|
MVP-first ideas for shipping in 2 weeks:
|
|
|
|
**Idea 1: Synchronous Insert + Frontend Polling**
|
|
When events happen in backend, insert into notifications table. Frontend polls `/api/notifications` every 5 seconds. Dead simple, ships day 1.
|
|
- Pro: No infrastructure, zero latency concerns, easy to debug
|
|
- Con: Polling overhead, but at 50-100/day per user it's fine
|
|
- DB schema: id, user_id, event_type, content, created_at, read_at
|
|
- Rate limiting: Just check created_at in last hour before insert
|
|
|
|
**Idea 2: WebSocket for Real-Time + Polling Fallback**
|
|
Add websocket connection for live push, but keep polling as fallback for unreliable networks. Only use WebSocket for active users.
|
|
- Pro: Feels snappy, mobile-friendly when we add it
|
|
- Con: More moving parts, but we get it free if we're already using WebSockets
|
|
- Question: Do we have WebSockets already?
|
|
|
|
**Idea 3: Simple Event Log + Background Batch Job**
|
|
Log all events in a single events table. Nightly cron job processes them into user-specific notifications based on preferences.
|
|
- Pro: Decoupled, easy to test, can retry silently
|
|
- Con: Not real-time, but 30sec requirement is met if cron runs every 15 seconds
|
|
|
|
**Idea 4: Hybrid - Immediate Insert + Smart Fetch**
|
|
Insert notification immediately when event fires. On React mount, `/api/notifications?since=X` returns unread. No polling for active users - just load on mount.
|
|
- Pro: Works offline, catch-up friendly, minimal network overhead
|
|
- Con: Slightly more frontend logic
|
|
|
|
**Real Talk:** Ideas 1 or 4 are ship-ready in week 1. Don't start with WebSockets unless you have them already. Polling at 50-100 notifs/day is unnoticeable load. Rate limiting is just a SQL WHERE clause. Preferences table: user_id, event_type, enabled. Done.
|
|
---
|
|
|
|
Name: AI-Moderator
|
|
## Discussion State Summary
|
|
|
|
We've successfully moved through the **seed phase** with rich clarification from all participants:
|
|
|
|
### What's Been Established
|
|
- **Event sources**: Single Python backend, low volume (50-100 notifications/user/day)
|
|
- **Delivery**: Best-effort within 30 seconds (no real-time requirement)
|
|
- **User control**: Simple on/off toggles per event type
|
|
- **Scope**: Web first, mobile deferred, no email/SMS
|
|
- **Data model**: Notification pointers only (no sensitive content)
|
|
- **Infrastructure**: Existing Postgres + JWT auth
|
|
- **Retention**: 7-day history, rate limit 100/hour per user
|
|
|
|
### Ideas Generated
|
|
|
|
**Architectural patterns explored:**
|
|
Architect proposed 8 approaches (polling worker, in-database queue, Redis pubsub, event sourcing, preference middleware, aggregation, background jobs, sync+async hybrid). All are viable at current scale; database-centric approaches (1-2) are simplest for MVP.
|
|
|
|
**Security surface identified:**
|
|
Security raised 9 attack vectors (audit logs, subscription tampering, injection attacks, rate limit bypass, CSRF, data leakage, WebSocket auth, event enumeration, cascading events, encryption). No blocking issues - all are architectural considerations.
|
|
|
|
**MVP pragmatism:**
|
|
Pragmatist outlined 4 implementation paths, with Ideas 1 (sync insert + polling) and 4 (immediate insert + smart fetch) as ship-ready week 1 candidates. Strong emphasis on ruthless scope: preferences table (user_id, event_type, enabled), simple rate limiting via SQL.
|
|
|
|
### Cluster Phase Analysis
|
|
|
|
The cluster phase asks us to: **Group related ideas into 3-5 themes and name each clearly.**
|
|
|
|
I see these natural groupings emerging:
|
|
|
|
1. **Delivery Mechanism** (How do notifications reach users?)
|
|
- Polling (Ideas 1, 4 from Pragmatist)
|
|
- WebSocket + fallback (Idea 2)
|
|
- In-database queue (Architect approach 2)
|
|
|
|
2. **Data Flow & Persistence** (Where does notification state live?)
|
|
- Synchronous table inserts (Ideas 1, 4)
|
|
- Background batch processing (Idea 3)
|
|
- Event sourcing / append-only logs (Architect approach 4)
|
|
|
|
3. **Preference & Rate Limiting** (When should notifications be suppressed?)
|
|
- Pre-insertion filtering (Architect approach 5)
|
|
- Post-fetch filtering (Frontend responsibility)
|
|
- Per-event-type limits (Security concern)
|
|
|
|
4. **Security & Reliability** (Protection against attack and data loss?)
|
|
- Injection validation, subscription tampering prevention
|
|
- Historical audit trails (Security idea 1)
|
|
- Self-referential event loop prevention
|
|
- Encryption options (Security idea 10)
|
|
|
|
5. **Scale & Complexity** (What's the growth path?)
|
|
- MVP minimal (Ideas 1, 4) → 1M+ notifications/day
|
|
- Infrastructure-ready from day 1 (Approaches 3, 5, 7)
|
|
- Decoupled patterns (Idea 3) for future evolution
|
|
|
|
### Readiness for Sketch Phase
|
|
|
|
**All participants have responded.** The discussion has moved naturally from clarification → divergence → synthesis. We have:
|
|
- Concrete constraints and success criteria
|
|
- Multiple viable approaches with tradeoffs articulated
|
|
- Security surface mapped (not blocking)
|
|
- MVP path identified (Ideas 1 or 4 in week 1)
|
|
|
|
**Recommendation**: Advance to **sketch phase** to:
|
|
1. Choose primary delivery mechanism (consensus on polling vs WebSocket vs batch)
|
|
2. Finalize data model (schema for notifications, preferences, rate limits)
|
|
3. Sketch API contract (`GET /notifications`, `PUT /preferences`)
|
|
4. Map security mitigations to chosen approach
|
|
5. Create rough implementation timeline
|
|
|
|
The ideas are divergent enough; clustering them now helps the sketch phase focus on concrete design.
|
|
|
|
|
|
---
|
|
|
|
Name: Human (Rob)
|
|
Great synthesis! For MVP, let's focus on:
|
|
|
|
1. **Delivery Mechanism** - Polling approach (Ideas 1/4) - simplest for 2 weeks
|
|
3. **Preference & Rate Limiting** - Pre-insertion filtering
|
|
4. **Security & Reliability** - Basic protections (no encryption needed for MVP)
|
|
|
|
Skip event sourcing and complex WebSocket for now. Let's sketch this out.
|
|
|
|
VOTE: READY
|
|
---
|
|
|
|
Name: AI-Architect
|
|
**Architectural Sketch Complete**
|
|
|
|
Created two diagrams capturing the MVP polling approach:
|
|
|
|
**Component Architecture** (`diagrams/notification-system-brainstorm_6.puml`):
|
|
- Shows Python backend, React frontend, PostgreSQL components
|
|
- Highlights 5 key pieces: Notification Service, Preference Checker, Rate Limiter, Frontend Poller, Notifications Table
|
|
- Maps relationships and data flows
|
|
|
|
**Sequence Flow** (`diagrams/notification-system-brainstorm_7.puml`):
|
|
- Details 5 flows: notification creation, frontend polling, user interaction, preference management, cleanup
|
|
- Shows decision points and error paths
|
|
- Marks unknowns around polling optimization and error handling
|
|
|
|
**Key Insights:**
|
|
1. Database-centric approach fits 2-week timeline
|
|
2. Polling at 5-10s intervals meets 30s requirement
|
|
3. Rate limiting via SQL counting is simple but effective
|
|
4. 7-day TTL cleanup prevents unbounded growth
|
|
5. Preference checking before insert reduces unnecessary notifications
|
|
|
|
**Architectural Assessment:** This is a boring, proven approach that will ship in 2 weeks. It's not sexy but it's maintainable by a small team. The patterns (polling, SQL rate limiting, preference filtering) are well-understood and debuggable.
|
|
|
|
**VOTE:** READY - The sketch captures the essence of the MVP approach with clear boundaries and growth paths.
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: AI-Security
|
|
Security analysis for sketch phase:
|
|
|
|
**Key Security Pieces for MVP (3-5 items):**
|
|
1. **Authentication boundary** - JWT validation for notification API endpoints
|
|
2. **Authorization checks** - Users can only access/modify their own notifications and preferences
|
|
3. **Input validation** - Event type whitelist, content sanitization for notification pointers
|
|
4. **Rate limiting** - 100/hour per user at application layer (not just SQL)
|
|
5. **CSRF protection** - For preference updates (POST/PUT endpoints)
|
|
|
|
**Threat Model Unknowns (?):**
|
|
- Event loop detection - how to prevent self-referential notifications?
|
|
- Admin access controls - who can see notification audit logs?
|
|
- Data retention compliance - 7-day cleanup mechanism security
|
|
|
|
**Security Architecture Notes:**
|
|
- Polling approach reduces WebSocket auth complexity
|
|
- Pre-insertion filtering prevents unwanted notifications at source
|
|
- Notification pointers (not content) reduces data exposure risk
|
|
- Basic protections align with 2-week MVP timeline
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: AI-Pragmatist
|
|
Perfect MVP direction. Polling + pre-insertion filtering is exactly what ships in 2 weeks.
|
|
|
|
**Key pieces for MVP:**
|
|
1. Notifications table (id, user_id, event_type, content, created_at, read_at)
|
|
2. Preferences table (user_id, event_type, enabled)
|
|
3. API endpoint: GET /api/notifications?since=X
|
|
4. Rate limiting: SQL check before insert
|
|
5. 7-day cleanup cron job
|
|
|
|
**Unknowns marked '?':**
|
|
- Frontend polling interval? (Start with 10s)
|
|
- How to handle offline users? (Catch-up on mount)
|
|
- WebSocket migration path? (Add later if needed)
|
|
|
|
CONCERN: COMPLEXITY - Architect's 8 approaches are overkill. Stick to simple polling.
|
|
|
|
VOTE: READY
|
|
---
|
|
|
|
Name: AI-Architect
|
|
**MVP Version (1 week max):**
|
|
1. **Core tables**: notifications (id, user_id, event_type, content, created_at, read_at), user_preferences (user_id, event_type, enabled)
|
|
2. **Notification creation**: Synchronous insert with preference check + SQL rate limiting
|
|
3. **Frontend polling**: GET /api/notifications?since=X every 10s
|
|
4. **Cleanup**: Daily cron deleting >7 days
|
|
5. **API endpoints**: GET notifications, POST read, PUT preferences
|
|
|
|
**Biggest Risk**: Polling scalability if user base grows 10x+ unexpectedly. SQL counting for rate limits could become bottleneck.
|
|
|
|
**Prototype First**: Notification creation flow (Event → Preference check → Rate limit → Insert). Test with 1000 simulated events.
|
|
|
|
**What to Cut**: WebSocket, notification aggregation, encryption, complex preference rules, mobile push, email/SMS fallback.
|
|
|
|
CONCERN: COMPLEXITY - The 8 architectural approaches from earlier are overkill. Stick to simple polling + SQL.
|
|
|
|
**Architectural Assessment**: This is a boring, maintainable approach that ships in 2 weeks. The patterns are well-understood and debuggable by a small team. Growth path: add WebSocket layer later if needed.
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: AI-Security
|
|
**MVP Security Reality Check**
|
|
|
|
**1-week MVP (Security-focused):**
|
|
- Basic JWT auth on API endpoints (already exists)
|
|
- User-specific authorization (only access own notifications)
|
|
- SQL injection prevention via parameterized queries
|
|
- Rate limiting at app layer (not just SQL)
|
|
- CSRF protection for preference updates
|
|
|
|
**Biggest Risk:** Notification injection via event payloads. If events come from user input (e.g., 'message from Alice'), attacker could craft malicious notification content.
|
|
|
|
**Prototype First:** Notification creation flow with input validation. Whitelist event types, sanitize content strings, test injection attempts.
|
|
|
|
**What to Cut:** Encryption, audit logs, admin controls, WebSocket auth complexity. These are phase 2.
|
|
|
|
CONCERN: COMPLEXITY - Architect's diagrams show 5 components but MVP needs just 2: NotificationService (create/read) and PreferenceChecker (filter). Rate limiting can be inline.
|
|
|
|
**Security MVP:** Validate event types, sanitize content, enforce user boundaries, rate limit at app layer. That's 2-3 days of work.
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: AI-Pragmatist
|
|
Perfect MVP direction. The polling approach is exactly what ships in 2 weeks.
|
|
|
|
**MVP Version (1 week max):**
|
|
1. Notifications table (id, user_id, event_type, content, created_at, read_at)
|
|
2. Preferences table (user_id, event_type, enabled)
|
|
3. API endpoint: GET /api/notifications?since=X (poll every 10s)
|
|
4. Rate limiting: SQL check before insert
|
|
5. 7-day cleanup cron job
|
|
|
|
**Biggest Risk:** Polling overhead at scale, but at 50-100 notifications/user/day it's negligible.
|
|
|
|
**Prototype First:** Build the notifications table and polling endpoint. Test with 2-3 event types.
|
|
|
|
**What We Can Cut:** WebSockets, encryption, complex invalidation, mobile push, email/SMS, quiet hours, digests, event sourcing.
|
|
|
|
CONCERN: COMPLEXITY - Architect's 8 approaches are overkill. Stick to simple polling.
|
|
|
|
**Shipping Priority:** Week 1: Tables + polling. Week 2: Preferences UI + cleanup job.
|
|
|
|
VOTE: READY
|
|
---
|
|
|
|
Name: AI-Architect
|
|
**Architectural Assessment:** The MVP polling approach is architecturally sound for the 2-week timeline. Database-centric design with synchronous inserts and frontend polling meets all constraints (low volume, 30s latency, simple preferences).
|
|
|
|
**Consensus Analysis:** Current votes: Human (Rob) READY, AI-Architect READY, AI-Security READY, AI-Pragmatist READY. All participants agree on the polling approach. No REJECT votes, no CHANGES votes.
|
|
|
|
**Template Requirements:** Brainstorm template requires 0.67 threshold (2/3) and human approval. Both conditions are met with 4/4 READY votes and Human (Rob) READY.
|
|
|
|
**Architectural Validation:** The approach is boring, proven, and maintainable by a small team. Growth path exists (add WebSocket layer later). Risk: polling scalability at 10x+ user growth, but acceptable for MVP.
|
|
|
|
**VOTE:** READY - Consensus reached, approach is architecturally appropriate for constraints.
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: AI-Security
|
|
Security assessment complete for the decide phase.
|
|
|
|
**Threat Model Analysis:** Created diagram `diagrams/notification-system-brainstorm_security_14.puml` showing MVP security boundaries.
|
|
|
|
**Security MVP Scope Assessment:**
|
|
✅ **Covered:** JWT auth, user-specific authorization, input validation (whitelist + sanitization), rate limiting (app + SQL layer), CSRF protection.
|
|
⚠️ **Deferred (Phase 2):** Encryption at rest, audit logging, admin controls, WebSocket auth, advanced DoS protection.
|
|
|
|
**Risk Level:** LOW - MVP scope is security-minimal and well-contained for 2-week timeline.
|
|
|
|
**Consensus Status:** All participants (Human, Architect, Security, Pragmatist) have voted READY.
|
|
|
|
**Security Vote:** No blocking security issues. MVP polling approach is secure enough for immediate implementation.
|
|
|
|
**Final Security Position:** The approach balances security requirements with development constraints. Basic protections are in place, deferred items are appropriate for phase 2.
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: AI-Pragmatist
|
|
Perfect MVP approach. The polling + SQL solution ships in 2 weeks with minimal complexity.
|
|
|
|
**Shipping Reality Check:**
|
|
1. Week 1: Notifications table + polling endpoint (2 days)
|
|
2. Week 1: Preference checking + rate limiting (1 day)
|
|
3. Week 2: Frontend UI + cleanup job (2 days)
|
|
4. Week 2: Testing + deployment (1 day)
|
|
|
|
**What We're Cutting:** WebSockets, encryption, audit logs, mobile push, email/SMS, complex invalidation, event sourcing.
|
|
|
|
**Simple Wins:**
|
|
- Polling at 10s meets 30s requirement
|
|
- SQL rate limiting works at 50-100 notifications/day
|
|
- 7-day cleanup prevents unbounded growth
|
|
- Preference checking before insert reduces noise
|
|
|
|
CONCERN: COMPLEXITY - Architect's 5-component diagram is overkill. MVP needs just 2: NotificationService (create/read) and PreferenceChecker (filter). Rate limiting is a SQL WHERE clause.
|
|
|
|
VOTE: READY
|
|
|
|
|
|
---
|
|
|
|
Name: Human (Rob)
|
|
All participants have voted READY. The MVP approach is clear:
|
|
|
|
**Approved Design:**
|
|
- Polling-based notification delivery (10s interval)
|
|
- Two tables: notifications, user_preferences
|
|
- Pre-insertion filtering with rate limiting (100/hour/user)
|
|
- 7-day history with daily cleanup
|
|
- Web first, mobile later
|
|
|
|
**Implementation Timeline:**
|
|
- Week 1: Schema + API endpoints + polling
|
|
- Week 2: Preferences UI + cleanup job + testing
|
|
|
|
This is a solid, boring, maintainable approach. Let's build it.
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: rob
|
|
Rob
|
|
I am happy
|
|
|
|
---
|
|
|
|
Name: AI-Architect
|
|
**Architectural Perspective: Decide Phase**
|
|
|
|
The discussion has reached unanimous consensus (5/5 READY votes including human approval). From an architectural standpoint:
|
|
|
|
**What's Been Validated:**
|
|
- Database-centric polling architecture is appropriate for the scale (50-100 notifications/user/day)
|
|
- Two-table schema (notifications + user_preferences) is minimal and correct
|
|
- Pre-insertion filtering with SQL-based rate limiting is simple and maintainable
|
|
- 7-day retention with cron cleanup prevents unbounded growth
|
|
- Frontend polling at 10s intervals meets 30s latency requirement with margin
|
|
|
|
**Architectural Soundness:**
|
|
This is a textbook "boring technology" choice - proven patterns, no premature optimization, debuggable by a 2-person team. The approach avoids:
|
|
- Infrastructure complexity (no message queues)
|
|
- Concurrency challenges (no WebSockets for MVP)
|
|
- Operational overhead (no distributed systems)
|
|
|
|
**Growth Path Preserved:**
|
|
The design doesn't paint us into a corner:
|
|
- WebSocket layer can wrap existing polling API later
|
|
- Message queue can slot in behind NotificationService
|
|
- Event sourcing can replace direct inserts without changing API contract
|
|
|
|
**Risk Assessment:**
|
|
Single point of concern (polling scalability at 10x+ growth) is acceptable given:
|
|
- Current constraints are well-defined
|
|
- Migration path exists
|
|
- Team can monitor and adapt
|
|
|
|
**Architectural Decision:** PROCEED with polling-based MVP. The approach is appropriately scoped, technically sound, and maintainable.
|
|
|
|
**Rob's statement "I am happy" confirms human approval.**
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: AI-Security
|
|
**Security Perspective: Decide Phase - Final Assessment**
|
|
|
|
The discussion has reached unanimous consensus with all security concerns appropriately scoped for MVP.
|
|
|
|
**Security Posture Validated:**
|
|
✅ Authentication/Authorization - JWT validation + user-specific access controls
|
|
✅ Input Validation - Event type whitelist + content sanitization
|
|
✅ Rate Limiting - Application layer enforcement (100/hour/user)
|
|
✅ CSRF Protection - For preference update endpoints
|
|
✅ SQL Injection Prevention - Parameterized queries
|
|
|
|
**Threat Surface Assessment:**
|
|
The polling-based approach actually reduces attack surface compared to WebSocket alternatives:
|
|
- No persistent connection state to hijack
|
|
- Simpler authentication flow (standard JWT on each request)
|
|
- Reduced DoS vectors (no connection flooding)
|
|
- Standard HTTP security controls apply
|
|
|
|
**Deferred Items (Appropriate for Phase 2):**
|
|
- Encryption at rest (low sensitivity data - pointers only)
|
|
- Comprehensive audit logging
|
|
- Admin access controls
|
|
- Advanced DoS protection beyond rate limiting
|
|
- Event loop detection (low risk at current scale)
|
|
|
|
**Risk Level: LOW**
|
|
For a 2-week MVP handling notification pointers (not sensitive content) with 50-100 notifications/user/day, the security controls are proportionate and sufficient.
|
|
|
|
**No blocking security issues identified.**
|
|
|
|
Rob's confirmation ("I am happy") provides human approval. The approach balances security requirements with development constraints appropriately.
|
|
|
|
VOTE: READY
|
|
VOTE: READY
|
|
|
|
---
|
|
|
|
Name: AI-Pragmatist
|
|
**Pragmatist Final Assessment: Decide Phase**
|
|
|
|
The discussion has reached unanimous consensus (5/5 READY votes + human approval). From a shipping perspective:
|
|
|
|
**What We're Building:**
|
|
- 2 tables, 3 API endpoints, 1 cron job
|
|
- Week 1: Schema + polling endpoint
|
|
- Week 2: Preferences UI + cleanup
|
|
- Total: ~6 days of actual dev work
|
|
|
|
**Reality Check - What Actually Ships:**
|
|
Day 1: CREATE TABLE notifications, CREATE TABLE user_preferences
|
|
Day 2: GET /api/notifications?since=X endpoint
|
|
Day 3: Preference checking + rate limiting logic
|
|
Day 4: Frontend polling component + notification list UI
|
|
Day 5: Preferences toggle UI
|
|
Day 6: Cleanup cron + testing
|
|
|
|
**Complexity Assessment:**
|
|
This is appropriately simple. No over-engineering detected in the final consensus:
|
|
- No message queues ✓
|
|
- No WebSockets ✓
|
|
- No event sourcing ✓
|
|
- No encryption ✓
|
|
- No complex aggregation ✓
|
|
|
|
Just: Database → API → Frontend polling. Boring and shippable.
|
|
|
|
**Shipping Confidence: HIGH**
|
|
Rob confirmed "I am happy" - human approval obtained. All participants aligned on simplest viable approach. No scope creep, no complexity debt, no architectural astronautics.
|
|
|
|
**Final Vote:** READY to implement. Let's ship this in 2 weeks.
|
|
|
|
VOTE: READY
|
|
VOTE: READY
|