mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 19:01:08 +02:00
Modul, Routen und Public-Domain heißen jetzt einheitlich "feedback": - App-Registry: id 'community' → 'feedback', name 'Community' → 'Feedback', Icon Megaphone → HeartHalf (passt zum bereits-globalen heart-half-Icon am Module-Header und im PillNav-Usermenü) - Modul-Config: communityModuleConfig → feedbackModuleConfig - Routen-Refs: alle href/goto-Aufrufe in Modul-Views, MyWishesView, Onboarding-Wish, Profile-MyWishes auf /feedback umgestellt - /feedback/+layout: Brand "Mana Community" → "Mana Feedback", Megaphone → HeartHalf, "In Mana öffnen"-CTA zeigt jetzt auf /?app=feedback - Public-Mirror Domain: community.mana.how → feedback.mana.how (cloudflared-config.yml + docker-compose.macmini.yml CORS_ORIGINS + PUBLIC_MANA_ANALYTICS_URL_CLIENT). DNS muss separat angelegt werden. - Settings-Section: Hilfe-Text nennt jetzt feedback.mana.how Internal: community_show_real_name + community_karma DB-Spalten bleiben (Migration nicht im Scope dieses Renames). Settings-Search-Index-Kategorie 'community' bleibt ebenfalls — sie spiegelt das DB-Schema, nicht den User-Begriff. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
336 lines
12 KiB
Markdown
336 lines
12 KiB
Markdown
---
|
||
status: living
|
||
owner: till
|
||
created: 2026-04-27
|
||
parent: docs/plans/feedback-rewards-and-identity.md
|
||
---
|
||
|
||
# Feedback-Hub — Manual Test-Checklist
|
||
|
||
> Was du im Browser durchklicken solltest, um Phase 3.A–3.F live
|
||
> verifiziert zu haben. Was hier nicht steht, ist durch automatisierte
|
||
> Tests abgedeckt (siehe `services/mana-analytics/CLAUDE.md` §Tests).
|
||
>
|
||
> **Format**: jede Zeile ist eine Action + Expected Outcome.
|
||
> Hak ab im commit-message wenn du's durchgespielt hast — z.B.
|
||
> `chore(testing): manual checklist run-through 2026-04-28`.
|
||
|
||
---
|
||
|
||
## 0. Setup — was du brauchst
|
||
|
||
| Account | Zweck | Wo |
|
||
|---|---|---|
|
||
| **Founder (du)** — `tills95@gmail.com` | Admin-Triage, Status-Setzen | mana.how Login |
|
||
| **Test-A** — neuer Account | Wish posten + Credits empfangen (Founder-Whitelist greift bei dir) | `mana.how/register` |
|
||
| **Test-B** — neuer Account | Auf Wishes reagieren, Reactioner-Bonus testen | `mana.how/register` |
|
||
|
||
Schnell-Login zwischen Accounts: Inkognito-Tab oder zweiter Browser. JWT lebt im Cookie + im SessionStorage; Inkognito-Sessions sind unabhängig.
|
||
|
||
**Vor dem Test prüfen — Lokale Entwicklung (`mana.how` lokal auf :5173):**
|
||
|
||
Die Web-App schickt Feedback-Calls an `localhost:3064` (mana-analytics).
|
||
Wenn der Service nicht läuft, siehst du im Browser-Console
|
||
`ERR_CONNECTION_REFUSED` auf `/api/v1/feedback/...`.
|
||
|
||
```bash
|
||
# In separatem Terminal vor dem Web-Dev-Server:
|
||
pnpm dev:analytics # → http://localhost:3064 (auto-watch)
|
||
```
|
||
|
||
Plus Auth + Credits, falls noch nicht laufend:
|
||
```bash
|
||
pnpm dev:auth # 3001
|
||
pnpm dev:credits # 3002
|
||
```
|
||
|
||
**Vor dem Test prüfen — Production (`mana.how`):**
|
||
|
||
```bash
|
||
ssh mana-server 'export DOCKER_HOST=unix:///Users/mana/.colima/default/docker.sock && /usr/local/bin/docker ps --filter "name=mana-analytics" --filter "name=mana-credits" --filter "name=mana-app-web" --filter "name=mana-auth" --format "{{.Names}}: {{.Status}}"'
|
||
```
|
||
|
||
Alle 4 sollten `(healthy)` sein. Wenn nicht: `bash scripts/mac-mini/build-app.sh mana-web --force-free` bzw. `docker compose up -d <service>`.
|
||
|
||
---
|
||
|
||
## 1. Onboarding-Wish (Phase 1, mit Phase 3.A Reward-Chip)
|
||
|
||
**Account: Test-A (frisch registriert)**
|
||
|
||
- [ ] Frisch einloggen → Onboarding-Flow startet (`/onboarding/name` … `/onboarding/wish`)
|
||
- [ ] Step 4 (Wish): Textarea + "Öffentlich teilen / Nur für Admins"-Toggle sichtbar
|
||
- [ ] Toggle auf "Öffentlich" lassen, ≥20 Zeichen tippen, "Fertig"
|
||
- [ ] **Expect**: Confirm zeigt `Sichtbar als Wachsame Eule #XXXX` + animierten Reward-Chip `+5 Mana Credits`
|
||
- [ ] Auf `mana.how/credits` (oder Workbench → Credits) sichtbar: Balance ist 5
|
||
|
||
**Edge:**
|
||
- [ ] Onboarding-Wish leer abschicken → Reward-Chip erscheint NICHT, kein Credit
|
||
- [ ] Toggle auf "Nur für Admins" → Wish kommt nicht im Public-Feed
|
||
|
||
---
|
||
|
||
## 2. Inline FeedbackHook + Modal (Phase 2)
|
||
|
||
**Account: Test-A**
|
||
|
||
- [ ] Workbench öffnen (`mana.how`), eine Modul-Card (z.B. Todo) anklicken
|
||
- [ ] Im ModuleShell-Header rechts ein 💡-Lightbulb-Icon sichtbar
|
||
- [ ] Klick → Modal öffnet sich, "Modul: todo"-Badge oben
|
||
- [ ] Category-Dropdown wählbar (feature/improvement/bug/praise/question)
|
||
- [ ] Senden → Confirm zeigt Eulen-Pseudonym + `+5 Mana Credits`-Chip
|
||
- [ ] **Expect**: Wenn du noch kein Modul-Wish hattest, Balance um +5 hoch
|
||
|
||
**Globale Pille:**
|
||
- [ ] Auf `/settings` oder `/profile` (kein Modul-Shell) → "Idee?"-Pille rechts unten erscheint
|
||
- [ ] Pille klicken → Modal öffnet sich (gleiche Funktion)
|
||
- [ ] **Expect** auf `/onboarding`, `/feedback`, `/community`: Pille **nicht** sichtbar
|
||
|
||
---
|
||
|
||
## 3. Public-Community-Feed (Phase 2 + 3.C Avatare)
|
||
|
||
**Eingeloggt (Test-A) auf `mana.how/community`:**
|
||
|
||
- [ ] Feed zeigt Test-A's Onboarding-Wish + Test-A's Modul-Wish
|
||
- [ ] Jeder Post hat: **Pixel-Identicon-Avatar** (32×32, deterministisch farbig) + Pseudonym
|
||
- [ ] Author-Klick → navigiert zu `/community/eule/<hash>`
|
||
- [ ] Reaction-Bar (👍❤️🚀🤔🎉) klickbar
|
||
- [ ] Filter: Category-Dropdown + Modul-Input
|
||
|
||
**Anonymous (Inkognito) auf `mana.how/community` UND `feedback.mana.how`:**
|
||
|
||
- [ ] Feed lädt ohne Login
|
||
- [ ] Pseudonym + Avatar sichtbar — **NIE Klarname** (auch wenn Test-A opted-in wäre)
|
||
- [ ] Reaction-Buttons read-only mit Tooltip "Login zum Reagieren"
|
||
- [ ] **Expect**: keine `myReactions`-Highlighting auf den Pills
|
||
|
||
---
|
||
|
||
## 4. Reactions + Karma (Phase 2 + 3.C)
|
||
|
||
**Account: Test-B (zweiter Account)**
|
||
|
||
- [ ] Auf Test-A's Wish 👍 reagieren
|
||
- [ ] **Expect** sofort: Pill zeigt `1` Counter, mit aktiv-Highlight
|
||
- [ ] **Expect** in DB: Test-A's `community_karma` ist 1 (über `/community/eule/<test-a-hash>` sichtbar als "1 Karma" / "Bronze-Eule" Badge)
|
||
|
||
**Account-Wechsel zu Test-A:**
|
||
- [ ] `/community/eule/<test-a-hash>` öffnen
|
||
- [ ] **Expect**: Hero zeigt Pixel-Avatar 96×96, Bronze-Eule-Badge, "1 Karma", Post-Count
|
||
- [ ] Eigene Posts sichtbar
|
||
|
||
**Karma-Edge:**
|
||
- [ ] Test-A reagiert auf eigenen Post 👍 → Karma bleibt **unverändert** (Self-React-Schutz)
|
||
- [ ] Test-B unreact (👍 nochmal klicken) → Test-A's Karma fällt zurück auf 0
|
||
|
||
---
|
||
|
||
## 5. Status-Flow + Loop-Closure (Phase 3.B)
|
||
|
||
**Account: Founder (du, als Admin)**
|
||
|
||
- [ ] `mana.how/community/admin` öffnen
|
||
- [ ] Test-A's Wish in der Liste
|
||
- [ ] Status auf `planned` ändern → speichert sofort
|
||
|
||
**Account: Test-A (Tab-Switch / nach Login):**
|
||
|
||
- [ ] **Expect**: Toast erscheint beim nächsten App-Open: `Geplant: ›X‹`
|
||
- [ ] `/profile/my-wishes` öffnen → Tab "Inbox" zeigt 1 unread Notification mit Status-Pill
|
||
- [ ] Tab "Eigene" zeigt Wish mit Status-Badge "Geplant" (lila)
|
||
|
||
**Account: Founder, Status auf `in_progress`:**
|
||
|
||
- [ ] Test-A: Toast `Wir bauen ›X‹ gerade`
|
||
- [ ] Inbox: 2 unread
|
||
- [ ] Tab "Eigene": Status "In Arbeit" (orange)
|
||
|
||
**Account: Founder, Status auf `completed`:**
|
||
|
||
- [ ] Test-A: Toast `Dein Wunsch ist live: ›X‹ · +500 Mana` (success-style)
|
||
- [ ] Test-A's Balance: +500 Credits sichtbar
|
||
- [ ] Test-B (der reagiert hat): Toast `Dein Like ist gelandet · +25 Mana`
|
||
- [ ] Test-B's Balance: +25 Credits
|
||
|
||
**Idempotency:**
|
||
- [ ] Founder ändert Status auf `in_progress`, dann zurück auf `completed`
|
||
- [ ] Test-A bekommt **keine** weiteren +500
|
||
- [ ] Test-A's Balance unverändert
|
||
|
||
---
|
||
|
||
## 6. AdminResponse + Notification (Phase 3.B)
|
||
|
||
**Account: Founder, auf einem Test-A-Wish:**
|
||
|
||
- [ ] In `/community/admin` AdminResponse setzen (z.B. "Schauen wir uns an")
|
||
|
||
**Account: Test-A:**
|
||
|
||
- [ ] Toast: `Antwort vom Team: ›X‹` (info-style, kein Credit)
|
||
- [ ] `/profile/my-wishes` Tab "Inbox": admin-response-Notification
|
||
- [ ] `/community/<id>` (Detail-Page): Admin-Response-Block sichtbar
|
||
- [ ] `/profile/my-wishes` Tab "Eigene": "Antwort vom Team"-Block neben dem Wish
|
||
|
||
---
|
||
|
||
## 7. Klarname-Toggle (Phase 3.C)
|
||
|
||
**Account: Test-A**
|
||
|
||
- [ ] `/settings` → "Community"-Tab anklicken
|
||
- [ ] **Expect**: Avatar-Preview, "Wachsame Eule #XXXX" + Bronze-Eule-Badge + 0 Karma
|
||
- [ ] Toggle "Klarnamen neben Pseudonym zeigen" einschalten
|
||
- [ ] **Expect**: Switch animiert zu rechts (primary-color), Eulen-Display zeigt jetzt "… · Test-A's Klarname"
|
||
|
||
**Eingeloggt (Test-A oder Test-B) auf `mana.how/community`:**
|
||
- [ ] Test-A's Posts zeigen `Wachsame Eule #XXXX · Test-A` neben dem Avatar
|
||
|
||
**Inkognito auf `mana.how/community`:**
|
||
- [ ] Test-A's Posts zeigen NUR `Wachsame Eule #XXXX` — **kein Klarname**, auch nicht im HTML-Source (View-Source prüfen)
|
||
|
||
**Toggle aus:**
|
||
- [ ] Switch wieder ausschalten → eingeloggte Sicht zeigt nur Pseudonym
|
||
- [ ] **Expect**: Optimistic-Update + Rollback bei Fehler funktioniert (kann man im Network-Panel sehen)
|
||
|
||
---
|
||
|
||
## 8. Eulen-Profil (Phase 3.C)
|
||
|
||
**Eingeloggt auf `/community`, Klick auf einen Pseudonym-Link:**
|
||
|
||
- [ ] Browse zu `/community/eule/<hash>`
|
||
- [ ] Hero: 96×96 Avatar, Pseudonym, Tier-Pill (Bronze/Silver/Gold/Platin), Karma-Count, Post-Count
|
||
- [ ] Liste aller public Posts dieser Eule
|
||
- [ ] "← Zurück zum Feed"-Link funktioniert
|
||
|
||
**Inkognito (kein Login):**
|
||
- [ ] `feedback.mana.how/community/eule/<hash>` (oder mana.how/community/eule/<hash>) lädt SSR-rendered
|
||
- [ ] **Expect**: Anzeige identisch — Avatar, Tier-Badge, Karma, Posts; KEIN Klarname
|
||
- [ ] HTML-Source: enthält `<meta name="description"...>` mit Pseudonym + Karma + Post-Count
|
||
|
||
**Edge:**
|
||
- [ ] `/community/eule/abc` (zu kurzer Hash) → 404 "Eulen-Profil nicht gefunden"
|
||
- [ ] `/community/eule/<64-hex-noch-nie-genutzt>` → leere Liste, Karma 0, "Diese Eule hat noch nichts gepostet"
|
||
|
||
---
|
||
|
||
## 9. Threading / Replies
|
||
|
||
**Account: Test-A öffnet einen seiner Wishes über `/community/<id>`:**
|
||
|
||
- [ ] Detail-View zeigt Original-Wish + Reactions-Bar
|
||
- [ ] "X Antworten"-Sektion unten
|
||
- [ ] Eingeloggte Reply-Box am Ende mit Textarea + Antworten-Button
|
||
|
||
**Account: Test-B reply-postet:**
|
||
- [ ] Reply erscheint sofort in der Liste
|
||
- [ ] **Expect**: KEIN +5-Credit für Replies (nur top-level zählt — siehe Plan)
|
||
|
||
---
|
||
|
||
## 10. Phase 3.F — Legacy ist weg (Verifikation)
|
||
|
||
- [ ] `mana.how/feedback` → 404 (alte Route gelöscht)
|
||
- [ ] App-Switcher / Workbench: kein "Feedback"-Modul mehr in der App-Liste
|
||
- [ ] Browser-Console im Submit-Flow: kein Aufruf an `/feedback/:id/vote` (alte Vote-Endpoints sind raus)
|
||
|
||
---
|
||
|
||
## 11. Founder-Whitelist (du selbst kannst NICHT farmen)
|
||
|
||
**Account: Founder (du):**
|
||
|
||
- [ ] Selbst einen Wish über Lightbulb posten
|
||
- [ ] **Expect**: Confirm zeigt KEINEN +5-Reward-Chip (Whitelist greift)
|
||
- [ ] Credits-Balance unverändert
|
||
- [ ] Wish kommt im Feed an (nur kein Bonus)
|
||
|
||
- [ ] Founder selbst auf eigenen Wish-Status `completed` setzen
|
||
- [ ] **Expect**: KEIN +500 ausgezahlt (founder-author skip)
|
||
- [ ] Credits unverändert
|
||
|
||
---
|
||
|
||
## 12. Rate-Limit (10 Submits / 24h)
|
||
|
||
**Account: Test-A** (oder ein 3. Test-Account, weil Test-A schon Credits hat)
|
||
|
||
- [ ] 11 Wishes innerhalb weniger Minuten posten (jeweils ≥20 chars)
|
||
- [ ] **Expect**: 1.–10. Submit zeigt Reward-Chip, +5/Submit
|
||
- [ ] **Expect**: 11. Submit landet im Feed, aber Confirm zeigt **keinen** Reward-Chip
|
||
- [ ] Balance: +50 (nicht +55)
|
||
|
||
---
|
||
|
||
## 13. Voting-Score (für Sortierung)
|
||
|
||
**Drei Wishes von Test-A vorbereiten, Test-B reagiert verschieden:**
|
||
|
||
| Wish | Reactions von Test-B | Score |
|
||
|---|---|---|
|
||
| W1 | 👍 (weight 1) | 1 |
|
||
| W2 | 🚀 (weight 2) | 2 |
|
||
| W3 | 🤔 (weight 0) | 0 |
|
||
|
||
- [ ] `/community` Feed-Reihenfolge: W2 oben, W1 mitte, W3 unten / oder gleichberechtigt
|
||
- [ ] Test-A's Karma: 2 (W3's 🤔 zählt nicht für score, aber zählt für Karma als 1; W1=1, W2=1, W3=1 → Karma=3)
|
||
- **Hinweis**: Karma += 1 pro Reaction (egal welches Emoji), nur Score-Weight unterscheidet
|
||
|
||
---
|
||
|
||
## 14. Mobile-Responsiveness (Quick-Check)
|
||
|
||
Alles oben in Mobile-Viewport (DevTools → 375×667 iPhone) durchgehen:
|
||
|
||
- [ ] Onboarding-Wish + Reward-Chip
|
||
- [ ] Lightbulb-Modal
|
||
- [ ] Floating "Idee?"-Pille (sollte sich auf "💡" verkürzen)
|
||
- [ ] /community Feed
|
||
- [ ] /community/eule/<hash> Hero-Layout
|
||
- [ ] /profile/my-wishes Tabs
|
||
- [ ] /settings Community-Section
|
||
|
||
---
|
||
|
||
## 15. Quick-DB-Sanity (optional)
|
||
|
||
Auf Mac Mini `psql` mit `mana_platform` öffnen:
|
||
|
||
```sql
|
||
-- Wer hat wieviel Karma?
|
||
SELECT id, name, community_karma, community_show_real_name
|
||
FROM auth.users WHERE community_karma > 0 ORDER BY community_karma DESC LIMIT 10;
|
||
|
||
-- Letzte 10 Notifications
|
||
SELECT user_id, kind, title, credits_awarded, read_at, created_at
|
||
FROM feedback.feedback_notifications ORDER BY created_at DESC LIMIT 10;
|
||
|
||
-- Letzte 10 Credit-Grants (über mana-credits)
|
||
SELECT user_id, amount, balance_after, metadata->>'reason' AS reason, created_at
|
||
FROM credits.transactions WHERE type = 'grant' ORDER BY created_at DESC LIMIT 10;
|
||
|
||
-- Reaction-Counter pro Wish
|
||
SELECT id, title, reactions, score
|
||
FROM feedback.user_feedback WHERE is_public = true ORDER BY score DESC LIMIT 5;
|
||
```
|
||
|
||
---
|
||
|
||
## Bekannte Lücken (nicht Test-blocker, aber gut zu wissen)
|
||
|
||
- **Auto-Test-Zugriff**: `pnpm test:integration` läuft gegen `mana_platform` direkt — Test-User-Rows werden mit `test-`-Prefix angelegt + cleanen sich auf. Kein Test-Pollution-Risiko.
|
||
- **Email-Notifications**: Stand jetzt nur In-App-Toast/Inbox, keine Email. Phase 3.B.3 (Monthly-Digest) ist im Plan, nicht gebaut.
|
||
- **Voice-Submit**: Phase 3.E offen — Mic-Button im FeedbackQuickModal noch nicht da.
|
||
- **Trending / Match-Existing**: Phase 3.D offen.
|
||
- **Karma-Decay**: Alte Posts akkumulieren immer mehr Karma. Phase 3 backlog.
|
||
|
||
---
|
||
|
||
## Wenn was kaputt ist
|
||
|
||
1. **Container-Logs**: `ssh mana-server 'docker logs mana-analytics --tail 50'` (analog auth/credits/web)
|
||
2. **DB-Konsistenz**: Sanity-SQLs oben
|
||
3. **Eintragsspur**: `feedback.user_feedback.id` → `feedback.feedback_notifications.feedback_id` → `auth.users.id`
|
||
4. **Plan-Doc Phase 3** (`feedback-rewards-and-identity.md`) für Architektur-Kontext
|