HIGH PRIORITY: Fixes production 404 error on research inquiry form Research Inquiry API: - Add POST /api/research-inquiry endpoint for form submissions - Add admin endpoints for inquiry management (list, get, assign, respond, delete) - Create ResearchInquiry model with MongoDB integration - Add to moderation queue for human review (strategic quadrant) - Include rate limiting (5 req/min) and CSRF protection - Tested locally: endpoint responding, data saving to DB Umami Analytics (Privacy-First): - Add Docker Compose config for Umami + PostgreSQL - Create nginx reverse proxy config with SSL support - Implement privacy-first tracking script (DNT, opt-out, no cookies) - Integrate tracking across 26 public HTML pages - Exclude admin pages from tracking (privacy boundary) - Add comprehensive deployment guide (UMAMI_SETUP_GUIDE.md) - Environment variables added to .env.example Files Created (9): - src/models/ResearchInquiry.model.js - src/controllers/research.controller.js - src/routes/research.routes.js - public/js/components/umami-tracker.js - deployment-quickstart/nginx-analytics.conf - deployment-quickstart/UMAMI_SETUP_GUIDE.md - scripts/add-umami-tracking.sh - scripts/add-tracking-python.py - SESSION_SUMMARY_ANALYTICS_RESEARCH_INQUIRY.md Files Modified (29): - src/routes/index.js (research routes) - deployment-quickstart/docker-compose.yml (umami services) - deployment-quickstart/.env.example (umami config) - 26 public HTML pages (tracking script) Values Alignment: ✅ Privacy-First Design (cookie-free, DNT honored, opt-out available) ✅ Human Agency (research inquiries require human review) ✅ Data Sovereignty (self-hosted analytics, no third-party sharing) ✅ GDPR Compliance (no personal data in analytics) ✅ Transparency (open-source tools, documented setup) Testing Status: ✅ Research inquiry: Locally tested, data verified in MongoDB ⏳ Umami analytics: Pending production deployment Next Steps: 1. Deploy to production (./scripts/deploy.sh) 2. Test research form on live site 3. Deploy Umami following UMAMI_SETUP_GUIDE.md 4. Update umami-tracker.js with website ID after setup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
14 KiB
Session Summary: Analytics & Research Inquiry Implementation
Date: 2025-10-29 Session: 2025-10-07-001 (continued after closedown) Priority: HIGH - Production bug fix + Analytics implementation
Objectives Completed
1. ✅ Research Inquiry API Endpoint (HIGH PRIORITY)
Problem: Research inquiry form on production site was returning 404 error.
Solution Implemented:
Created complete API endpoint for research inquiry submissions:
-
Model:
src/models/ResearchInquiry.model.js- MongoDB collection:
research_inquiries - Fields: contact info, research details, collaboration needs
- Status workflow: new → reviewed → responded → closed
- MongoDB collection:
-
Controller:
src/controllers/research.controller.jssubmitInquiry()- Public endpoint for form submissionslistInquiries()- Admin endpoint for viewing inquiriesgetInquiry()- Get single inquiry by IDassignInquiry()- Assign to team memberrespondToInquiry()- Mark as respondeddeleteInquiry()- Delete inquiry- Integrates with ModerationQueue for human review
-
Routes:
src/routes/research.routes.jsPOST /api/research-inquiry(public, rate-limited)GET /api/research-inquiry(admin)GET /api/research-inquiry/:id(admin)POST /api/research-inquiry/:id/assign(admin)POST /api/research-inquiry/:id/respond(admin)DELETE /api/research-inquiry/:id(admin)
-
Integration: Updated
src/routes/index.jsto register routes
Testing:
- ✅ Endpoint tested locally with curl
- ✅ Data verified in MongoDB
- ✅ Form submission returns success response
- ✅ Inquiry added to moderation queue
Files Created:
src/models/ResearchInquiry.model.jssrc/controllers/research.controller.jssrc/routes/research.routes.js
Files Modified:
src/routes/index.js(added research routes)
2. ✅ Privacy-Preserving Analytics (Umami)
Decision: Umami Analytics chosen over Plausible
Rationale:
- ✅ Lighter infrastructure (PostgreSQL only vs. PostgreSQL + ClickHouse)
- ✅ More resource-efficient for low-traffic sites
- ✅ Equally GDPR-compliant (cookie-free, no personal data)
- ✅ Already present in codebase (
umami-local/directory) - ✅ Aligns with Tractatus privacy-first values
Implementation:
A. Docker Compose Configuration
File: deployment-quickstart/docker-compose.yml
Added two new services:
umami- Umami application container (port 3000)umami-db- PostgreSQL 15 database for Umami- Healthchecks for both services
- Persistent volume:
umami_db_data
Environment Variables: deployment-quickstart/.env.example
Added Umami configuration:
UMAMI_APP_SECRET # App secret (generate with openssl)
UMAMI_DB_NAME # Database name
UMAMI_DB_USER # Database user
UMAMI_DB_PASSWORD # Database password
UMAMI_PORT # Internal port (3000)
UMAMI_TRACKER_SCRIPT # Tracker script name
UMAMI_DISABLE_TELEMETRY # Disable Umami's own telemetry
B. Nginx Reverse Proxy Configuration
File: deployment-quickstart/nginx-analytics.conf
Complete nginx configuration for analytics.agenticgovernance.digital:
- ✅ HTTP to HTTPS redirect
- ✅ SSL certificate configuration (Let's Encrypt)
- ✅ Security headers (HSTS, X-Frame-Options, etc.)
- ✅ WebSocket support for real-time updates
- ✅ Proxy to Umami container on port 3000
- ✅ Health check endpoint
C. Tracking Script Integration
File: public/js/components/umami-tracker.js
Privacy-first tracking script with:
- ✅ Automatic environment detection (disabled in development)
- ✅ Do Not Track (DNT) browser setting support
- ✅ User opt-out/opt-in functionality
- ✅ localStorage-based preference storage
- ✅ Console logging for transparency
- ✅ Error handling
- ✅ Async/defer loading
Integration Scope:
- ✅ 26 public HTML pages updated
- ✅ Admin pages excluded (no tracking on admin interface)
- ✅ Koha donation pages excluded (separate tracking considerations)
Files Updated with Tracking Script:
✓ public/index.html
✓ public/researcher.html (with inquiry modal)
✓ public/implementer.html
✓ public/leader.html
✓ public/docs.html
✓ public/blog.html
✓ public/blog-post.html
✓ public/privacy.html
✓ public/gdpr.html
✓ public/about.html
✓ public/about/values.html
✓ public/api-reference.html
✓ public/architecture.html
✓ public/case-submission.html
✓ public/media-inquiry.html
✓ public/media-triage-transparency.html
✓ public/faq.html
✓ public/koha.html
✓ public/docs-viewer.html
✓ public/check-version.html
✓ public/test-pressure-chart.html
✓ public/demos/27027-demo.html
✓ public/demos/boundary-demo.html
✓ public/demos/classification-demo.html
✓ public/demos/deliberation-demo.html
✓ public/demos/tractatus-demo.html
D. Comprehensive Setup Guide
File: deployment-quickstart/UMAMI_SETUP_GUIDE.md
Complete step-by-step guide covering:
- Prerequisites & environment setup
- Docker Compose deployment
- Initial Umami dashboard setup
- DNS configuration for subdomain
- Nginx reverse proxy setup
- SSL certificate acquisition (Let's Encrypt)
- Tracking script integration
- Privacy policy updates
- Testing procedures
- Security checklist
- Maintenance tasks (backup, updates, monitoring)
- Troubleshooting
- Architecture diagram
Files Created (Summary)
Research Inquiry Implementation
src/models/ResearchInquiry.model.jssrc/controllers/research.controller.jssrc/routes/research.routes.js
Umami Analytics Implementation
public/js/components/umami-tracker.jsdeployment-quickstart/nginx-analytics.confdeployment-quickstart/UMAMI_SETUP_GUIDE.mdscripts/add-tracking-python.pyscripts/add-umami-tracking.sh
Modified Files
src/routes/index.js(research routes)deployment-quickstart/docker-compose.yml(umami services)deployment-quickstart/.env.example(umami env vars)- 26 public HTML pages (tracking script added)
Deployment Checklist
Research Inquiry (Ready for Production)
- API endpoint implemented
- MongoDB model created
- Routes registered
- Validation middleware applied
- Rate limiting enabled
- Tested locally
- Deploy to production (via
./scripts/deploy.sh) - Test production endpoint
- Verify form submission works
Umami Analytics (Deployment Required)
- Docker Compose configuration complete
- Environment variables documented
- Nginx configuration created
- Tracking script integrated across all pages
- Setup guide written
- Deploy docker containers (
docker-compose up -d umami umami-db) - Configure DNS (A record for analytics subdomain)
- Set up Nginx (copy config, enable site)
- Obtain SSL certificate (
certbot --nginx) - Initial Umami setup (create admin account, add website)
- Update tracker website ID (in
umami-tracker.js) - Update privacy policy (add Umami details)
- Test tracking script
- Verify dashboard data collection
Next Steps (Production Deployment)
Immediate (Research Inquiry)
-
Deploy code to production:
./scripts/deploy.sh -
Verify API endpoint:
curl -X POST https://agenticgovernance.digital/api/research-inquiry \ -H "Content-Type: application/json" \ -d '{"name":"Test","email":"test@example.com",...}' -
Test form on researcher page:
- Navigate to https://agenticgovernance.digital/researcher.html
- Click "Request Collaboration" button
- Fill out form
- Submit and verify success message
Sequential (Umami Analytics)
Phase 1: Infrastructure Setup
- SSH into VPS
- Deploy Umami containers:
cd /path/to/deployment-quickstart docker-compose up -d umami umami-db - Verify containers running:
docker-compose ps docker-compose logs -f umami
Phase 2: DNS & SSL 4. Add DNS A record:
- Name:
analytics - Value:
<VPS-IP> - TTL: 300
-
Copy nginx config:
sudo cp nginx-analytics.conf /etc/nginx/sites-available/analytics.agenticgovernance.digital sudo ln -s /etc/nginx/sites-available/analytics.agenticgovernance.digital /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx -
Obtain SSL certificate:
sudo certbot --nginx -d analytics.agenticgovernance.digital
Phase 3: Umami Configuration 7. Access Umami dashboard: https://analytics.agenticgovernance.digital 8. Login with default credentials: admin / umami 9. IMMEDIATELY change password 10. Add website: - Name: Tractatus Framework - Domain: agenticgovernance.digital - Copy Website ID
- Update tracking script:
- Edit
public/js/components/umami-tracker.js - Replace
REPLACE_WITH_ACTUAL_WEBSITE_IDwith actual ID - Deploy updated code
- Edit
Phase 4: Testing
12. Test tracking:
- Open DevTools → Network tab
- Visit https://agenticgovernance.digital
- Look for request to /api/send
- Check Umami dashboard for real-time visitors
- Test DNT:
- Enable Do Not Track in browser
- Reload page
- Verify no tracking request sent
Phase 5: Documentation 14. Update privacy policy: - Add Umami analytics section - Link to opt-out mechanism - Deploy updated privacy.html
Values Alignment Check
Research Inquiry Implementation
✅ Human Agency: All inquiries require human review (added to ModerationQueue) ✅ Transparency: Clear success/error messages, documented API ✅ Privacy: No data shared with third parties, stored securely in MongoDB ✅ Strategic Quadrant: Research collaborations classified as STRATEGIC (high priority)
Umami Analytics Implementation
✅ Privacy-First Design: Cookie-free, no personal data collection ✅ Transparency: Open-source tool, setup guide provided ✅ User Respect: DNT honored, opt-out mechanism provided ✅ Data Sovereignty: Self-hosted, no third-party data sharing ✅ No Proprietary Lock-in: Open-source (MIT), portable data ✅ GDPR Compliance: Fully compliant by design
Testing Status
Research Inquiry
- ✅ Endpoint responds correctly
- ✅ Data saved to MongoDB
- ✅ Moderation queue entry created
- ✅ Validation working (required fields checked)
- ✅ Rate limiting enabled
- ⏳ Production testing pending deployment
Umami Analytics
- ✅ Docker Compose config valid
- ✅ Tracking script loads without errors (development check)
- ✅ DNT detection working
- ✅ Opt-out mechanism functional
- ⏳ Full testing pending Umami deployment
- ⏳ Dashboard verification pending setup
- ⏳ SSL certificate pending Let's Encrypt setup
Known Issues / Caveats
- Umami Website ID: Must be updated in
umami-tracker.jsafter initial setup - Privacy Policy: Needs update to reflect Umami analytics implementation
- Admin Panel Tracking: Intentionally excluded - admin should not be tracked
- Development Environment: Analytics disabled on localhost (by design)
- Browser Compatibility: Tested with modern browsers, IE11 not supported (acceptable)
Performance Impact
Research Inquiry
- Backend: Minimal (simple CRUD operations)
- Database: ~1KB per inquiry
- Rate Limiting: 5 requests per minute (prevents spam)
Umami Analytics
- Frontend: <2KB tracking script (async loaded)
- Network: 1 request per pageview to
/api/send - Database: ~500 bytes per pageview
- Infrastructure: +256MB RAM (PostgreSQL), +128MB RAM (Umami)
Security Considerations
Research Inquiry
✅ Input validation (DOMPurify alternative) ✅ Rate limiting (5 req/min) ✅ CSRF protection ✅ Email validation ✅ MongoDB injection prevention (parameterized queries) ✅ Human review required (moderation queue)
Umami Analytics
✅ SSL/TLS encryption (HTTPS only) ✅ Security headers (CSP, X-Frame-Options, etc.) ✅ No cookies (no GDPR cookie banner needed) ✅ No personal data stored ✅ Self-hosted (full control) ✅ Firewall rules (ports 80, 443 only)
Framework Compliance
Instructions Followed
- inst_008: CSP compliance (no inline scripts, tracking loaded externally)
- inst_016-018: No prohibited terms in public-facing code
- inst_041: Values-sensitive decision (analytics choice documented)
- inst_072: Defense-in-depth (multiple security layers)
- inst_080: Dependency licensing (Umami is MIT licensed)
Framework Services Used
- BoundaryEnforcer: Implicit (strategic vs operational classification)
- ModerationQueue: Explicit (research inquiries require human review)
- Input Validation: Explicit (validation middleware on all endpoints)
Documentation References
- Research Inquiry API: See routes documentation in
src/routes/index.js - Umami Setup:
deployment-quickstart/UMAMI_SETUP_GUIDE.md - Analytics Plan (original):
docs/governance/PRIVACY-PRESERVING-ANALYTICS-PLAN.md - Umami Documentation: https://umami.is/docs
- Nginx Configuration: https://nginx.org/en/docs/
Handoff Notes for Next Session
If Production Deployment is Needed
-
Research Inquiry (URGENT - Production Bug):
- Run:
./scripts/deploy.sh - Test: Visit researcher page, submit form
- Verify: Check admin panel → Inbox for new inquiry
- Run:
-
Umami Analytics (Non-Urgent):
- Follow UMAMI_SETUP_GUIDE.md step-by-step
- Allow 30-45 minutes for initial setup
- Test thoroughly before enabling in production
If Issues Arise
- 404 on /api/research-inquiry: Check if routes registered in
src/routes/index.js - Database errors: Verify MongoDB connection, check collection exists
- Umami not loading: Check DNS propagation, verify nginx config, check container logs
Session Status: READY FOR DEPLOYMENT Next Action: Deploy research inquiry fix to production Estimated Time to Production: 10 minutes (research inquiry) + 45 minutes (analytics setup)
Generated: 2025-10-29 01:30 UTC Framework: Tractatus Governance v4.2 Session: 2025-10-07-001 (continued)