chore: remove unused assets (header-imageold.png, test artifacts)
This commit is contained in:
parent
db3633425a
commit
6893d4065f
43 changed files with 0 additions and 3469 deletions
Binary file not shown.
|
Before Width: | Height: | Size: 2.3 MiB |
|
|
@ -1,402 +0,0 @@
|
|||
# Kraiken Landing Page Variant Report V2
|
||||
**Persona-Based User Testing Results**
|
||||
*Generated: 2026-02-16*
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
**🏆 Overall Winner: Variant B (Offensive)**
|
||||
|
||||
Variant B ("The AI that trades while you sleep") wins as the strongest all-around performer, with:
|
||||
- **Best engagement**: Only variant that got "yes" CTA clicks from Marcus across the board
|
||||
- **Highest excitement**: Scored 7/10 with Alex (highest for newcomers)
|
||||
- **Clearest value prop**: "Your Unfair Advantage" and "First-Mover Alpha" resonated most strongly
|
||||
|
||||
**Key Insight**: The "offensive" messaging doesn't alienate newcomers as feared — it actually generates more excitement when paired with transparency signals. All variants score identically with Sarah (yield farmers) because NONE show APY/yield numbers.
|
||||
|
||||
---
|
||||
|
||||
## Comparison Table: Persona × Variant Scores
|
||||
|
||||
### Marcus (Degen / CT Native)
|
||||
| Metric | Variant A (Defensive) | Variant B (Offensive) | Variant C (Mixed) |
|
||||
|--------|----------------------|----------------------|-------------------|
|
||||
| First Impression | 7/10 | 7/10 | 7/10 |
|
||||
| Would Click CTA | ❌ No | ✅ Yes | ✅ Yes |
|
||||
| Trust Level | 8/10 | 7/10 | 8/10 |
|
||||
| Excitement | 7/10 | 7/10 | 7/10 |
|
||||
| Would Share | ✅ Yes | ✅ Yes | ✅ Yes |
|
||||
|
||||
**Winner: Variant B** — Only variant with strong enough CTA language to convert
|
||||
|
||||
### Sarah (Yield Farmer / Data-Driven)
|
||||
| Metric | Variant A (Defensive) | Variant B (Offensive) | Variant C (Mixed) |
|
||||
|--------|----------------------|----------------------|-------------------|
|
||||
| First Impression | 6/10 | 6/10 | 6/10 |
|
||||
| Would Click CTA | ❌ No | ❌ No | ❌ No |
|
||||
| Trust Level | 7/10 | 7/10 | 7/10 |
|
||||
| Excitement | 5/10 | 5/10 | 5/10 |
|
||||
| Would Share | ❌ No | ❌ No | ❌ No |
|
||||
|
||||
**Winner: TIE** — All variants fail to provide yield data Sarah needs
|
||||
|
||||
### Alex (Newcomer / Risk-Averse)
|
||||
| Metric | Variant A (Defensive) | Variant B (Offensive) | Variant C (Mixed) |
|
||||
|--------|----------------------|----------------------|-------------------|
|
||||
| First Impression | 7/10 | 7/10 | 7/10 |
|
||||
| Would Click CTA | ❌ No | ❌ No | ✅ Yes |
|
||||
| Trust Level | 7/10 | 5/10 | 5/10 |
|
||||
| Excitement | 5/10 | 7/10 | 7/10 |
|
||||
| Would Share | ❌ No | ❌ No | ❌ No |
|
||||
|
||||
**Winner: Variant C** — "Protected downside" messaging + "AI handles the rest" reduces fear
|
||||
|
||||
---
|
||||
|
||||
## Detailed Analysis by Persona
|
||||
|
||||
### 🎯 Marcus (Degen) — Best: Variant B
|
||||
|
||||
**What Worked in Variant B:**
|
||||
- ✅ "**Your Unfair Advantage**" — speaks directly to edge-seeking mindset
|
||||
- ✅ "**First-Mover Alpha**" — FOMO trigger without being cringe
|
||||
- ✅ "**Get Your Edge**" CTA — action-oriented, not corporate
|
||||
- ✅ "**You just hold and win**" — simple value prop
|
||||
|
||||
**What Worked in Variant A:**
|
||||
- ✅ "**The token that can't be rugged**" — Marcus said this is "Good RT material"
|
||||
- ✅ Strong trust signal (8/10) from anti-rug messaging
|
||||
|
||||
**What All Variants Missed:**
|
||||
- ❌ No social proof (TVL, user count, trading volume)
|
||||
- ❌ No "degen" language (alpha, moon, ape, wagmi, etc.)
|
||||
- ❌ Variant A has weak CTA: "Get $KRK" vs B's "Get Your Edge"
|
||||
|
||||
**Marcus's Actual Feedback:**
|
||||
- Variant A: *"Weak CTA - where's the 'ape in' button?"*
|
||||
- Variant B: *"CTA speaks my language"*
|
||||
- Variant C: *"Needs more edge. alpha, moon, ape would hit better"*
|
||||
|
||||
---
|
||||
|
||||
### 📊 Sarah (Yield Farmer) — All Variants FAIL
|
||||
|
||||
**Critical Missing Elements (ALL Variants):**
|
||||
- ❌ No APY/yield percentages shown
|
||||
- ❌ No risk metrics or quantified returns
|
||||
- ❌ No comparison to Aave/Compound rates
|
||||
- ❌ No audit information or security metrics
|
||||
|
||||
**What Sarah Actually Said:**
|
||||
> "No yield numbers - what's the APY?"
|
||||
> "Missing: APY/yield numbers, risk metrics, comparison to Aave/Compound rates."
|
||||
|
||||
**Why She Won't Convert:**
|
||||
All variants mention "capturing trading fees" and "ETH reserves growing" but give ZERO concrete numbers. Sarah needs to see:
|
||||
- Historical APY (7-day, 30-day)
|
||||
- Fee capture rate
|
||||
- ETH reserve growth chart
|
||||
- Risk-adjusted return vs Aave
|
||||
|
||||
**Minimal Trust Signals Present:**
|
||||
- ✅ All variants score 7/10 trust from "on-chain" transparency language
|
||||
- ✅ "Real ETH" backing provides some credibility
|
||||
- But without data, she won't click
|
||||
|
||||
---
|
||||
|
||||
### 👶 Alex (Newcomer) — Best: Variant C
|
||||
|
||||
**What Worked in Variant C:**
|
||||
- ✅ "**DeFi without the rug pull**" — directly addresses #1 fear (scams)
|
||||
- ✅ "**Protected downside**" — frames safety explicitly
|
||||
- ✅ "**The AI handles the rest**" — reduces perceived complexity
|
||||
- ✅ Trust signal: "protected" mentioned explicitly
|
||||
|
||||
**What Worked Across Variants:**
|
||||
- ✅ All scored 7/10 first impression — "seems understandable"
|
||||
- ✅ "How It Works" sections provide structure
|
||||
- ✅ "30 Seconds" onboarding reduces intimidation
|
||||
|
||||
**What All Variants Missed:**
|
||||
- ❌ Still too much unexplained jargon ("Uniswap V3", "liquidity pool", "rebalancing")
|
||||
- ❌ No user testimonials or social proof
|
||||
- ❌ No explicit "for beginners" guidance
|
||||
- ❌ Variant B's "alpha" and "first-mover" language lowered trust (5/10 vs 7/10)
|
||||
|
||||
**Alex's Actual Feedback:**
|
||||
- Variant A: *"Good: has clear explanations. Needs more safety assurances"*
|
||||
- Variant B: *"Worried about scams"* (trust dropped to 5/10)
|
||||
- Variant C: *"feels safe enough to learn more"* + ✅ clicked CTA
|
||||
|
||||
---
|
||||
|
||||
## Specific Copy Analysis
|
||||
|
||||
### 🎯 Headlines Compared
|
||||
|
||||
| Variant | Headline | Marcus | Sarah | Alex |
|
||||
|---------|----------|--------|-------|------|
|
||||
| **A** | "The token that can't be rugged" | ⭐ Best for trust | ❌ No data signal | ✅ Addresses fear |
|
||||
| **B** | "The AI that trades while you sleep" | ✅ Edge signal | ❌ Vague promise | ⚠️ Reduces trust |
|
||||
| **C** | "DeFi without the rug pull" | ⚠️ Defensive | ❌ No data signal | ⭐ Best for safety |
|
||||
|
||||
**Recommendation**: Variant B headline for top of page, Variant A tagline for subhead
|
||||
|
||||
---
|
||||
|
||||
### 💬 Value Props Compared
|
||||
|
||||
#### Variant A (Defensive)
|
||||
```
|
||||
"$KRK has a price floor backed by real ETH.
|
||||
An AI manages it. You just hold."
|
||||
```
|
||||
- ✅ **Clear**: Even Alex understands
|
||||
- ❌ **Boring**: No edge for Marcus
|
||||
- ❌ **No numbers**: Sarah bounces
|
||||
|
||||
#### Variant B (Offensive)
|
||||
```
|
||||
"An autonomous AI agent managing $KRK liquidity 24/7.
|
||||
Capturing alpha. Deepening positions.
|
||||
You just hold and win."
|
||||
```
|
||||
- ✅ **Exciting**: "Capturing alpha" hits Marcus
|
||||
- ✅ **Active**: "hold and win" = clear outcome
|
||||
- ⚠️ **Jargony**: Alex doesn't know what "deepening positions" means
|
||||
|
||||
#### Variant C (Mixed)
|
||||
```
|
||||
"AI-managed liquidity with an ETH-backed floor.
|
||||
Real upside, protected downside."
|
||||
```
|
||||
- ✅ **Balanced**: Best risk/reward framing
|
||||
- ✅ **Safe**: "Protected downside" = trust for Alex
|
||||
- ❌ **Generic**: No edge for Marcus
|
||||
|
||||
**Recommendation**: Combine B + C:
|
||||
*"An AI managing liquidity 24/7 — capturing alpha with a protected downside. You just hold and win."*
|
||||
|
||||
---
|
||||
|
||||
### 🚨 CTAs Compared
|
||||
|
||||
| Variant | CTA | Marcus | Sarah | Alex |
|
||||
|---------|-----|--------|-------|------|
|
||||
| **A** | "Get $KRK" | ❌ Weak | ❌ No data | ❌ Too direct |
|
||||
| **B** | "Get Your Edge" | ✅ Converts | ❌ No data | ⚠️ Confusing |
|
||||
| **C** | "Buy $KRK" | ⚠️ Transactional | ❌ No data | ✅ Clear |
|
||||
|
||||
**Recommendation**: Use **"Start Earning"** (from Variant B's secondary CTA) — works for all personas
|
||||
|
||||
---
|
||||
|
||||
## Top 3 Actionable Copy Improvements
|
||||
|
||||
### 1. **Add Concrete Yield Numbers (CRITICAL for Sarah)**
|
||||
|
||||
**Current state**: All variants say "capturing trading fees" but show ZERO numbers
|
||||
|
||||
**Fix**:
|
||||
```diff
|
||||
- Capturing trading fees, adjusting to market conditions
|
||||
+ Capturing 15-40% APY from trading fees (7-day avg: 28.3%)
|
||||
```
|
||||
|
||||
**Where to add**:
|
||||
- Hero section: "24.5% APY — view live dashboard"
|
||||
- "How It Works" AI section: "Historical returns: 15-40% APY"
|
||||
- Add "Live Metrics" card with: Current APY, ETH Reserves, Total Value Locked
|
||||
|
||||
**Impact**: Converts Sarah from 5/10 excitement → 8/10, gets her to click CTA
|
||||
|
||||
---
|
||||
|
||||
### 2. **Dial Down Jargon, Dial Up Plain English (for Alex)**
|
||||
|
||||
**Current problems**:
|
||||
- "Uniswap V3 positions" — Alex doesn't know what this means
|
||||
- "Rebalancing ranges" — sounds complicated
|
||||
- "Liquidity pool" — unclear to newcomers
|
||||
|
||||
**Fix with tooltips or plain rewrites**:
|
||||
```diff
|
||||
- Kraiken optimizes 3 Uniswap V3 positions
|
||||
+ Kraiken manages your tokens across 3 trading strategies
|
||||
|
||||
- Rebalancing to capture fees
|
||||
+ Adjusting positions to earn more from trades
|
||||
|
||||
- ETH in a Uniswap V3 pool
|
||||
+ ETH locked in a trading vault that backs every token
|
||||
```
|
||||
|
||||
**Impact**: Increases Alex's trust from 5/10 → 7/10, reduces "too confusing" complaints
|
||||
|
||||
---
|
||||
|
||||
### 3. **Add Social Proof Immediately (for Marcus + Alex)**
|
||||
|
||||
**Current state**: ZERO social proof on any variant
|
||||
|
||||
**Fix — Add to hero section**:
|
||||
```
|
||||
[Live Stats Bar]
|
||||
$2.4M TVL | 1,247 holders | 24.5% APY | 156 AI rebalances this week
|
||||
```
|
||||
|
||||
**Fix — Add testimonials section**:
|
||||
```
|
||||
💬 "Made 31% in 3 weeks while I slept. AI actually works." — 0x7a3f...
|
||||
📈 "Better returns than my Aave position, way less hassle." — @defi_sarah
|
||||
🛡️ "First DeFi project I trusted enough to hold long-term." — 0x9b2c...
|
||||
```
|
||||
|
||||
**Impact**:
|
||||
- Marcus: Gets the TVL/user count he needs → increases "would share" confidence
|
||||
- Alex: Real user voices → increases trust from 5/10 → 7/10
|
||||
|
||||
---
|
||||
|
||||
## Copy to KEEP (Performs Well)
|
||||
|
||||
### ✅ Keep These Phrases
|
||||
|
||||
**From Variant A:**
|
||||
- ✅ **"The token that can't be rugged"** — Marcus rated this "Good RT material"
|
||||
- ✅ **"You don't lift a finger"** — Clarity for Alex
|
||||
- ✅ **"No black boxes, no trust required"** — Strong transparency signal
|
||||
|
||||
**From Variant B:**
|
||||
- ✅ **"Your Unfair Advantage"** — Resonates with Marcus
|
||||
- ✅ **"The AI that trades while you sleep"** — Best headline for engagement
|
||||
- ✅ **"First-Mover Alpha"** — Subtle FOMO without being cringe
|
||||
- ✅ **"You just hold and win"** — Clear outcome
|
||||
|
||||
**From Variant C:**
|
||||
- ✅ **"Protected downside"** — Alex's top trust signal
|
||||
- ✅ **"Real upside, protected downside"** — Best risk framing
|
||||
- ✅ **"The AI handles the rest"** — Reduces complexity fear
|
||||
|
||||
---
|
||||
|
||||
## Copy to CHANGE
|
||||
|
||||
### ⚠️ Rewrite These
|
||||
|
||||
**Weak CTAs:**
|
||||
- ❌ "Get $KRK" → ✅ "Start Earning" or "Get Your Edge"
|
||||
- ❌ "Buy $KRK" → ✅ "Start Earning" (less transactional)
|
||||
|
||||
**Vague Value Props:**
|
||||
- ❌ "Capturing alpha" → ✅ "Earning 15-40% APY from trading fees"
|
||||
- ❌ "Real liquidity, real ETH reserves growing" → ✅ "ETH reserves up 23% this month — track live"
|
||||
|
||||
**Jargon:**
|
||||
- ❌ "Optimizes 3 Uniswap V3 positions" → ✅ "Manages 3 trading strategies"
|
||||
- ❌ "Rebalancing ranges" → ✅ "Adjusting positions to capture more fees"
|
||||
|
||||
---
|
||||
|
||||
## Copy to KILL
|
||||
|
||||
### ❌ Delete These
|
||||
|
||||
**Corporate/Safe Language (Marcus hates):**
|
||||
- ❌ "Use at your own risk" — Nobody reads this, removes it from legal if possible
|
||||
- ❌ "Research and Development" — Too academic, not degen
|
||||
|
||||
**Vague Promises (Sarah hates):**
|
||||
- ❌ "Growing with every trade" — Show the number or cut it
|
||||
- ❌ "Accumulates value on-chain automatically" — Vague, replace with APY
|
||||
|
||||
**Complexity (Alex hates):**
|
||||
- ❌ "Exploiting market conditions" — Sounds shady to newcomers
|
||||
- ❌ "Deepening positions" — Jargon that adds no clarity
|
||||
|
||||
---
|
||||
|
||||
## Recommended Hybrid Version
|
||||
|
||||
Combine the best elements from each variant:
|
||||
|
||||
### Hero Section
|
||||
```
|
||||
KrAIken
|
||||
|
||||
[Variant B headline, Variant A subhead]
|
||||
The AI that trades while you sleep
|
||||
The token that can't be rugged.
|
||||
|
||||
[New: Add live stats]
|
||||
$2.4M TVL · 24.5% APY · 1,247 holders
|
||||
|
||||
[Variant C value prop + numbers]
|
||||
AI-managed liquidity with an ETH-backed floor.
|
||||
Real upside (15-40% APY), protected downside.
|
||||
|
||||
[Variant B CTA]
|
||||
→ Start Earning
|
||||
```
|
||||
|
||||
### How It Works (3 Cards)
|
||||
|
||||
**Card 1: [Variant B] Your Unfair Advantage**
|
||||
```
|
||||
⚡ AI Trading Edge
|
||||
Kraiken manages 3 trading strategies 24/7 — capturing 15-40% APY
|
||||
from fees, adjusting depth, optimizing positions. Never sleeps, never panics.
|
||||
```
|
||||
|
||||
**Card 2: [Variant C] Protected Downside**
|
||||
```
|
||||
🛡️ ETH-Backed Floor
|
||||
Every $KRK is backed by real ETH. The protocol maintains a price floor
|
||||
that protects you from catastrophic drops. Real upside, protected downside.
|
||||
```
|
||||
|
||||
**Card 3: [Variant A] Fully Transparent**
|
||||
```
|
||||
🔍 No Black Boxes
|
||||
Every rebalance is on-chain. Watch the AI work in real-time.
|
||||
No trust required — just verifiable execution.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Testing Metrics Summary
|
||||
|
||||
**Total variants tested**: 3
|
||||
**Total personas evaluated**: 3
|
||||
**Total screenshots captured**: 12 (4 per variant)
|
||||
**Total evaluations**: 9 JSON feedback files
|
||||
|
||||
**Files generated**:
|
||||
- `/tmp/usertest-results/visual-feedback-{persona}-{variant}.json` (9 files)
|
||||
- `/tmp/usertest-results/text-{variant}.txt` (3 files)
|
||||
- `/tmp/usertest-results/screenshots/{variant}/*.png` (12 screenshots)
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Immediate wins** (< 1 hour):
|
||||
- Add live APY number to hero section
|
||||
- Change CTA to "Start Earning"
|
||||
- Add TVL/holder count stats
|
||||
|
||||
2. **High-impact** (< 1 day):
|
||||
- Create "Live Metrics" dashboard widget
|
||||
- Add 3 user testimonials
|
||||
- Simplify jargon with tooltips
|
||||
|
||||
3. **Strategic** (ongoing):
|
||||
- A/B test Variant B headline vs Variant A
|
||||
- Track conversion by persona type
|
||||
- Monitor which CTAs convert best
|
||||
|
||||
---
|
||||
|
||||
*Report generated from Playwright-based persona testing with grounded analysis of actual page content.*
|
||||
|
|
@ -1,268 +0,0 @@
|
|||
# Landing Page Variant Comparison Report
|
||||
**Generated:** 2026-02-15
|
||||
**Test Method:** Persona-based user testing (3 personas × 3 variants = 9 evaluations)
|
||||
**Personas Tested:** Marcus "Flash" Chen (Degen), Sarah Park (Cautious Yield Farmer), Alex Rivera (Newcomer)
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
**🏆 Winner: Variant C (Mixed) — "DeFi without the rug pull"**
|
||||
|
||||
Variant C achieved the best overall performance across all three target personas, with:
|
||||
- **Highest average first impression:** 7.67/10
|
||||
- **Best CTA conversion potential:** 100% across Sarah + Alex (66% overall)
|
||||
- **Strongest trust signals:** 7.33/10 average
|
||||
- **Most balanced appeal:** Works for 2/3 personas (Sarah ⭐⭐⭐, Alex ⭐⭐)
|
||||
|
||||
**Key Insight:** The mixed variant balances safety messaging (crucial for Sarah/Alex) with enough upside framing to remain interesting. It avoids the extremes that alienate segments: Variant A is too boring for Marcus, Variant B is too aggressive for Sarah/Alex.
|
||||
|
||||
---
|
||||
|
||||
## Detailed Score Comparison
|
||||
|
||||
### Summary Table: Persona × Variant Scores
|
||||
|
||||
| Metric | Marcus × A | Marcus × B | Marcus × C | Sarah × A | Sarah × B | Sarah × C | Alex × A | Alex × B | Alex × C |
|
||||
|--------|-----------|-----------|-----------|----------|----------|----------|---------|---------|---------|
|
||||
| **First Impression** | 4/10 | 9/10 | 7/10 | 8/10 | 5/10 | 9/10 | 8/10 | 4/10 | 7/10 |
|
||||
| **Would Click CTA** | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
|
||||
| **Trust Level** | 6/10 | 7/10 | 7/10 | 8/10 | 4/10 | 8/10 | 7/10 | 4/10 | 7/10 |
|
||||
| **Excitement** | 3/10 | 9/10 | 6/10 | 6/10 | 3/10 | 7/10 | 6/10 | 5/10 | 7/10 |
|
||||
| **Would Share** | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
|
||||
|
||||
### Aggregate Scores by Variant
|
||||
|
||||
| Variant | Avg First Impression | CTA Click Rate | Avg Trust | Avg Excitement | Share Rate |
|
||||
|---------|---------------------|----------------|-----------|----------------|------------|
|
||||
| **A (Defensive)** | 6.67/10 | 66% (2/3) | 7.0/10 | 5.0/10 | 0% (0/3) |
|
||||
| **B (Offensive)** | 6.0/10 | 33% (1/3) | 5.0/10 | 5.67/10 | 33% (1/3) |
|
||||
| **C (Mixed)** | **7.67/10** | **66% (2/3)** | **7.33/10** | **6.67/10** | 33% (1/3) |
|
||||
|
||||
**Winner:** Variant C leads in 4/5 aggregate metrics.
|
||||
|
||||
---
|
||||
|
||||
## Persona-by-Persona Analysis
|
||||
|
||||
### 🎯 Marcus "Flash" Chen (Degen / MEV Hunter)
|
||||
|
||||
**Winner: Variant B (Offensive)**
|
||||
|
||||
| Metric | Variant A | Variant B | Variant C |
|
||||
|--------|-----------|-----------|-----------|
|
||||
| First Impression | 4/10 | **9/10** | 7/10 |
|
||||
| Would Click CTA | ❌ | **✅** | ✅ |
|
||||
| Trust | 6/10 | **7/10** | **7/10** |
|
||||
| Excitement | 3/10 | **9/10** | 6/10 |
|
||||
| Would Share | ❌ | **✅** | ❌ |
|
||||
|
||||
**Key Feedback:**
|
||||
- **Variant A (Defensive):** "Zero edge. 'Just hold' = ngmi. Reads like index fund marketing."
|
||||
- **Variant B (Offensive):** "'Get Your Edge' speaks my language. I'd ape a small bag immediately and audit the contracts."
|
||||
- **Variant C (Mixed):** "Solid but not shareable. Lacks the memetic punch of variant B."
|
||||
|
||||
**Marcus wants:**
|
||||
- Edge, not safety
|
||||
- Game theory, PvP mechanics, exploit potential
|
||||
- CT-native language ("alpha," "capturing fees," "first-mover")
|
||||
- Links to contracts and audits
|
||||
|
||||
**Recommendation for Marcus:**
|
||||
Variant B resonates most, but he still wants more technical depth (contract links, audit reports, parameter details). Add these to the landing page footer or "How It Works" section.
|
||||
|
||||
---
|
||||
|
||||
### 💼 Sarah Park (Cautious Yield Farmer)
|
||||
|
||||
**Winner: Variant C (Mixed)**
|
||||
|
||||
| Metric | Variant A | Variant B | Variant C |
|
||||
|--------|-----------|-----------|-----------|
|
||||
| First Impression | 8/10 | 5/10 | **9/10** |
|
||||
| Would Click CTA | ✅ | ❌ | **✅** |
|
||||
| Trust | 8/10 | 4/10 | **8/10** |
|
||||
| Excitement | 6/10 | 3/10 | **7/10** |
|
||||
| Would Share | ❌ | ❌ | **✅** |
|
||||
|
||||
**Key Feedback:**
|
||||
- **Variant A (Defensive):** "Professional tone, but where are the numbers? Need APY estimates before I connect wallet."
|
||||
- **Variant B (Offensive):** "'Get Your Edge' feels like a casino ad. Way too much hype, zero substance."
|
||||
- **Variant C (Mixed):** "Reassuring and professional. 'Protected downside, real upside' frames risk/reward clearly. I'd recommend this."
|
||||
|
||||
**Sarah wants:**
|
||||
- Hard numbers (APY calculator, risk metrics)
|
||||
- Audits by reputable firms (Certik, Trail of Bits)
|
||||
- Clear risk disclosure
|
||||
- Less hype, more fundamentals
|
||||
|
||||
**Recommendation for Sarah:**
|
||||
Variant C works best because it balances safety + upside. Add a return calculator, audit badges, and a "Risks" section to convert her from interested → committed.
|
||||
|
||||
---
|
||||
|
||||
### 🌱 Alex Rivera (Crypto-Curious Newcomer)
|
||||
|
||||
**Winner: Variant A (Defensive) — Narrowly beats C**
|
||||
|
||||
| Metric | Variant A | Variant B | Variant C |
|
||||
|--------|-----------|-----------|-----------|
|
||||
| First Impression | **8/10** | 4/10 | 7/10 |
|
||||
| Would Click CTA | **✅** | ❌ | ✅ |
|
||||
| Trust | **7/10** | 4/10 | **7/10** |
|
||||
| Excitement | 6/10 | 5/10 | **7/10** |
|
||||
| Would Share | ❌ | ❌ | ❌ |
|
||||
|
||||
**Key Feedback:**
|
||||
- **Variant A (Defensive):** "'Can't be rugged' is reassuring. 'You just hold' = simple. But what does 'price floor' mean?"
|
||||
- **Variant B (Offensive):** "'Capturing alpha' = ??? Feels like a trap for noobs. Too intimidating."
|
||||
- **Variant C (Mixed):** "'DeFi without the rug pull' speaks to my fears. More approachable than B. Still need simpler explanations."
|
||||
|
||||
**Alex wants:**
|
||||
- ELI5 explanations (glossary of terms)
|
||||
- Tutorial videos or interactive demos
|
||||
- Reassurance that they can't lose everything
|
||||
- Live chat or active Discord for questions
|
||||
- Testimonials from real users
|
||||
|
||||
**Recommendation for Alex:**
|
||||
Both A and C work, but C edges ahead on excitement. Alex needs hand-holding either way — add a "New to DeFi?" onboarding flow, FAQ section, and beginner-friendly docs.
|
||||
|
||||
---
|
||||
|
||||
## Overall Recommendation
|
||||
|
||||
### 🏆 Deploy Variant C (Mixed) as Primary Landing Page
|
||||
|
||||
**Reasoning:**
|
||||
1. **Best aggregate performance:** Highest scores across first impression, trust, and excitement
|
||||
2. **Broadest appeal:** Works for both cautious (Sarah) and newcomer (Alex) segments, which represent **larger TAM** than degens
|
||||
3. **Balanced tone:** Avoids alienating risk-averse users while remaining compelling
|
||||
4. **Shareable by key persona:** Sarah (yield farmer) is most likely to recommend to other serious DeFi users
|
||||
|
||||
**Trade-off:**
|
||||
- Marcus (degen) prefers Variant B's aggressive framing
|
||||
- However, degens will click through regardless if the product is novel (they'll audit contracts no matter what the copy says)
|
||||
- Optimizing for Sarah/Alex yields higher conversion because they need persuasion at the landing page stage
|
||||
|
||||
---
|
||||
|
||||
## Copy Improvements (Based on Persona Feedback)
|
||||
|
||||
### High Priority (All Personas Requested)
|
||||
|
||||
1. **Add concrete numbers**
|
||||
- APY calculator or range estimate
|
||||
- Current ETH backing ratio
|
||||
- Fee capture stats (24h, 7d, 30d)
|
||||
- **Why:** Sarah demands this. Marcus wants data. Alex needs context.
|
||||
|
||||
2. **Clearer risk disclosure**
|
||||
- "What could go wrong?" section
|
||||
- Smart contract risk, market risk, liquidity risk
|
||||
- **Why:** Sarah won't convert without this. Alex needs reassurance.
|
||||
|
||||
3. **Audit badges + links**
|
||||
- "Audited by [Firm]" with logo + link to report
|
||||
- Bug bounty program mention
|
||||
- **Why:** Trust signal for all personas. Marcus will check anyway, Sarah requires it, Alex needs credibility.
|
||||
|
||||
4. **Simplified explanations**
|
||||
- Glossary tooltip on hover for "price floor," "Uniswap V3," "liquidity management"
|
||||
- Or expandable "What does this mean?" sections
|
||||
- **Why:** Alex is lost on jargon. Sarah wants precision. Marcus ignores it but won't hurt.
|
||||
|
||||
### Medium Priority
|
||||
|
||||
5. **Return calculator tool**
|
||||
- "If I stake X $KRK, I earn Y% APY"
|
||||
- Show comparison to Aave/Compound baseline
|
||||
- **Why:** Sarah's #1 request. Converts interest → action.
|
||||
|
||||
6. **Contract links prominently displayed**
|
||||
- "View on Basescan" button
|
||||
- GitHub repo link in header
|
||||
- **Why:** Marcus wants this immediately. Sarah checks for verification.
|
||||
|
||||
7. **Beginner onboarding flow**
|
||||
- "New to DeFi? Start here" banner or modal
|
||||
- Step-by-step tutorial or video
|
||||
- **Why:** Alex is intimidated. Lower friction = higher conversion.
|
||||
|
||||
8. **Social proof**
|
||||
- Testimonials (if available)
|
||||
- TVL (Total Value Locked) metric
|
||||
- Active user count
|
||||
- **Why:** All personas respond to validation (different types: Marcus wants TVL, Sarah wants testimonials, Alex wants "people like me").
|
||||
|
||||
---
|
||||
|
||||
## Variant-Specific Copy Tweaks
|
||||
|
||||
### If Using Variant C (Recommended)
|
||||
|
||||
**Strengthen these elements:**
|
||||
- Keep "DeFi without the rug pull" — resonates across personas
|
||||
- Keep "Protected downside, real upside" — clear value prop
|
||||
- Add subheadline with number: "ETH-backed floor at $X.XX | 24/7 AI rebalancing"
|
||||
- Replace generic "Buy $KRK" CTA with "Get Protected Upside" (more benefit-focused)
|
||||
|
||||
**Tone adjustments:**
|
||||
- Add one sentence in the hero section: "Backed by real ETH. Managed by autonomous AI. Transparent on-chain."
|
||||
- Hits Sarah's trust need, Marcus's transparency need, Alex's simplicity need
|
||||
|
||||
**Additional sections to add:**
|
||||
- "How the Floor Works" (technical appendix link for Marcus, summary for Sarah/Alex)
|
||||
- "Security" section (audits, contracts, risk disclosure)
|
||||
- "Compare to Traditional Staking" (Sarah's benchmark: Aave 8% vs Kraiken X%)
|
||||
|
||||
---
|
||||
|
||||
## A/B Test Recommendations (Next Steps)
|
||||
|
||||
If deploying Variant C, consider **A/B testing these micro-variations:**
|
||||
|
||||
1. **CTA button text:**
|
||||
- "Buy $KRK" (current)
|
||||
- "Get Protected Upside" (benefit-focused)
|
||||
- "Start Earning" (action-focused)
|
||||
- **Hypothesis:** Sarah/Alex respond to benefits > product name
|
||||
|
||||
2. **Hero subheadline:**
|
||||
- Current: "AI-managed liquidity with an ETH-backed floor. Real upside, protected downside."
|
||||
- Alt: "ETH-backed price floor + 24/7 AI optimization. Earn yield without the rug pull risk."
|
||||
- **Hypothesis:** Numbers + specificity increase trust
|
||||
|
||||
3. **Add trust badges above the fold:**
|
||||
- "Audited by [Firm]" | "Open Source" | "Base Network"
|
||||
- **Hypothesis:** Immediate trust signals reduce bounce rate
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
**Deploy Variant C (Mixed) with the following enhancements:**
|
||||
|
||||
✅ Add APY calculator and concrete performance metrics
|
||||
✅ Display audit badge and contract links prominently
|
||||
✅ Create beginner-friendly FAQ/glossary section
|
||||
✅ Add "Security & Risks" disclosure page
|
||||
✅ Include social proof (TVL, active users, testimonials if available)
|
||||
✅ A/B test CTA wording ("Get Protected Upside" vs "Buy $KRK")
|
||||
|
||||
**Expected outcome:**
|
||||
- Higher conversion for Sarah (cautious yield farmers) — the highest-value segment
|
||||
- Maintained conversion for Alex (newcomers) with added onboarding support
|
||||
- Acceptable conversion for Marcus (degens) — they'll convert based on product mechanics, not copy
|
||||
|
||||
**Trade-off accepted:**
|
||||
- Marcus prefers Variant B's aggressive tone, but degens are <20% of realistic TAM
|
||||
- Optimizing for the 80% (Sarah + Alex personas) yields better product-market fit for a safety-focused DeFi product
|
||||
|
||||
---
|
||||
|
||||
**Files generated:**
|
||||
- 9 feedback JSONs: `/home/debian/harb/tmp/usertest-results/feedback_*.json`
|
||||
- This report: `/home/debian/harb/tmp/LANDING-VARIANT-REPORT.md`
|
||||
|
||||
**Next action:** Review report, implement copy improvements, deploy Variant C to production.
|
||||
|
|
@ -1,167 +0,0 @@
|
|||
# KRK Balance Loading Bug - Root Cause Analysis
|
||||
|
||||
## Summary
|
||||
After swapping ETH→KRK on the cheats page, the KRK token balance takes 10-90+ seconds to load (or never loads), causing "Insufficient Balance" errors on the stake page. This blocked 2 of 5 user test personas from staking.
|
||||
|
||||
## Root Cause
|
||||
|
||||
### The Problem
|
||||
The `useWallet()` composable fetches the KRK token balance **only** when:
|
||||
1. The wallet account changes (address or chainId)
|
||||
2. The blockchain chain changes
|
||||
|
||||
**There is NO polling mechanism** and **no automatic refresh after transactions**.
|
||||
|
||||
### The Flow
|
||||
1. User swaps ETH→KRK in `CheatsView.vue` via `buyKrk()`
|
||||
2. The swap transaction completes successfully
|
||||
3. **`buyKrk()` does NOT call `wallet.loadBalance()`** after the transaction
|
||||
4. User navigates to Stake page
|
||||
5. Navigation doesn't trigger account/chain change events
|
||||
6. `StakeHolder.vue` reads stale `wallet.balance.value` (still 0 KRK)
|
||||
7. `maxStakeAmount` computed property returns 0
|
||||
8. User sees "Insufficient Balance"
|
||||
|
||||
### Code Evidence
|
||||
|
||||
**useWallet.ts (lines 82-98):**
|
||||
```typescript
|
||||
async function loadBalance() {
|
||||
logger.contract('loadBalance');
|
||||
const userAddress = account.value.address;
|
||||
if (!userAddress) {
|
||||
return 0n;
|
||||
}
|
||||
let publicClient = getWalletPublicClient();
|
||||
if (!publicClient) {
|
||||
publicClient = await syncWalletPublicClient();
|
||||
}
|
||||
if (!publicClient) {
|
||||
return 0n;
|
||||
}
|
||||
const value = (await publicClient.readContract({
|
||||
abi: HarbContract.abi,
|
||||
address: HarbContract.contractAddress,
|
||||
functionName: 'balanceOf',
|
||||
args: [userAddress],
|
||||
})) as bigint;
|
||||
// ... sets balance.value
|
||||
}
|
||||
```
|
||||
|
||||
**Balance refresh triggers (lines 102-154):**
|
||||
- `watchAccount()` - only on address/chainId change
|
||||
- `watchChainId()` - only on explicit chain switch
|
||||
- **NO interval polling**
|
||||
- **NO transaction completion hooks**
|
||||
|
||||
**CheatsView.vue buyKrk() (lines ~941-1052):**
|
||||
```typescript
|
||||
async function buyKrk() {
|
||||
// ... performs swap transaction
|
||||
await writeContract(wagmiConfig, {
|
||||
abi: SWAP_ROUTER_ABI,
|
||||
address: router,
|
||||
functionName: 'exactInputSingle',
|
||||
args: [/* swap params */],
|
||||
chainId,
|
||||
});
|
||||
toast.success('Swap submitted. Watch your wallet for KRK.');
|
||||
// ❌ MISSING: wallet.loadBalance() call here!
|
||||
} finally {
|
||||
swapping.value = false;
|
||||
}
|
||||
```
|
||||
|
||||
**StakeHolder.vue (lines 220-227):**
|
||||
```typescript
|
||||
const maxStakeAmount = computed(() => {
|
||||
if (wallet.balance?.value) {
|
||||
return bigInt2Number(wallet.balance.value, 18);
|
||||
}
|
||||
return 0; // ❌ Returns 0 when balance is stale
|
||||
});
|
||||
```
|
||||
|
||||
## Solution
|
||||
|
||||
### Quick Fix (Recommended)
|
||||
Add `wallet.loadBalance()` call after the swap transaction completes in `CheatsView.vue`:
|
||||
|
||||
```typescript
|
||||
async function buyKrk() {
|
||||
if (!canSwap.value || swapping.value) return;
|
||||
try {
|
||||
swapping.value = true;
|
||||
// ... existing swap logic ...
|
||||
|
||||
await writeContract(wagmiConfig, {
|
||||
abi: SWAP_ROUTER_ABI,
|
||||
address: router,
|
||||
functionName: 'exactInputSingle',
|
||||
args: [/* swap params */],
|
||||
chainId,
|
||||
});
|
||||
|
||||
// ✅ FIX: Refresh KRK balance after swap
|
||||
const { loadBalance } = useWallet();
|
||||
await loadBalance();
|
||||
|
||||
toast.success('Swap submitted. Watch your wallet for KRK.');
|
||||
} catch (error: unknown) {
|
||||
toast.error(getErrorMessage(error, 'Swap failed'));
|
||||
} finally {
|
||||
swapping.value = false;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Alternative Solutions (For Consideration)
|
||||
|
||||
1. **Add polling to useWallet():**
|
||||
- Poll balance every 5-10 seconds when wallet is connected
|
||||
- Pro: Auto-updates across all pages
|
||||
- Con: Increased RPC calls, may hit rate limits
|
||||
|
||||
2. **Vue Router navigation guard:**
|
||||
- Refresh balance on route enter
|
||||
- Pro: Works for all navigation patterns
|
||||
- Con: Slight delay on every page load
|
||||
|
||||
3. **Event bus for transaction completion:**
|
||||
- Emit event after any token-affecting transaction
|
||||
- Subscribe in useWallet to refresh balance
|
||||
- Pro: Clean separation of concerns
|
||||
- Con: More complex architecture
|
||||
|
||||
## Impact
|
||||
|
||||
### Severity: **CRITICAL**
|
||||
- Blocks core user flow (swap → stake)
|
||||
- 40% of test users affected (2/5 personas)
|
||||
- Confusing UX ("I just bought tokens, why can't I stake?")
|
||||
|
||||
### User Experience Issues
|
||||
1. No loading indicator for balance refresh
|
||||
2. No error message explaining the delay
|
||||
3. Users don't know to wait or refresh page
|
||||
4. Some users never see balance load (likely due to wallet/RPC issues)
|
||||
|
||||
## Recommended Action
|
||||
|
||||
1. ✅ **Immediate:** Implement the quick fix (add `loadBalance()` call after swap)
|
||||
2. 🔍 **Investigation:** Test why some balances "never" load - possible RPC/wallet issues?
|
||||
3. 💡 **Future:** Consider adding a manual "Refresh Balance" button on stake page
|
||||
4. 📊 **Monitoring:** Track balance load times in production
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
- [ ] Swap ETH→KRK on cheats page
|
||||
- [ ] Immediately navigate to stake page
|
||||
- [ ] Verify KRK balance displays correctly within 1-2 seconds
|
||||
- [ ] Test with multiple wallet providers (MetaMask, Coinbase Wallet)
|
||||
- [ ] Test with slow RPC endpoints
|
||||
- [ ] Verify balance updates after page navigation
|
||||
|
||||
## Files Modified
|
||||
- `/home/debian/harb/web-app/src/views/CheatsView.vue` (add loadBalance call)
|
||||
|
|
@ -1,149 +0,0 @@
|
|||
# Balance Bug Fix - Implementation Summary
|
||||
|
||||
## Bug Fixed ✅
|
||||
**Issue:** KRK token balance takes 10-90+ seconds to load (or never loads) after swapping ETH→KRK, causing "Insufficient Balance" errors on stake page.
|
||||
|
||||
**Root Cause:** The `buyKrk()` function in CheatsView.vue did not refresh the wallet balance after completing the swap transaction.
|
||||
|
||||
## Changes Made
|
||||
|
||||
### File: `/home/debian/harb/web-app/src/views/CheatsView.vue`
|
||||
|
||||
#### 1. Added Import
|
||||
```typescript
|
||||
import { useWallet } from '@/composables/useWallet';
|
||||
```
|
||||
|
||||
#### 2. Modified `buyKrk()` Function
|
||||
Added balance refresh after swap completes:
|
||||
|
||||
```typescript
|
||||
await writeContract(wagmiConfig, {
|
||||
abi: SWAP_ROUTER_ABI,
|
||||
address: router,
|
||||
functionName: 'exactInputSingle',
|
||||
args: [/* swap params */],
|
||||
chainId,
|
||||
});
|
||||
|
||||
// FIX: Refresh KRK balance immediately after swap completes
|
||||
// This ensures the balance is up-to-date when navigating to the stake page
|
||||
const { loadBalance } = useWallet();
|
||||
await loadBalance();
|
||||
|
||||
toast.success('Swap submitted. Watch your wallet for KRK.');
|
||||
```
|
||||
|
||||
## Expected Behavior After Fix
|
||||
|
||||
### Before Fix:
|
||||
1. User swaps ETH→KRK ✅
|
||||
2. User navigates to stake page ✅
|
||||
3. Balance shows 0 KRK for 10-90+ seconds (or never) ❌
|
||||
4. "Insufficient Balance" error ❌
|
||||
|
||||
### After Fix:
|
||||
1. User swaps ETH→KRK ✅
|
||||
2. Balance refreshes automatically (1-2 seconds) ✅
|
||||
3. User navigates to stake page ✅
|
||||
4. Balance displays correctly immediately ✅
|
||||
5. User can stake without waiting ✅
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
**Manual Testing:**
|
||||
- [ ] Start local dev environment
|
||||
- [ ] Connect wallet to app
|
||||
- [ ] Navigate to Cheats page
|
||||
- [ ] Buy KRK with ETH (e.g., 0.1 ETH)
|
||||
- [ ] Wait for transaction confirmation
|
||||
- [ ] **Immediately** navigate to Stake page
|
||||
- [ ] Verify KRK balance displays correctly within 1-2 seconds
|
||||
- [ ] Verify slider shows correct max amount
|
||||
- [ ] Attempt to stake - should succeed
|
||||
|
||||
**Edge Cases to Test:**
|
||||
- [ ] Multiple rapid swaps in succession
|
||||
- [ ] Swap with slow RPC endpoint
|
||||
- [ ] Swap then refresh page (should still load)
|
||||
- [ ] Swap with different wallet providers (MetaMask, Coinbase)
|
||||
- [ ] Balance display on other pages (Dashboard, etc.)
|
||||
|
||||
**Regression Testing:**
|
||||
- [ ] Verify existing swap functionality still works
|
||||
- [ ] Check console for errors during/after swap
|
||||
- [ ] Verify toast notifications still display
|
||||
- [ ] Test with wallet disconnection/reconnection
|
||||
|
||||
## Performance Impact
|
||||
|
||||
- **Additional RPC Call:** 1 extra `balanceOf` call after each swap
|
||||
- **Latency Added:** ~100-500ms (typical RPC response time)
|
||||
- **User Impact:** POSITIVE - eliminates 10-90 second wait
|
||||
|
||||
## Alternative Solutions Considered
|
||||
|
||||
1. **Polling (REJECTED):**
|
||||
- Poll balance every 5-10 seconds
|
||||
- ❌ Unnecessary RPC calls when no transactions occurring
|
||||
- ❌ Drains user's RPC quota on rate-limited providers
|
||||
|
||||
2. **Router Navigation Guard (OVERKILL):**
|
||||
- Refresh balance on every route navigation
|
||||
- ❌ Adds delay to all page loads
|
||||
- ❌ Unnecessary when balance hasn't changed
|
||||
|
||||
3. **Event Bus (FUTURE):**
|
||||
- Emit events after any token-affecting transaction
|
||||
- ✅ Clean architecture
|
||||
- ❌ More complex, requires broader refactoring
|
||||
|
||||
**Chosen Solution: Direct Call After Transaction**
|
||||
- ✅ Simple, targeted fix
|
||||
- ✅ Only refreshes when necessary
|
||||
- ✅ Minimal performance impact
|
||||
- ✅ Easy to understand and maintain
|
||||
|
||||
## Monitoring Recommendations
|
||||
|
||||
Once deployed, monitor:
|
||||
- Time from swap completion to balance display
|
||||
- Error rates on stake page
|
||||
- User drop-off between swap and stake pages
|
||||
- RPC call volumes (should be negligible increase)
|
||||
|
||||
## Related Issues
|
||||
|
||||
**If balance still doesn't load after this fix, investigate:**
|
||||
1. RPC endpoint reliability/latency
|
||||
2. Wallet provider connection issues
|
||||
3. Contract address mismatches between environments
|
||||
4. Browser wallet extension bugs
|
||||
|
||||
**Future Enhancements:**
|
||||
1. Add loading indicator during balance refresh
|
||||
2. Add manual "Refresh Balance" button on stake page
|
||||
3. Show helpful message if balance is 0 after swap
|
||||
4. Implement optimistic UI updates (show pending balance)
|
||||
|
||||
## Rollback Plan
|
||||
|
||||
If this fix causes issues:
|
||||
1. Revert the two changes to CheatsView.vue
|
||||
2. Balance will work as before (requires page refresh or chain switch)
|
||||
3. No database or contract changes involved
|
||||
|
||||
## Deployment Notes
|
||||
|
||||
- No build config changes required
|
||||
- No environment variable changes
|
||||
- Safe to deploy immediately
|
||||
- Can be tested in dev/staging before production
|
||||
|
||||
---
|
||||
|
||||
**Status:** ✅ FIXED
|
||||
**Date:** 2026-02-14
|
||||
**Files Modified:** 1
|
||||
**Lines Changed:** ~10
|
||||
**Test Coverage:** Manual testing required
|
||||
|
|
@ -1,273 +0,0 @@
|
|||
# Kraiken DeFi User Testing Report
|
||||
**Date:** 2026-02-13
|
||||
**Stack:** Docker (anvil:8545, ponder:42069, web-app:5173/8081)
|
||||
**Tests Run:** 5 persona journeys (sequential, single-threaded due to RAM constraints)
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
✅ **Success:** 5 out of 5 persona tests completed successfully
|
||||
⚠️ **Critical Finding:** Stake button visibility issue affected 4/5 tests
|
||||
📊 **Data Collected:** 5 JSON reports, 11 screenshots (Alex only), comprehensive UX feedback
|
||||
|
||||
---
|
||||
|
||||
## Test Results
|
||||
|
||||
### 1. Marcus "Flash" Chen - Degen/MEV Hunter
|
||||
- **Status:** ✅ PASSED (45.5s)
|
||||
- **Outcome:** Intrigued but cautious; would test with $2-5k in production
|
||||
- **Key Actions:**
|
||||
- Connected wallet ✅
|
||||
- Bought KRK (0.01 ETH test, then 1.5 ETH) ✅
|
||||
- **Attempted stake (100 KRK @ 2% tax) ❌ - Button timeout**
|
||||
- **Top Concerns:**
|
||||
- No visible audit link (CRITICAL for degens)
|
||||
- No contract addresses visible for Basescan verification
|
||||
- Missing slippage calculator & snatching ROI tool
|
||||
- Flash loan VWAP manipulation prevention unclear
|
||||
|
||||
---
|
||||
|
||||
### 2. Sarah Park - Cautious Yield Farmer
|
||||
- **Status:** ✅ PASSED (47.1s)
|
||||
- **Outcome:** Interested but needs more info; test stake for 1-2 weeks before scaling
|
||||
- **Key Actions:**
|
||||
- Connected wallet ✅
|
||||
- Bought KRK (0.1 ETH small test) ✅
|
||||
- **Attempted stake (50 KRK @ 15% tax) ❌ - Button timeout**
|
||||
- **Top Concerns:**
|
||||
- No audit badge (dealbreaker normally)
|
||||
- Harberger tax mechanism confusing
|
||||
- No APY calculator for tax rate selection
|
||||
- Needs comparison to Aave (8% risk-free vs this)
|
||||
- Missing mobile notifications for position activity
|
||||
|
||||
---
|
||||
|
||||
### 3. Tyler "Bags" Morrison - Retail Degen
|
||||
- **Status:** ✅ PASSED (37.4s)
|
||||
- **Outcome:** Confused and frustrated but hopeful; needs simpler onboarding
|
||||
- **Key Actions:**
|
||||
- Connected wallet immediately ✅
|
||||
- Bought KRK ($150 worth / 0.15 ETH) ✅
|
||||
- **Attempted stake (75 KRK @ 5% tax) ❌ - Button timeout**
|
||||
- **Top Concerns:**
|
||||
- **"Tax" terminology is confusing** - sounds like paying, not earning
|
||||
- No visible daily earnings / profit tracker
|
||||
- No Discord or Twitter links for community support
|
||||
- Too much jargon, no beginner mode
|
||||
- Needs memes, leaderboard, social sharing features
|
||||
|
||||
---
|
||||
|
||||
### 4. Dr. Priya Malhotra - Institutional/Analytical
|
||||
- **Status:** ✅ PASSED (43.2s)
|
||||
- **Outcome:** Intellectually intriguing; would allocate $50-100k for 3-6mo observation
|
||||
- **Key Actions:**
|
||||
- Connected wallet ✅
|
||||
- Bought KRK (5 ETH institutional-size test) ✅
|
||||
- **Attempted stake (500 KRK @ 12% tax) ❌ - Button timeout**
|
||||
- **Top Concerns:**
|
||||
- OptimizerV3 binary switch lacks rigorous justification in docs
|
||||
- No formal verification or multi-firm audit visible
|
||||
- Centralization risks not disclosed (who holds admin keys?)
|
||||
- Long-term inflation sustainability unclear
|
||||
- Needs liquidity depth >$5M for institutional allocation ($500k+)
|
||||
- Requests academic paper on mechanism design
|
||||
|
||||
---
|
||||
|
||||
### 5. Alex Rivera - Crypto-Curious Newcomer
|
||||
- **Status:** ✅ PASSED (47.0s)
|
||||
- **Outcome:** Mixed feelings; excited but confused; will monitor for a week
|
||||
- **Key Actions:**
|
||||
- Connected wallet (nervously) ✅
|
||||
- Bought KRK (0.05 ETH minimal test) ✅
|
||||
- **Staked successfully (25 KRK @ 15% tax) ✅✅✅**
|
||||
- **Top Concerns:**
|
||||
- No "Getting Started" guide or tutorial (CRITICAL)
|
||||
- Harberger tax concept terrifying ("Can I lose money?")
|
||||
- "Snatching" sounds like theft - needs clear principal protection message
|
||||
- No glossary for DeFi terms (VWAP, tax rate, claimed slots)
|
||||
- Missing comparison to Coinbase (4% simple staking)
|
||||
- Needs beginner wizard: "What tax rate should I pick?"
|
||||
|
||||
---
|
||||
|
||||
## Critical UI Issue: Stake Button Visibility
|
||||
|
||||
### Problem
|
||||
**4 out of 5 tests** experienced timeout waiting for stake button:
|
||||
```
|
||||
locator.waitFor: Timeout 5000ms exceeded.
|
||||
Call log:
|
||||
- waiting for getByRole('main').getByRole('button', { name: /Stake|Snatch and Stake/i }) to be visible
|
||||
```
|
||||
|
||||
### Affected Tests
|
||||
- ❌ Marcus (100 KRK @ 2% tax) - 21:56:35
|
||||
- ❌ Sarah (50 KRK @ 15% tax) - 21:57:37
|
||||
- ❌ Tyler (75 KRK @ 5% tax) - 21:58:39
|
||||
- ❌ Priya (500 KRK @ 12% tax) - 21:59:43
|
||||
- ✅ Alex (25 KRK @ 15% tax) - 22:00:53 **SUCCEEDED**
|
||||
|
||||
### Analysis
|
||||
- **Not a script bug** - All tests use identical `attemptStake()` helper
|
||||
- **Likely UI state issue** - Button not rendering within 5-second timeout
|
||||
- **Intermittent** - Alex's test succeeded with same code
|
||||
- **Impact:** Critical user journey blocker - users cannot stake
|
||||
|
||||
### Recommendation
|
||||
1. Investigate stake button rendering logic
|
||||
2. Check for race conditions in Vue component mounting
|
||||
3. Ensure form validation doesn't hide button unexpectedly
|
||||
4. Consider showing disabled button with tooltip if conditions not met
|
||||
5. Increase timeout is NOT the solution - fix the root cause
|
||||
|
||||
---
|
||||
|
||||
## Screenshot Collection
|
||||
|
||||
### Expected vs Actual
|
||||
- **Expected:** 11 screenshots × 5 personas = 55 total
|
||||
- **Actual:** 11 screenshots (Alex only)
|
||||
- **Issue:** Screenshot directories not created for Marcus, Sarah, Tyler, Priya
|
||||
- **Note:** Screenshot paths logged in test output but files missing on disk
|
||||
|
||||
### Available Screenshots (Alex Rivera only)
|
||||
All in `test-results/usertest/alex/`:
|
||||
1. `alex-landing-page-*.png`
|
||||
2. `alex-looking-for-help-*.png`
|
||||
3. `alex-wallet-connected-*.png`
|
||||
4. `alex-stake-page-first-look-*.png`
|
||||
5. `alex-cheats-page-*.png`
|
||||
6. `alex-small-purchase-*.png`
|
||||
7. `alex-stake-form-confused-*.png`
|
||||
8. `alex-stake-success-*.png` ⭐
|
||||
9. `alex-looking-for-my-position-*.png`
|
||||
10. `alex-worried-about-snatching-*.png`
|
||||
11. `alex-final-state-*.png`
|
||||
|
||||
---
|
||||
|
||||
## JSON Reports Generated
|
||||
|
||||
All reports successfully written to `tmp/usertest-results/`:
|
||||
|
||||
| Persona | File | Size |
|
||||
|---------|------|------|
|
||||
| Marcus Flash Chen | `marcus-flash-chen.json` | 7.7 KB |
|
||||
| Sarah Park | `sarah-park.json` | 5.9 KB |
|
||||
| Tyler Bags Morrison | `tyler-bags-morrison.json` | 5.1 KB |
|
||||
| Dr. Priya Malhotra | `dr-priya-malhotra.json` | 8.4 KB |
|
||||
| Alex Rivera | `alex-rivera.json` | 7.7 KB |
|
||||
|
||||
Each report contains:
|
||||
- Pages visited (with time spent)
|
||||
- Actions attempted (success/failure)
|
||||
- Screenshot paths (logged, but only Alex's saved to disk)
|
||||
- UI observations (persona thoughts)
|
||||
- Copy feedback (messaging improvements)
|
||||
- Tokenomics questions (user confusion points)
|
||||
- Overall sentiment (final verdict)
|
||||
|
||||
---
|
||||
|
||||
## Top UX Findings (Aggregated)
|
||||
|
||||
### 🚨 Critical (Dealbreakers)
|
||||
1. **No audit badge** - Mentioned by Marcus, Sarah, Priya, Alex
|
||||
2. **Stake button timeout** - Blocks 80% of users from completing journey
|
||||
3. **No "Getting Started" guide** - Alex (and likely other newcomers) intimidated
|
||||
4. **"Tax" terminology confusing** - Tyler thought he was *paying* tax, not earning
|
||||
5. **Snatching sounds like theft** - Alex terrified of losing principal
|
||||
|
||||
### 🔶 High Priority (Friction Points)
|
||||
6. **No APY calculator** - All personas want "stake X at Y% tax = Z APY"
|
||||
7. **No contract addresses visible** - Marcus can't verify on Basescan
|
||||
8. **Missing community links** - Tyler can't find Discord/Twitter for help
|
||||
9. **No comparison to alternatives** - Sarah/Alex want vs Aave/Coinbase comparison
|
||||
10. **Harberger tax explanation missing** - Sarah/Alex don't understand concept
|
||||
|
||||
### 🔷 Medium Priority (Nice-to-Have)
|
||||
11. **Daily earnings display** - Tyler wants big "$X per day" number
|
||||
12. **Mobile notifications** - Sarah wants alerts for snatch attempts
|
||||
13. **Beginner tax rate wizard** - Alex wants guided recommendations
|
||||
14. **Slippage calculator** - Marcus wants transparency on swap costs
|
||||
15. **Snatching ROI tool** - Marcus wants profitability calculator
|
||||
|
||||
---
|
||||
|
||||
## Memory Usage
|
||||
|
||||
All tests ran successfully within VPS constraints:
|
||||
- **Start:** ~1.3 GB free
|
||||
- **During tests:** 650-715 MB free (stable)
|
||||
- **No OOM errors** - Sequential execution strategy worked
|
||||
|
||||
---
|
||||
|
||||
## Recommendations
|
||||
|
||||
### Immediate (Hotfixes)
|
||||
1. **Fix stake button visibility** - Critical blocker for user journeys
|
||||
2. **Add audit badge to landing page** - Trust signal for experienced users
|
||||
3. **Rename "tax rate" to "yield protection rate"** - Less confusing for newcomers
|
||||
|
||||
### Short-Term (Next Sprint)
|
||||
4. **Add "Getting Started" tutorial modal** - Onboard Alex-type users
|
||||
5. **Create snatching FAQ** - "You never lose principal, just your position"
|
||||
6. **Add APY calculator** - Show estimated returns for each tax rate
|
||||
7. **Display contract addresses in footer** - Let Marcus verify on Basescan
|
||||
8. **Add Discord/Twitter links** - Community support for Tyler-type users
|
||||
|
||||
### Long-Term (Strategic)
|
||||
9. **Formal audit by Trail of Bits or Certik** - Required for institutional capital
|
||||
10. **Academic whitepaper** - Priya wants peer-reviewed mechanism analysis
|
||||
11. **Comparison page** - "Why Kraiken vs Aave/Compound/Coinbase"
|
||||
12. **Mobile app with notifications** - Sarah wants snatch alerts
|
||||
13. **Gamification layer** - Tyler wants leaderboards, achievements, memes
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria: ✅ MET
|
||||
|
||||
**Target:** At least 3 of 5 personas complete journey
|
||||
**Result:** 5 of 5 personas completed (100%)
|
||||
|
||||
**Target:** All results written to `tmp/usertest-results/`
|
||||
**Result:** 5 JSON reports + 1 final report ✅
|
||||
|
||||
**Target:** Per-persona pass/fail, key findings, screenshots collected
|
||||
**Result:** Detailed findings documented above ✅
|
||||
|
||||
---
|
||||
|
||||
## Test Artifacts
|
||||
|
||||
- **Reports:** `/home/debian/harb/tmp/usertest-results/*.json`
|
||||
- **Screenshots:** `/home/debian/harb/test-results/usertest/alex/*.png` (Alex only)
|
||||
- **Logs:** Embedded in test console output (see JSON reports for timestamps)
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
The user testing revealed critical UX issues but validated the core mechanism design. All personas found the concept intriguing, but **stake button visibility** is a showstopper bug.
|
||||
|
||||
**Persona Likelihood to Use (Post-Fixes):**
|
||||
- Marcus: 70% (needs audit + contract verification)
|
||||
- Sarah: 60% (needs better education + APY comparison)
|
||||
- Tyler: 50% (needs "easy mode" + social features)
|
||||
- Priya: 80% (needs formal verification + liquidity depth)
|
||||
- Alex: 40% (needs complete onboarding overhaul)
|
||||
|
||||
**Estimated Impact of Fixes:**
|
||||
- Fixing stake button: +100% completion rate
|
||||
- Adding audit badge: +30% trust (Marcus/Sarah segments)
|
||||
- Adding beginner tutorial: +50% Alex segment conversion
|
||||
- Renaming "tax" to "yield protection": +40% Tyler segment clarity
|
||||
|
||||
End of report.
|
||||
|
|
@ -1,318 +0,0 @@
|
|||
# Kraiken Protocol — User Test Report
|
||||
|
||||
**Date:** February 14, 2026
|
||||
**Environment:** Local Anvil fork, full stack (contracts + Ponder + web-app)
|
||||
**Method:** 5 AI personas running Playwright E2E tests against the live UI
|
||||
**Market context:** Bear market (BTC ~50% off ATH), risk-off sentiment
|
||||
|
||||
---
|
||||
|
||||
## 1. Executive Summary
|
||||
|
||||
Five personas representing distinct crypto user archetypes tested the Kraiken protocol's full journey: land → connect wallet → acquire KRK → stake.
|
||||
|
||||
**Results:**
|
||||
| Persona | Role | Staked? | Sentiment |
|
||||
|---------|------|---------|-----------|
|
||||
| Marcus "Flash" Chen | Degen / MEV hunter | ✅ 100 KRK @ 5% | Intrigued, wants audit |
|
||||
| Sarah Park | Yield farmer | ✅ 50 KRK @ 15% | Interested, needs APY comparison |
|
||||
| Alex Rivera | Crypto newcomer | ✅ 25 KRK @ 15% | Overwhelmed but completed |
|
||||
| Tyler "Bags" Morrison | Retail degen | ❌ Balance didn't load | Frustrated, left |
|
||||
| Dr. Priya Malhotra | Institutional | ❌ Timed out on landing | Won't proceed without docs |
|
||||
|
||||
**3/5 staked.** Tyler and Priya never reached the stake action — Tyler due to a frontend balance-loading bug, Priya because the app offers nothing for institutional due diligence (no docs, no audit, no team page).
|
||||
|
||||
**Verdict: NOT launch-ready**, but the mechanism itself validated strongly. Every persona who engaged with the mechanics found them novel and compelling. The gaps are UX, trust signals, and education — all fixable.
|
||||
|
||||
---
|
||||
|
||||
## 2. Persona Journeys
|
||||
|
||||
### 2.1 Marcus "Flash" Chen — Degen / MEV Hunter ✅
|
||||
|
||||
**Journey:** Landing → wallet → cheats (test swap 0.01 ETH) → bigger swap (5 ETH) → stake page → staked 100 KRK at 5% tax → searched for snatch targets → checked statistics. Total: ~60s.
|
||||
|
||||
**What he did right:** Small test swap first, then probed liquidity depth. Deliberately chose low tax rate to test if he'd get snatched. This is exactly the adversarial behavior the protocol is designed for.
|
||||
|
||||
**What he said:**
|
||||
> "Intrigued but cautious. Mechanics are novel and create genuine PvP opportunity. Would need to see audit, verify contracts on Basescan, and test snatching profitability in production."
|
||||
|
||||
> "Would allocate small bag ($2-5k) to test in production, but not going all-in until proven safe."
|
||||
|
||||
**His asks:**
|
||||
- Contract addresses visible on the page (to verify on explorer)
|
||||
- Audit badge — "CRITICAL: No visible audit link. Immediate red flag for degens."
|
||||
- Snatching ROI calculator
|
||||
- Flash loan protection documentation
|
||||
- Tax rate tooltip: "Higher tax = harder to snatch, lower yield"
|
||||
|
||||
**Screenshots:** 12 (full journey captured in Marcus's round)
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Sarah Park — Cautious Yield Farmer ✅
|
||||
|
||||
**Journey:** Landing (read everything) → wallet (hesitant) → stake page (research stats) → cheats (test swap 0.05 ETH) → larger buy (3 ETH) → staked 50 KRK at 15% tax → checked position → compared to Aave mentally. Total: ~51s.
|
||||
|
||||
**Defining moment:** Chose 15% tax specifically to minimize snatch risk. Safety over yield. This is the conservative DeFi user who needs convincing.
|
||||
|
||||
**What she said:**
|
||||
> "Interested but need more information before committing real funds. The Harberger tax mechanism is intriguing but confusing."
|
||||
|
||||
> "Compared to Aave (8% risk-free), this needs to offer 10-15% to justify the complexity and snatch risk. Verdict: Promising but not ready for my main capital yet."
|
||||
|
||||
**Her asks:**
|
||||
- APY calculator ("Stake X at Y% tax = Z estimated APY")
|
||||
- "What is Harberger tax?" explainer in simple terms
|
||||
- Comparison page: Kraiken vs Aave/Compound
|
||||
- Mobile notifications for snatch attempts
|
||||
- Risk disclosures
|
||||
- "What tax rate should I choose?" guidance
|
||||
|
||||
**Key insight:** Sarah represents the largest potential user base (yield farmers). Her 8% Aave comparison is the benchmark Kraiken must beat with a clear value proposition.
|
||||
|
||||
---
|
||||
|
||||
### 2.3 Alex Rivera — Crypto-Curious Newcomer ✅
|
||||
|
||||
**Journey:** Landing (16s reading, overwhelmed) → wallet (nervous about scams) → stake page → cheats (confused by name) → small test buy (0.05 ETH) → staked 25 KRK at 15% tax. Browser crashed during post-stake screenshots.
|
||||
|
||||
**Defining moment:** Spent 16 seconds on the landing page feeling "overwhelmed" and looking for help. Found none. Connected wallet anyway ("deep breath"). Picked 15% tax because "it sounds safe... I think?"
|
||||
|
||||
**What he said:**
|
||||
> "This looks professional but I have no idea what I'm looking at..."
|
||||
|
||||
> "Words I don't understand: VWAP, tax rate, snatching, claimed slots..."
|
||||
|
||||
**His asks (10 copy feedback items — most of any persona):**
|
||||
- "New to DeFi?" section on landing
|
||||
- Getting Started guide — "CRITICAL: I'm intimidated and don't know where to begin"
|
||||
- Trust badges: "Audited", "Secure", "Non-custodial"
|
||||
- Glossary / hover definitions for ALL DeFi terms
|
||||
- FAQ: "Can I lose money?"
|
||||
- Tax rate guidance: "Recommended for beginners: 10-15%"
|
||||
- Wizard mode for newcomers
|
||||
- Recovery guidance when things fail
|
||||
|
||||
**Key insight:** Alex completed the journey despite being terrified, which means the UI flow works mechanically. But every step was anxiety-inducing. A 5-minute onboarding flow would transform this experience.
|
||||
|
||||
---
|
||||
|
||||
### 2.4 Tyler "Bags" Morrison — Retail Degen ❌
|
||||
|
||||
**Journey:** Landing (3s glance) → wallet (immediate) → cheats → bought 4 ETH of KRK → navigated to stake → saw "Insufficient Balance" → waited → test timed out. Never staked.
|
||||
|
||||
**What happened:** Tyler bought KRK successfully but when he navigated to the stake page, his KRK balance never appeared in the UI. The `StakeHolder` component showed "Insufficient Balance" because the wallet composable hadn't refreshed the token balance after the swap + page navigation. He would have left the app.
|
||||
|
||||
**What he said:**
|
||||
> "What's all this 'tax rate' stuff? Too complicated, just want to stake"
|
||||
|
||||
> "Make staking easier! Just ONE button, not all these options"
|
||||
|
||||
> "Do I make more money with higher or lower tax? Idk???"
|
||||
|
||||
**Key insight:** Tyler represents the user who will NEVER read docs. He needs a "one-click stake" option with sensible defaults. The tax rate selector is a complete blocker for this persona — he doesn't understand it and has no way to learn.
|
||||
|
||||
---
|
||||
|
||||
### 2.5 Dr. Priya Malhotra — Institutional ❌
|
||||
|
||||
**Journey:** Landing page only. Read it, searched for docs, found none, stopped.
|
||||
|
||||
**What happened:** Priya's test timed out because the balance-loading issue prevented progression. But her feedback from the landing page alone is valuable:
|
||||
|
||||
**What she said:**
|
||||
> "No visible link to technical documentation. For institutional investors, this is essential."
|
||||
|
||||
> "No audit report link visible. Institutional capital requires multi-firm audits at minimum."
|
||||
|
||||
**Her questions:**
|
||||
- "What is the theoretical Nash equilibrium for tax rates?"
|
||||
- "Has this undergone formal verification?"
|
||||
- "What are the centralization risks? Who holds admin keys? Is there a timelock?"
|
||||
|
||||
**Key insight:** Institutional money won't touch Kraiken until there's a whitepaper, audit report, formal verification, and governance transparency. This is post-launch work, but should be planned.
|
||||
|
||||
---
|
||||
|
||||
## 3. Critical Bugs
|
||||
|
||||
### 3.1 Balance Loading After Swap (LAUNCH BLOCKER)
|
||||
**Impact:** Blocked 2/5 users from staking
|
||||
**Root cause:** After swapping ETH→KRK on the cheats page, navigating to the stake page shows stale balance (0 KRK). The `useWallet` composable's `loadBalance()` is only triggered on account/chain changes, not navigation.
|
||||
**Partial fix applied:** Added `loadBalance()` call after swap in CheatsView.vue. But the balance still doesn't refresh reliably when navigating between pages.
|
||||
**Real fix needed:** Either poll the token balance periodically (every 5s), or trigger `loadBalance()` when StakeHolder mounts, or use wagmi's `useBalance` with `watch: true`.
|
||||
|
||||
### 3.2 Ponder/GraphQL Instability
|
||||
**Impact:** Crashed during testing, 502 errors. Position verification via GraphQL failed.
|
||||
**Severity:** Medium — staking works without Ponder, but position display doesn't.
|
||||
|
||||
### 3.3 Browser Crash on Screenshot (Minor)
|
||||
**Impact:** Alex's browser crashed during post-stake screenshot. Likely Chromium memory on the VPS, not a real user issue.
|
||||
|
||||
---
|
||||
|
||||
## 4. UX & Copy Findings (Prioritized)
|
||||
|
||||
### P0 — Must fix before any launch
|
||||
|
||||
| Finding | Who flagged it | Fix |
|
||||
|---------|---------------|-----|
|
||||
| No audit badge | All 5 personas | Add badge + link (even "audit pending") |
|
||||
| Tax rate has zero guidance | Tyler, Sarah, Alex | Tooltip + "Recommended: X%" default |
|
||||
| No "What is this?" explanation | Alex, Sarah, Priya | Landing page explainer section |
|
||||
| Balance doesn't refresh after swap | Tyler (blocker) | Fix wallet composable polling |
|
||||
|
||||
### P1 — Should fix before mainnet
|
||||
|
||||
| Finding | Who flagged it | Fix |
|
||||
|---------|---------------|-----|
|
||||
| No APY calculator | Sarah, Marcus | "Stake X at Y% ≈ Z% APY" widget |
|
||||
| "Snatching" sounds hostile | Alex, Sarah | Rename or add reassuring copy |
|
||||
| No contract addresses visible | Marcus | Display + link to explorer |
|
||||
| No getting started guide | Alex | 3-step onboarding overlay |
|
||||
| No comparison to alternatives | Sarah | "Why Kraiken vs Aave?" section |
|
||||
|
||||
### P2 — Nice to have
|
||||
|
||||
| Finding | Who flagged it | Fix |
|
||||
|---------|---------------|-----|
|
||||
| No docs/whitepaper link | Priya, Marcus | Link to docs site |
|
||||
| No mobile notifications | Sarah | Push/email for snatch events |
|
||||
| No FAQ | Alex | FAQ page or accordion |
|
||||
| "Cheat Console" name confusing | Alex | Rename to "Test Console" for testnet |
|
||||
| No team/about page | Sarah, Priya | About section with team bios |
|
||||
|
||||
---
|
||||
|
||||
## 5. Tokenomics Feedback
|
||||
|
||||
### Questions every persona had:
|
||||
1. **"What tax rate should I choose?"** — Nobody understood the tax rate mechanic without guidance. Marcus gamed it (low tax to test snatching), Sarah maximized safety (high tax), Tyler guessed randomly, Alex panicked.
|
||||
|
||||
2. **"Can I get snatched and lose money?"** — The snatch mechanic is either exciting (Marcus: "genuine PvP") or terrifying (Alex: "Can I lose my money?"). The answer needs to be front and center.
|
||||
|
||||
3. **"What's the APY?"** — Sarah compared to Aave (8% risk-free). Without a clear yield estimate, yield farmers can't make a decision.
|
||||
|
||||
### Persona-specific deep questions:
|
||||
- **Marcus:** "What prevents flash-loaning to manipulate VWAP?" / "What's the minimum profitable tax spread for snatching?"
|
||||
- **Sarah:** "How does 7-day inflation compare to staking returns?" / "Is 15% tax high enough to prevent snatching?"
|
||||
- **Priya:** "What is the Nash equilibrium?" / "Has this undergone formal verification?"
|
||||
- **Alex:** "What is a Harberger Tax?" / "Higher tax = more money or less money? This is backwards from normal taxes!"
|
||||
- **Tyler:** "Do I make more money with higher or lower tax? Idk???"
|
||||
|
||||
### Key takeaway:
|
||||
The tax rate mechanic IS the protocol's unique value prop — but it's also its biggest comprehension barrier. A "tax rate explainer" that answers "what should I choose and why" is the single highest-impact content piece you could create.
|
||||
|
||||
---
|
||||
|
||||
## 6. Competitive Positioning
|
||||
|
||||
### Bear market framing
|
||||
In a bear market, users prioritize:
|
||||
1. Safety (don't lose what I have)
|
||||
2. Yield (beat inflation/holding)
|
||||
3. Trust (audits, track record)
|
||||
4. Novelty (something worth learning)
|
||||
|
||||
### vs Aave/Compound (Sarah's world)
|
||||
**Sarah's benchmark:** "8% on USDC with zero snatch risk."
|
||||
**Kraiken's pitch:** "Active yield management where YOU control your risk/reward through tax rate selection. Higher engagement = higher returns." But this only works if you can show estimated APY ranges.
|
||||
|
||||
### vs Memecoins (Tyler's world)
|
||||
**Tyler's benchmark:** "Buy low, pump, dump."
|
||||
**Kraiken's pitch:** "Earn while you hold. Gamified staking where you compete for positions." Tyler would respond to leaderboards, PvP snatch notifications, and "top earner" status.
|
||||
|
||||
### vs Institutional DeFi (Priya's world)
|
||||
**Priya's benchmark:** "Formal verification, multi-sig governance, audit by Trail of Bits."
|
||||
**Kraiken's pitch (future):** "Novel mechanism design with game-theoretic foundations, published research, formal analysis." Not ready for this audience yet.
|
||||
|
||||
### Recommended launch target: Marcus + Sarah
|
||||
Degens discover, yield farmers sustain. Marcus tests the mechanics, finds alpha, tweets about it. Sarah follows with conservative positions once she sees the APY data. Tyler and Alex come later when there's onboarding. Priya comes post-audit.
|
||||
|
||||
---
|
||||
|
||||
## 7. Launch Checklist
|
||||
|
||||
### Week 1: Fix blockers
|
||||
- [ ] Fix balance refresh on page navigation (StakeHolder `onMounted` → `loadBalance()`)
|
||||
- [ ] Add audit badge or "audit in progress" notice
|
||||
- [ ] Add tax rate tooltip explaining the tradeoff
|
||||
- [ ] Stabilize Ponder (or gracefully degrade when it's down)
|
||||
|
||||
### Week 2: Core UX
|
||||
- [ ] Tax rate explainer page/modal
|
||||
- [ ] "What is Kraiken?" landing section
|
||||
- [ ] APY estimate widget (even rough ranges)
|
||||
- [ ] Display contract addresses with explorer links
|
||||
- [ ] "What happens if I get snatched?" FAQ entry
|
||||
|
||||
### Week 3: Onboarding
|
||||
- [ ] Getting Started guide (3 steps: connect → buy → stake)
|
||||
- [ ] Default tax rate suggestion for new users
|
||||
- [ ] "Why Kraiken?" comparison section
|
||||
- [ ] Rename "Cheat Console" for testnet UX
|
||||
|
||||
### Week 4+: Growth
|
||||
- [ ] Snatch notifications (push/email)
|
||||
- [ ] Snatching ROI calculator
|
||||
- [ ] Leaderboard / gamification
|
||||
- [ ] Technical docs / whitepaper link
|
||||
- [ ] Team/about page
|
||||
|
||||
---
|
||||
|
||||
## 8. Work Items
|
||||
|
||||
| Task | Effort | Impact | Persona |
|
||||
|------|--------|--------|---------|
|
||||
| Fix balance refresh bug | S | Critical | Tyler |
|
||||
| Tax rate tooltip | S | High | All |
|
||||
| Audit badge / notice | S | High | All |
|
||||
| Landing page explainer | M | High | Alex, Sarah |
|
||||
| APY calculator widget | M | High | Sarah |
|
||||
| Ponder stability | M | Medium | All |
|
||||
| Getting Started guide | M | High | Alex |
|
||||
| Contract addresses in UI | S | Medium | Marcus |
|
||||
| "What if snatched?" copy | S | Medium | Alex, Sarah |
|
||||
| Tax rate explainer page | M | High | All |
|
||||
| Comparison to Aave | S | Medium | Sarah |
|
||||
| Snatch notifications | L | Medium | Sarah |
|
||||
| Snatching ROI calculator | M | Medium | Marcus |
|
||||
| Docs/whitepaper | L | Medium | Priya |
|
||||
| Leaderboard | L | Low | Tyler |
|
||||
|
||||
**S** = < 1 day, **M** = 1-3 days, **L** = 1 week+
|
||||
|
||||
---
|
||||
|
||||
## 9. Test Artifacts
|
||||
|
||||
### JSON Reports (per persona)
|
||||
- `marcus-flash-chen.json` — Complete journey, staked ✅
|
||||
- `sarah-park.json` — Complete journey, staked ✅
|
||||
- `alex-rivera.json` — Complete journey, staked ✅ (browser crash on final screenshots)
|
||||
- `tyler-bags-morrison.json` — Partial journey, blocked by balance bug ❌
|
||||
- `dr-priya-malhotra.json` — Landing page only, timed out ❌
|
||||
|
||||
### Screenshots on disk
|
||||
- `test-results/usertest/tyler/` — 5 screenshots (landing → wallet → cheats → bought → stake page)
|
||||
- Marcus, Sarah, Alex screenshots referenced in JSON but from different test runs; some not persisted to disk
|
||||
|
||||
### Test Infrastructure
|
||||
- Playwright E2E suite: `tests/e2e/usertest/*.spec.ts` (5 persona specs + helpers)
|
||||
- Chain state: evm_snapshot/revert between each persona for isolation
|
||||
- Balance fix: `web-app/src/views/CheatsView.vue` (added `loadBalance()` after swap)
|
||||
|
||||
### Known test issues
|
||||
- Screenshot paths are relative and depend on Playwright's working directory — inconsistent between runs
|
||||
- Playwright's 5-minute default test timeout is tight for personas that do many buys
|
||||
- `evm_revert` returns `false` when snapshot ID is stale (need fresh snapshot each time)
|
||||
|
||||
---
|
||||
|
||||
## 10. Bottom Line
|
||||
|
||||
**The mechanism works and people find it interesting.** Marcus wants to game it (good — that's the design). Sarah wants to optimize it (good — that's the yield). Alex wants to understand it (fixable — add education). Tyler wants it simpler (fixable — add defaults). Priya wants proof it's safe (necessary — add audits).
|
||||
|
||||
**One sentence:** Kraiken has a genuinely novel DeFi mechanism that generates real curiosity across all user types, but it can't launch until users can actually complete the staking flow without hitting bugs, and until the tax rate mechanic is explained well enough that a newcomer can make an informed choice.
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
# Round 3 User Test Results - COMPLETED
|
||||
|
||||
**Date:** 2026-02-13 23:34-23:40 UTC
|
||||
**Environment:** Verified working stack with clean snapshots
|
||||
|
||||
## Test Execution Summary
|
||||
|
||||
All 5 persona tests completed successfully:
|
||||
|
||||
### ✅ Test Results
|
||||
|
||||
1. **Marcus "Flash" Chen** (Degen/MEV Hunter)
|
||||
- Status: PASSED ✅
|
||||
- Stake Result: **SUCCESS** (100 KRK at 5% tax)
|
||||
- Duration: 57.1s
|
||||
- Report: `marcus-flash-chen.json`
|
||||
|
||||
2. **Sarah Park** (Cautious Yield Farmer)
|
||||
- Status: PASSED ✅
|
||||
- Stake Result: **FAILED** - "Insufficient Balance" error
|
||||
- Duration: 54.1s
|
||||
- Report: `sarah-park.json`
|
||||
- Note: Test passed despite stake failure; UI showed position afterward
|
||||
|
||||
3. **Tyler "Bags" Morrison** (Retail Degen)
|
||||
- Status: PASSED ✅
|
||||
- Stake Result: **FAILED** - "Insufficient Balance" error
|
||||
- Duration: 48.0s
|
||||
- Report: `tyler-bags-morrison.json`
|
||||
- Note: Test passed despite stake failure; UI showed position afterward
|
||||
|
||||
4. **Dr. Priya Malhotra** (Institutional Investor)
|
||||
- Status: PASSED ✅
|
||||
- Stake Result: **FAILED** - "Insufficient Balance" error
|
||||
- Duration: 1.0m
|
||||
- Report: `dr-priya-malhotra.json`
|
||||
- Note: Test passed despite stake failure; UI showed position afterward
|
||||
|
||||
5. **Alex Rivera** (Crypto-Curious Newcomer)
|
||||
- Status: PASSED ✅
|
||||
- Stake Result: **SUCCESS** (25 KRK at 15% tax)
|
||||
- Duration: 49.9s
|
||||
- Report: `alex-rivera.json`
|
||||
|
||||
## Artifacts Generated
|
||||
|
||||
### JSON Reports (5/5) ✅
|
||||
- `/home/debian/harb/tmp/usertest-results/marcus-flash-chen.json`
|
||||
- `/home/debian/harb/tmp/usertest-results/sarah-park.json`
|
||||
- `/home/debian/harb/tmp/usertest-results/tyler-bags-morrison.json`
|
||||
- `/home/debian/harb/tmp/usertest-results/dr-priya-malhotra.json`
|
||||
- `/home/debian/harb/tmp/usertest-results/alex-rivera.json`
|
||||
|
||||
### Screenshots
|
||||
- Alex Rivera: 12 screenshots in `test-results/usertest/alex/`
|
||||
- Other personas: Screenshots taken during tests (may have been cleaned up)
|
||||
|
||||
## Snapshot Management ✅
|
||||
|
||||
Between each persona test, snapshot was successfully reverted and recreated:
|
||||
- Initial snapshot: ID stored in `/home/debian/harb/tmp/.chain-snapshot-id`
|
||||
- Each revert: Verified contracts still deployed (KRK code length = 12168 bytes)
|
||||
- Final snapshot: 0x5
|
||||
|
||||
## Issues Identified
|
||||
|
||||
### "Insufficient Balance" Error (3/5 personas)
|
||||
Sarah, Tyler, and Priya all encountered "Insufficient KRK balance" errors when attempting to stake, despite having purchased adequate amounts of KRK:
|
||||
|
||||
- **Sarah:** Bought 3.05 ETH worth of KRK, tried to stake 50 KRK → FAILED
|
||||
- **Tyler:** Bought 4.0 ETH worth of KRK, tried to stake 75 KRK → FAILED
|
||||
- **Priya:** Bought 10.5 ETH worth of KRK, tried to stake 500 KRK → FAILED
|
||||
|
||||
However:
|
||||
- Tests continued and passed
|
||||
- UI showed "checking my position" screens afterward
|
||||
- Suggests possible UI bug or race condition
|
||||
|
||||
### Successful Stakes
|
||||
- **Marcus:** Bought via smaller swaps, staked 100 KRK → SUCCESS
|
||||
- **Alex:** Bought 0.8 ETH worth, staked 25 KRK → SUCCESS
|
||||
|
||||
Pattern: Smaller stake amounts and simpler buy patterns succeeded.
|
||||
|
||||
## Overall Result
|
||||
|
||||
**STATUS: COMPLETE** ✅
|
||||
|
||||
All 5 persona tests executed, all tests passed (exit code 0), all JSON reports generated with comprehensive UX feedback. Some stake transactions showed UI errors but tests completed successfully.
|
||||
|
||||
## Next Steps (Recommendations)
|
||||
|
||||
1. **Investigate "Insufficient Balance" UI bug** - Why does UI show this error for valid balances?
|
||||
2. **GraphQL verification** - Tests don't currently verify positions via GraphQL as mentioned in original criteria
|
||||
3. **Screenshot preservation** - Only last test's screenshots remain; consider archiving all
|
||||
4. **Stake success rate** - 40% actual stake success (2/5); investigate why larger amounts fail
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
═══════════════════════════════════════════════════════════════
|
||||
KRAIKEN DEFI - USER TESTING RESULTS
|
||||
5 Persona Journeys | 2026-02-13
|
||||
═══════════════════════════════════════════════════════════════
|
||||
|
||||
✅ ALL 5 TESTS PASSED (100% completion rate)
|
||||
|
||||
RESULTS:
|
||||
--------
|
||||
1. Marcus (Degen/MEV) PASSED (45.5s) - Stake failed, but test succeeded
|
||||
2. Sarah (Yield Farmer) PASSED (47.1s) - Stake failed, but test succeeded
|
||||
3. Tyler (Retail Degen) PASSED (37.4s) - Stake failed, but test succeeded
|
||||
4. Priya (Institutional) PASSED (43.2s) - Stake failed, but test succeeded
|
||||
5. Alex (Newcomer) PASSED (47.0s) - STAKE SUCCEEDED! ✨
|
||||
|
||||
🚨 CRITICAL BUG FOUND:
|
||||
---------------------
|
||||
Stake button visibility timeout - affected 4/5 tests
|
||||
- Button not appearing within 5s for most users
|
||||
- Real UI issue, not script bug
|
||||
- BLOCKS primary user journey (staking)
|
||||
|
||||
📊 DATA COLLECTED:
|
||||
------------------
|
||||
✅ 5 JSON reports (7.7 KB avg) in tmp/usertest-results/
|
||||
✅ 11 screenshots (Alex only - others missing on disk)
|
||||
✅ 60+ UX findings categorized by severity
|
||||
✅ Persona-specific feedback per journey
|
||||
|
||||
🔥 TOP 5 ISSUES:
|
||||
----------------
|
||||
1. Stake button timeout (4/5 users blocked)
|
||||
2. No audit badge (trust issue for Marcus/Sarah/Priya)
|
||||
3. No "Getting Started" guide (Alex intimidated)
|
||||
4. "Tax" terminology confusing (Tyler thought he was PAYING)
|
||||
5. "Snatching" sounds like theft (Alex terrified)
|
||||
|
||||
💰 PERSONA VERDICTS:
|
||||
--------------------
|
||||
Marcus: "Intrigued but needs audit + contracts" ($2-5k test allocation)
|
||||
Sarah: "Promising but not ready for main capital" (needs 1-2 week test)
|
||||
Tyler: "Confused but hopeful" (will sell if snatched without understanding)
|
||||
Priya: "Intellectually intriguing" ($50-100k observation, $500k+ needs audits)
|
||||
Alex: "Excited but terrified" (monitor 1 week, leave if snatched)
|
||||
|
||||
📁 DELIVERABLES:
|
||||
----------------
|
||||
- tmp/usertest-results/FINAL-REPORT.md (full analysis)
|
||||
- tmp/usertest-results/*.json (5 persona reports)
|
||||
- test-results/usertest/alex/*.png (11 screenshots)
|
||||
|
||||
🎯 SUCCESS CRITERIA: MET
|
||||
- 5/5 personas completed ✅
|
||||
- All reports generated ✅
|
||||
- Findings documented ✅
|
||||
|
||||
MEMORY STABLE: 650-715 MB free throughout (no OOM)
|
||||
|
||||
═══════════════════════════════════════════════════════════════
|
||||
Full report: /home/debian/harb/tmp/usertest-results/FINAL-REPORT.md
|
||||
═══════════════════════════════════════════════════════════════
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
# Quick Test Guide - Balance Bug Fix
|
||||
|
||||
## Test the Fix in 60 Seconds
|
||||
|
||||
### Setup (5 seconds)
|
||||
```bash
|
||||
cd /home/debian/harb
|
||||
# Ensure dev environment is running
|
||||
# If not: npm run dev in web-app/
|
||||
```
|
||||
|
||||
### Test Steps (55 seconds)
|
||||
|
||||
1. **Open app in browser** (http://localhost:5173 or staging URL)
|
||||
|
||||
2. **Connect wallet** - Use MetaMask or test wallet
|
||||
|
||||
3. **Navigate to Cheats page** (/cheats)
|
||||
|
||||
4. **Check current KRK balance**
|
||||
- Open browser console
|
||||
- Type: `console.log('Balance before swap')`
|
||||
- Navigate to Stake page, note the balance
|
||||
|
||||
5. **Return to Cheats page**
|
||||
|
||||
6. **Perform swap:**
|
||||
- Enter amount: `0.1` ETH
|
||||
- Click "Buy" button
|
||||
- Confirm transaction in wallet
|
||||
|
||||
7. **Watch for:**
|
||||
- ✅ Toast notification: "Swap submitted..."
|
||||
- ✅ Transaction confirmation
|
||||
- ✅ **No console errors**
|
||||
|
||||
8. **Immediately navigate to Stake page**
|
||||
|
||||
9. **Verify:**
|
||||
- ✅ KRK balance displays new amount (not 0)
|
||||
- ✅ Balance loads within 1-2 seconds
|
||||
- ✅ Slider shows correct max amount
|
||||
- ✅ "Insufficient Balance" does NOT appear
|
||||
- ✅ Can input stake amount and submit
|
||||
|
||||
## Expected Console Output
|
||||
|
||||
```
|
||||
loadBalance // This should appear right after swap
|
||||
```
|
||||
|
||||
## Success Criteria
|
||||
|
||||
✅ Balance updates immediately after swap completes
|
||||
✅ No delay when navigating to stake page
|
||||
✅ Stake form is usable without refresh
|
||||
|
||||
## If Test Fails
|
||||
|
||||
### Check:
|
||||
1. Did the swap transaction actually confirm? (check wallet)
|
||||
2. Any errors in browser console?
|
||||
3. Is the RPC endpoint responding? (Network tab)
|
||||
4. Is the correct contract address configured?
|
||||
|
||||
### Debug Commands:
|
||||
```bash
|
||||
# Check if changes are present
|
||||
cd /home/debian/harb/web-app/src/views
|
||||
grep -A 3 "loadBalance()" CheatsView.vue
|
||||
# Should show the new code
|
||||
|
||||
# Check imports
|
||||
grep "useWallet" CheatsView.vue
|
||||
# Should show: import { useWallet } from '@/composables/useWallet';
|
||||
```
|
||||
|
||||
## Files to Review
|
||||
|
||||
- **Bug Analysis:** `/home/debian/harb/tmp/usertest-results/BALANCE-BUG-ANALYSIS.md`
|
||||
- **Fix Summary:** `/home/debian/harb/tmp/usertest-results/BALANCE-BUG-FIX-SUMMARY.md`
|
||||
- **Modified File:** `/home/debian/harb/web-app/src/views/CheatsView.vue`
|
||||
|
||||
## Before vs After Comparison
|
||||
|
||||
| Scenario | Before Fix | After Fix |
|
||||
|----------|-----------|-----------|
|
||||
| Swap then navigate | Balance: 0 KRK (or waits 10-90s) | Balance: correct amount (1-2s) |
|
||||
| Can stake? | ❌ "Insufficient Balance" | ✅ Yes, immediately |
|
||||
| User frustration | 😤 High | 😊 None |
|
||||
| Required workaround | Page refresh or wait | None needed |
|
||||
|
||||
---
|
||||
|
||||
**Quick Validation:** If you can swap → navigate → stake without any wait or error, the fix works! 🎉
|
||||
|
|
@ -1,121 +0,0 @@
|
|||
# Kraiken User Test Report v2
|
||||
**Date:** 2026-02-14
|
||||
**Branch:** `feat/ponder-lm-indexing`
|
||||
**Stack:** Local fork (Anvil + Bootstrap + Ponder + Web-app + Landing)
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Two test suites targeting distinct user funnels:
|
||||
- **Test A (Passive Holder):** 9/9 passed ✅ — Landing page → Get KRK → Return value
|
||||
- **Test B (Staker):** 7/12 passed (3 stake execution timeouts, 2 skipped) — Staking UI evaluation + docs audit
|
||||
|
||||
The tests surface **actionable UX friction** across both funnels. Core finding: **the passive holder funnel converts degens but loses newcomers and yield farmers.**
|
||||
|
||||
---
|
||||
|
||||
## Test A: Passive Holder Journey
|
||||
|
||||
### Tyler — Retail Degen ("sell me in 30 seconds")
|
||||
| Metric | Result |
|
||||
|--------|--------|
|
||||
| Would buy | ✅ Yes |
|
||||
| Would return | ❌ No |
|
||||
| Friction | Landing page is one-time conversion, no repeat visit value |
|
||||
|
||||
**Key insight:** Degens convert on first visit but have no reason to come back. The landing page needs live stats or a reason to revisit.
|
||||
|
||||
### Alex — Newcomer ("what even is this?")
|
||||
| Metric | Result |
|
||||
|--------|--------|
|
||||
| Would buy | ❌ No |
|
||||
| Would return | ❌ No |
|
||||
| Friction | No beginner explanation, no trust signals, no step-by-step guide, unclear value prop |
|
||||
|
||||
**Key insight:** Newcomers bounce. The landing page assumes crypto literacy. Needs: "What is this?" section, social proof, getting started guide.
|
||||
|
||||
### Sarah — Yield Farmer ("is this worth my time?")
|
||||
| Metric | Result |
|
||||
|--------|--------|
|
||||
| Would buy | ❌ No |
|
||||
| Would return | ❌ No |
|
||||
| Friction | No APY/yield display, no risk indicators, no audit info, can't verify liquidity, no monitoring tools |
|
||||
|
||||
**Key insight:** Yield farmers need numbers upfront. Without APY estimates, risk metrics, or audit credentials, they won't invest time to understand the protocol.
|
||||
|
||||
---
|
||||
|
||||
## Test B: Staker Journey
|
||||
|
||||
### Priya — Institutional ("show me the docs")
|
||||
**Steps completed:** Setup ✅, Documentation audit ✅, UI quality ✅, Stake execution ⏱ (timeout)
|
||||
|
||||
**Documentation Audit:**
|
||||
- ✅ Documentation link visible
|
||||
- ✅ Found 5 contract addresses — can verify on Etherscan
|
||||
- ⚠ No copy button for addresses — minor friction
|
||||
- ✅ Audit report accessible
|
||||
- ⚠ Protocol parameters not displayed
|
||||
- ⚠ No source code link (Codeberg/GitHub)
|
||||
|
||||
**UI Quality:**
|
||||
- ✅ Found 39 precise numbers — good data quality
|
||||
- ⚠ No indication if data is live or stale
|
||||
- ✅ Input validation present
|
||||
- ✅ Clear units on all values
|
||||
|
||||
### Marcus — Degen/MEV ("where's the edge?")
|
||||
**Steps completed:** Setup ✅, Interface analysis ✅, Stake execution ⏱ (timeout)
|
||||
|
||||
### Sarah — Yield Farmer ("what are the risks?")
|
||||
**Steps completed:** Setup ✅, Risk evaluation ✅, Stake execution ⏱ (timeout)
|
||||
|
||||
**Note:** Stake execution tests timeout because the test wallet interaction (fill amount → select tax → click stake) doesn't match the actual UI component structure. This is a test scaffolding issue, not a UX issue.
|
||||
|
||||
---
|
||||
|
||||
## Findings by Priority
|
||||
|
||||
### 🔴 Critical (Blocking Conversion)
|
||||
1. **No APY/yield indicator on landing page** — Yield farmers and passive holders need a number to anchor on. Even "indicative rate" or "protocol performance" would help.
|
||||
2. **No beginner explanation** — Newcomers have zero context. Need a "What is Kraiken?" section in plain English.
|
||||
3. **Landing page is one-time only** — No reason to return after first visit. Protocol Health section exists but needs real data.
|
||||
|
||||
### 🟡 Important (Reduces Trust)
|
||||
4. **No audit/security credentials visible** — Sarah and Priya both flagged this. Link to audit report, bug bounty, or security practices.
|
||||
5. **No source code link** — Institutional users want to verify. Link to Codeberg repo.
|
||||
6. **Data freshness unclear** — Priya noted: "No indication if data is live or stale." Add timestamps or "live" indicators.
|
||||
7. **No copy button for contract addresses** — Minor but Priya flagged it for verification workflow.
|
||||
|
||||
### 🟢 Nice to Have
|
||||
8. **Protocol parameters not displayed** — Advanced users want to see CI, AS, AW values.
|
||||
9. **Step-by-step getting started guide on landing** — Exists on docs but not on landing page.
|
||||
10. **Social proof / community links** — Tyler would convert faster with Discord/Twitter presence visible.
|
||||
|
||||
---
|
||||
|
||||
## Recommendations
|
||||
|
||||
### For Passive Holders (Landing Page)
|
||||
1. Add **indicative APY** or protocol performance metric (even with disclaimer)
|
||||
2. Add "What is Kraiken?" explainer in 2-3 sentences for newcomers
|
||||
3. Make Protocol Health section show **live data** (holder count, ETH reserve, supply growth)
|
||||
4. Add **trust signals**: audit link, team/project background, community links
|
||||
5. Add "Last updated" timestamps to stats
|
||||
|
||||
### For Stakers (Web App)
|
||||
1. Add **copy button** next to contract addresses
|
||||
2. Add **data freshness indicator** (live dot, last updated timestamp)
|
||||
3. Link to **source code** (Codeberg repo)
|
||||
4. Display **protocol parameters** (current optimizer settings)
|
||||
|
||||
### For Both
|
||||
1. The ProtocolStatsCard component was built (commit `a0aca16`) but needs integration into the landing page with real Ponder data
|
||||
2. Bootstrap V3 swap is broken (sqrtPriceLimitX96=0 gives empty swap) — not blocking for mainnet but blocks local testing
|
||||
|
||||
---
|
||||
|
||||
## Test Infrastructure Notes
|
||||
- **buyKrk helper** uses direct KRK transfer from deployer (Anvil #0) — V3 pool swap broken on local fork due to pool initialization at min tick
|
||||
- **Stake execution tests** need UI component alignment — test expects `getByLabel(/staking amount/i)` but actual component may use different structure
|
||||
- **Chain snapshots** work correctly for state isolation between personas
|
||||
- **Test A is fully stable** and can be run as regression
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
{
|
||||
"personaName": "Alex Rivera",
|
||||
"testDate": "2026-02-14T06:18:39.634Z",
|
||||
"pagesVisited": [
|
||||
{
|
||||
"page": "Landing",
|
||||
"url": "http://localhost:8081/app/#/",
|
||||
"timeSpent": 16579,
|
||||
"timestamp": "2026-02-14T06:18:57.248Z"
|
||||
},
|
||||
{
|
||||
"page": "Stake (learning)",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 3089,
|
||||
"timestamp": "2026-02-14T06:19:33.683Z"
|
||||
},
|
||||
{
|
||||
"page": "Cheats (confused)",
|
||||
"url": "http://localhost:8081/app/#/cheats",
|
||||
"timeSpent": 2527,
|
||||
"timestamp": "2026-02-14T06:19:40.939Z"
|
||||
},
|
||||
{
|
||||
"page": "Stake (attempting)",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 2769,
|
||||
"timestamp": "2026-02-14T06:20:02.126Z"
|
||||
}
|
||||
],
|
||||
"actionsAttempted": [
|
||||
{
|
||||
"action": "Connect wallet (first time)",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T06:19:30.592Z"
|
||||
},
|
||||
{
|
||||
"action": "Mint 5 ETH (following guide)",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T06:19:49.049Z"
|
||||
},
|
||||
{
|
||||
"action": "Buy KRK with 0.05 ETH (minimal test)",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T06:19:53.941Z"
|
||||
},
|
||||
{
|
||||
"action": "Stake 25 KRK at 15% tax",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T06:20:54.782Z"
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
"test-results/usertest/alex/alex-landing-page-2026-02-14T06-18-47-686Z.png",
|
||||
"test-results/usertest/alex/alex-looking-for-help-2026-02-14T06-18-57-754Z.png",
|
||||
"test-results/usertest/alex/alex-wallet-connected-2026-02-14T06-19-28-099Z.png",
|
||||
"test-results/usertest/alex/alex-stake-page-first-look-2026-02-14T06-19-33-686Z.png",
|
||||
"test-results/usertest/alex/alex-cheats-page-2026-02-14T06-19-40-952Z.png",
|
||||
"test-results/usertest/alex/alex-small-purchase-2026-02-14T06-19-53-953Z.png",
|
||||
"test-results/usertest/alex/alex-stake-form-confused-2026-02-14T06-20-02-147Z.png",
|
||||
"test-results/usertest/alex/stake-form-filled-2026-02-14T06-20-23-152Z.png"
|
||||
],
|
||||
"uiObservations": [
|
||||
"This looks professional but I have no idea what I'm looking at...",
|
||||
"Looking for a \"How it Works\" or tutorial before I do anything...",
|
||||
"Feeling overwhelmed - too much jargon without explanation",
|
||||
"I've heard about wallet scams... is this safe to connect?",
|
||||
"No security information visible - makes me nervous to connect wallet",
|
||||
"Okay, deep breath... connecting wallet for the first time on this app",
|
||||
"Wallet connected! That was easier than I thought. Now what?",
|
||||
"Lots of numbers and charts... what does it all mean?",
|
||||
"Words I don't understand: VWAP, tax rate, snatching, claimed slots...",
|
||||
"Looking for FAQ or help section...",
|
||||
"I need to get some tokens first... let me figure out how",
|
||||
"\"Cheat Console\"? Is this for testing? I'm confused but will try it...",
|
||||
"Got some ETH! Still not sure what I'm doing though...",
|
||||
"Buying the smallest amount possible to test - don't want to lose much if this is a scam",
|
||||
"Purchase went through! That was actually pretty smooth.",
|
||||
"Staring at the stake form... what tax rate should I pick???",
|
||||
"Going with 15% because it sounds safe... I think? Really not sure about this.",
|
||||
"Stake failed: page.screenshot: Target crashed \nBrowser logs:\n\n<launching> /home/debian/.cache/ms-playwright/chromium_headless_shell-1193/chrome-linux/headless_shell --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=AcceptCHFrame,AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,Translate,AutoDeElevate --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --enable-automation --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --no-sandbox --disable-dev-shm-usage --no-sandbox --user-data-dir=/tmp/playwright_chromiumdev_profile-o9mGmd --remote-debugging-pipe --no-startup-window\n<launched> pid=3975633\n[pid=3975633][err] [0214/061840.266925:WARNING:sandbox/policy/linux/sandbox_linux.cc:414] InitializeSandbox() called with multiple threads in process gpu-process.\n[pid=3975633] <gracefully close start>\n[pid=3975633] <forcefully close>\n[pid=3975633] <kill>\n[pid=3975633] <will force kill>\nCall log:\n\u001b[2m - taking page screenshot\u001b[22m\n\u001b[2m - waiting for fonts to load...\u001b[22m\n\u001b[2m - fonts loaded\u001b[22m\n. I give up, this is too hard."
|
||||
],
|
||||
"copyFeedback": [
|
||||
"Landing page should have a \"New to DeFi?\" section that explains basics",
|
||||
"CRITICAL: No \"Getting Started\" guide visible. I'm intimidated and don't know where to begin.",
|
||||
"Need trust signals: \"Audited\", \"Secure\", \"Non-custodial\" badges to reassure newcomers",
|
||||
"Need more info icons and tooltips to explain every element",
|
||||
"ESSENTIAL: Need a glossary or hover definitions for all DeFi terms",
|
||||
"No FAQ visible! Common questions like \"Can I lose money?\" need answers up front.",
|
||||
"Good: Transaction was straightforward. Bad: No confirmation message explaining what happened.",
|
||||
"CRITICAL: Tax rate needs \"Recommended for beginners: 10-15%\" guidance",
|
||||
"Please add a \"What should I choose?\" helper or wizard mode for newcomers!",
|
||||
"Failed stakes need recovery guidance: \"Here's what to try next...\""
|
||||
],
|
||||
"tokenomicsQuestions": [
|
||||
"What is staking? How do I make money from this?",
|
||||
"What is a \"Harberger Tax\"? Never heard of this before.",
|
||||
"What are \"owner slots\"? Is that like shares?",
|
||||
"Can I lose my money if I stake? What are the risks?",
|
||||
"Higher tax = more money or less money? This is backwards from normal taxes!"
|
||||
],
|
||||
"overallSentiment": ""
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"persona": "alex",
|
||||
"test": "A",
|
||||
"timestamp": "2026-02-14T22:01:42.927Z",
|
||||
"journey": "passive-holder",
|
||||
"steps": [
|
||||
{
|
||||
"step": "landing-page",
|
||||
"screenshot": "test-results/usertest/alex-a/landing-confusion-1771106505894.png",
|
||||
"feedback": [
|
||||
"Reading the page... trying to understand what this protocol does",
|
||||
"✗ No clear explainer - I'm lost and don't know what this is",
|
||||
"✓ Language is relatively accessible",
|
||||
"✗ Not sure how to start or what to do first",
|
||||
"⚠ No visible security/audit info - how do I know this is safe?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "get-krk",
|
||||
"screenshot": "test-results/usertest/alex-a/get-krk-page-1771106510934.png",
|
||||
"feedback": [
|
||||
"Clicked \"Get KRK\" - now what?",
|
||||
"✗ No clear instructions on how to proceed",
|
||||
"✗ No Uniswap link found - how do I get KRK?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "post-purchase",
|
||||
"screenshot": "test-results/usertest/alex-a/after-purchase-1771106525778.png",
|
||||
"feedback": [
|
||||
"Pretending I figured out Uniswap and bought KRK...",
|
||||
"✗ Failed to get KRK: execution reverted: \"SPL\" (action=\"estimateGas\", data=\"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000353504c0000000000000000000000000000000000000000000000000000000000\", reason=\"SPL\", transaction={ \"data\": \"0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ff196f1e3a895404d073b8611252cf97388773a70000000000000000000000000000000000000000000000000000000000002710000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb922660000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"from\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\", \"to\": \"0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4\" }, invocation=null, revert={ \"args\": [ \"SPL\" ], \"name\": \"Error\", \"signature\": \"Error(string)\" }, code=CALL_EXCEPTION, version=6.15.0)",
|
||||
"Okay, I have KRK now... what should I do with it?",
|
||||
"✓ Found guidance for what to do after getting KRK",
|
||||
"✗ No reason to come back to landing page"
|
||||
]
|
||||
}
|
||||
],
|
||||
"overall": {
|
||||
"friction": [
|
||||
"No beginner-friendly explanation on landing page",
|
||||
"Lack of trust signals for newcomers",
|
||||
"Get KRK page lacks step-by-step guide",
|
||||
"Value proposition unclear to crypto newcomers"
|
||||
],
|
||||
"wouldBuy": false,
|
||||
"wouldReturn": false
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
{
|
||||
"personaName": "Dr. Priya Malhotra",
|
||||
"testDate": "2026-02-14T05:10:14.669Z",
|
||||
"pagesVisited": [
|
||||
{
|
||||
"page": "Landing",
|
||||
"url": "http://localhost:8081/app/",
|
||||
"timeSpent": 3429,
|
||||
"timestamp": "2026-02-14T05:10:18.856Z"
|
||||
}
|
||||
],
|
||||
"actionsAttempted": [],
|
||||
"screenshots": [
|
||||
"test-results/usertest/priya/priya-landing-page-2026-02-14T05-10-18-102Z.png",
|
||||
"test-results/usertest/priya/priya-searching-for-docs-2026-02-14T05-10-18-898Z.png"
|
||||
],
|
||||
"uiObservations": [
|
||||
"Initial assessment: Clean UI, but need to verify claims about mechanism design",
|
||||
"Searching for whitepaper, technical appendix, or formal specification...",
|
||||
"Would normally review GitHub repository and TECHNICAL_APPENDIX.md before proceeding",
|
||||
"Looking for governance structure, DAO participation, or admin key disclosures..."
|
||||
],
|
||||
"copyFeedback": [
|
||||
"No visible link to technical documentation. For institutional investors, this is essential.",
|
||||
"No audit report link visible. Institutional capital requires multi-firm audits at minimum."
|
||||
],
|
||||
"tokenomicsQuestions": [
|
||||
"What is the theoretical Nash equilibrium for tax rates in this Harberger tax system?",
|
||||
"Has this undergone formal verification? Any peer-reviewed analysis of the mechanism?",
|
||||
"What are the centralization risks? Who holds admin keys? Is there a timelock?"
|
||||
],
|
||||
"overallSentiment": ""
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 5,
|
||||
"personaName": "Alex Rivera",
|
||||
"personaArchetype": "Crypto-Curious Newcomer",
|
||||
"variant": "Variant A (Defensive)",
|
||||
"variantId": "defensive",
|
||||
"variantUrl": "http://localhost:5174/#/",
|
||||
"timestamp": "2026-02-15T21:47:20.896Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 8,
|
||||
"wouldClickCTA": {
|
||||
"answer": true,
|
||||
"reasoning": "\"Can't be rugged\" is reassuring for someone who's heard horror stories. \"You just hold\" = simple. ETH backing sounds real/tangible."
|
||||
},
|
||||
"trustLevel": 7,
|
||||
"excitementLevel": 6,
|
||||
"wouldShare": {
|
||||
"answer": false,
|
||||
"reasoning": "I'm too new to recommend crypto stuff to friends. But if I make money and it's actually safe, I might mention it later."
|
||||
},
|
||||
"topComplaint": "I don't know what \"price floor\" or \"Uniswap V3\" mean. The headline is clear, but the details lose me. Need simpler explanations.",
|
||||
"whatWouldMakeMeBuy": "A beginner-friendly tutorial video, clear FAQ on \"what is a price floor,\" and reassurance that I can't lose everything. Maybe testimonials from real users."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "The token that can't be rugged.",
|
||||
"subtitle": "$KRK has a price floor backed by real ETH. An AI manages it. You just hold.",
|
||||
"ctaText": "Get $KRK",
|
||||
"keyMessages": [
|
||||
"Price Floor: Every $KRK is backed by ETH in a Uniswap V3 liquidity pool. The protocol maintains a minimum price that protects holders from crashes.",
|
||||
"AI-Managed: Kraiken rebalances liquidity positions 24/7 — capturing trading fees, adjusting to market conditions, optimizing depth. You don't lift a finger.",
|
||||
"Fully Transparent: Every rebalance is on-chain. Watch the AI work in real-time. No black boxes, no trust required."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 5,
|
||||
"personaName": "Alex Rivera",
|
||||
"personaArchetype": "Crypto-Curious Newcomer",
|
||||
"variant": "Variant C (Mixed)",
|
||||
"variantId": "mixed",
|
||||
"variantUrl": "http://localhost:5174/#/mixed",
|
||||
"timestamp": "2026-02-15T21:47:20.898Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 7,
|
||||
"wouldClickCTA": {
|
||||
"answer": true,
|
||||
"reasoning": "\"DeFi without the rug pull\" speaks to my fears (I've heard about scams). \"Protected downside\" = safety. Simple CTA \"Buy $KRK\" is clear."
|
||||
},
|
||||
"trustLevel": 7,
|
||||
"excitementLevel": 7,
|
||||
"wouldShare": {
|
||||
"answer": false,
|
||||
"reasoning": "Still too early for me to recommend. But this feels more approachable than variant B. If I try it and it works, maybe."
|
||||
},
|
||||
"topComplaint": "Still some unclear terms (\"AI-managed liquidity,\" \"ETH-backed floor\"). I'd need to click through to docs to understand how this actually works.",
|
||||
"whatWouldMakeMeBuy": "Step-by-step onboarding, glossary of terms, live chat support or active Discord where I can ask dumb questions without judgment. Show me it's safe."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "DeFi without the rug pull.",
|
||||
"subtitle": "AI-managed liquidity with an ETH-backed floor. Real upside, protected downside.",
|
||||
"ctaText": "Buy $KRK",
|
||||
"keyMessages": [
|
||||
"AI Liquidity Management: Kraiken optimizes your position 24/7 — capturing trading fees, rebalancing ranges, adapting to market conditions. Your tokens work while you sleep.",
|
||||
"ETH-Backed Floor: Every $KRK is backed by real ETH in a Uniswap V3 pool. The protocol maintains a price floor that protects you from catastrophic drops.",
|
||||
"Fully Transparent: Every move is on-chain. Watch the AI rebalance in real-time. No black boxes, no promises — just verifiable execution."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 5,
|
||||
"personaName": "Alex Rivera",
|
||||
"personaArchetype": "Crypto-Curious Newcomer",
|
||||
"variant": "Variant B (Offensive)",
|
||||
"variantId": "offensive",
|
||||
"variantUrl": "http://localhost:5174/#/offensive",
|
||||
"timestamp": "2026-02-15T21:47:20.897Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 4,
|
||||
"wouldClickCTA": {
|
||||
"answer": false,
|
||||
"reasoning": "\"Get Your Edge\" sounds like day-trading talk. \"Capturing alpha\" = ??? This feels like it's for experts, not me. Intimidating."
|
||||
},
|
||||
"trustLevel": 4,
|
||||
"excitementLevel": 5,
|
||||
"wouldShare": {
|
||||
"answer": false,
|
||||
"reasoning": "I wouldn't share this. It sounds too risky and I don't understand half the terms. Don't want to look dumb or lose friends' money."
|
||||
},
|
||||
"topComplaint": "Too much jargon. \"First-mover alpha,\" \"autonomous AI agent,\" \"deepening positions\" — what does this actually mean? Feels like a trap for noobs.",
|
||||
"whatWouldMakeMeBuy": "Explain like I'm 5. What is this? How do I use it? What are the risks in plain English? Stop assuming I know what \"alpha\" means."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "The AI that trades while you sleep.",
|
||||
"subtitle": "An autonomous AI agent managing $KRK liquidity 24/7. Capturing alpha. Deepening positions. You just hold and win.",
|
||||
"ctaText": "Get Your Edge",
|
||||
"keyMessages": [
|
||||
"ETH-Backed Growth: Real liquidity, real ETH reserves growing with every trade. While other tokens bleed, $KRK accumulates value on-chain automatically.",
|
||||
"AI Trading Edge: Kraiken optimizes 3 Uniswap V3 positions non-stop — rebalancing to capture fees, adjusting depth, exploiting market conditions. Never sleeps, never panics.",
|
||||
"First-Mover Alpha: Autonomous AI liquidity management is the future. You're early. Watch positions compound in real-time — no trust, just transparent on-chain execution."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 1,
|
||||
"personaName": "Marcus \"Flash\" Chen",
|
||||
"personaArchetype": "Degen / MEV Hunter",
|
||||
"variant": "Variant A (Defensive)",
|
||||
"variantId": "defensive",
|
||||
"variantUrl": "http://localhost:5174/#/",
|
||||
"timestamp": "2026-02-15T21:47:20.889Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 4,
|
||||
"wouldClickCTA": {
|
||||
"answer": false,
|
||||
"reasoning": "\"Can't be rugged\" sounds like marketing cope. Where's the alpha? This reads like it's for scared money. I want edge, not safety blankets."
|
||||
},
|
||||
"trustLevel": 6,
|
||||
"excitementLevel": 3,
|
||||
"wouldShare": {
|
||||
"answer": false,
|
||||
"reasoning": "Too defensive. My CT would roast me for shilling \"safe\" tokens. This is for boomers."
|
||||
},
|
||||
"topComplaint": "Zero edge. \"Just hold\" = ngmi. Where's the game theory? Where's the PvP? Reads like index fund marketing.",
|
||||
"whatWouldMakeMeBuy": "Show me the exploit potential. Give me snatching mechanics, arbitrage opportunities, something I can out-trade normies on. Stop selling safety."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "The token that can't be rugged.",
|
||||
"subtitle": "$KRK has a price floor backed by real ETH. An AI manages it. You just hold.",
|
||||
"ctaText": "Get $KRK",
|
||||
"keyMessages": [
|
||||
"Price Floor: Every $KRK is backed by ETH in a Uniswap V3 liquidity pool. The protocol maintains a minimum price that protects holders from crashes.",
|
||||
"AI-Managed: Kraiken rebalances liquidity positions 24/7 — capturing trading fees, adjusting to market conditions, optimizing depth. You don't lift a finger.",
|
||||
"Fully Transparent: Every rebalance is on-chain. Watch the AI work in real-time. No black boxes, no trust required."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 1,
|
||||
"personaName": "Marcus \"Flash\" Chen",
|
||||
"personaArchetype": "Degen / MEV Hunter",
|
||||
"variant": "Variant C (Mixed)",
|
||||
"variantId": "mixed",
|
||||
"variantUrl": "http://localhost:5174/#/mixed",
|
||||
"timestamp": "2026-02-15T21:47:20.892Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 7,
|
||||
"wouldClickCTA": {
|
||||
"answer": true,
|
||||
"reasoning": "\"DeFi without the rug pull\" is punchy. \"Real upside, protected downside\" frames the value prop clearly. Not as boring as variant A."
|
||||
},
|
||||
"trustLevel": 7,
|
||||
"excitementLevel": 6,
|
||||
"wouldShare": {
|
||||
"answer": false,
|
||||
"reasoning": "It's solid but not shareable. Lacks the memetic punch of variant B. This is \"good product marketing,\" not \"CT viral.\""
|
||||
},
|
||||
"topComplaint": "Sits in the middle. Not safe enough for noobs, not edgy enough for degens. Trying to please everyone = pleasing no one.",
|
||||
"whatWouldMakeMeBuy": "If I saw this after variant B, I'd click through. But if this was my first impression, I'd probably keep scrolling. Needs more bite."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "DeFi without the rug pull.",
|
||||
"subtitle": "AI-managed liquidity with an ETH-backed floor. Real upside, protected downside.",
|
||||
"ctaText": "Buy $KRK",
|
||||
"keyMessages": [
|
||||
"AI Liquidity Management: Kraiken optimizes your position 24/7 — capturing trading fees, rebalancing ranges, adapting to market conditions. Your tokens work while you sleep.",
|
||||
"ETH-Backed Floor: Every $KRK is backed by real ETH in a Uniswap V3 pool. The protocol maintains a price floor that protects you from catastrophic drops.",
|
||||
"Fully Transparent: Every move is on-chain. Watch the AI rebalance in real-time. No black boxes, no promises — just verifiable execution."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 1,
|
||||
"personaName": "Marcus \"Flash\" Chen",
|
||||
"personaArchetype": "Degen / MEV Hunter",
|
||||
"variant": "Variant B (Offensive)",
|
||||
"variantId": "offensive",
|
||||
"variantUrl": "http://localhost:5174/#/offensive",
|
||||
"timestamp": "2026-02-15T21:47:20.891Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 9,
|
||||
"wouldClickCTA": {
|
||||
"answer": true,
|
||||
"reasoning": "\"Get Your Edge\" speaks my language. \"Trades while you sleep\" + \"capturing alpha\" = I'm interested. This feels like it respects my intelligence."
|
||||
},
|
||||
"trustLevel": 7,
|
||||
"excitementLevel": 9,
|
||||
"wouldShare": {
|
||||
"answer": true,
|
||||
"reasoning": "\"First-mover alpha\" and \"AI trading edge\" are CT-native. This has the hype energy without being cringe. I'd quote-tweet this."
|
||||
},
|
||||
"topComplaint": "Still needs more meat. Where are the contract links? Where's the audit? Don't just tell me \"alpha,\" show me the code.",
|
||||
"whatWouldMakeMeBuy": "I'd ape a small bag immediately based on this copy, then audit the contracts. If the mechanics are novel and the code is clean, I'm in heavy."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "The AI that trades while you sleep.",
|
||||
"subtitle": "An autonomous AI agent managing $KRK liquidity 24/7. Capturing alpha. Deepening positions. You just hold and win.",
|
||||
"ctaText": "Get Your Edge",
|
||||
"keyMessages": [
|
||||
"ETH-Backed Growth: Real liquidity, real ETH reserves growing with every trade. While other tokens bleed, $KRK accumulates value on-chain automatically.",
|
||||
"AI Trading Edge: Kraiken optimizes 3 Uniswap V3 positions non-stop — rebalancing to capture fees, adjusting depth, exploiting market conditions. Never sleeps, never panics.",
|
||||
"First-Mover Alpha: Autonomous AI liquidity management is the future. You're early. Watch positions compound in real-time — no trust, just transparent on-chain execution."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 2,
|
||||
"personaName": "Sarah Park",
|
||||
"personaArchetype": "Cautious Yield Farmer",
|
||||
"variant": "Variant A (Defensive)",
|
||||
"variantId": "defensive",
|
||||
"variantUrl": "http://localhost:5174/#/",
|
||||
"timestamp": "2026-02-15T21:47:20.892Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 8,
|
||||
"wouldClickCTA": {
|
||||
"answer": true,
|
||||
"reasoning": "\"Can't be rugged\" + \"price floor backed by real ETH\" addresses my #1 concern. AI management sounds hands-off, which I like. Professional tone."
|
||||
},
|
||||
"trustLevel": 8,
|
||||
"excitementLevel": 6,
|
||||
"wouldShare": {
|
||||
"answer": false,
|
||||
"reasoning": "I'd research this myself first. If it pans out after 2 weeks, I'd mention it to close friends who also farm yield. Not Twitter material."
|
||||
},
|
||||
"topComplaint": "No numbers. What's the expected APY? What's the price floor mechanism exactly? How does the AI work? Need more detail before I connect wallet.",
|
||||
"whatWouldMakeMeBuy": "Clear documentation on returns (calculator tool), audit by a reputable firm, and transparent risk disclosure. If APY beats Aave's 8% with reasonable risk, I'm in."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "The token that can't be rugged.",
|
||||
"subtitle": "$KRK has a price floor backed by real ETH. An AI manages it. You just hold.",
|
||||
"ctaText": "Get $KRK",
|
||||
"keyMessages": [
|
||||
"Price Floor: Every $KRK is backed by ETH in a Uniswap V3 liquidity pool. The protocol maintains a minimum price that protects holders from crashes.",
|
||||
"AI-Managed: Kraiken rebalances liquidity positions 24/7 — capturing trading fees, adjusting to market conditions, optimizing depth. You don't lift a finger.",
|
||||
"Fully Transparent: Every rebalance is on-chain. Watch the AI work in real-time. No black boxes, no trust required."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 2,
|
||||
"personaName": "Sarah Park",
|
||||
"personaArchetype": "Cautious Yield Farmer",
|
||||
"variant": "Variant C (Mixed)",
|
||||
"variantId": "mixed",
|
||||
"variantUrl": "http://localhost:5174/#/mixed",
|
||||
"timestamp": "2026-02-15T21:47:20.894Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 9,
|
||||
"wouldClickCTA": {
|
||||
"answer": true,
|
||||
"reasoning": "\"DeFi without the rug pull\" is reassuring. \"Protected downside, real upside\" frames risk/reward clearly. AI management + ETH backing = interesting."
|
||||
},
|
||||
"trustLevel": 8,
|
||||
"excitementLevel": 7,
|
||||
"wouldShare": {
|
||||
"answer": true,
|
||||
"reasoning": "This feels professional and honest. If it delivers on the promise, I'd recommend it to other cautious DeFi users. Balanced tone inspires confidence."
|
||||
},
|
||||
"topComplaint": "Still light on specifics. I want to see the risk/return math before I commit. Need a clear APY estimate and explanation of how the floor protection works.",
|
||||
"whatWouldMakeMeBuy": "Add a return calculator, link to audit, show me the team. If the docs are thorough and the security checks out, I'd start with a small test stake."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "DeFi without the rug pull.",
|
||||
"subtitle": "AI-managed liquidity with an ETH-backed floor. Real upside, protected downside.",
|
||||
"ctaText": "Buy $KRK",
|
||||
"keyMessages": [
|
||||
"AI Liquidity Management: Kraiken optimizes your position 24/7 — capturing trading fees, rebalancing ranges, adapting to market conditions. Your tokens work while you sleep.",
|
||||
"ETH-Backed Floor: Every $KRK is backed by real ETH in a Uniswap V3 pool. The protocol maintains a price floor that protects you from catastrophic drops.",
|
||||
"Fully Transparent: Every move is on-chain. Watch the AI rebalance in real-time. No black boxes, no promises — just verifiable execution."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"personaId": 2,
|
||||
"personaName": "Sarah Park",
|
||||
"personaArchetype": "Cautious Yield Farmer",
|
||||
"variant": "Variant B (Offensive)",
|
||||
"variantId": "offensive",
|
||||
"variantUrl": "http://localhost:5174/#/offensive",
|
||||
"timestamp": "2026-02-15T21:47:20.894Z",
|
||||
"evaluation": {
|
||||
"firstImpression": 5,
|
||||
"wouldClickCTA": {
|
||||
"answer": false,
|
||||
"reasoning": "\"Get Your Edge\" feels like a casino ad. \"Capturing alpha\" and \"you just hold and win\" sound too good to be true. Red flags for unsustainable promises."
|
||||
},
|
||||
"trustLevel": 4,
|
||||
"excitementLevel": 3,
|
||||
"wouldShare": {
|
||||
"answer": false,
|
||||
"reasoning": "This reads like a high-risk moonshot. I wouldn't recommend this to anyone I care about. Feels like 2021 degen marketing."
|
||||
},
|
||||
"topComplaint": "Way too much hype, zero substance. \"First-mover alpha\" is a euphemism for \"you're exit liquidity.\" Where are the audits? The team? The real returns?",
|
||||
"whatWouldMakeMeBuy": "Tone it down. Give me hard numbers, risk disclosures, and professional credibility. Stop trying to sell me FOMO and sell me fundamentals."
|
||||
},
|
||||
"copyObserved": {
|
||||
"headline": "The AI that trades while you sleep.",
|
||||
"subtitle": "An autonomous AI agent managing $KRK liquidity 24/7. Capturing alpha. Deepening positions. You just hold and win.",
|
||||
"ctaText": "Get Your Edge",
|
||||
"keyMessages": [
|
||||
"ETH-Backed Growth: Real liquidity, real ETH reserves growing with every trade. While other tokens bleed, $KRK accumulates value on-chain automatically.",
|
||||
"AI Trading Edge: Kraiken optimizes 3 Uniswap V3 positions non-stop — rebalancing to capture fees, adjusting depth, exploiting market conditions. Never sleeps, never panics.",
|
||||
"First-Mover Alpha: Autonomous AI liquidity management is the future. You're early. Watch positions compound in real-time — no trust, just transparent on-chain execution."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
{
|
||||
"personaName": "Marcus Flash Chen",
|
||||
"testDate": "2026-02-14T09:32:02.425Z",
|
||||
"pagesVisited": [
|
||||
{
|
||||
"page": "Landing",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 4931,
|
||||
"timestamp": "2026-02-14T09:32:07.882Z"
|
||||
},
|
||||
{
|
||||
"page": "Cheats",
|
||||
"url": "http://localhost:8081/app/#/cheats",
|
||||
"timeSpent": 1012,
|
||||
"timestamp": "2026-02-14T09:32:13.489Z"
|
||||
},
|
||||
{
|
||||
"page": "Stake",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 4009,
|
||||
"timestamp": "2026-02-14T09:32:42.061Z"
|
||||
}
|
||||
],
|
||||
"actionsAttempted": [
|
||||
{
|
||||
"action": "Connect wallet",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:32:12.008Z"
|
||||
},
|
||||
{
|
||||
"action": "Mint 50 ETH",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:32:19.285Z"
|
||||
},
|
||||
{
|
||||
"action": "Buy KRK with 0.01 ETH (test)",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:32:22.445Z"
|
||||
},
|
||||
{
|
||||
"action": "Buy KRK with 5 ETH",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:32:28.043Z"
|
||||
},
|
||||
{
|
||||
"action": "Stake 100 KRK at 5% tax",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:32:50.835Z"
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
"test-results/usertest/marcus/marcus-landing-page-2026-02-14T09-32-06-783Z.png",
|
||||
"test-results/usertest/marcus/marcus-wallet-connected-2026-02-14T09-32-11-516Z.png",
|
||||
"test-results/usertest/marcus/marcus-looking-for-docs-2026-02-14T09-32-12-020Z.png",
|
||||
"test-results/usertest/marcus/marcus-cheats-page-2026-02-14T09-32-13-489Z.png",
|
||||
"test-results/usertest/marcus/marcus-small-swap-complete-2026-02-14T09-32-22-445Z.png",
|
||||
"test-results/usertest/marcus/marcus-large-swap-complete-2026-02-14T09-32-28-043Z.png",
|
||||
"test-results/usertest/marcus/marcus-stake-page-initial-2026-02-14T09-32-42-061Z.png",
|
||||
"test-results/usertest/marcus/stake-form-filled-2026-02-14T09-32-46-851Z.png",
|
||||
"test-results/usertest/marcus/marcus-low-tax-stake-success-2026-02-14T09-32-50-835Z.png",
|
||||
"test-results/usertest/marcus/marcus-looking-for-snatch-targets-2026-02-14T09-32-56-378Z.png",
|
||||
"test-results/usertest/marcus/marcus-statistics-section-2026-02-14T09-32-58-090Z.png",
|
||||
"test-results/usertest/marcus/marcus-final-dashboard-2026-02-14T09-33-00-896Z.png"
|
||||
],
|
||||
"uiObservations": [
|
||||
"Lands on app, immediately skeptical - what's the catch?",
|
||||
"Connected wallet - now looking for contract addresses to verify on Basescan",
|
||||
"Scrolling through UI looking for audit report link...",
|
||||
"Found cheats page - good for testing edge cases quickly",
|
||||
"Testing small swap first to check slippage behavior",
|
||||
"Now testing larger swap to probe liquidity depth",
|
||||
"Examining stake interface - looking for snatching mechanics explanation",
|
||||
"Staking at 2% tax intentionally - testing if someone can snatch me",
|
||||
"Stake worked at 2% - now waiting to see if I get snatched...",
|
||||
"Scrolling through active positions looking for snatch targets...",
|
||||
"Found 0 active positions. Checking tax rates for snatch opportunities.",
|
||||
"No other positions visible yet - can't test snatching mechanics",
|
||||
"Checking average tax rate and claimed slots - looking for meta trends",
|
||||
"Intrigued but cautious. Mechanics are novel and create genuine PvP opportunity. Would need to see audit, verify contracts on Basescan, and test snatching profitability in production. Missing: clear contract addresses, audit badge, slippage calculator, snatching ROI tool. Three-position liquidity is interesting - need to verify it actually works under manipulation attempts. Would allocate small bag ($2-5k) to test in production, but not going all-in until proven safe."
|
||||
],
|
||||
"copyFeedback": [
|
||||
"Landing page needs \"Audited by X\" badge prominently displayed",
|
||||
"CRITICAL: No visible audit link. Immediate red flag for degens.",
|
||||
"Tax rate selector needs tooltip: \"Higher tax = harder to snatch, lower yield\""
|
||||
],
|
||||
"tokenomicsQuestions": [
|
||||
"What prevents someone from flash-loaning to manipulate VWAP?",
|
||||
"What's the slippage on this tiny swap? Is three-position liquidity working?",
|
||||
"Did I hit the discovery edge? What's the actual buy depth?",
|
||||
"What's the minimum profitable tax spread for snatching? Need a calculator.",
|
||||
"What's the Nash equilibrium tax rate? Is there a dominant strategy?"
|
||||
],
|
||||
"overallSentiment": "Intrigued but cautious. Mechanics are novel and create genuine PvP opportunity. Would need to see audit, verify contracts on Basescan, and test snatching profitability in production. Missing: clear contract addresses, audit badge, slippage calculator, snatching ROI tool. Three-position liquidity is interesting - need to verify it actually works under manipulation attempts. Would allocate small bag ($2-5k) to test in production, but not going all-in until proven safe."
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
{
|
||||
"persona": "marcus-v2",
|
||||
"test": "B",
|
||||
"timestamp": "2026-02-15T17:48:17.182Z",
|
||||
"journey": "staker",
|
||||
"steps": [
|
||||
{
|
||||
"step": "connect-wallet",
|
||||
"screenshot": "test-results/usertest/marcus-v2/01-wallet-connected-1771177708288.png",
|
||||
"feedback": [
|
||||
"Navigating to stake page...",
|
||||
"Connecting wallet...",
|
||||
"✓ Wallet connected successfully"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "verify-existing-position",
|
||||
"screenshot": "test-results/usertest/marcus-v2/02-existing-position-1771177720214.png",
|
||||
"feedback": [
|
||||
"Looking for my existing position created in setup...",
|
||||
"✗ No active positions found - setup may have failed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "execute-snatch",
|
||||
"screenshot": "test-results/usertest/marcus-v2/04-post-snatch-1771177733886.png",
|
||||
"feedback": [
|
||||
"Looking for other positions with lower tax rates to snatch...",
|
||||
"Found 0 total positions visible",
|
||||
"Filling snatch form: amount + higher tax rate...",
|
||||
"Button shows \"Stake\" - may not be snatching or no targets available"
|
||||
]
|
||||
}
|
||||
],
|
||||
"overall": {
|
||||
"friction": [
|
||||
"Position created in setup not visible"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
{
|
||||
"persona": "priya",
|
||||
"test": "B",
|
||||
"timestamp": "2026-02-15T02:50:32.499Z",
|
||||
"journey": "staker",
|
||||
"steps": [
|
||||
{
|
||||
"step": "setup",
|
||||
"feedback": [
|
||||
"Preparing test wallet...",
|
||||
"✓ Wallet funded"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "documentation-audit",
|
||||
"screenshot": "test-results/usertest/priya-b/documentation-audit-1771123845859.png",
|
||||
"feedback": [
|
||||
"Looking for: docs, contract addresses, audit reports, technical specs...",
|
||||
"✓ Documentation link visible - can review technical details",
|
||||
"✓ Found 5 contract address(es) - can verify on Etherscan",
|
||||
"⚠ No copy button - minor friction for address verification",
|
||||
"✓ Audit report accessible - critical for institutional review",
|
||||
"⚠ Protocol parameters not displayed - harder to model behavior",
|
||||
"⚠ No source code link - cannot independently verify implementation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "ui-quality",
|
||||
"screenshot": "test-results/usertest/priya-b/ui-quality-1771123857278.png",
|
||||
"feedback": [
|
||||
"Evaluating UI quality: precision, accuracy, professionalism...",
|
||||
"✓ Found 39 precise numbers - shows data quality",
|
||||
"⚠ No indication if data is live or stale",
|
||||
"Testing edge cases: trying to stake 0...",
|
||||
"✓ Input validation present - handles edge cases gracefully",
|
||||
"✓ Clear units on all values - professional data presentation"
|
||||
]
|
||||
}
|
||||
],
|
||||
"overall": {
|
||||
"friction": []
|
||||
}
|
||||
}
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
{
|
||||
"persona": "priya-v2",
|
||||
"test": "B",
|
||||
"timestamp": "2026-02-15T17:49:30.257Z",
|
||||
"journey": "staker",
|
||||
"steps": [
|
||||
{
|
||||
"step": "connect-wallet",
|
||||
"screenshot": "test-results/usertest/priya-v2/01-fresh-state-1771177781290.png",
|
||||
"feedback": [
|
||||
"Priya (fresh staker) connecting wallet...",
|
||||
"✓ No existing positions (fresh staker)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "fill-amount",
|
||||
"screenshot": "test-results/usertest/priya-v2/02-amount-filled-1771177793612.png",
|
||||
"feedback": [
|
||||
"Filling staking form as a new user...",
|
||||
"✓ Staking Amount input found",
|
||||
"✓ Filled amount: 100 KRK"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "select-tax-rate",
|
||||
"screenshot": "test-results/usertest/priya-v2/03-tax-selected-1771177806774.png",
|
||||
"feedback": [
|
||||
"Selecting tax rate...",
|
||||
"✓ Tax rate selector found",
|
||||
"✓ Selected tax rate index: 5"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "execute-stake",
|
||||
"feedback": [
|
||||
"Completing stake form and executing transaction...",
|
||||
"✗ Stake button not found"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "verify-position",
|
||||
"screenshot": "test-results/usertest/priya-v2/06-final-state-1771177831162.png",
|
||||
"feedback": [
|
||||
"Checking for new position in Active Positions...",
|
||||
"✓ Active Positions section found",
|
||||
"⚠ No positions visible - stake may have failed",
|
||||
"Priya verdict: Stake failed or unclear"
|
||||
]
|
||||
}
|
||||
],
|
||||
"overall": {
|
||||
"friction": [
|
||||
"Stake button not accessible"
|
||||
],
|
||||
"wouldStake": false
|
||||
}
|
||||
}
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
{
|
||||
"personaName": "Sarah Park",
|
||||
"testDate": "2026-02-14T09:35:46.210Z",
|
||||
"pagesVisited": [
|
||||
{
|
||||
"page": "Landing",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 4802,
|
||||
"timestamp": "2026-02-14T09:35:51.215Z"
|
||||
},
|
||||
{
|
||||
"page": "Stake (research)",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 3014,
|
||||
"timestamp": "2026-02-14T09:35:58.960Z"
|
||||
},
|
||||
{
|
||||
"page": "Cheats",
|
||||
"url": "http://localhost:8081/app/#/cheats",
|
||||
"timeSpent": 1029,
|
||||
"timestamp": "2026-02-14T09:36:01.424Z"
|
||||
},
|
||||
{
|
||||
"page": "Stake (attempt)",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 2006,
|
||||
"timestamp": "2026-02-14T09:36:19.504Z"
|
||||
}
|
||||
],
|
||||
"actionsAttempted": [
|
||||
{
|
||||
"action": "Connect wallet",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:35:55.946Z"
|
||||
},
|
||||
{
|
||||
"action": "Mint 20 ETH",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:36:06.122Z"
|
||||
},
|
||||
{
|
||||
"action": "Buy KRK with 0.05 ETH (test)",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:36:09.366Z"
|
||||
},
|
||||
{
|
||||
"action": "Buy KRK with 3.0 ETH total",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:36:15.493Z"
|
||||
},
|
||||
{
|
||||
"action": "Stake 50 KRK at 15% tax",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:36:27.915Z"
|
||||
},
|
||||
{
|
||||
"action": "Stake 50 KRK at 15% tax (conservative)",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T09:36:28.377Z"
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
"test-results/usertest/sarah/sarah-landing-page-2026-02-14T09-35-50-612Z.png",
|
||||
"test-results/usertest/sarah/sarah-looking-for-info-2026-02-14T09-35-51-264Z.png",
|
||||
"test-results/usertest/sarah/sarah-wallet-connected-2026-02-14T09-35-55-414Z.png",
|
||||
"test-results/usertest/sarah/sarah-stake-page-reading-2026-02-14T09-35-58-960Z.png",
|
||||
"test-results/usertest/sarah/sarah-statistics-analysis-2026-02-14T09-35-59-558Z.png",
|
||||
"test-results/usertest/sarah/sarah-test-purchase-complete-2026-02-14T09-36-09-366Z.png",
|
||||
"test-results/usertest/sarah/sarah-stake-form-before-fill-2026-02-14T09-36-19-504Z.png",
|
||||
"test-results/usertest/sarah/stake-form-filled-2026-02-14T09-36-24-199Z.png",
|
||||
"test-results/usertest/sarah/sarah-conservative-stake-success-2026-02-14T09-36-27-915Z.png",
|
||||
"test-results/usertest/sarah/sarah-checking-my-position-2026-02-14T09-36-33-387Z.png",
|
||||
"test-results/usertest/sarah/sarah-final-review-2026-02-14T09-36-36-220Z.png"
|
||||
],
|
||||
"uiObservations": [
|
||||
"Reading landing page carefully before connecting wallet",
|
||||
"Looking for About, Docs, or Team page before doing anything else...",
|
||||
"Deciding to connect wallet after reading available info...",
|
||||
"Wallet connected. Now checking the staking interface details.",
|
||||
"Reading staking dashboard carefully - what are these tax rates about?",
|
||||
"Examining statistics - average tax rate, claimed slots, inflation rate",
|
||||
"Using test environment to simulate before committing real funds",
|
||||
"Starting with a small test purchase to understand the process",
|
||||
"Test purchase successful. Now buying more for actual staking.",
|
||||
"Bought more KRK. Now ready to stake.",
|
||||
"Examining the stake form - trying to understand tax rate implications",
|
||||
"Choosing 15% tax rate to minimize snatch risk - prioritizing safety over yield",
|
||||
"Stake successful! Now monitoring to see if position stays secure.",
|
||||
"Can see my active position. Would want notifications when something changes.",
|
||||
"Comparing this to Aave in my head - Aave is simpler but boring...",
|
||||
"Interested but need more information before committing real funds. The Harberger tax mechanism is intriguing but confusing - I don't fully understand how to optimize my tax rate or what happens if I get snatched. UI is clean but lacks educational content for newcomers. Missing: audit badge, return calculator, risk disclosures, comparison to alternatives, mobile notifications. Would need to monitor my test stake for 1-2 weeks before scaling up. Compared to Aave (8% risk-free), this needs to offer 10-15% to justify the complexity and snatch risk. Verdict: Promising but not ready for my main capital yet."
|
||||
],
|
||||
"copyFeedback": [
|
||||
"Landing page should explain \"What is Harberger tax?\" in simple terms",
|
||||
"No audit badge visible - this is a dealbreaker for me normally, but will test anyway",
|
||||
"The info icon next to \"Staking Dashboard\" helps, but needs more detail on risks",
|
||||
"Tax rate dropdown needs explanation: \"What tax rate should I choose?\"",
|
||||
"Would love a calculator: \"Stake X at Y% tax = Z estimated APY\"",
|
||||
"Need mobile notifications or email alerts for position activity (snatch attempts, tax due)",
|
||||
"Needs a \"Why Kraiken?\" section comparing to traditional staking/lending"
|
||||
],
|
||||
"tokenomicsQuestions": [
|
||||
"Has this been audited by Certik, Trail of Bits, or similar?",
|
||||
"If I stake at 10% tax, what's my expected APY after taxes?",
|
||||
"What happens if I get snatched? Do I lose my principal or just my position?",
|
||||
"How does the 7-day inflation compare to my expected staking returns?",
|
||||
"Is 15% tax high enough to prevent snatching? What's the meta?",
|
||||
"Aave gives me 8% on USDC with zero snatch risk. Why should I use this instead?"
|
||||
],
|
||||
"overallSentiment": "Interested but need more information before committing real funds. The Harberger tax mechanism is intriguing but confusing - I don't fully understand how to optimize my tax rate or what happens if I get snatched. UI is clean but lacks educational content for newcomers. Missing: audit badge, return calculator, risk disclosures, comparison to alternatives, mobile notifications. Would need to monitor my test stake for 1-2 weeks before scaling up. Compared to Aave (8% risk-free), this needs to offer 10-15% to justify the complexity and snatch risk. Verdict: Promising but not ready for my main capital yet."
|
||||
}
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
{
|
||||
"persona": "sarah",
|
||||
"test": "A",
|
||||
"timestamp": "2026-02-14T22:02:07.065Z",
|
||||
"journey": "passive-holder",
|
||||
"steps": [
|
||||
{
|
||||
"step": "landing-page",
|
||||
"screenshot": "test-results/usertest/sarah-a/landing-metrics-1771106529875.png",
|
||||
"feedback": [
|
||||
"Scanning for key metrics: APY, TVL, risk factors...",
|
||||
"✗ No clear APY shown - can't evaluate if this is competitive",
|
||||
"⚠ No TVL shown - harder to gauge protocol maturity",
|
||||
"⚠ No protocol health metrics - how do I assess risk?",
|
||||
"✗ No audit badge or security info - major red flag",
|
||||
"⚠ No contract addresses - want to verify before committing capital"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "get-krk",
|
||||
"screenshot": "test-results/usertest/sarah-a/get-krk-flow-1771106535060.png",
|
||||
"feedback": [
|
||||
"Evaluating acquisition flow - time is money",
|
||||
"⚠ Redirects to external swap - adds friction and gas costs",
|
||||
"✗ No Uniswap link or wrong address - can't verify DEX liquidity",
|
||||
"⚠ No price impact warning - could be surprised by slippage"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "holder-experience",
|
||||
"screenshot": "test-results/usertest/sarah-a/holder-dashboard-1771106550421.png",
|
||||
"feedback": [
|
||||
"Acquiring KRK to evaluate holder experience...",
|
||||
"✗ Acquisition failed: execution reverted: \"SPL\" (action=\"estimateGas\", data=\"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000353504c0000000000000000000000000000000000000000000000000000000000\", reason=\"SPL\", transaction={ \"data\": \"0x04e45aaf0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ff196f1e3a895404d073b8611252cf97388773a70000000000000000000000000000000000000000000000000000000000002710000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb922660000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"from\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\", \"to\": \"0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4\" }, invocation=null, revert={ \"args\": [ \"SPL\" ], \"name\": \"Error\", \"signature\": \"Error(string)\" }, code=CALL_EXCEPTION, version=6.15.0)",
|
||||
"Now holding KRK - what ongoing value does landing page provide?",
|
||||
"✗ No real-time data - no reason to return to landing page",
|
||||
"⚠ No protocol health dashboard - can't monitor protocol risk",
|
||||
"⚠ No links to Dune/DexScreener - harder to do deep analysis",
|
||||
"Sarah's verdict: Not competitive enough",
|
||||
"Would return: No, one-time interaction only"
|
||||
]
|
||||
}
|
||||
],
|
||||
"overall": {
|
||||
"friction": [
|
||||
"No yield/APY displayed on landing page",
|
||||
"Missing protocol health/risk indicators",
|
||||
"No visible audit/security credentials",
|
||||
"Cannot verify DEX liquidity before buying",
|
||||
"Programmatic acquisition flow broken",
|
||||
"Landing page provides no ongoing value for holders",
|
||||
"Insufficient monitoring/analytics tools for active yield farmers"
|
||||
],
|
||||
"wouldBuy": false,
|
||||
"wouldReturn": false
|
||||
}
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
{
|
||||
"persona": "sarah-v2",
|
||||
"test": "B",
|
||||
"timestamp": "2026-02-15T17:48:54.788Z",
|
||||
"journey": "staker",
|
||||
"steps": [
|
||||
{
|
||||
"step": "view-position",
|
||||
"screenshot": "test-results/usertest/sarah-v2/01-view-position-1771177746036.png",
|
||||
"feedback": [
|
||||
"Sarah connecting to view her staked position...",
|
||||
"✗ Position not found - may have been snatched"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "check-pnl",
|
||||
"screenshot": "test-results/usertest/sarah-v2/02-pnl-analysis-1771177757582.png",
|
||||
"feedback": [
|
||||
"Analyzing P&L metrics for risk assessment...",
|
||||
"✗ P&L metrics not visible",
|
||||
"⚠ Time held not visible"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "exit-position",
|
||||
"screenshot": "test-results/usertest/sarah-v2/03-no-position-1771177769529.png",
|
||||
"feedback": [
|
||||
"Exiting position to recover KRK...",
|
||||
"✗ No position to exit - may have been snatched already"
|
||||
]
|
||||
}
|
||||
],
|
||||
"overall": {
|
||||
"friction": [
|
||||
"P&L display missing",
|
||||
"Position disappeared before exit"
|
||||
]
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB |
|
|
@ -1,95 +0,0 @@
|
|||
{
|
||||
"personaName": "Tyler Bags Morrison",
|
||||
"testDate": "2026-02-14T10:37:23.887Z",
|
||||
"pagesVisited": [
|
||||
{
|
||||
"page": "Landing (glanced)",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 3387,
|
||||
"timestamp": "2026-02-14T10:37:27.756Z"
|
||||
},
|
||||
{
|
||||
"page": "Cheats",
|
||||
"url": "http://localhost:8081/app/#/cheats",
|
||||
"timeSpent": 1013,
|
||||
"timestamp": "2026-02-14T10:37:32.945Z"
|
||||
},
|
||||
{
|
||||
"page": "Stake",
|
||||
"url": "http://localhost:8081/app/#/stake",
|
||||
"timeSpent": 3010,
|
||||
"timestamp": "2026-02-14T10:37:49.125Z"
|
||||
}
|
||||
],
|
||||
"actionsAttempted": [
|
||||
{
|
||||
"action": "Connect wallet",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T10:37:31.909Z"
|
||||
},
|
||||
{
|
||||
"action": "Mint 10 ETH",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T10:37:37.065Z"
|
||||
},
|
||||
{
|
||||
"action": "Buy KRK with 4.0 ETH total",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T10:37:40.260Z"
|
||||
},
|
||||
{
|
||||
"action": "Stake 50 KRK at 5% tax",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T10:37:57.887Z"
|
||||
},
|
||||
{
|
||||
"action": "Stake 75 KRK at 5% tax (random)",
|
||||
"success": true,
|
||||
"timestamp": "2026-02-14T10:37:58.468Z"
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
"test-results/usertest/tyler/tyler-landing-page-2026-02-14T10-37-26-711Z.png",
|
||||
"test-results/usertest/tyler/tyler-wallet-connected-2026-02-14T10-37-31-370Z.png",
|
||||
"test-results/usertest/tyler/tyler-found-cheats-2026-02-14T10-37-32-945Z.png",
|
||||
"test-results/usertest/tyler/tyler-bought-krk-2026-02-14T10-37-40-260Z.png",
|
||||
"test-results/usertest/tyler/tyler-stake-page-2026-02-14T10-37-49-125Z.png",
|
||||
"test-results/usertest/tyler/stake-form-filled-2026-02-14T10-37-53-878Z.png",
|
||||
"test-results/usertest/tyler/tyler-staked-2026-02-14T10-37-57-887Z.png",
|
||||
"test-results/usertest/tyler/tyler-checking-gains-2026-02-14T10-38-03-482Z.png",
|
||||
"test-results/usertest/tyler/tyler-confused-about-snatching-2026-02-14T10-38-04-203Z.png",
|
||||
"test-results/usertest/tyler/tyler-final-confused-state-2026-02-14T10-38-07-201Z.png"
|
||||
],
|
||||
"uiObservations": [
|
||||
"Cool looking app! Let's goooo 🚀",
|
||||
"Connecting wallet right away - don't need to read docs",
|
||||
"Wallet connected! Where do I buy?",
|
||||
"Looking for a buy button... where is it?",
|
||||
"Found this \"Cheat Console\" page - looks like I can buy here?",
|
||||
"Need ETH first I guess... clicking buttons",
|
||||
"Got some ETH! Now buying KRK!",
|
||||
"Buying $150 worth (all I can afford) LFG!!! 🔥",
|
||||
"BOUGHT! Let's stake this and get rich!",
|
||||
"Stake page! Time to stake everything and make passive income",
|
||||
"Picking 5% because it sounds good I guess... middle of the road?",
|
||||
"STAKED! Wen moon? 🌙",
|
||||
"Where are my gains? How much am I making per day?",
|
||||
"Wait... what does \"tax\" mean? Am I PAYING tax or EARNING tax?",
|
||||
"Still don't understand what \"Harberger tax\" means but whatever",
|
||||
"Need to ask in Discord: \"why did I get snatched already??\"",
|
||||
"Can't find community - feeling alone and confused",
|
||||
"Confused and frustrated but still hopeful. I bought in because it looked cool and seemed like a way to make passive income, but now I'm lost. Don't understand tax rates, don't know when I get paid, worried someone will snatch my position. App needs MUCH simpler onboarding - like a tutorial or a \"Beginner Mode\" that picks settings for me. If I don't see gains in a few days OR if I get snatched without understanding why, I'm selling and moving to the next thing. Needs: Big simple buttons, profit tracker, Discord link, tutorial video, and NO JARGON. Also, make it fun! Where are the memes? Where's the leaderboard? Make me want to share this on Twitter."
|
||||
],
|
||||
"copyFeedback": [
|
||||
"Needs bigger \"BUY NOW\" button on landing page",
|
||||
"What's all this \"tax rate\" stuff? Too complicated, just want to stake",
|
||||
"Needs a big \"Your Daily Earnings: $X\" display - can't see my profits",
|
||||
"CRITICAL: The word \"tax\" is confusing! Call it \"yield rate\" or something",
|
||||
"No Discord or Twitter link visible! How do I ask questions?"
|
||||
],
|
||||
"tokenomicsQuestions": [
|
||||
"Do I make more money with higher or lower tax? Idk???",
|
||||
"When do I get paid? Where do I see my rewards?"
|
||||
],
|
||||
"overallSentiment": "Confused and frustrated but still hopeful. I bought in because it looked cool and seemed like a way to make passive income, but now I'm lost. Don't understand tax rates, don't know when I get paid, worried someone will snatch my position. App needs MUCH simpler onboarding - like a tutorial or a \"Beginner Mode\" that picks settings for me. If I don't see gains in a few days OR if I get snatched without understanding why, I'm selling and moving to the next thing. Needs: Big simple buttons, profit tracker, Discord link, tutorial video, and NO JARGON. Also, make it fun! Where are the memes? Where's the leaderboard? Make me want to share this on Twitter."
|
||||
}
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
{
|
||||
"persona": "tyler",
|
||||
"test": "A",
|
||||
"timestamp": "2026-02-14T22:01:13.361Z",
|
||||
"journey": "passive-holder",
|
||||
"steps": [
|
||||
{
|
||||
"step": "landing-page",
|
||||
"screenshot": "test-results/usertest/tyler-a/landing-page-1771106476861.png",
|
||||
"feedback": [
|
||||
"Scanning page... do I see APY numbers? Big buttons? What's the hook?",
|
||||
"✗ No clear \"Get KRK\" button visible - where do I start?",
|
||||
"✗ No flashy APY or TVL numbers - nothing to grab my attention",
|
||||
"✓ Copy is relatively clean, not too technical",
|
||||
"Missing: No visible protocol health/stats - how do I know this isn't rugpull?",
|
||||
"Tyler's verdict: FAIL: Not sold in 30 seconds. Needs bigger numbers and clearer value prop."
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "get-krk",
|
||||
"screenshot": "test-results/usertest/tyler-a/get-krk-page-1771106481985.png",
|
||||
"feedback": [
|
||||
"✗ Get KRK button went to wrong place: http://localhost:8081/#/app",
|
||||
"✗ No Uniswap link found - how do I actually get KRK?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"step": "return-value",
|
||||
"screenshot": "test-results/usertest/tyler-a/return-check-1771106501427.png",
|
||||
"feedback": [
|
||||
"Buying KRK via on-chain swap...",
|
||||
"✓ Successfully acquired KRK via swap",
|
||||
"Now I have KRK... why would I come back to landing page?",
|
||||
"✗ No compelling reason to return to landing page - just a static ad"
|
||||
]
|
||||
}
|
||||
],
|
||||
"overall": {
|
||||
"friction": [
|
||||
"Landing page offers no ongoing value for holders",
|
||||
"Landing page is one-time conversion, no repeat visit value"
|
||||
],
|
||||
"wouldBuy": true,
|
||||
"wouldReturn": false
|
||||
}
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "alex",
|
||||
"variant": "a",
|
||||
"firstImpression": "7/10 - Seems understandable",
|
||||
"wouldClickCTA": "no - Too much jargon - I don't understand",
|
||||
"trustLevel": "7/10 - Worried about scams",
|
||||
"excitement": "5/10 - Skeptical and confused",
|
||||
"topComplaint": "Too much jargon - I don't understand",
|
||||
"whatWouldMakeThemBuy": "More trust signals and real user testimonials",
|
||||
"wouldShare": "no - too risky/confusing to recommend",
|
||||
"specificCopyFeedback": "Good: has clear explanations. Needs more safety assurances"
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "alex",
|
||||
"variant": "b",
|
||||
"firstImpression": "7/10 - Seems understandable",
|
||||
"wouldClickCTA": "no - Too much jargon - I don't understand",
|
||||
"trustLevel": "5/10 - Worried about scams",
|
||||
"excitement": "7/10 - Interested if it's real",
|
||||
"topComplaint": "Too much jargon - I don't understand",
|
||||
"whatWouldMakeThemBuy": "More trust signals and real user testimonials",
|
||||
"wouldShare": "no - too risky/confusing to recommend",
|
||||
"specificCopyFeedback": "Good: has clear explanations. Needs more safety assurances"
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "alex",
|
||||
"variant": "c",
|
||||
"firstImpression": "7/10 - Seems understandable",
|
||||
"wouldClickCTA": "yes - feels safe enough to learn more",
|
||||
"trustLevel": "5/10 - Worried about scams",
|
||||
"excitement": "7/10 - Interested if it's real",
|
||||
"topComplaint": "Too much jargon - I don't understand",
|
||||
"whatWouldMakeThemBuy": "More trust signals and real user testimonials",
|
||||
"wouldShare": "no - too risky/confusing to recommend",
|
||||
"specificCopyFeedback": "Good: has clear explanations. Trust signals present (protected)"
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "marcus",
|
||||
"variant": "a",
|
||||
"firstImpression": "7/10 - Needs more degen energy",
|
||||
"wouldClickCTA": "no - Weak CTA - where's the 'ape in' button?",
|
||||
"trustLevel": "8/10 - Anti-rug messaging resonates",
|
||||
"excitement": "7/10 - This could moon",
|
||||
"topComplaint": "Weak CTA - where's the 'ape in' button?",
|
||||
"whatWouldMakeThemBuy": "Already has some good hooks, needs more social proof (TVL, user count)",
|
||||
"wouldShare": "yes - Good RT material: \"can't be rugged\"",
|
||||
"specificCopyFeedback": "Strong: \"can't be rugged\" "
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "marcus",
|
||||
"variant": "b",
|
||||
"firstImpression": "7/10 - Needs more degen energy",
|
||||
"wouldClickCTA": "yes - CTA speaks my language",
|
||||
"trustLevel": "7/10 - Needs more proof it works",
|
||||
"excitement": "7/10 - This could moon",
|
||||
"topComplaint": "Not enough hype",
|
||||
"whatWouldMakeThemBuy": "More FOMO triggers, clearer edge/alpha signal",
|
||||
"wouldShare": "yes - Interesting enough",
|
||||
"specificCopyFeedback": "Needs more edge. alpha, moon, ape would hit better. "
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "marcus",
|
||||
"variant": "c",
|
||||
"firstImpression": "7/10 - Needs more degen energy",
|
||||
"wouldClickCTA": "yes - CTA speaks my language",
|
||||
"trustLevel": "8/10 - Anti-rug messaging resonates",
|
||||
"excitement": "7/10 - This could moon",
|
||||
"topComplaint": "Not enough hype",
|
||||
"whatWouldMakeThemBuy": "More FOMO triggers, clearer edge/alpha signal",
|
||||
"wouldShare": "yes - Interesting enough",
|
||||
"specificCopyFeedback": "Needs more edge. alpha, moon, ape would hit better. "
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "sarah",
|
||||
"variant": "a",
|
||||
"firstImpression": "6/10 - No yield data visible",
|
||||
"wouldClickCTA": "no - No yield numbers - what's the APY?",
|
||||
"trustLevel": "7/10 - Shows some risk awareness",
|
||||
"excitement": "5/10 - Need more concrete data",
|
||||
"topComplaint": "No yield numbers - what's the APY?",
|
||||
"whatWouldMakeThemBuy": "Show me the APY, risk-adjusted returns, and audit reports",
|
||||
"wouldShare": "no - not enough data to recommend",
|
||||
"specificCopyFeedback": "Missing: APY/yield numbers, risk metrics, comparison to Aave/Compound rates. "
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "sarah",
|
||||
"variant": "b",
|
||||
"firstImpression": "6/10 - No yield data visible",
|
||||
"wouldClickCTA": "no - No yield numbers - what's the APY?",
|
||||
"trustLevel": "7/10 - Shows some risk awareness",
|
||||
"excitement": "5/10 - Need more concrete data",
|
||||
"topComplaint": "No yield numbers - what's the APY?",
|
||||
"whatWouldMakeThemBuy": "Show me the APY, risk-adjusted returns, and audit reports",
|
||||
"wouldShare": "no - not enough data to recommend",
|
||||
"specificCopyFeedback": "Missing: APY/yield numbers, risk metrics, comparison to Aave/Compound rates. "
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"persona": "sarah",
|
||||
"variant": "c",
|
||||
"firstImpression": "6/10 - No yield data visible",
|
||||
"wouldClickCTA": "no - No yield numbers - what's the APY?",
|
||||
"trustLevel": "7/10 - Shows some risk awareness",
|
||||
"excitement": "5/10 - Need more concrete data",
|
||||
"topComplaint": "No yield numbers - what's the APY?",
|
||||
"whatWouldMakeThemBuy": "Show me the APY, risk-adjusted returns, and audit reports",
|
||||
"wouldShare": "no - not enough data to recommend",
|
||||
"specificCopyFeedback": "Missing: APY/yield numbers, risk metrics, comparison to Aave/Compound rates. "
|
||||
}
|
||||
|
|
@ -1,339 +0,0 @@
|
|||
import { chromium } from 'playwright';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
const variants = [
|
||||
{ id: 'a', url: 'http://127.0.0.1:8081/#/', name: 'defensive' },
|
||||
{ id: 'b', url: 'http://127.0.0.1:8081/#/offensive', name: 'offensive' },
|
||||
{ id: 'c', url: 'http://127.0.0.1:8081/#/mixed', name: 'mixed' }
|
||||
];
|
||||
|
||||
const personas = [
|
||||
{
|
||||
id: 'marcus',
|
||||
name: 'Marcus (degen)',
|
||||
profile: 'CT native, trades memecoins, responds to: hype, FOMO, edge, "alpha". Hates: corporate speak, "safe" language. Wants: to ape fast. Benchmark: "would I RT this?"',
|
||||
evaluator: (text) => evaluateMarcus(text)
|
||||
},
|
||||
{
|
||||
id: 'sarah',
|
||||
name: 'Sarah (yield farmer)',
|
||||
profile: 'Uses Aave/Compound, wants 8%+ yield. Responds to: numbers, APY, risk metrics. Hates: vague promises, no data. Benchmark: "better risk-adjusted than my Aave position?"',
|
||||
evaluator: (text) => evaluateSarah(text)
|
||||
},
|
||||
{
|
||||
id: 'alex',
|
||||
name: 'Alex (newcomer)',
|
||||
profile: 'First DeFi exposure, scared of scams. Responds to: clarity, trust signals, simplicity. Hates: jargon, hype. Benchmark: "do I understand what this does and trust it?"',
|
||||
evaluator: (text) => evaluateAlex(text)
|
||||
}
|
||||
];
|
||||
|
||||
function evaluateMarcus(text) {
|
||||
const textLower = text.toLowerCase();
|
||||
|
||||
// Check for hype/edge language
|
||||
const hypeWords = ['alpha', 'moon', 'ape', 'degen', 'chad', 'gm', 'ngmi', 'wagmi', 'lfg', 'fomo'];
|
||||
const hypeCount = hypeWords.filter(w => textLower.includes(w)).length;
|
||||
|
||||
// Check for corporate/safe language (negative)
|
||||
const corporateWords = ['compliance', 'regulation', 'safe', 'secure', 'trusted', 'enterprise'];
|
||||
const corporateCount = corporateWords.filter(w => textLower.includes(w)).length;
|
||||
|
||||
// Look for action-oriented CTAs
|
||||
const hasStrongCTA = /launch|trade|ape|buy|get in|join/i.test(text);
|
||||
|
||||
// Check for AI/trading edge mentions
|
||||
const hasEdge = /ai|bot|automated|trades.*sleep|24\/7|algorithm/i.test(text);
|
||||
|
||||
// Extract specific compelling phrases
|
||||
const compellingPhrases = [];
|
||||
if (text.includes("can't be rugged")) compellingPhrases.push("can't be rugged");
|
||||
if (text.includes("trades while you sleep")) compellingPhrases.push("trades while you sleep");
|
||||
if (text.includes("without the rug pull")) compellingPhrases.push("without the rug pull");
|
||||
|
||||
// Scoring
|
||||
let firstImpression = 5;
|
||||
if (hypeCount > 2) firstImpression += 2;
|
||||
if (hasEdge) firstImpression += 2;
|
||||
if (corporateCount > 2) firstImpression -= 2;
|
||||
firstImpression = Math.max(1, Math.min(10, firstImpression));
|
||||
|
||||
let excitement = 5;
|
||||
if (hypeCount > 1) excitement += 2;
|
||||
if (hasEdge) excitement += 2;
|
||||
if (corporateCount > 1) excitement -= 2;
|
||||
excitement = Math.max(1, Math.min(10, excitement));
|
||||
|
||||
let trustLevel = 6; // Degens trust the memes
|
||||
if (textLower.includes('rug')) trustLevel += 1;
|
||||
if (textLower.includes('ai')) trustLevel += 1;
|
||||
trustLevel = Math.max(1, Math.min(10, trustLevel));
|
||||
|
||||
const wouldClickCTA = hasStrongCTA && (hypeCount > 0 || hasEdge);
|
||||
const wouldShare = excitement >= 7;
|
||||
|
||||
let topComplaint = "Not enough hype";
|
||||
if (corporateCount > 2) topComplaint = "Too corporate, not degen enough";
|
||||
if (!hasStrongCTA) topComplaint = "Weak CTA - where's the 'ape in' button?";
|
||||
|
||||
let whatWouldMakeThemBuy = "More FOMO triggers, clearer edge/alpha signal";
|
||||
if (compellingPhrases.length > 0) whatWouldMakeThemBuy = "Already has some good hooks, needs more social proof (TVL, user count)";
|
||||
|
||||
return {
|
||||
firstImpression: `${firstImpression}/10 - ${hypeCount > 1 ? 'Has some edge/hype vibes' : 'Needs more degen energy'}`,
|
||||
wouldClickCTA: wouldClickCTA ? `yes - ${hasStrongCTA ? 'CTA speaks my language' : 'curious about the tech'}` : `no - ${topComplaint}`,
|
||||
trustLevel: `${trustLevel}/10 - ${textLower.includes('rug') ? 'Anti-rug messaging resonates' : 'Needs more proof it works'}`,
|
||||
excitement: `${excitement}/10 - ${excitement >= 7 ? 'This could moon' : 'Meh, seen similar'}`,
|
||||
topComplaint,
|
||||
whatWouldMakeThemBuy,
|
||||
wouldShare: wouldShare ? `yes - ${compellingPhrases.length > 0 ? `Good RT material: "${compellingPhrases[0]}"` : 'Interesting enough'}` : 'no - not spicy enough for CT',
|
||||
specificCopyFeedback: compellingPhrases.length > 0
|
||||
? `Strong: "${compellingPhrases.join('", "')}" ${corporateCount > 1 ? '| Weak: too much safe/corporate language' : ''}`
|
||||
: `Needs more edge. ${hypeWords.slice(0, 3).join(', ')} would hit better. ${corporateCount > 1 ? 'Ditch the corporate speak.' : ''}`
|
||||
};
|
||||
}
|
||||
|
||||
function evaluateSarah(text) {
|
||||
const textLower = text.toLowerCase();
|
||||
|
||||
// Check for numbers/metrics
|
||||
const hasAPY = /\d+%|\d+\s*percent|apy|yield|return/i.test(text);
|
||||
const hasNumbers = (text.match(/\d+/g) || []).length;
|
||||
|
||||
// Check for risk/safety mentions
|
||||
const hasRiskInfo = /risk|audit|security|transparent|verified/i.test(text);
|
||||
|
||||
// Check for DeFi comparisons
|
||||
const mentionsCompetitors = /aave|compound|curve|convex/i.test(text);
|
||||
|
||||
// Check for vague promises (negative)
|
||||
const vaguePromises = /revolutionary|game-changing|disrupting|amazing|incredible/i.test(text);
|
||||
|
||||
// Extract specific numbers
|
||||
const numbers = text.match(/\d+\.?\d*%?/g) || [];
|
||||
|
||||
// Scoring
|
||||
let firstImpression = 5;
|
||||
if (hasAPY) firstImpression += 2;
|
||||
if (hasNumbers > 3) firstImpression += 1;
|
||||
if (vaguePromises) firstImpression -= 2;
|
||||
firstImpression = Math.max(1, Math.min(10, firstImpression));
|
||||
|
||||
let trustLevel = 5;
|
||||
if (hasRiskInfo) trustLevel += 2;
|
||||
if (hasAPY) trustLevel += 1;
|
||||
if (vaguePromises) trustLevel -= 2;
|
||||
trustLevel = Math.max(1, Math.min(10, trustLevel));
|
||||
|
||||
let excitement = 4; // Skeptical by default
|
||||
if (hasAPY && hasNumbers > 5) excitement += 3;
|
||||
if (hasRiskInfo) excitement += 1;
|
||||
excitement = Math.max(1, Math.min(10, excitement));
|
||||
|
||||
const wouldClickCTA = hasAPY && hasRiskInfo;
|
||||
const wouldShare = excitement >= 7 && hasAPY;
|
||||
|
||||
let topComplaint = "No yield numbers - what's the APY?";
|
||||
if (vaguePromises) topComplaint = "Too much hype, not enough data";
|
||||
if (!hasRiskInfo) topComplaint = "No risk metrics or audit info";
|
||||
|
||||
let whatWouldMakeThemBuy = "Show me the APY, risk-adjusted returns, and audit reports";
|
||||
if (hasAPY) whatWouldMakeThemBuy = "More detail on how yields are generated and sustained";
|
||||
|
||||
return {
|
||||
firstImpression: `${firstImpression}/10 - ${hasAPY ? 'Has some numbers' : 'No yield data visible'}`,
|
||||
wouldClickCTA: wouldClickCTA ? 'yes - enough data to explore further' : `no - ${topComplaint}`,
|
||||
trustLevel: `${trustLevel}/10 - ${hasRiskInfo ? 'Shows some risk awareness' : 'Missing critical risk/audit info'}`,
|
||||
excitement: `${excitement}/10 - ${excitement >= 7 ? 'Numbers look interesting' : 'Need more concrete data'}`,
|
||||
topComplaint,
|
||||
whatWouldMakeThemBuy,
|
||||
wouldShare: wouldShare ? 'yes - solid risk-adjusted opportunity' : 'no - not enough data to recommend',
|
||||
specificCopyFeedback: hasAPY
|
||||
? `Good: ${numbers.slice(0, 3).join(', ')} shown | Needs: more breakdown of yield sources and risks`
|
||||
: `Missing: APY/yield numbers, risk metrics, comparison to Aave/Compound rates. ${vaguePromises ? 'Remove vague promises, add hard data.' : ''}`
|
||||
};
|
||||
}
|
||||
|
||||
function evaluateAlex(text) {
|
||||
const textLower = text.toLowerCase();
|
||||
|
||||
// Check for clarity
|
||||
const hasSimpleExplanation = /what is|how it works|step|simple|easy/i.test(text);
|
||||
const hasClearValue = /earn|make money|profit|income|passive/i.test(text);
|
||||
|
||||
// Check for jargon (negative)
|
||||
const jargonWords = ['liquidity', 'amm', 'tvl', 'dex', 'yield farming', 'impermanent loss', 'slippage'];
|
||||
const jargonCount = jargonWords.filter(w => textLower.includes(w)).length;
|
||||
|
||||
// Check for trust signals
|
||||
const trustSignals = ['audit', 'secure', 'safe', 'protected', 'insurance', 'verified'];
|
||||
const trustCount = trustSignals.filter(w => textLower.includes(w)).length;
|
||||
|
||||
// Check for excessive hype (negative)
|
||||
const hypeWords = ['moon', 'ape', 'degen', 'chad', 'gm'];
|
||||
const hypeCount = hypeWords.filter(w => textLower.includes(w)).length;
|
||||
|
||||
// Scoring
|
||||
let firstImpression = 5;
|
||||
if (hasSimpleExplanation) firstImpression += 2;
|
||||
if (jargonCount > 3) firstImpression -= 2;
|
||||
if (hypeCount > 0) firstImpression -= 1;
|
||||
firstImpression = Math.max(1, Math.min(10, firstImpression));
|
||||
|
||||
let trustLevel = 5;
|
||||
if (trustCount > 1) trustLevel += 2;
|
||||
if (textLower.includes('rug') && textLower.includes("can't")) trustLevel += 2;
|
||||
if (hypeCount > 1) trustLevel -= 2;
|
||||
trustLevel = Math.max(1, Math.min(10, trustLevel));
|
||||
|
||||
let excitement = 5;
|
||||
if (hasClearValue) excitement += 2;
|
||||
if (jargonCount > 3) excitement -= 2;
|
||||
excitement = Math.max(1, Math.min(10, excitement));
|
||||
|
||||
const wouldClickCTA = hasSimpleExplanation && trustCount > 0 && jargonCount < 3;
|
||||
const wouldShare = trustLevel >= 7 && excitement >= 6;
|
||||
|
||||
let topComplaint = "Too much jargon - I don't understand";
|
||||
if (hypeCount > 1) topComplaint = "Feels scammy with all the hype";
|
||||
if (!hasSimpleExplanation) topComplaint = "Doesn't explain what it actually does";
|
||||
|
||||
let whatWouldMakeThemBuy = "Clear explanation of what it does, how I make money, and why it's safe";
|
||||
if (hasSimpleExplanation) whatWouldMakeThemBuy = "More trust signals and real user testimonials";
|
||||
|
||||
return {
|
||||
firstImpression: `${firstImpression}/10 - ${hasSimpleExplanation ? 'Seems understandable' : 'Confused about what this does'}`,
|
||||
wouldClickCTA: wouldClickCTA ? 'yes - feels safe enough to learn more' : `no - ${topComplaint}`,
|
||||
trustLevel: `${trustLevel}/10 - ${trustCount > 1 ? 'Has some trust signals' : 'Worried about scams'}`,
|
||||
excitement: `${excitement}/10 - ${excitement >= 6 ? 'Interested if it\'s real' : 'Skeptical and confused'}`,
|
||||
topComplaint,
|
||||
whatWouldMakeThemBuy,
|
||||
wouldShare: wouldShare ? 'yes - would recommend to friends' : 'no - too risky/confusing to recommend',
|
||||
specificCopyFeedback: jargonCount > 2
|
||||
? `Too much jargon: ${jargonWords.filter(w => textLower.includes(w)).slice(0, 3).join(', ')}. Explain in plain English. ${hypeCount > 0 ? 'Hype language makes it feel less trustworthy.' : ''}`
|
||||
: `Good: ${hasSimpleExplanation ? 'has clear explanations' : 'not too technical'}. ${trustCount > 0 ? `Trust signals present (${trustSignals.filter(w => textLower.includes(w)).slice(0, 2).join(', ')})` : 'Needs more safety assurances'}`
|
||||
};
|
||||
}
|
||||
|
||||
async function captureScreenshotCDP(page, filepath) {
|
||||
const cdp = await page.context().newCDPSession(page);
|
||||
const { data } = await cdp.send('Page.captureScreenshot', { format: 'png' });
|
||||
fs.writeFileSync(filepath, Buffer.from(data, 'base64'));
|
||||
console.log(` ✓ Screenshot saved: ${filepath}`);
|
||||
}
|
||||
|
||||
async function testVariant(browser, variant) {
|
||||
console.log(`\n=== Testing variant ${variant.id.toUpperCase()}: ${variant.name} (${variant.url}) ===`);
|
||||
|
||||
const page = await browser.newPage();
|
||||
|
||||
// Block fonts to avoid hangs
|
||||
await page.route('**/*fonts*', r => r.abort());
|
||||
await page.route('**/*analytics*', r => r.abort());
|
||||
await page.route('**/*gtag*', r => r.abort());
|
||||
|
||||
// Navigate with commit waitUntil
|
||||
console.log(`Navigating to ${variant.url}...`);
|
||||
await page.goto(variant.url, { waitUntil: 'commit' });
|
||||
|
||||
// Wait for Vue to render
|
||||
console.log('Waiting 6 seconds for Vue to render...');
|
||||
await page.waitForTimeout(6000);
|
||||
|
||||
// Create screenshots directory
|
||||
const screenshotDir = path.join(__dirname, 'usertest-results', 'screenshots', variant.id);
|
||||
fs.mkdirSync(screenshotDir, { recursive: true });
|
||||
|
||||
// Take screenshots at different scroll positions
|
||||
const scrollPositions = [
|
||||
{ name: 'hero', y: 0 },
|
||||
{ name: 'scroll-800', y: 800 },
|
||||
{ name: 'scroll-1600', y: 1600 },
|
||||
{ name: 'scroll-2400', y: 2400 }
|
||||
];
|
||||
|
||||
for (const pos of scrollPositions) {
|
||||
console.log(`Taking screenshot at ${pos.name} (y=${pos.y})...`);
|
||||
await page.evaluate((y) => window.scrollTo(0, y), pos.y);
|
||||
await page.waitForTimeout(500); // Let scroll settle
|
||||
|
||||
const filepath = path.join(screenshotDir, `${pos.name}.png`);
|
||||
await captureScreenshotCDP(page, filepath);
|
||||
}
|
||||
|
||||
// Scroll back to top
|
||||
await page.evaluate(() => window.scrollTo(0, 0));
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Extract all visible text
|
||||
console.log('Extracting visible text...');
|
||||
const pageText = await page.evaluate(() => document.body.innerText);
|
||||
|
||||
// Save extracted text
|
||||
const textPath = path.join(__dirname, 'usertest-results', `text-${variant.id}.txt`);
|
||||
fs.writeFileSync(textPath, pageText);
|
||||
console.log(` ✓ Text saved: ${textPath}`);
|
||||
console.log(` Text length: ${pageText.length} chars`);
|
||||
|
||||
await page.close();
|
||||
|
||||
return pageText;
|
||||
}
|
||||
|
||||
async function generateEvaluations(variant, pageText) {
|
||||
console.log(`\n=== Generating evaluations for variant ${variant.id.toUpperCase()} ===`);
|
||||
|
||||
const resultsDir = path.join(__dirname, 'usertest-results');
|
||||
fs.mkdirSync(resultsDir, { recursive: true });
|
||||
|
||||
for (const persona of personas) {
|
||||
console.log(`Evaluating for ${persona.name}...`);
|
||||
|
||||
const evaluation = persona.evaluator(pageText);
|
||||
const result = {
|
||||
persona: persona.id,
|
||||
variant: variant.id,
|
||||
...evaluation
|
||||
};
|
||||
|
||||
const filepath = path.join(resultsDir, `visual-feedback-${persona.id}-${variant.id}.json`);
|
||||
fs.writeFileSync(filepath, JSON.stringify(result, null, 2));
|
||||
console.log(` ✓ Saved: ${filepath}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
console.log('Starting Playwright user testing...');
|
||||
console.log(`Chromium path: ${process.env.HOME}/.cache/ms-playwright/chromium-1209/chrome-linux64/chrome`);
|
||||
|
||||
const browser = await chromium.launch({
|
||||
headless: true,
|
||||
executablePath: `${process.env.HOME}/.cache/ms-playwright/chromium-1209/chrome-linux64/chrome`
|
||||
});
|
||||
|
||||
console.log('Browser launched successfully');
|
||||
|
||||
try {
|
||||
// Test each variant
|
||||
for (const variant of variants) {
|
||||
const pageText = await testVariant(browser, variant);
|
||||
await generateEvaluations(variant, pageText);
|
||||
}
|
||||
|
||||
console.log('\n✅ All tests completed successfully!');
|
||||
console.log(`Results saved to: ${path.join(__dirname, 'usertest-results')}`);
|
||||
|
||||
} finally {
|
||||
await browser.close();
|
||||
console.log('Browser closed');
|
||||
}
|
||||
}
|
||||
|
||||
main().catch(error => {
|
||||
console.error('Error:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue