Heru Feedback — Architecture Diagram
┌─────────────────────────────────────────────────────────┐
│ TESTER'S DEVICE │
│ (Quik's phone, Vision's laptop) │
│ │
│ ┌─────────────────────────────────┐ │
│ │ FMO / WCR / My Voyages App │ │
│ │ (web or mobile) │ │
│ │ │ │
│ │ ┌───────────────────┐ │ │
│ │ │ Ida Widget (FAB) │ ← tester taps this │
│ │ │ - Screenshot │ │
│ │ │ - Text │ │
│ │ │ - Voice recording │ │
│ │ │ - Screen record │ │
│ │ └────────┬──────────┘ │
│ └───────────┼──────────────────────┘ │
└──────────────┼──────────────────────────────────────────┘
│ POST /api/feedback
▼
┌──────────────────────────────────────┐
│ CLARA BACKEND (Shared EC2) │ ← lives on develop EC2
│ 98.83.4.34 │ (i-0c851042b3e385682)
│ │
│ 1. Store feedback in PostgreSQL │
│ 2. Upload screenshot/audio to S3 │
│ 3. Classify (Sonnet): bug/feature │
│ 4. POST to Slack #maat-agents │
│ 5. Write task to Auset Brain vault │
│ ~/auset-brain/Feedback-Tasks/ │
│ <heru>/<id>.md │
└──────────┬───────────────────────────┘
│
┌─────┴─────┐
▼ ▼
┌─────────┐ ┌──────────────────────────────────┐
│ SLACK │ │ AUSET BRAIN VAULT (S3) │
│ #maat- │ │ s3://auset-brain-vault/ │
│ agents │ │ Feedback-Tasks/fmo/001.md │
│ │ │ Feedback-Tasks/wcr/001.md │
│ Mo sees │ │ Feedback-Tasks/my-voyages/001.md │
│ it here │ └──────────┬───────────────────────┘
└─────────┘ │
│ Haiku dispatcher reads
│ every 5 minutes
▼
┌───────────────────────────────────────────────────┐
│ QC1 (Mac M4 Pro) │
│ 100.113.53.80 (Tailscale) │
│ │
│ ┌──────────────────────────────────┐ │
│ │ HAIKU DISPATCHER │ │
│ │ (haiku-dispatcher.js — cron 5m) │ │
│ │ │ │
│ │ Reads: vault Feedback-Tasks/ │ │
│ │ Routes based on area: │ │
│ │ frontend → Annie/Jean-Michel │ │
│ │ backend → Ernest/Daniel │ │
│ │ mobile → Mae │ │
│ │ auth → Clark │ │
│ │ │ │
│ │ Dispatches via: │ │
│ │ cursor-ssh agent --print │ │
│ │ --trust --model auto │ │
│ │ "<fix this bug prompt>" │ │
│ └──────────────┬───────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ CURSOR AGENTS (up to 6) │ │
│ │ │ │
│ │ Work in: ~/worktrees/<heru>/ │ │
│ │ Fix bug → commit → push │ │
│ │ Update feedback status: fixed │ │
│ └──────────────┬───────────────────┘ │
└─────────────────┼──────────────────────────────────┘
│ git push to develop
▼
┌───────────────────────────────────┐
│ GITHUB (imaginationeverywhere/) │
│ develop branch updated │
└──────────┬────────────────────────┘
│ auto-deploy triggers
┌─────┴─────┐
▼ ▼
┌─────────┐ ┌─────────────────┐
│ AMPLIFY │ │ EC2 DEVELOP │
│ (web) │ │ (backend) │
│ auto- │ │ PM2 restart │
│ deploys │ │ on push │
└─────────┘ └─────────────────┘
│
▼
TESTER REFRESHES → SEES FIX
(Mobile: EAS build → TestFlight/Play Store Internal)
Where Agents Live
QC1 (Mac M4 Pro) at Quik’s house, 100.113.53.80 via Tailscale.
- Cursor agents run there using
cursor-sshwrapper (~/.local/bin/cursor-ssh) - Haiku dispatcher (
haiku-dispatcher.js) runs on QC1 cron every 5 minutes - Reads new feedback tasks from the vault (synced from S3)
- Dispatches the right Cursor agent based on area (frontend/backend/mobile/auth)
- Up to 6 concurrent agents
The Flow (End to End)
- Tester taps Ida widget → submits bug with screenshot/text/voice
- Clara Backend (EC2) receives POST /api/feedback → stores in DB → uploads media to S3
- Sonnet classifies: bug / feature / question
- Slack maat-agents gets notification (Mo sees it)
- Vault gets task file at
~/auset-brain/Feedback-Tasks/<heru>/<id>.md - Haiku dispatcher (QC1 cron) reads new task → routes to correct agent
- Cursor agent (QC1) fixes the bug on develop branch → commits → pushes
- Amplify auto-deploys web; EC2 restarts backend; EAS builds mobile
- Tester refreshes → sees fix. Widget shows “Fixed” status.
Models Used
| Component | Model | Where | Cost |
|---|---|---|---|
| Classification | Sonnet 4.6 | Clara Backend (EC2) | Max plan |
| Dispatch routing | Haiku 4.5 | QC1 (haiku-dispatcher.js) | Max plan |
| Code fixes | Cursor agent (auto) | QC1 (cursor-ssh) | Cursor subscription |
| Slack format | None (template) | Clara Backend | $0 |