Skills hiarthur

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

install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/arthgrab/hiarthur" ~/.claude/skills/clawdbot-skills-hiarthur && rm -rf "$T"
manifest: skills/arthgrab/hiarthur/SKILL.md
source content

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

POST /api/agents/search

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

Response:

{
  "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.

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.

POST /api/agents/product

{
  "location": "product/f7e2a9c1b3d4"
}

Response:

{
  "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:

{
  "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"
}
FieldTypeRequiredDefaultDescription
type
"new"
yesDiscriminator.
search_query
stringyesBroad 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
booleanyesWhen
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
stringnosame 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 stringnoserver-generatedOmit 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
objectno
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 stringno
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"
)

FieldTypeRequiredDescription
type
"continue"
yesDiscriminator.
conversation_id
UUID stringyesExact value from the prior search response.
logical_search_id
stringyesExact value from the prior search response.

Search Response

{
  "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
}
FieldTypeDescription
conversation_id
stringStable conversation identifier. Reuse for continue requests and frontend handoff.
logical_search_id
stringIdentifies this search session for pagination. Reuse for continue requests.
products
array
ProductWithExplainer
objects. May be empty (valid on continue).
can_fetch_more
booleanThe only pagination signal.
true
= more results available via continue.

Each

products[]
entry:

FieldTypeDescription
product.description
stringProduct title/description.
product.brand
string or nullBrand name if known.
product.location
stringOpaque product identifier (format:
product/<cache_key>
). Preserve exactly for
/agents/product
calls and frontend handoff.
product.price
number or nullPrice in dollars.
product.rating
number or nullStar rating (e.g., 4.6).
product.reviews_count
integer or nullNumber of customer reviews.
explainer
stringHuman-readable rationale for the fit grade. May be empty.
match_grade
stringCanonical fit label. One of:
"Excellent"
,
"Good"
,
"Partial"
,
"Low"
.

Match Grade Semantics

GradeMeaning
ExcellentAll user requirements confirmed by evidence. All numeric constraints pass.
GoodAll critical requirements confirmed, none contraindicated. Constraints pass or pass within tolerance.
PartialAt least one critical requirement is unconfirmed, missing, or contraindicated, OR some numeric constraints fail.
LowAny requirement is contraindicated, OR no requirements could be evaluated.

Product Endpoint — Deep Analysis

Request

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

Use only a

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

Response

FieldTypeDescription
fmea
objectFailure Mode and Effects Analysis. See structure below.
features_summary
stringParagraph summarizing key product features.
reviews_summary
stringParagraph 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):

FieldTypePossible Values
failure_name
stringConcise description of what goes wrong.
likelihood.level
string
"low"
,
"medium"
,
"high"
likelihood.reasoning
stringProduct-specific probability rationale with expected incidence.
impact
string
"cosmetic"
,
"annoying"
,
"performance_loss"
,
"unusable"
timeline
string
"immediate"
,
"within_a_year"
,
"over_a_year"
summary
string1–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.

FieldTypeDescription
failure_name
stringThe common failure that is unlikely here.
ownership_experience
stringShort positive reframe (max ~6 words, e.g., "Long cord with easy rewind").
reasoning
stringWhat 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

StatusEndpointCauseSuggested 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
BothSchema validation failure: missing required field, wrong type, or extra key present.Fix request body. All request models use
extra = "forbid"
.
500
BothUnhandled 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
    .