XHS Content Benchmark
Follow shared release-shell rules in:
Use this skill when the user wants to:
- benchmark competitor or inspiration accounts on Xiaohongshu
- identify repeated Xiaohongshu title hooks and cover patterns
- shortlist strong note examples before adapting them into local XHS cards
- compare recent post output from one or more known Xiaohongshu profiles
Read these references before implementation:
skills/20-research/xhs-content-benchmark/references/actor-selection.md
skills/20-research/xhs-content-benchmark/references/brief-schema.md
skills/20-research/xhs-content-benchmark/references/normalized-schema.md
Default posture
Start from account-based benchmarking, not broad keyword search.
Default starting surface:
- known profile URLs -> recent post benchmark pool
Do not use this as the default first surface:
- keyword or topic search as the first collection surface
Do not silently switch between surfaces.
If the user asks for keyword search, use the keyword-search route explicitly and fail visibly if it returns no items.
Validated actor path
Default actor for this skill:
rednote-xiaohongshu-user-posts-scraper
Use it when the user provides:
- one or more Xiaohongshu
- one or more Xiaohongshu
This is the current default because it returns the post-level fields this benchmark flow needs:
- note URL
- note id
- title
- post type
- like count
- author metadata
- cover image metadata
Experimental route
Keyword route:
rednote-xiaohongshu-search-scraper
Use it only when the user explicitly wants keyword or topic benchmarking.
Current operational rule:
- require
- fail if the actor returns zero items
Do not pretend keyword benchmarking succeeded when the actor returned an empty dataset.
Not part of this skill
- comment mining
- audience language extraction
- media downloading
- profile health snapshots
- publishing or scheduling notes
Route those later to dedicated XHS skills.
Recommended workflow
- classify the request:
- account benchmark
- keyword benchmark
- compile a small benchmark brief into actor input
- run the chosen actor through the shared collection runner
- normalize into one local post dataset
- rank by like signal plus theme relevance
- summarize:
- recurring hooks
- title pattern families
- cover aspect patterns
- content-type split
- strongest benchmark examples
Cost discipline
Validated account route:
- start with 8-15 recent posts per profile
- benchmark 1-3 profiles at a time
Experimental keyword route:
- the actor currently enforces a much higher minimum item count
- do not hide that constraint
- keep keyword batches narrow and specific
Release-Shell Execution Contract
- keep benchmark briefs, actor inputs, raw datasets, normalized datasets,
rankings, and analysis outputs under
<work-folder>/.postplus/xiaohongshu-content-benchmark/
- keep only final user-facing benchmark summaries or shortlists outside
- start with a bounded first pass:
- profiles for the validated account route
- narrow keyword batches only when the user explicitly requests search
- if hosted capability is unavailable, unauthorized, or returns a stable
network error, stop immediately instead of switching to ad hoc shell glue
Main scripts
scripts/build_xhs_benchmark_actor_input.mjs
scripts/normalize_xhs_benchmark_dataset.mjs
scripts/rank_xhs_benchmark_posts.mjs
scripts/analyze_xhs_benchmark_dataset.mjs
Use the shared collection runner for actor calls:
${CLAUDE_SKILL_DIR}/_postplus_shared/00-core/shared-collection/scripts/collection_actor_run.mjs
Minimal workflow
Account benchmark
Build actor input from a brief:
bash
node ${CLAUDE_SKILL_DIR}/scripts/build_xhs_benchmark_actor_input.mjs \
--brief <work-folder>/.postplus/xhs-benchmark-brief.json \
--output <work-folder>/.postplus/xhs-benchmark-actor-input.json
Run the validated actor:
bash
node ${CLAUDE_SKILL_DIR}/_postplus_shared/00-core/shared-collection/scripts/collection_actor_run.mjs \
--collection-key xhs-account-posts \
--input <work-folder>/.postplus/xhs-benchmark-actor-input.json \
--output <work-folder>/.postplus/xhs-benchmark-raw.json
Normalize, rank, analyze:
bash
node ${CLAUDE_SKILL_DIR}/scripts/normalize_xhs_benchmark_dataset.mjs \
--input <work-folder>/.postplus/xhs-benchmark-raw.json \
--output <work-folder>/.postplus/xhs-benchmark-normalized.json
node ${CLAUDE_SKILL_DIR}/scripts/rank_xhs_benchmark_posts.mjs \
--input <work-folder>/.postplus/xhs-benchmark-normalized.json \
--theme "职场,打工人,办公室" \
--output <work-folder>/.postplus/xhs-benchmark-ranking.json
node ${CLAUDE_SKILL_DIR}/scripts/analyze_xhs_benchmark_dataset.mjs \
--input <work-folder>/.postplus/xhs-benchmark-normalized.json \
--output <work-folder>/.postplus/xhs-benchmark-analysis.json
Keyword benchmark
Use the same build script, but provide
in the brief.
Operational constraint:
- keep
- expect a visible failure if the actor returns zero items
Good output
Return:
- benchmark shortlist
- top note URLs
- recurring title hooks
- title pattern breakdown
- cover-shape breakdown
- observed content-type split
- data-quality warnings when fields are missing
- suggested card angles that can later feed
skills/40-creative/xiaohongshu-card-notes
Failure posture
- fail if the request mixes profile benchmarking and keyword benchmarking without saying which should be primary
- fail if no , , or are provided
- fail if the keyword-search actor returns zero items
- fail if the normalized dataset has no note URLs
- keep raw actor output for debugging