Skip to content
Back to skills

Hiarthur

ASecurity

Search Amazon products and analyze materials, design, and reviews to uncover trade-offs and likely disappointments. See results in an interactive GUI.

  • 33 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 5, 2026
ai-agentsrustgoapifrontendbackendperformance

Works with

  • api

Security analysis

A100/100

Scanned September 5, 2026

npx -y skills add dvcrn/openclaw-skills-marketplace --skill hiarthur --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Hiarthur?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Hiarthur
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/dvcrn-hiarthur/badge)](https://www.skillsdirectory.com/skills/dvcrn-hiarthur)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: hiarthur
description: "Search Amazon products and analyze materials, design, and reviews to uncover trade-offs and likely disappointments. See results in an interactive GUI."
---

# HiArthur Product Search and Understanding

## Overview

Two-endpoint API for intelligent product search and deep product analysis. Products are sourced from Amazon, but results go far beyond what Amazon returns directly — every product is analyzed through a multi-stage pipeline combining computer vision, LLMs, and symbolic reasoning to evaluate how well each product actually matches what the user is looking for and where it's likely to disappoint.

- `POST https://hiarthur.com/api/agents/search` — find products matching a query. Each result is graded for fit against the user's requirements using vision + language models, not just keyword matching.
- `POST https://hiarthur.com/api/agents/product` — deep-dive one product for failure-mode analysis (FMEA), feature summary, and review synthesis. Uses LLM reasoning over product details and images to surface likely disappointments.

Base URL: `https://hiarthur.com/api`

Results can optionally be handed off to a GUI (e.g. https://hiarthur.com/c/<conversation_id> or https://hiarthur.com/product/f7e2a9c1b3d4) where users can browse results visually and continue the conversation interactively.

---

## When to Use This Skill

Use this skill when you need to:

- Find products that match detailed user requirements
- Evaluate trade-offs between competing products
- Identify likely durability or design problems
- Understand why a product might disappoint buyers
- Compare products beyond simple ratings or keywords

## Quick-Start: End-to-End Flow

### Step 1 — Start a new search

```json
POST /api/agents/search

{
  "type": "new",
  "search_query": "noise cancelling headphones for travel",
  "search_top_brands": true
}
```

Response:

```json
{
  "conversation_id": "a1b2c3d4-...",
  "logical_search_id": "ls_abc123",
  "products": [
    {
      "product": {
        "description": "Sony WH-1000XM5 Wireless Noise Canceling Headphones",
        "brand": "Sony",
        "location": "product/f7e2a9c1b3d4",
        "price": 328.0,
        "rating": 4.6,
        "reviews_count": 12450
      },
      "explainer": "Strong noise canceling with long battery life, well suited for travel.",
      "match_grade": "Excellent"
    }
  ],
  "can_fetch_more": true
}
```

### Step 2 — Fetch more results (pagination)

Reuse `conversation_id` and `logical_search_id` exactly as returned.

```json
POST /api/agents/search

{
  "type": "continue",
  "conversation_id": "a1b2c3d4-...",
  "logical_search_id": "ls_abc123"
}
```

Repeat while `can_fetch_more` is `true`. A continue response with `products: []` is valid (more may come on the next continue). Stop when `can_fetch_more` is `false`.

### Step 3 — Deep-dive a product

Use a `product.location` value exactly as returned by search.

```json
POST /api/agents/product

{
  "location": "product/f7e2a9c1b3d4"
}
```

Response:

```json
{
  "fmea": {
    "unmitigated_failure_modes": [
      {
        "failure_name": "Headband cushion flattens over time",
        "likelihood": {
          "level": "medium",
          "reasoning": "Foam compression builds with daily wear, so most regular users will notice reduced comfort within months."
        },
        "impact": "annoying",
        "timeline": "within_a_year",
        "summary": "The headband padding can compress with regular use, making the headphones less comfortable for long listening sessions.",
        "evidence": [
          "Foam headband cushion visible in images",
          "No mention of memory foam or replaceable pads"
        ]
      }
    ],
    "mitigated_failure_modes": [
      {
        "failure_name": "Poor noise canceling on wind",
        "ownership_experience": "Multipoint wind-noise reduction",
        "reasoning": "Multiple microphones and adaptive ANC algorithms reduce wind interference compared to single-mic designs.",
        "evidence": [
          "Adaptive ANC with multiple external microphones",
          "Wind noise reduction mode listed in features"
        ]
      }
    ],
    "quality_summary": "These headphones prioritize audio quality and noise canceling performance. Most disappointment comes from comfort degradation over time rather than core functionality."
  },
  "features_summary": "Paragraph summarizing key product features based on listing data.",
  "reviews_summary": "Paragraph synthesizing themes and patterns from customer reviews."
}
```

---

## Search Endpoint — Full Field Reference

### New Search (`type: "new"`)

Full example with all optional fields:

```json
{
  "type": "new",
  "search_query": "noise cancelling headphones for travel",
  "search_top_brands": true,
  "trim_query": "Over-ear wireless headphones with active noise canceling and long battery life for airplane use",
  "brands": ["Sony", "Bose"],
  "search_filters": {
    "price_min": 100,
    "price_max": 400,
    "rating_min": 4.0,
    "reviews_min": 500
  },
  "search_sort": "relevance"
}
```

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `type` | `"new"` | yes | — | Discriminator. |
| `search_query` | string | yes | — | Broad retrieval query sent to the product catalog. Should be precise, user-intent-aligned, and include all key attributes (color, size, material, use case, gender). |
| `search_top_brands` | boolean | yes | — | When `true`, restricts results to recognized top brands in the category. Default to `true` for electronics, appliances, clothing, tools, beauty, home/kitchen. Default to `false` for books, media. |
| `trim_query` | string | no | same as `search_query` | Similarity-trimming query. After retrieval, products with low similarity to this string are removed. Should be a fluent, attribute-rich, natural-language description optimized for matching product titles and images. More descriptive than `search_query`. See examples below. |
| `conversation_id` | UUID string | no | server-generated | Omit to let the server create a new conversation. Supply to attach this search to an existing conversation. |
| `brands` | string[] | no | `[]` | Explicit brand-name constraints. Only populate when the user names specific brands. Use canonical names with proper capitalization (e.g., `["Nike", "Adidas"]`). |
| `search_filters` | object | no | `null` | All sub-fields optional and nullable: `price_min` (number), `price_max` (number), `rating_min` (number), `reviews_min` (integer). No extra keys allowed. |
| `search_sort` | enum string | no | `null` | `"relevance"`, `"price_low"`, `"price_high"`, or `"best_sellers"`. |

#### `search_query` vs `trim_query`

`search_query` drives broad catalog retrieval. `trim_query` is applied after retrieval as a similarity filter — products with low similarity to it are removed.

`trim_query` should read like a grounded, attribute-rich product description:

- "A men's sleeveless hooded vest made of shiny metallic fabric with a full zipper front."
- "A 12-pack of chocolate-flavored protein shakes, each bottle containing 20 grams of protein."
- "A thick purple yoga mat made of dense non-slip foam, measuring one inch in thickness."
- "A 10-inch nonstick frying pan with a ceramic coating and induction-compatible base."
- "Wireless Bluetooth 5.3 earbuds with noise-canceling features and at least 40 hours of battery life."

When omitted, `trim_query` defaults to `search_query`. Only set it when you have a more descriptive version.

### Continue Search (`type: "continue"`)

| Field | Type | Required | Description |
|---|---|---|---|
| `type` | `"continue"` | yes | Discriminator. |
| `conversation_id` | UUID string | yes | Exact value from the prior search response. |
| `logical_search_id` | string | yes | Exact value from the prior search response. |

### Search Response

```json
{
  "conversation_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "logical_search_id": "ls_abc123",
  "products": [
    {
      "product": {
        "description": "Sony WH-1000XM5 Wireless Noise Canceling Headphones",
        "brand": "Sony",
        "location": "product/f7e2a9c1b3d4",
        "price": 328.0,
        "rating": 4.6,
        "reviews_count": 12450
      },
      "explainer": "Strong noise canceling with long battery life, well suited for travel.",
      "match_grade": "Excellent"
    }
  ],
  "can_fetch_more": true
}
```

| Field | Type | Description |
|---|---|---|
| `conversation_id` | string | Stable conversation identifier. Reuse for continue requests and frontend handoff. |
| `logical_search_id` | string | Identifies this search session for pagination. Reuse for continue requests. |
| `products` | array | `ProductWithExplainer` objects. May be empty (valid on continue). |
| `can_fetch_more` | boolean | The only pagination signal. `true` = more results available via continue. |

Each `products[]` entry:

| Field | Type | Description |
|---|---|---|
| `product.description` | string | Product title/description. |
| `product.brand` | string or null | Brand name if known. |
| `product.location` | string | Opaque product identifier (format: `product/<cache_key>`). Preserve exactly for `/agents/product` calls and frontend handoff. |
| `product.price` | number or null | Price in dollars. |
| `product.rating` | number or null | Star rating (e.g., 4.6). |
| `product.reviews_count` | integer or null | Number of customer reviews. |
| `explainer` | string | Human-readable rationale for the fit grade. May be empty. |
| `match_grade` | string | Canonical fit label. One of: `"Excellent"`, `"Good"`, `"Partial"`, `"Low"`. |

### Match Grade Semantics

| Grade | Meaning |
|---|---|
| **Excellent** | All user requirements confirmed by evidence. All numeric constraints pass. |
| **Good** | All critical requirements confirmed, none contraindicated. Constraints pass or pass within tolerance. |
| **Partial** | At least one critical requirement is unconfirmed, missing, or contraindicated, OR some numeric constraints fail. |
| **Low** | Any requirement is contraindicated, OR no requirements could be evaluated. |

---

## Product Endpoint — Deep Analysis

### Request

```json
{ "location": "product/<cache_key>" }
```

Use only a `location` value returned by `/api/agents/search`. Never invent locations. Request model uses `extra = "forbid"`.

### Response

| Field | Type | Description |
|---|---|---|
| `fmea` | object | Failure Mode and Effects Analysis. See structure below. |
| `features_summary` | string | Paragraph summarizing key product features. |
| `reviews_summary` | string | Paragraph synthesizing themes from customer reviews. |

### FMEA Structure

The `fmea` object describes how a product is likely to disappoint a buyer over time, framed as failure modes rather than feature ratings.

**`unmitigated_failure_modes`** — array, typically 3 entries, ordered by expected regret impact (likelihood x impact x immediacy):

| Field | Type | Possible Values |
|---|---|---|
| `failure_name` | string | Concise description of what goes wrong. |
| `likelihood.level` | string | `"low"`, `"medium"`, `"high"` |
| `likelihood.reasoning` | string | Product-specific probability rationale with expected incidence. |
| `impact` | string | `"cosmetic"`, `"annoying"`, `"performance_loss"`, `"unusable"` |
| `timeline` | string | `"immediate"`, `"within_a_year"`, `"over_a_year"` |
| `summary` | string | 1–2 sentences on real-use customer impact. |
| `evidence` | string[] | Concrete cues from listing, specs, or images. |

**`mitigated_failure_modes`** — array, 0–3 entries: common category failures that the product's design intentionally addresses.

| Field | Type | Description |
|---|---|---|
| `failure_name` | string | The common failure that is unlikely here. |
| `ownership_experience` | string | Short positive reframe (max ~6 words, e.g., "Long cord with easy rewind"). |
| `reasoning` | string | What design choices reduce this risk. |
| `evidence` | string[] | Concrete cues from listing. |

**`quality_summary`** — string: A calm, informed paragraph synthesizing dominant risks, design priorities, disappointment timeline, fixability, and who the product is likely to satisfy vs. frustrate.

---

## Error Handling

| Status | Endpoint | Cause | Suggested Action |
|---|---|---|---|
| `400` | `/agents/product` | Invalid location format (empty, malformed, or contains path separators). | Verify the location was copied verbatim from a search result. |
| `404` | `/agents/search` (continue) | `logical_search_id` not found or expired from cache. | Start a new search with `type: "new"`. |
| `404` | `/agents/product` | Product cache key or destination not found. May have expired. | Re-run search to get a fresh location. |
| `422` | Both | Schema validation failure: missing required field, wrong type, or extra key present. | Fix request body. All request models use `extra = "forbid"`. |
| `500` | Both | Unhandled internal error. | Retry once with backoff. If persistent, report as a service issue. |
| `502` | `/agents/search` | Search backend did not return a final result, or returned an invalid payload. | Retry once. If persistent, the upstream search service may be degraded. |

---

## Safety Rules

1. Send JSON request bodies only.
2. Never include extra fields — all request models use `extra = "forbid"` and will reject unknown keys with `422`.
3. Never invent product locations. Only use `location` values returned by `/api/agents/search`.
4. Preserve `conversation_id`, `logical_search_id`, and `product.location` exactly as returned. Do not trim, modify, or regenerate.
5. For `type: "new"`, omit `conversation_id` to let the server generate one.
6. All endpoints use the base URL `https://hiarthur.com/api`.

---

## Frontend Handoff

- Open `c/<conversation_id>` in a browser to resume that conversation within a GUI.
- Open a returned product location in a browser to open the product information and see product images in a GUI.
- Keep all backend-derived IDs and locations unchanged during handoff URL construction.

## Recommended Agent Usage Pattern

1. Call `/agents/search` with `type: "new"`.
2. Inspect the returned `products`.
3. If more candidates are needed, call `/agents/search` with `type: "continue"`.
4. When a specific product requires deeper analysis, call `/agents/product`.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…