[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M75BSFHTF79GWDHSDPP2VQ9G":3,"skill-same:01M75BSFHTF79GWDHSDPP2VQ9G":55},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":32,"commitSha":33,"skillDirectory":34,"forksCount":35,"repositoryHtmlUrl":36,"repositoryHomepageUrl":6,"ownerHtmlUrl":37,"ownerBlogUrl":38,"ownerDescription":39,"updatedAt":40,"install":41,"resources":54},"01M75BSFHTF79GWDHSDPP2VQ9G","nova-act-usability",null,"AI-orchestrated usability testing using Amazon Nova Act. The agent generates personas, runs tests to collect raw data, interprets responses to determine goal achievement, and generates HTML reports. Tests real user workflows (booking, checkout, posting) with safety guardrails. Use when asked to \"test website usability\", \"run usability test\", \"generate usability report\", \"evaluate user experience\", \"test checkout flow\", \"test booking process\", or \"analyze website UX\".","javimosch\u002Fopen-claw-skills","javimosch","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F12900508?v=4","01M6D3F2AS6PV75ET9PZ1QGP8J","Javier Leandro Arancibia","01M75B8NCTAJG9WH5YNZH7C3D8",0,"MIT","https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fadityak6798\u002Fwebsite-usability-test-nova-act\u002FSKILL.md",[],[],"2026-11-12 13:55:43",false,"---\nname: nova-act-usability\nversion: 1.0.2\ndescription: AI-orchestrated usability testing using Amazon Nova Act. The agent generates personas, runs tests to collect raw data, interprets responses to determine goal achievement, and generates HTML reports. Tests real user workflows (booking, checkout, posting) with safety guardrails. Use when asked to \"test website usability\", \"run usability test\", \"generate usability report\", \"evaluate user experience\", \"test checkout flow\", \"test booking process\", or \"analyze website UX\".\nmetadata:\n  openclaw:\n    requires:\n      config:\n        - ~\u002F.openclaw\u002Fconfig\u002Fnova-act.json\n      bins:\n        - python3\n---\n\n# Nova Act Usability Testing v1.0.2\n\n**AI-orchestrated** usability testing with digital twin personas powered by Amazon Nova Act.\n\n## ⚠️ Prerequisites & Credentials\n\n**This skill requires an Amazon Nova Act API key.**\n\n| Requirement | Details |\n|-------------|---------|\n| **API Key** | Nova Act API key from [AWS Console](https:\u002F\u002Fconsole.aws.amazon.com\u002F) |\n| **Config Location** | `~\u002F.openclaw\u002Fconfig\u002Fnova-act.json` |\n| **Format** | `{\"apiKey\": \"your-nova-act-api-key-here\"}` |\n| **Dependencies** | `pip3 install nova-act pydantic playwright` |\n| **Browser** | `playwright install chromium` (~300MB download) |\n\n## 🔒 Data & Privacy Notice\n\n**What this skill accesses:**\n- **Reads:** `~\u002F.openclaw\u002Fconfig\u002Fnova-act.json` (your API key)\n- **Writes:** `.\u002Fnova_act_logs\u002F` (trace files with screenshots), `.\u002Ftest_results_adaptive.json`, `.\u002Fnova_act_usability_report.html`\n\n**What trace files contain:**\n- Screenshots of every page visited\n- Full page content (HTML, text)\n- Browser actions and AI decisions\n\n**Recommendations:**\n- Run tests only on **non-production** or **test environments**\n- Be aware traces may capture **PII or sensitive data** visible on tested pages\n- Review\u002Fdelete trace files after use if they contain sensitive content\n- Consider running in a **sandboxed environment** (container\u002FVM) for untrusted sites\n\n---\n\n## Features\n\n**Agent-Driven Interpretation**: The script no longer interprets responses. YOU (the agent) must:\n1. Run the test script → collect raw data\n2. Read JSON → interpret each `raw_response` \n3. Set `goal_achieved` and `overall_success`\n4. Generate the report\n\nNo hardcoded regex. No extra API calls. The agent doing the work is already running.\n\n## Quick Start (For AI Agents)\n\n**When a user asks to test a website, YOU (the AI agent) must complete ALL 4 phases:**\n\n| Phase | What Happens | Who Does It |\n|-------|--------------|-------------|\n| 1. Setup | Generate personas, run test script | Agent + Script |\n| 2. Collect | Script captures raw Nova Act responses | Script |\n| 3. Interpret | Read JSON, determine goal_achieved for each step | **Agent** |\n| 4. Report | Generate HTML report with interpreted results | Agent |\n\n**⚠️ The script does NOT interpret responses or generate the final report. You must do phases 3-4.**\n\n### 🎯 Recommended: AI Agent Generates Personas\n\n**You're already an AI (Claude) - use your intelligence to generate contextual personas!**\n\n```python\nimport subprocess\nimport os\nimport sys\nimport json\nimport tempfile\n\n# Step 1: Check dependencies\ntry:\n    import nova_act\n    print(\"✅ Dependencies ready\")\nexcept ImportError:\n    print(\"📦 Dependencies not installed. Please run:\")\n    print(\"   pip3 install nova-act pydantic playwright\")\n    print(\"   playwright install chromium\")\n    sys.exit(1)\n\n# Step 2: Verify Nova Act API key\nconfig_file = os.path.expanduser(\"~\u002F.openclaw\u002Fconfig\u002Fnova-act.json\")\nwith open(config_file, 'r') as f:\n    config = json.load(f)\n    if config.get('apiKey') == 'your-nova-act-api-key-here':\n        print(f\"⚠️  Please add your Nova Act API key to {config_file}\")\n        sys.exit(1)\n\n# Step 3: YOU (the AI agent) generate personas\n# Example for https:\u002F\u002Fwww.pgatour.com\u002F (golf tournament site)\nwebsite_url = \"https:\u002F\u002Fwww.pgatour.com\u002F\"\n\npersonas = [\n    {\n        \"name\": \"Marcus Chen\",\n        \"archetype\": \"tournament_follower\",\n        \"age\": 42,\n        \"tech_proficiency\": \"high\",\n        \"description\": \"Avid golf fan who follows multiple tours and tracks player stats\",\n        \"goals\": [\n            \"Check current tournament leaderboard\",\n            \"View recent tournament results\",\n            \"Track favorite player performance\"\n        ]\n    },\n    {\n        \"name\": \"Dorothy Williams\",\n        \"archetype\": \"casual_viewer\",\n        \"age\": 68,\n        \"tech_proficiency\": \"low\",\n        \"description\": \"Occasional golf viewer who watches major tournaments\",\n        \"goals\": [\n            \"Find when the next tournament is\",\n            \"See who won recently\",\n            \"Understand how to watch online\"\n        ]\n    }\n]\n\n# Step 4: Save personas and run test\nwith tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:\n    json.dump(personas, f, indent=2)\n    personas_file = f.name\n\nskill_dir = os.path.expanduser(\"~\u002F.openclaw\u002Fskills\u002Fnova-act-usability\")\ntest_script = os.path.join(skill_dir, \"scripts\", \"run_adaptive_test.py\")\n\n# Run with AI-generated personas\nsubprocess.run([sys.executable, test_script, website_url, personas_file])\n\n# Clean up temp file\nos.unlink(personas_file)\n```\n\n**Persona Template:**\n```json\n{\n  \"name\": \"FirstName LastName\",\n  \"archetype\": \"descriptive_identifier\",\n  \"age\": 30,\n  \"tech_proficiency\": \"low|medium|high\",\n  \"description\": \"One sentence about who they are\",\n  \"goals\": [\n    \"First goal relevant to this website\",\n    \"Second goal relevant to this website\",\n    \"Third goal relevant to this website\"\n  ]\n}\n```\n\n### 📝 Alternative: Simple Custom Persona\n\nIf user specifies a persona description, pass it as a string:\n\n```python\n# User: \"Test PGA Tour site as a golf enthusiast\"\nwebsite_url = \"https:\u002F\u002Fwww.pgatour.com\u002F\"\nuser_persona = \"golf enthusiast who follows tournaments closely\"\n\nsubprocess.run([sys.executable, test_script, website_url, user_persona])\n# Script will parse this and create personas automatically\n```\n\n### ⚠️ Fallback: Auto-Generation (Not Recommended)\n\nLet the script guess personas based on basic category keywords:\n\n```python\n# Generic, less contextual personas\nsubprocess.run([sys.executable, test_script, website_url])\n```\n\n### Why YOU Should Generate Personas\n\n**✅ Advantages:**\n- **Better context:** You have full conversation history and domain knowledge\n- **Smarter inference:** You can analyze the URL, industry, and user intent\n- **No duplicate API calls:** You're already Claude - don't call yourself again!\n- **User preferences:** You can adapt based on stated preferences\n- **Clarifying questions:** You can ask the user about target demographics\n\n**❌ What to avoid:**\n- Don't let Python script make its own Claude API call (wasteful)\n- Don't rely on generic fallback personas (less accurate)\n- Don't skip persona generation (hurts test quality)\n\n### 💡 Tips for Persona Generation\n\n**Analyze the website:**\n- **URL domain:** `.gov` → citizens, `.edu` → students\u002Ffaculty\n- **Keywords:** \"shop\" → shoppers, \"book\" → travelers, \"play\" → gamers\n- **Industry:** Golf → fans\u002Fplayers, Banking → customers\u002Fbusinesses\n\n**Create diverse personas:**\n- Mix experience levels (beginner, intermediate, expert)\n- Mix tech proficiency (low, medium, high)  \n- Mix age ranges (young, middle-aged, senior)\n- Mix motivations (casual, professional, enthusiastic)\n\n**Generate realistic goals:**\n- Specific to the website's purpose\n- Actionable and measurable\n- Match the persona's characteristics\n\n**Examples by industry:**\n- **E-commerce:** bargain_hunter, comparison_shopper, impulse_buyer\n- **News:** daily_reader, topic_follower, casual_browser\n- **Sports:** die_hard_fan, casual_viewer, stats_tracker\n- **Travel:** business_traveler, vacation_planner, deal_seeker\n- **SaaS:** power_user, evaluator, beginner\n## User Invocation\n\nUsers can trigger this skill by saying:\n- \"Test the usability of [website URL]\"\n- \"Run a usability test on [website URL]\"\n- \"Generate a usability report for [website URL]\"\n- \"Evaluate the UX of [website URL]\"\n- \"Analyze [website URL] for usability issues\"\n- **NEW:** \"Test the booking flow on [website]\"\n- **NEW:** \"Test the checkout process on [e-commerce site]\"\n- **NEW:** \"Test posting workflow on [social media site]\"\n\n**The AI will automatically:**\n1. Load the Nova Act cookbook for guidance\n2. Analyze the page to understand it\n3. Detect if it's a workflow-based site (booking, e-commerce, social, etc.)\n4. **Generate contextual personas:**\n   - If custom persona specified → Create persona matching that description\n   - If no custom persona → Use Claude AI to infer the 3 most plausible real-world user types\n   - Fallback to category-based personas if AI unavailable\n5. Create realistic test cases (including full workflows when appropriate)\n6. Run adaptive, iterative tests with Nova Act\n7. **NEW:** Apply safety stops before material impact actions (payment, posting, account creation)\n8. Generate comprehensive HTML report with trace links\n9. Provide viewing instructions\n\n## Workflow Testing\n\n**NEW in this version:** The skill now tests complete user journeys, not just information-finding!\n\n### Supported Workflows\n\n**E-Commerce:**\n- Product search → Add to cart → Checkout → **STOP before payment**\n\n**Flight\u002FHotel Booking:**\n- Search → Select → Fill details → **STOP before booking**\n\n**Social Media:**\n- Create post → Add content → **STOP before publishing**\n\n**Account Signup:**\n- Fill registration → **STOP before final submission**\n\n**Form Submission:**\n- Fill form → **STOP before submit**\n\n### Safety Guarantees\n\nThe skill will **NEVER:**\n- Complete actual purchases\n- Create real accounts\n- Post publicly\n- Send emails\u002Fmessages\n- Subscribe to newsletters\n- Make any action with monetary\u002Flegal\u002Freputational impact\n\nThe skill will **ALWAYS:**\n- Test up to (but not including) the final action\n- Verify the final button exists and is accessible\n- Document the safety stop in observations\n\n## 🧠 Agent Analysis (CRITICAL)\n\n**You (the AI agent) must analyze test results!** The script collects raw responses but does NOT interpret them.\n\n### Why Agent Analysis?\n\nThe script returns raw Nova Act responses like:\n- `\"No\"` - Is there a pricing link?\n- `\"I don't see any documentation\"` - Is there docs?\n- `\"Amazon Nova Act\"` - What is the headline?\n\n**You must determine if each response means the goal was achieved:**\n\n| Response | Goal Achieved? |\n|----------|---------------|\n| `\"No\"` | ❌ NOT achieved |\n| `\"I don't see...\"` | ❌ NOT achieved |\n| `\"Not found\"` | ❌ NOT achieved |\n| `\"Yes, I found...\"` | ✅ Achieved |\n| `\"Amazon Nova Act\"` (content) | ✅ Achieved |\n| `\"The pricing is $29\u002Fmo\"` | ✅ Achieved |\n\n### Result Data Structure\n\nAfter the test script runs, read the JSON results. Each step contains:\n\n```json\n{\n    \"step_name\": \"check_nav_for_pricing\",\n    \"prompt\": \"Is there a pricing link in the navigation?\",\n    \"expected_outcome\": \"Find pricing in navigation\",\n    \"raw_response\": \"No\",\n    \"api_success\": true,\n    \"needs_agent_analysis\": true,\n    \"attempts\": [\n        {\n            \"prompt\": \"Is there a pricing link in the navigation?\",\n            \"response\": \"No\",\n            \"approach\": \"original\"\n        }\n    ]\n}\n```\n\n**Key fields you analyze:**\n- `raw_response`: The actual Nova Act response - YOU determine what it means\n- `api_success`: Did the API call work? (script handles this)\n- `needs_agent_analysis`: Always `true` - your cue to interpret\n- `attempts`: All attempts made (script tries up to 3 alternative approaches)\n\n### How to Analyze\n\n**For each step, determine:**\n1. `goal_achieved`: Did the response indicate success or failure?\n2. `friction_level`: How hard was it? (attempts.length > 1 = friction)\n3. `observations`: UX insights from the response\n\n**Analysis example:**\n\n```\nStep 1: \"Is there a pricing link?\" \n  → Response: \"No\" (1 attempt)\n  → Goal achieved: NO (explicit negative)\n  → Friction: HIGH (not discoverable)\n\nStep 2: \"What is the headline?\" \n  → Response: \"Amazon Nova Act\" (1 attempt)\n  → Goal achieved: YES (actual content)\n  → Friction: LOW (immediately visible)\n\nStep 3: \"Find documentation\" \n  → Response: \"I found a docs link in the footer\" (3 attempts)\n  → Goal achieved: YES (found eventually)\n  → Friction: MEDIUM (required multiple approaches)\n```\n\n### Helper Functions (For Script Integration)\n\nThe `response_interpreter.py` provides helpers if you want structured prompts:\n\n```python\nfrom scripts.response_interpreter import (\n    format_for_agent_analysis,\n    create_agent_prompt_for_interpretation,\n    create_agent_prompt_for_alternative\n)\n\n# Format all results for analysis\nformatted = format_for_agent_analysis(results)\n\n# Get interpretation prompt for one step\nprompt = create_agent_prompt_for_interpretation(step_result)\n\n# Get retry prompt when goal not achieved  \nretry_prompt = create_agent_prompt_for_alternative(\n    original_prompt=\"Is there a pricing link?\",\n    failed_response=\"No\",\n    attempt_number=2\n)\n```\n\n### Complete Analysis Workflow (MANDATORY)\n\n**The script does NOT generate the final report automatically.** You (the agent) must:\n\n1. **Run the test script** → outputs `test_results_adaptive.json` with raw data\n2. **Read the JSON** into your context\n3. **Interpret each step** → set `goal_achieved: true\u002Ffalse` based on `raw_response`\n4. **Set overall success** → set `overall_success: true\u002Ffalse` on each test\n5. **Save updated JSON**\n6. **Call report generator** with interpreted results\n\n**Step-by-step code for the agent to execute:**\n\n```python\nimport json\nimport os\nimport sys\n\n# Add skill scripts to path\nsys.path.insert(0, os.path.expanduser(\"~\u002F.openclaw\u002Fskills\u002Fnova-act-usability\u002Fscripts\"))\nfrom enhanced_report_generator import generate_enhanced_report\n\n# 1. Read raw results\nwith open('test_results_adaptive.json', 'r') as f:\n    results = json.load(f)\n\n# 2. YOU (the agent) interpret each step\nfor test in results:\n    goals_achieved = 0\n    for step in test.get('steps', []):\n        raw = step.get('raw_response', '')\n        \n        # AGENT INTERPRETS: Does this response indicate goal was achieved?\n        # You decide based on the response content and expected outcome\n        # Example interpretations:\n        #   \"No\" → goal_achieved = False\n        #   \"Leaderboard, News, Schedule, Players\" → goal_achieved = True (content found)\n        #   \"Yes\" → goal_achieved = True\n        #   \"I don't see any...\" → goal_achieved = False\n        \n        step['goal_achieved'] = ???  # YOU set this based on your interpretation\n        if step['goal_achieved']:\n            goals_achieved += 1\n    \n    # 3. Set overall success (e.g., >= 50% goals achieved)\n    total = len(test.get('steps', []))\n    test['goals_achieved'] = goals_achieved\n    test['overall_success'] = (goals_achieved \u002F total >= 0.5) if total > 0 else False\n\n# 4. Save interpreted results\nwith open('test_results_adaptive.json', 'w') as f:\n    json.dump(results, f, indent=2)\n\n# 5. Generate report with interpreted data\npage_analysis = {\n    'title': '...',  # From your earlier analysis\n    'purpose': '...',\n    'navigation': [...]\n}\nall_traces = []\nfor r in results:\n    all_traces.extend(r.get('trace_files', []))\n\nreport_path = generate_enhanced_report(page_analysis, results, all_traces)\nprint(f\"Report: {report_path}\")\n```\n\n**Why the agent must interpret:**\n- No hardcoded regex or pattern matching\n- You understand context (what \"Yes\" means for this specific question)\n- You can reason about partial success, edge cases\n- No duplicate Claude API calls - you're already running!\n\n## ⚠️ Critical: Keep Nova Act Prompts Simple\n\n**Nova Act is a browser automation tool, NOT a reasoning engine.**\n\nThe Claude agent (you) does all reasoning about:\n- What to test based on the persona\n- Whether results are good or bad\n- What the UX implications are\n\nNova Act just:\n- Clicks, types, scrolls\n- Reports what it sees\n\n### ❌ WRONG: Asking Nova Act to reason\n\n```python\n# DON'T ask Nova Act to think about personas\nnova.act(\"As a beginner user, can you easily find the documentation?\")\nnova.act(\"Would a business professional find the pricing clear?\")\nnova.act(\"Is this task accomplishable for someone with low technical skills?\")\n```\n\n### ✅ RIGHT: Simple, direct browser commands\n\n```python\n# Simple browser actions\nnova.act(\"Click the Documentation link in the navigation\")\nnova.act(\"Find and click a link containing 'Pricing'\")\nnova.act_get(\"What text is displayed in the main heading?\")\nnova.act_get(\"List the navigation menu items visible on this page\")\n```\n\n### The Correct Workflow\n\n1. **Agent** (you) decides what to test based on persona: \"Dorothy is 68 with low tech skills - she wants to know how to watch golf online\"\n2. **Agent** generates simple Nova Act prompts: \"Click 'Watch & Listen' in the navigation\"\n3. **Nova Act** executes browser task and returns raw results: \"Clicked Watch & Listen, now on video page\"\n4. **Agent** interprets results: \"Dorothy would find this confusing because the options are unclear...\"\n\n## How This Works\n\n**You (the AI) are the orchestrator.** This skill provides:\n1. **Nova Act cookbook** (`references\u002Fnova-act-cookbook.md`) - Best practices, workflow patterns, and safety guidelines (automatically loaded at test start)\n2. **Adaptive test orchestrator** (`run_adaptive_test.py`) - Main execution script with workflow detection\n3. **Dynamic strategy generator** (`scripts\u002Fdynamic_exploration.py`) - Generates workflow-appropriate test strategies\n4. **Session management** (`scripts\u002Fnova_session.py`) - Nova Act wrapper\n5. **Report generator** (`enhanced_report_generator.py`) - Auto-generated HTML reports\n\n**Execution Flow:**\n\n### CRITICAL: Check Dependencies First\n\n**Before running ANY test, check if dependencies are installed:**\n\n```bash\n# Check if nova-act is installed\npython3 -c \"import nova_act\" 2>\u002Fdev\u002Fnull\nif [ $? -ne 0 ]; then\n    echo \"Dependencies not installed. Please run:\"\n    echo \"  pip3 install nova-act pydantic playwright\"\n    echo \"  playwright install chromium\"\n    exit 1\nfi\n\n# Check API key\nif ! grep -q '\"apiKey\":.*[^\"]' ~\u002F.openclaw\u002Fconfig\u002Fnova-act.json; then\n    echo \"⚠️  Please add your Nova Act API key to ~\u002F.openclaw\u002Fconfig\u002Fnova-act.json\"\n    exit 1\nfi\n```\n\n**Or use Python to check:**\n\n```python\nimport sys\n\n# Check if nova-act is installed\ntry:\n    import nova_act\n    print(\"✅ Dependencies already installed\")\nexcept ImportError:\n    print(\"📦 Dependencies not installed. Please run:\")\n    print(\"   pip3 install nova-act pydantic playwright\")\n    print(\"   playwright install chromium\")\n    sys.exit(1)\n```\n\n### Running Tests (After Dependencies Confirmed)\n\nWhen a user asks for usability testing:\n\n```bash\n# Find the skill directory\nSKILL_DIR=~\u002F.openclaw\u002Fskills\u002Fnova-act-usability\n\n# Run the adaptive test script\npython3 \"$SKILL_DIR\u002Fscripts\u002Frun_adaptive_test.py\" \"https:\u002F\u002Fexample.com\"\n\n# This will:\n# - Create nova_act_logs\u002F in current directory\n# - Create test_results_adaptive.json in current directory\n# - Create nova_act_usability_report.html in current directory\n# - Provide 60-second status updates during test\n```\n\n### ⏱️ Timeout Guidance\n\n**Recommended timeout: 30 minutes (1800 seconds)**\n\nFull usability tests with 3 personas × 3 goals = 9 tests can take 10-20+ minutes depending on:\n- Website load times (slow sites like media-heavy sports sites take longer)\n- Nova Act API response times (each act() call takes 5-60 seconds)\n- Network conditions\n\n**Graceful shutdown:** If the test is interrupted (timeout, SIGTERM, SIGINT), it will:\n1. Save all completed test results to `test_results_adaptive.json`\n2. Generate a **partial report** clearly marked as incomplete\n3. Show how many tests completed vs planned\n\n**For shorter tests:** Use fewer personas or goals:\n```python\n# Quick test with 1 persona\npersonas = [{\"name\": \"Test User\", \"archetype\": \"casual\", ...}]\n```\n\n### What You (the AI) Need to Do:\n\n1. **Check dependencies** (run the check above)\n2. **If missing**: Tell user to run `pip3 install nova-act pydantic playwright && playwright install chromium`\n3. **If present**: Extract the website URL from user's request\n4. **Run the test** with the URL as argument\n5. **Monitor progress** (status updates every 60 seconds)\n6. **Share the report** viewing instructions with user\n\n## Quick Start\n\n**When user requests usability testing:**\n\n```python\nimport subprocess\nimport os\n\n# Get skill directory\nskill_dir = os.path.expanduser(\"~\u002F.openclaw\u002Fskills\u002Fnova-act-usability\")\nif not os.path.exists(skill_dir):\n    # Try workspace location\n    skill_dir = os.path.join(os.getcwd(), \"nova-act-usability\")\n\nscript_path = os.path.join(skill_dir, \"scripts\", \"run_adaptive_test.py\")\n\n# Run test\nresult = subprocess.run(\n    [\"python3\", script_path, \"https:\u002F\u002Fexample.com\"],\n    env={**os.environ, \"NOVA_ACT_SKIP_PLAYWRIGHT_INSTALL\": \"1\"},\n    capture_output=True,\n    text=True\n)\n\nprint(result.stdout)\n```\n\n## Detailed Workflow (Internal)\n\nThe adaptive test script (`run_adaptive_test.py`) handles:\n\n### Step 1: Page Analysis\n- Loads the page with Nova Act\n- Extracts title, navigation, purpose\n- Identifies key elements (docs, demo, pricing)\n\n### Step 2: Contextual Persona Generation\n- Creates personas based on what the page offers\n- Developer persona if API\u002Fcode focused\n- Business persona for evaluation\n- Beginner persona if demo available\n\n### Step 3: Realistic Test Case Generation\n- Top 3 use cases per persona\n- Based on actual page content\n- Matched to persona goals\n\n### Step 4: Iterative Test Execution\n\nFor each persona + task combination:\n\n```python\nfrom scripts.nova_session import nova_session\nfrom nova_act import BOOL_SCHEMA\nimport time\n\nobservations = []\n\nwith nova_session(website_url) as nova:\n    start_time = time.time()\n    \n    # Initial navigation\n    observations.append({\n        \"step\": \"navigate\",\n        \"action\": f\"Loaded {website_url}\",\n        \"success\": True,\n        \"notes\": \"Initial page load\"\n    })\n    \n    # Execute task step-by-step (AI-orchestrated)\n    # Break into small act() calls based on cookbook guidance\n    \n    # Example: \"Find pricing information\" task\n    \n    # Step 1: Look for pricing link\n    nova.act(\"Look for a link or button for pricing, plans, or subscription\")\n    found = nova.act_get(\n        \"Is there a visible pricing or plans link?\",\n        schema=BOOL_SCHEMA\n    )\n    \n    observations.append({\n        \"step\": \"find_pricing_link\",\n        \"action\": \"Search for pricing navigation\",\n        \"success\": found.parsed_response,\n        \"notes\": \"Easy to find\" if found.parsed_response else \"Not immediately visible - UX friction\"\n    })\n    \n    if found.parsed_response:\n        # Step 2: Navigate to pricing\n        nova.act(\"Click on the pricing or plans link\")\n        \n        # Step 3: Analyze pricing page\n        is_clear = nova.act_get(\n            \"Is the pricing information clearly displayed with prices and features?\",\n            schema=BOOL_SCHEMA\n        )\n        \n        observations.append({\n            \"step\": \"view_pricing\",\n            \"action\": \"Accessed pricing page\",\n            \"success\": is_clear.parsed_response,\n            \"notes\": \"Clear pricing display\" if is_clear.parsed_response else \"Pricing unclear or confusing\"\n        })\n    else:\n        # Alternative path - try search\n        nova.act(\"Look for a search function\")\n        # ... continue orchestrating\n    \n    duration = time.time() - start_time\n    \n    # Document overall task result\n    task_success = all(obs[\"success\"] for obs in observations if obs[\"success\"] is not None)\n    \n    results.append({\n        \"persona\": persona_name,\n        \"task\": task_description,\n        \"success\": task_success,\n        \"duration\": duration,\n        \"observations\": observations,\n        \"friction_points\": [obs for obs in observations if not obs.get(\"success\")]\n    })\n```\n\n### Step 5: Pool and Analyze Results\n\nAfter all tests:\n1. Identify common friction points across personas\n2. Note accessibility issues for low-tech personas\n3. Flag efficiency problems (too many steps)\n4. Document task failures (major UX issues)\n\n### Step 6: Generate Report\n\n```python\nimport json\nfrom scripts.enhanced_report_generator import generate_enhanced_report\n\n# Save results\nwith open(\"test_results_adaptive.json\", \"w\") as f:\n    json.dump(results, f, indent=2)\n\n# Generate HTML report\nreport_path = generate_enhanced_report(\n    page_analysis=page_analysis,\n    results=test_results\n)\n\nprint(f\"Report: {report_path}\")\n```\n\n## Key Principles\n\n### Dynamic Task Decomposition\n\nThe AI should decide how to break down each task based on:\n- Website complexity\n- Persona's technical level\n- Task nature (navigation vs data entry vs search)\n\n**Low-tech persona example:**\n```python\n# More explicit, step-by-step\nnova.act(\"Look for a button labeled 'Contact' or 'Contact Us'\")\nnova.act(\"Click on the Contact button\")\nresult = nova.act_get(\"Is there a phone number or email address visible?\")\n```\n\n**High-tech persona example:**\n```python\n# Test efficiency features\nnova.act(\"Look for keyboard shortcuts or quick access features\")\nnova.act(\"Try to use search (Ctrl+K or Cmd+K)\")\n```\n\n### Real-Time Observation\n\nAfter EVERY `act()` call, analyze:\n- Did it succeed?\n- Was the UI element easy to find?\n- Was the label clear?\n- How many attempts needed?\n- Any error messages?\n\nDocument friction immediately in observations.\n\n### Persona-Aware Prompting\n\nAdapt `act()` prompts to persona characteristics:\n- **Elderly\u002Flow-tech:** Look for obvious, labeled buttons; read everything\n- **Power users:** Try keyboard shortcuts, advanced features\n- **Mobile users:** Test mobile responsiveness, touch targets\n- **Screen reader users:** Test keyboard navigation, ARIA labels\n\n## Resources\n\n### `references\u002Fnova-act-cookbook.md`\n**MUST READ before starting any test.** Contains best practices for:\n- Effective act() prompting\n- Task decomposition strategies\n- Data extraction patterns\n- Error handling\n- Persona adaptation\n\n### `references\u002Fpersona-examples.md`\nTemplate personas with detailed profiles:\n- Tech-savvy millennial\n- Elderly first-timer\n- Busy professional\n- Student\u002Fbudget-conscious\n- Accessibility-focused\n- International\u002Fnon-native speaker\n\n### `scripts\u002Fnova_session.py`\nThin wrapper providing Nova Act session primitive:\n```python\nwith nova_session(url, headless=True, logs_dir=\".\u002Flogs\") as nova:\n    nova.act(\"action\")\n    result = nova.act_get(\"query\", schema=Schema)\n```\n\n### `scripts\u002Fenhanced_report_generator.py`\nCompiles observations into HTML usability report with trace file links.\n\n### `assets\u002Freport-template.html`\nProfessional HTML template for usability reports.\n\n## ⚠️ IMPORTANT: First-Time Setup Required\n\n**This skill requires dependencies that must be installed before use.**\n\n### For AI Agents: Dependency Check\n\n**ALWAYS check if dependencies are installed before running tests:**\n\n```python\n# Quick dependency check\ntry:\n    import nova_act\n    print(\"✅ Dependencies installed\")\nexcept ImportError:\n    print(\"📦 Dependencies not installed. Please run:\")\n    print(\"   pip3 install nova-act pydantic playwright\")\n    print(\"   playwright install chromium\")\n    print(\"\")\n    print(\"This will take 2-3 minutes to download browsers (~300MB)\")\n```\n\n### For Users: One-Time Setup\n\n**Step 1: Install Python packages**\n```bash\npip3 install nova-act pydantic playwright\n```\n\n**Step 2: Install Playwright browser**\n```bash\nplaywright install chromium\n```\n\n**Step 3: Configure API key**\n1. Get your Nova Act API key from [AWS Console](https:\u002F\u002Fconsole.aws.amazon.com\u002F)\n2. Create config file:\n```bash\nmkdir -p ~\u002F.openclaw\u002Fconfig\necho '{\"apiKey\": \"your-key-here\"}' > ~\u002F.openclaw\u002Fconfig\u002Fnova-act.json\n```\n3. Replace `your-key-here` with your actual Nova Act API key\n\n## Example: AI-Orchestrated Test\n\n**User request:** \"Test example.com for elderly users\"\n\n**AI orchestration:**\n\n1. Read `references\u002Fnova-act-cookbook.md`\n2. Read `references\u002Fpersona-examples.md`\n3. Generate elderly persona (Dorothy, 72, low tech proficiency)\n4. Generate tasks:\n   - \"Find contact information\"\n   - \"Read about services\"\n   - \"Navigate to FAQ\"\n5. For each task, dynamically orchestrate Nova Act:\n   - Start session\n   - Execute small act() steps\n   - Observe and analyze each result\n   - Take notes on friction (small text, unclear labels, etc.)\n   - Continue or adapt based on observations\n6. Pool observations\n7. Generate HTML report with findings and recommendations\n\n**The AI decides every step.** The skill just provides tools and guidance.\n\n## File Structure\n\n```\nnova-act-usability\u002F\n├── SKILL.md                          # This file\n├── README.md                         # User documentation\n├── skill.json                        # Skill manifest\n├── scripts\u002F\n│   ├── run_adaptive_test.py          # Main orchestrator (accepts URL arg)\n│   ├── nova_session.py               # Session wrapper\n│   ├── enhanced_report_generator.py  # HTML report generator\n│   └── trace_finder.py               # Extract trace file paths\n├── references\u002F\n│   ├── nova-act-cookbook.md          # Best practices\n│   └── persona-examples.md           # Template personas\n└── assets\u002F\n    └── report-template.html          # HTML template\n\n```\n\n## Output Files (Created in Working Directory)\n\nWhen you run a test, these files are created in your current working directory:\n\n```\n.\u002F\n├── nova_act_logs\u002F                    # Nova Act trace files\n│   ├── act_\u003Cid>_output.html         # Session recordings\n│   └── ...\n├── test_results_adaptive.json        # Raw test results\n└── nova_act_usability_report.html   # Final report\n```\n\nAll paths are relative - works from any installation location!\n","# Nova Act Usability Testing v1.0.2\n\n**AI-orchestrated** usability testing with digital twin personas powered by Amazon Nova Act.\n\n## ⚠️ Prerequisites & Credentials\n\n**This skill requires an Amazon Nova Act API key.**\n\n| Requirement | Details |\n|-------------|---------|\n| **API Key** | Nova Act API key from [AWS Console](https:\u002F\u002Fconsole.aws.amazon.com\u002F) |\n| **Config Location** | `~\u002F.openclaw\u002Fconfig\u002Fnova-act.json` |\n| **Format** | `{\"apiKey\": \"your-nova-act-api-key-here\"}` |\n| **Dependencies** | `pip3 install nova-act pydantic playwright` |\n| **Browser** | `playwright install chromium` (~300MB download) |\n\n## 🔒 Data & Privacy Notice\n\n**What this skill accesses:**\n- **Reads:** `~\u002F.openclaw\u002Fconfig\u002Fnova-act.json` (your API key)\n- **Writes:** `.\u002Fnova_act_logs\u002F` (trace files with screenshots), `.\u002Ftest_results_adaptive.json`, `.\u002Fnova_act_usability_report.html`\n\n**What trace files contain:**\n- Screenshots of every page visited\n- Full page content (HTML, text)\n- Browser actions and AI decisions\n\n**Recommendations:**\n- Run tests only on **non-production** or **test environments**\n- Be aware traces may capture **PII or sensitive data** visible on tested pages\n- Review\u002Fdelete trace files after use if they contain sensitive content\n- Consider running in a **sandboxed environment** (container\u002FVM) for untrusted sites\n\n---\n\n## Features\n\n**Agent-Driven Interpretation**: The script no longer interprets responses. YOU (the agent) must:\n1. Run the test script → collect raw data\n2. Read JSON → interpret each `raw_response` \n3. Set `goal_achieved` and `overall_success`\n4. Generate the report\n\nNo hardcoded regex. No extra API calls. The agent doing the work is already running.\n\n## Quick Start (For AI Agents)\n\n**When a user asks to test a website, YOU (the AI agent) must complete ALL 4 phases:**\n\n| Phase | What Happens | Who Does It |\n|-------|--------------|-------------|\n| 1. Setup | Generate personas, run test script | Agent + Script |\n| 2. Collect | Script captures raw Nova Act responses | Script |\n| 3. Interpret | Read JSON, determine goal_achieved for each step | **Agent** |\n| 4. Report | Generate HTML report with interpreted results | Agent |\n\n**⚠️ The script does NOT interpret responses or generate the final report. You must do phases 3-4.**\n\n### 🎯 Recommended: AI Agent Generates Personas\n\n**You're already an AI (Claude) - use your intelligence to generate contextual personas!**\n\n```python\nimport subprocess\nimport os\nimport sys\nimport json\nimport tempfile\n\n# Step 1: Check dependencies\ntry:\n    import nova_act\n    print(\"✅ Dependencies ready\")\nexcept ImportError:\n    print(\"📦 Dependencies not installed. Please run:\")\n    print(\"   pip3 install nova-act pydantic playwright\")\n    print(\"   playwright install chromium\")\n    sys.exit(1)\n\n# Step 2: Verify Nova Act API key\nconfig_file = os.path.expanduser(\"~\u002F.openclaw\u002Fconfig\u002Fnova-act.json\")\nwith open(config_file, 'r') as f:\n    config = json.load(f)\n    if config.get('apiKey') == 'your-nova-act-api-key-here':\n        print(f\"⚠️  Please add your Nova Act API key to {config_file}\")\n        sys.exit(1)\n\n# Step 3: YOU (the AI agent) generate personas\n# Example for https:\u002F\u002Fwww.pgatour.com\u002F (golf tournament site)\nwebsite_url = \"https:\u002F\u002Fwww.pgatour.com\u002F\"\n\npersonas = [\n    {\n        \"name\": \"Marcus Chen\",\n        \"archetype\": \"tournament_follower\",\n        \"age\": 42,\n        \"tech_proficiency\": \"high\",\n        \"description\": \"Avid golf fan who follows multiple tours and tracks player stats\",\n        \"goals\": [\n            \"Check current tournament leaderboard\",\n            \"View recent tournament results\",\n            \"Track favorite player performance\"\n        ]\n    },\n    {\n        \"name\": \"Dorothy Williams\",\n        \"archetype\": \"casual_viewer\",\n        \"age\": 68,\n        \"tech_proficiency\": \"low\",\n        \"description\": \"Occasional golf viewer who watches major tournaments\",\n        \"goals\": [\n            \"Find when the next tournament is\",\n            \"See who won recently\",\n            \"Understand how to watch online\"\n        ]\n    }\n]\n\n# Step 4: Save personas and run test\nwith tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:\n    json.dump(personas, f, indent=2)\n    personas_file = f.name\n\nskill_dir = os.path.expanduser(\"~\u002F.openclaw\u002Fskills\u002Fnova-act-usability\")\ntest_script = os.path.join(skill_dir, \"scripts\", \"run_adaptive_test.py\")\n\n# Run with AI-generated personas\nsubprocess.run([sys.executable, test_script, website_url, personas_file])\n\n# Clean up temp file\nos.unlink(personas_file)\n```\n\n**Persona Template:**\n```json\n{\n  \"name\": \"FirstName LastName\",\n  \"archetype\": \"descriptive_identifier\",\n  \"age\": 30,\n  \"tech_proficiency\": \"low|medium|high\",\n  \"description\": \"One sentence about who they are\",\n  \"goals\": [\n    \"First goal relevant to this website\",\n    \"Second goal relevant to this website\",\n    \"Third goal relevant to this website\"\n  ]\n}\n```\n\n### 📝 Alternative: Simple Custom Persona\n\nIf user specifies a persona description, pass it as a string:\n\n```python\n# User: \"Test PGA Tour site as a golf enthusiast\"\nwebsite_url = \"https:\u002F\u002Fwww.pgatour.com\u002F\"\nuser_persona = \"golf enthusiast who follows tournaments closely\"\n\nsubprocess.run([sys.executable, test_script, website_url, user_persona])\n# Script will parse this and create personas automatically\n```\n\n### ⚠️ Fallback: Auto-Generation (Not Recommended)\n\nLet the script guess personas based on basic category keywords:\n\n```python\n# Generic, less contextual personas\nsubprocess.run([sys.executable, test_script, website_url])\n```\n\n### Why YOU Should Generate Personas\n\n**✅ Advantages:**\n- **Better context:** You have full conversation history and domain knowledge\n- **Smarter inference:** You can analyze the URL, industry, and user intent\n- **No duplicate API calls:** You're already Claude - don't call yourself again!\n- **User preferences:** You can adapt based on stated preferences\n- **Clarifying questions:** You can ask the user about target demographics\n\n**❌ What to avoid:**\n- Don't let Python script make its own Claude API call (wasteful)\n- Don't rely on generic fallback personas (less accurate)\n- Don't skip persona generation (hurts test quality)\n\n### 💡 Tips for Persona Generation\n\n**Analyze the website:**\n- **URL domain:** `.gov` → citizens, `.edu` → students\u002Ffaculty\n- **Keywords:** \"shop\" → shoppers, \"book\" → travelers, \"play\" → gamers\n- **Industry:** Golf → fans\u002Fplayers, Banking → customers\u002Fbusinesses\n\n**Create diverse personas:**\n- Mix experience levels (beginner, intermediate, expert)\n- Mix tech proficiency (low, medium, high)  \n- Mix age ranges (young, middle-aged, senior)\n- Mix motivations (casual, professional, enthusiastic)\n\n**Generate realistic goals:**\n- Specific to the website's purpose\n- Actionable and measurable\n- Match the persona's characteristics\n\n**Examples by industry:**\n- **E-commerce:** bargain_hunter, comparison_shopper, impulse_buyer\n- **News:** daily_reader, topic_follower, casual_browser\n- **Sports:** die_hard_fan, casual_viewer, stats_tracker\n- **Travel:** business_traveler, vacation_planner, deal_seeker\n- **SaaS:** power_user, evaluator, beginner\n## User Invocation\n\nUsers can trigger this skill by saying:\n- \"Test the usability of [website URL]\"\n- \"Run a usability test on [website URL]\"\n- \"Generate a usability report for [website URL]\"\n- \"Evaluate the UX of [website URL]\"\n- \"Analyze [website URL] for usability issues\"\n- **NEW:** \"Test the booking flow on [website]\"\n- **NEW:** \"Test the checkout process on [e-commerce site]\"\n- **NEW:** \"Test posting workflow on [social media site]\"\n\n**The AI will automatically:**\n1. Load the Nova Act cookbook for guidance\n2. Analyze the page to understand it\n3. Detect if it's a workflow-based site (booking, e-commerce, social, etc.)\n4. **Generate contextual personas:**\n   - If custom persona specified → Create persona matching that description\n   - If no custom persona → Use Claude AI to infer the 3 most plausible real-world user types\n   - Fallback to category-based personas if AI unavailable\n5. Create realistic test cases (including full workflows when appropriate)\n6. Run adaptive, iterative tests with Nova Act\n7. **NEW:** Apply safety stops before material impact actions (payment, posting, account creation)\n8. Generate comprehensive HTML report with trace links\n9. Provide viewing instructions\n\n## Workflow Testing\n\n**NEW in this version:** The skill now tests complete user journeys, not just information-finding!\n\n### Supported Workflows\n\n**E-Commerce:**\n- Product search → Add to cart → Checkout → **STOP before payment**\n\n**Flight\u002FHotel Booking:**\n- Search → Select → Fill details → **STOP before booking**\n\n**Social Media:**\n- Create post → Add content → **STOP before publishing**\n\n**Account Signup:**\n- Fill registration → **STOP before final submission**\n\n**Form Submission:**\n- Fill form → **STOP before submit**\n\n### Safety Guarantees\n\nThe skill will **NEVER:**\n- Complete actual purchases\n- Create real accounts\n- Post publicly\n- Send emails\u002Fmessages\n- Subscribe to newsletters\n- Make any action with monetary\u002Flegal\u002Freputational impact\n\nThe skill will **ALWAYS:**\n- Test up to (but not including) the final action\n- Verify the final button exists and is accessible\n- Document the safety stop in observations\n\n## 🧠 Agent Analysis (CRITICAL)\n\n**You (the AI agent) must analyze test results!** The script collects raw responses but does NOT interpret them.\n\n### Why Agent Analysis?\n\nThe script returns raw Nova Act responses like:\n- `\"No\"` - Is there a pricing link?\n- `\"I don't see any documentation\"` - Is there docs?\n- `\"Amazon Nova Act\"` - What is the headline?\n\n**You must determine if each response means the goal was achieved:**\n\n| Response | Goal Achieved? |\n|----------|---------------|\n| `\"No\"` | ❌ NOT achieved |\n| `\"I don't see...\"` | ❌ NOT achieved |\n| `\"Not found\"` | ❌ NOT achieved |\n| `\"Yes, I found...\"` | ✅ Achieved |\n| `\"Amazon Nova Act\"` (content) | ✅ Achieved |\n| `\"The pricing is $29\u002Fmo\"` | ✅ Achieved |\n\n### Result Data Structure\n\nAfter the test script runs, read the JSON results. Each step contains:\n\n```json\n{\n    \"step_name\": \"check_nav_for_pricing\",\n    \"prompt\": \"Is there a pricing link in the navigation?\",\n    \"expected_outcome\": \"Find pricing in navigation\",\n    \"raw_response\": \"No\",\n    \"api_success\": true,\n    \"needs_agent_analysis\": true,\n    \"attempts\": [\n        {\n            \"prompt\": \"Is there a pricing link in the navigation?\",\n            \"response\": \"No\",\n            \"approach\": \"original\"\n        }\n    ]\n}\n```\n\n**Key fields you analyze:**\n- `raw_response`: The actual Nova Act response - YOU determine what it means\n- `api_success`: Did the API call work? (script handles this)\n- `needs_agent_analysis`: Always `true` - your cue to interpret\n- `attempts`: All attempts made (script tries up to 3 alternative approaches)\n\n### How to Analyze\n\n**For each step, determine:**\n1. `goal_achieved`: Did the response indicate success or failure?\n2. `friction_level`: How hard was it? (attempts.length > 1 = friction)\n3. `observations`: UX insights from the response\n\n**Analysis example:**\n\n```\nStep 1: \"Is there a pricing link?\" \n  → Response: \"No\" (1 attempt)\n  → Goal achieved: NO (explicit negative)\n  → Friction: HIGH (not discoverable)\n\nStep 2: \"What is the headline?\" \n  → Response: \"Amazon Nova Act\" (1 attempt)\n  → Goal achieved: YES (actual content)\n  → Friction: LOW (immediately visible)\n\nStep 3: \"Find documentation\" \n  → Response: \"I found a docs link in the footer\" (3 attempts)\n  → Goal achieved: YES (found eventually)\n  → Friction: MEDIUM (required multiple approaches)\n```\n\n### Helper Functions (For Script Integration)\n\nThe `response_interpreter.py` provides helpers if you want structured prompts:\n\n```python\nfrom scripts.response_interpreter import (\n    format_for_agent_analysis,\n    create_agent_prompt_for_interpretation,\n    create_agent_prompt_for_alternative\n)\n\n# Format all results for analysis\nformatted = format_for_agent_analysis(results)\n\n# Get interpretation prompt for one step\nprompt = create_agent_prompt_for_interpretation(step_result)\n\n# Get retry prompt when goal not achieved  \nretry_prompt = create_agent_prompt_for_alternative(\n    original_prompt=\"Is there a pricing link?\",\n    failed_response=\"No\",\n    attempt_number=2\n)\n```\n\n### Complete Analysis Workflow (MANDATORY)\n\n**The script does NOT generate the final report automatically.** You (the agent) must:\n\n1. **Run the test script** → outputs `test_results_adaptive.json` with raw data\n2. **Read the JSON** into your context\n3. **Interpret each step** → set `goal_achieved: true\u002Ffalse` based on `raw_response`\n4. **Set overall success** → set `overall_success: true\u002Ffalse` on each test\n5. **Save updated JSON**\n6. **Call report generator** with interpreted results\n\n**Step-by-step code for the agent to execute:**\n\n```python\nimport json\nimport os\nimport sys\n\n# Add skill scripts to path\nsys.path.insert(0, os.path.expanduser(\"~\u002F.openclaw\u002Fskills\u002Fnova-act-usability\u002Fscripts\"))\nfrom enhanced_report_generator import generate_enhanced_report\n\n# 1. Read raw results\nwith open('test_results_adaptive.json', 'r') as f:\n    results = json.load(f)\n\n# 2. YOU (the agent) interpret each step\nfor test in results:\n    goals_achieved = 0\n    for step in test.get('steps', []):\n        raw = step.get('raw_response', '')\n        \n        # AGENT INTERPRETS: Does this response indicate goal was achieved?\n        # You decide based on the response content and expected outcome\n        # Example interpretations:\n        #   \"No\" → goal_achieved = False\n        #   \"Leaderboard, News, Schedule, Players\" → goal_achieved = True (content found)\n        #   \"Yes\" → goal_achieved = True\n        #   \"I don't see any...\" → goal_achieved = False\n        \n        step['goal_achieved'] = ???  # YOU set this based on your interpretation\n        if step['goal_achieved']:\n            goals_achieved += 1\n    \n    # 3. Set overall success (e.g., >= 50% goals achieved)\n    total = len(test.get('steps', []))\n    test['goals_achieved'] = goals_achieved\n    test['overall_success'] = (goals_achieved \u002F total >= 0.5) if total > 0 else False\n\n# 4. Save interpreted results\nwith open('test_results_adaptive.json', 'w') as f:\n    json.dump(results, f, indent=2)\n\n# 5. Generate report with interpreted data\npage_analysis = {\n    'title': '...',  # From your earlier analysis\n    'purpose': '...',\n    'navigation': [...]\n}\nall_traces = []\nfor r in results:\n    all_traces.extend(r.get('trace_files', []))\n\nreport_path = generate_enhanced_report(page_analysis, results, all_traces)\nprint(f\"Report: {report_path}\")\n```\n\n**Why the agent must interpret:**\n- No hardcoded regex or pattern matching\n- You understand context (what \"Yes\" means for this specific question)\n- You can reason about partial success, edge cases\n- No duplicate Claude API calls - you're already running!\n\n## ⚠️ Critical: Keep Nova Act Prompts Simple\n\n**Nova Act is a browser automation tool, NOT a reasoning engine.**\n\nThe Claude agent (you) does all reasoning about:\n- What to test based on the persona\n- Whether results are good or bad\n- What the UX implications are\n\nNova Act just:\n- Clicks, types, scrolls\n- Reports what it sees\n\n### ❌ WRONG: Asking Nova Act to reason\n\n```python\n# DON'T ask Nova Act to think about personas\nnova.act(\"As a beginner user, can you easily find the documentation?\")\nnova.act(\"Would a business professional find the pricing clear?\")\nnova.act(\"Is this task accomplishable for someone with low technical skills?\")\n```\n\n### ✅ RIGHT: Simple, direct browser commands\n\n```python\n# Simple browser actions\nnova.act(\"Click the Documentation link in the navigation\")\nnova.act(\"Find and click a link containing 'Pricing'\")\nnova.act_get(\"What text is displayed in the main heading?\")\nnova.act_get(\"List the navigation menu items visible on this page\")\n```\n\n### The Correct Workflow\n\n1. **Agent** (you) decides what to test based on persona: \"Dorothy is 68 with low tech skills - she wants to know how to watch golf online\"\n2. **Agent** generates simple Nova Act prompts: \"Click 'Watch & Listen' in the navigation\"\n3. **Nova Act** executes browser task and returns raw results: \"Clicked Watch & Listen, now on video page\"\n4. **Agent** interprets results: \"Dorothy would find this confusing because the options are unclear...\"\n\n## How This Works\n\n**You (the AI) are the orchestrator.** This skill provides:\n1. **Nova Act cookbook** (`references\u002Fnova-act-cookbook.md`) - Best practices, workflow patterns, and safety guidelines (automatically loaded at test start)\n2. **Adaptive test orchestrator** (`run_adaptive_test.py`) - Main execution script with workflow detection\n3. **Dynamic strategy generator** (`scripts\u002Fdynamic_exploration.py`) - Generates workflow-appropriate test strategies\n4. **Session management** (`scripts\u002Fnova_session.py`) - Nova Act wrapper\n5. **Report generator** (`enhanced_report_generator.py`) - Auto-generated HTML reports\n\n**Execution Flow:**\n\n### CRITICAL: Check Dependencies First\n\n**Before running ANY test, check if dependencies are installed:**\n\n```bash\n# Check if nova-act is installed\npython3 -c \"import nova_act\" 2>\u002Fdev\u002Fnull\nif [ $? -ne 0 ]; then\n    echo \"Dependencies not installed. Please run:\"\n    echo \"  pip3 install nova-act pydantic playwright\"\n    echo \"  playwright install chromium\"\n    exit 1\nfi\n\n# Check API key\nif ! grep -q '\"apiKey\":.*[^\"]' ~\u002F.openclaw\u002Fconfig\u002Fnova-act.json; then\n    echo \"⚠️  Please add your Nova Act API key to ~\u002F.openclaw\u002Fconfig\u002Fnova-act.json\"\n    exit 1\nfi\n```\n\n**Or use Python to check:**\n\n```python\nimport sys\n\n# Check if nova-act is installed\ntry:\n    import nova_act\n    print(\"✅ Dependencies already installed\")\nexcept ImportError:\n    print(\"📦 Dependencies not installed. Please run:\")\n    print(\"   pip3 install nova-act pydantic playwright\")\n    print(\"   playwright install chromium\")\n    sys.exit(1)\n```\n\n### Running Tests (After Dependencies Confirmed)\n\nWhen a user asks for usability testing:\n\n```bash\n# Find the skill directory\nSKILL_DIR=~\u002F.openclaw\u002Fskills\u002Fnova-act-usability\n\n# Run the adaptive test script\npython3 \"$SKILL_DIR\u002Fscripts\u002Frun_adaptive_test.py\" \"https:\u002F\u002Fexample.com\"\n\n# This will:\n# - Create nova_act_logs\u002F in current directory\n# - Create test_results_adaptive.json in current directory\n# - Create nova_act_usability_report.html in current directory\n# - Provide 60-second status updates during test\n```\n\n### ⏱️ Timeout Guidance\n\n**Recommended timeout: 30 minutes (1800 seconds)**\n\nFull usability tests with 3 personas × 3 goals = 9 tests can take 10-20+ minutes depending on:\n- Website load times (slow sites like media-heavy sports sites take longer)\n- Nova Act API response times (each act() call takes 5-60 seconds)\n- Network conditions\n\n**Graceful shutdown:** If the test is interrupted (timeout, SIGTERM, SIGINT), it will:\n1. Save all completed test results to `test_results_adaptive.json`\n2. Generate a **partial report** clearly marked as incomplete\n3. Show how many tests completed vs planned\n\n**For shorter tests:** Use fewer personas or goals:\n```python\n# Quick test with 1 persona\npersonas = [{\"name\": \"Test User\", \"archetype\": \"casual\", ...}]\n```\n\n### What You (the AI) Need to Do:\n\n1. **Check dependencies** (run the check above)\n2. **If missing**: Tell user to run `pip3 install nova-act pydantic playwright && playwright install chromium`\n3. **If present**: Extract the website URL from user's request\n4. **Run the test** with the URL as argument\n5. **Monitor progress** (status updates every 60 seconds)\n6. **Share the report** viewing instructions with user\n\n## Quick Start\n\n**When user requests usability testing:**\n\n```python\nimport subprocess\nimport os\n\n# Get skill directory\nskill_dir = os.path.expanduser(\"~\u002F.openclaw\u002Fskills\u002Fnova-act-usability\")\nif not os.path.exists(skill_dir):\n    # Try workspace location\n    skill_dir = os.path.join(os.getcwd(), \"nova-act-usability\")\n\nscript_path = os.path.join(skill_dir, \"scripts\", \"run_adaptive_test.py\")\n\n# Run test\nresult = subprocess.run(\n    [\"python3\", script_path, \"https:\u002F\u002Fexample.com\"],\n    env={**os.environ, \"NOVA_ACT_SKIP_PLAYWRIGHT_INSTALL\": \"1\"},\n    capture_output=True,\n    text=True\n)\n\nprint(result.stdout)\n```\n\n## Detailed Workflow (Internal)\n\nThe adaptive test script (`run_adaptive_test.py`) handles:\n\n### Step 1: Page Analysis\n- Loads the page with Nova Act\n- Extracts title, navigation, purpose\n- Identifies key elements (docs, demo, pricing)\n\n### Step 2: Contextual Persona Generation\n- Creates personas based on what the page offers\n- Developer persona if API\u002Fcode focused\n- Business persona for evaluation\n- Beginner persona if demo available\n\n### Step 3: Realistic Test Case Generation\n- Top 3 use cases per persona\n- Based on actual page content\n- Matched to persona goals\n\n### Step 4: Iterative Test Execution\n\nFor each persona + task combination:\n\n```python\nfrom scripts.nova_session import nova_session\nfrom nova_act import BOOL_SCHEMA\nimport time\n\nobservations = []\n\nwith nova_session(website_url) as nova:\n    start_time = time.time()\n    \n    # Initial navigation\n    observations.append({\n        \"step\": \"navigate\",\n        \"action\": f\"Loaded {website_url}\",\n        \"success\": True,\n        \"notes\": \"Initial page load\"\n    })\n    \n    # Execute task step-by-step (AI-orchestrated)\n    # Break into small act() calls based on cookbook guidance\n    \n    # Example: \"Find pricing information\" task\n    \n    # Step 1: Look for pricing link\n    nova.act(\"Look for a link or button for pricing, plans, or subscription\")\n    found = nova.act_get(\n        \"Is there a visible pricing or plans link?\",\n        schema=BOOL_SCHEMA\n    )\n    \n    observations.append({\n        \"step\": \"find_pricing_link\",\n        \"action\": \"Search for pricing navigation\",\n        \"success\": found.parsed_response,\n        \"notes\": \"Easy to find\" if found.parsed_response else \"Not immediately visible - UX friction\"\n    })\n    \n    if found.parsed_response:\n        # Step 2: Navigate to pricing\n        nova.act(\"Click on the pricing or plans link\")\n        \n        # Step 3: Analyze pricing page\n        is_clear = nova.act_get(\n            \"Is the pricing information clearly displayed with prices and features?\",\n            schema=BOOL_SCHEMA\n        )\n        \n        observations.append({\n            \"step\": \"view_pricing\",\n            \"action\": \"Accessed pricing page\",\n            \"success\": is_clear.parsed_response,\n            \"notes\": \"Clear pricing display\" if is_clear.parsed_response else \"Pricing unclear or confusing\"\n        })\n    else:\n        # Alternative path - try search\n        nova.act(\"Look for a search function\")\n        # ... continue orchestrating\n    \n    duration = time.time() - start_time\n    \n    # Document overall task result\n    task_success = all(obs[\"success\"] for obs in observations if obs[\"success\"] is not None)\n    \n    results.append({\n        \"persona\": persona_name,\n        \"task\": task_description,\n        \"success\": task_success,\n        \"duration\": duration,\n        \"observations\": observations,\n        \"friction_points\": [obs for obs in observations if not obs.get(\"success\")]\n    })\n```\n\n### Step 5: Pool and Analyze Results\n\nAfter all tests:\n1. Identify common friction points across personas\n2. Note accessibility issues for low-tech personas\n3. Flag efficiency problems (too many steps)\n4. Document task failures (major UX issues)\n\n### Step 6: Generate Report\n\n```python\nimport json\nfrom scripts.enhanced_report_generator import generate_enhanced_report\n\n# Save results\nwith open(\"test_results_adaptive.json\", \"w\") as f:\n    json.dump(results, f, indent=2)\n\n# Generate HTML report\nreport_path = generate_enhanced_report(\n    page_analysis=page_analysis,\n    results=test_results\n)\n\nprint(f\"Report: {report_path}\")\n```\n\n## Key Principles\n\n### Dynamic Task Decomposition\n\nThe AI should decide how to break down each task based on:\n- Website complexity\n- Persona's technical level\n- Task nature (navigation vs data entry vs search)\n\n**Low-tech persona example:**\n```python\n# More explicit, step-by-step\nnova.act(\"Look for a button labeled 'Contact' or 'Contact Us'\")\nnova.act(\"Click on the Contact button\")\nresult = nova.act_get(\"Is there a phone number or email address visible?\")\n```\n\n**High-tech persona example:**\n```python\n# Test efficiency features\nnova.act(\"Look for keyboard shortcuts or quick access features\")\nnova.act(\"Try to use search (Ctrl+K or Cmd+K)\")\n```\n\n### Real-Time Observation\n\nAfter EVERY `act()` call, analyze:\n- Did it succeed?\n- Was the UI element easy to find?\n- Was the label clear?\n- How many attempts needed?\n- Any error messages?\n\nDocument friction immediately in observations.\n\n### Persona-Aware Prompting\n\nAdapt `act()` prompts to persona characteristics:\n- **Elderly\u002Flow-tech:** Look for obvious, labeled buttons; read everything\n- **Power users:** Try keyboard shortcuts, advanced features\n- **Mobile users:** Test mobile responsiveness, touch targets\n- **Screen reader users:** Test keyboard navigation, ARIA labels\n\n## Resources\n\n### `references\u002Fnova-act-cookbook.md`\n**MUST READ before starting any test.** Contains best practices for:\n- Effective act() prompting\n- Task decomposition strategies\n- Data extraction patterns\n- Error handling\n- Persona adaptation\n\n### `references\u002Fpersona-examples.md`\nTemplate personas with detailed profiles:\n- Tech-savvy millennial\n- Elderly first-timer\n- Busy professional\n- Student\u002Fbudget-conscious\n- Accessibility-focused\n- International\u002Fnon-native speaker\n\n### `scripts\u002Fnova_session.py`\nThin wrapper providing Nova Act session primitive:\n```python\nwith nova_session(url, headless=True, logs_dir=\".\u002Flogs\") as nova:\n    nova.act(\"action\")\n    result = nova.act_get(\"query\", schema=Schema)\n```\n\n### `scripts\u002Fenhanced_report_generator.py`\nCompiles observations into HTML usability report with trace file links.\n\n### `assets\u002Freport-template.html`\nProfessional HTML template for usability reports.\n\n## ⚠️ IMPORTANT: First-Time Setup Required\n\n**This skill requires dependencies that must be installed before use.**\n\n### For AI Agents: Dependency Check\n\n**ALWAYS check if dependencies are installed before running tests:**\n\n```python\n# Quick dependency check\ntry:\n    import nova_act\n    print(\"✅ Dependencies installed\")\nexcept ImportError:\n    print(\"📦 Dependencies not installed. Please run:\")\n    print(\"   pip3 install nova-act pydantic playwright\")\n    print(\"   playwright install chromium\")\n    print(\"\")\n    print(\"This will take 2-3 minutes to download browsers (~300MB)\")\n```\n\n### For Users: One-Time Setup\n\n**Step 1: Install Python packages**\n```bash\npip3 install nova-act pydantic playwright\n```\n\n**Step 2: Install Playwright browser**\n```bash\nplaywright install chromium\n```\n\n**Step 3: Configure API key**\n1. Get your Nova Act API key from [AWS Console](https:\u002F\u002Fconsole.aws.amazon.com\u002F)\n2. Create config file:\n```bash\nmkdir -p ~\u002F.openclaw\u002Fconfig\necho '{\"apiKey\": \"your-key-here\"}' > ~\u002F.openclaw\u002Fconfig\u002Fnova-act.json\n```\n3. Replace `your-key-here` with your actual Nova Act API key\n\n## Example: AI-Orchestrated Test\n\n**User request:** \"Test example.com for elderly users\"\n\n**AI orchestration:**\n\n1. Read `references\u002Fnova-act-cookbook.md`\n2. Read `references\u002Fpersona-examples.md`\n3. Generate elderly persona (Dorothy, 72, low tech proficiency)\n4. Generate tasks:\n   - \"Find contact information\"\n   - \"Read about services\"\n   - \"Navigate to FAQ\"\n5. For each task, dynamically orchestrate Nova Act:\n   - Start session\n   - Execute small act() steps\n   - Observe and analyze each result\n   - Take notes on friction (small text, unclear labels, etc.)\n   - Continue or adapt based on observations\n6. Pool observations\n7. Generate HTML report with findings and recommendations\n\n**The AI decides every step.** The skill just provides tools and guidance.\n\n## File Structure\n\n```\nnova-act-usability\u002F\n├── SKILL.md                          # This file\n├── README.md                         # User documentation\n├── skill.json                        # Skill manifest\n├── scripts\u002F\n│   ├── run_adaptive_test.py          # Main orchestrator (accepts URL arg)\n│   ├── nova_session.py               # Session wrapper\n│   ├── enhanced_report_generator.py  # HTML report generator\n│   └── trace_finder.py               # Extract trace file paths\n├── references\u002F\n│   ├── nova-act-cookbook.md          # Best practices\n│   └── persona-examples.md           # Template personas\n└── assets\u002F\n    └── report-template.html          # HTML template\n\n```\n\n## Output Files (Created in Working Directory)\n\nWhen you run a test, these files are created in your current working directory:\n\n```\n.\u002F\n├── nova_act_logs\u002F                    # Nova Act trace files\n│   ├── act_\u003Cid>_output.html         # Session recordings\n│   └── ...\n├── test_results_adaptive.json        # Raw test results\n└── nova_act_usability_report.html   # Final report\n```\n\nAll paths are relative - works from any installation location!\n",{"name":5,"version":24,"metadata":25,"description":7},"1.0.2",{"openclaw":26},{"requires":27},{"bins":28,"config":30},[29],"python3",[31],"~\u002F.openclaw\u002Fconfig\u002Fnova-act.json","main","f9d3fe7cf9ac8f1ea63a0d96e98e1f510a3814db","skills\u002Fadityak6798\u002Fwebsite-usability-test-nova-act",1,"https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills","https:\u002F\u002Fgithub.com\u002Fjavimosch","intrane.fr","Building robust, open-source infrastructure for the commons. AI-leveraged, self-hosted, built to last.","2026-06-07 03:34:58",{"source":8,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add javimosch\u002Fopen-claw-skills --skill nova-act-usability",{"tool":47,"command":48},"bunx","bunx skills add javimosch\u002Fopen-claw-skills --skill nova-act-usability",{"tool":50,"command":51},"pnpm","pnpm dlx skills add javimosch\u002Fopen-claw-skills --skill nova-act-usability","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fadityak6798\u002Fwebsite-usability-test-nova-act\u002FSKILL.md",true,[],[56,64,71,78,85,92],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":63},"01M778GGXG2VQ0YF31W2MKGMQZ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[],[],"2026-11-15 14:19:17",{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":63},"01M778G7BH8SBJ9FJ6C3G7CB1K","ceaser","Interact with the Ceaser privacy protocol on Base L2 using the ceaser-mcp MCP tools. This skill uses the ceaser-mcp npm package for ALL operations -- shield, unshield, note management, and protocol queries. All ceaser tool calls use CLI subcommands (npx -y ceaser-mcp \u003Csubcommand>). Ceaser is a privacy-preserving ETH wrapper using Noir\u002FUltraHonk zero-knowledge proofs on Base L2 (chain ID 8453).","https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzyra-v21\u002Fceaser\u002FSKILL.md",[],[],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":63},"01M778FYCJQZWFKKX5FYMK3S47","ceaser-send","Fully automated private ETH transfer via Ceaser Protocol on Base L2 using the ceaser-mcp MCP tools. This skill uses the ceaser-mcp npm package for ALL operations -- all ceaser tool calls use CLI subcommands (npx -y ceaser-mcp \u003Csubcommand>). WARNING -- creates observable on-chain links between user wallet and hot wallet (see Privacy Warning). Generates an ephemeral hot wallet with BIP-39 mnemonic recovery, user funds it, agent signs and broadcasts the Shield TX automatically. Exactly one manual step required (funding the hot wallet with ETH). Uses Noir\u002FUltraHonk zero-knowledge proofs.","https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzyra-v21\u002Fceaser-send\u002FSKILL.md",[],[],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":63},"01M778FQQNSEYA3HJKZBPQ4M9Z","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[],[],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":63},"01M778FGVZX7QA2TF9BFMM37FY","moldium","Post and manage content on the Moldium blog platform. Triggered by \"post to Moldium\", \"write a blog post\", \"publish an article\", etc.","https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzyom45\u002Fmoldium\u002FSKILL.md",[],[],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":63},"01M778F88D8PQ9MQ0KNW2TJ8ZH","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, submit comments, search papers, and import papers. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, submitting paper reviews, searching papers by title, or importing papers from arXiv URLs via API at http:\u002F\u002Fweakaccept.top:8000\u002F.","https:\u002F\u002Fgithub.com\u002Fjavimosch\u002Fopen-claw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[],[]]