AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Market Research

skill-berenshtein-market-research-skills-market-research · by berenshtein

>

No reviews yet
0 installs
22 views
0.0% view→install

Install

$ agentstack add skill-berenshtein-market-research-skills-market-research

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-berenshtein-market-research-skills-market-research)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
4mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Market Research? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Market Research — full AJTBD research cycle

This skill orchestrates 9 phases of market research across 3 blocks (Research → Strategy → Output) with 3 user checkpoints. Three modes: express, quick, deep.


First message

When this skill is invoked, do the following:

  1. Identify inputs. Check whether the user has provided:
  • A path to a product context document (if a brief / one-pager already exists)
  • A product description in the message
  • Or nothing — then ask
  1. Check for resume. Look for research-state.json in the working folder:
  • If found and status != "completed" → propose resuming from the last phase
  • If not found → start a new research project
  1. Pick the mode. Ask the user:
Research mode:

1. **Express** (~40 min, 1 session) — landscape + competitors + segments.
   Research Block only, no strategy or sales artifacts.
   For quick reconnaissance of a new market.

2. **Quick** (~2.5h, 3 sessions) — 1 segment, full 9-phase cycle.
   Research + Strategy + Output. The main mode.

3. **Deep** (~5h, 3-4 sessions) — 2 segments, full analytics.
   Extended data collection, all competitors, 5 experts on the council.

I recommend express for a first look, quick for a full study,
deep when maximum thoroughness is required.
  1. Create a working folder and initialize state:
./market-research-{product-slug}/
├── research/
│   └── (artifacts 01-09 will live here)
└── research-state.json

Modes: express / quick / deep

| Aspect | Express | Quick | Deep | |--------|---------|-------|------| | Time | ~40 min (1 session) | ~2.5h (3 sessions) | ~5h (3-4 sessions) | | Phases | 1-3 only | 1-9 | 1-9 | | Checkpoints | CP1 (final) | CP1, CP2, CP3 | CP1, CP2, CP3 | | Deep-dive segments | — | 1 | 2 | | Phase 1: English-language sources | No | No | Yes | | Phase 2: competitors | 5 direct | 7 direct + 2 benchmark | All (10-15 + 3-5 global) | | Phase 6: CEO Council | — | 3-4 experts | 5 experts | | Phase 7: Synthesis | — | Offer to skip | Include | | Output block (8-9) | — | Yes | Yes |

Express ends after Checkpoint 1. The user gets a landscape, competitive matrix and segments — enough to decide "dig deeper or not." If desired, they can continue in quick/deep — state allows resume.


State Management

research-state.json

{
  "version": "1.0",
  "mode": "express|quick|deep",
  "product": "Product name",
  "product_slug": "product-slug",
  "brief_source": "path/to/context.md | manual",
  "workspace": "./market-research-{slug}/",
  "created_at": "2026-03-19T10:00:00Z",
  "updated_at": "2026-03-19T12:00:00Z",
  "current_phase": 0,
  "status": "in_progress|checkpoint|completed|failed",
  "phases": {
    "1": {
      "status": "pending|in_progress|done|skipped",
      "started_at": null,
      "completed_at": null,
      "artifacts": [],
      "sources_count": 0,
      "errors": []
    }
  },
  "checkpoints": {
    "1": {
      "status": "pending|passed",
      "gate_met": false,
      "decisions": {}
    },
    "2": {
      "status": "pending|passed",
      "gate_met": false,
      "decisions": {}
    },
    "3": {
      "status": "pending|passed",
      "gate_met": false,
      "decisions": {}
    }
  },
  "insights": [],
  "selected_segments": [],
  "brief_vars": {
    "product": "",
    "market": "",
    "country": "",
    "currency": "",
    "business_model": "",
    "known_competitors": [],
    "icp_hypothesis": "",
    "url": ""
  }
}

State management rules

  • Update state after each phase: current_phase, phases[N].status, updated_at
  • Record user decisions in checkpoints[N].decisions
  • Insight tracker: add every key fact from Phase 1-2 to insights[]:

``json { "id": "I001", "phase": 1, "text": "15.2M self-employed in RF", "confidence": "V", "source_url": "https://...", "status": "pending", "used_in": [] } ` As insights get used in phases 3-9, update status"used" and used_in. At the end (Phase 9), check whether any insights are still "pending"` — ask the user to decide: use or discard.

  • On errors: record into phases[N].errors[], apply the fallback, do not stop
  • Resume: when continuing, read state and rebuild context from the artifacts of completed phases
  • Mode upgrade: if a research project starts in express, the user can continue in quick/deep — update mode in state; phases 1-3 are already done

Confidence Labels

Tag every number and statement in artifacts:

  • [V] — Verified: confirmed from 2+ independent sources. Required: URLs of both sources.
  • [S] — Single-source: one source. Required: source URL.
  • [E] — Estimated: computed from assumptions. Required: the calculation formula.
  • [G] — Generated: produced by the LLM without a primary source.

Citation format:

TAM: 280B RUB [V] (Data Insight, 2025: https://... | FTS, 2025: https://...)
SAM: 42B RUB [E] (280 × 0.15 — segment share estimated)
Market growth ~40% [S] (Data Insight, 2025: https://...)
Average ticket ~15K RUB [G]

Algorithm: 9 phases in 3 blocks

RESEARCH BLOCK (Phases 1-3)

Phase 1: Market Landscape

Goal: Gather the quantitative picture of the market: size, growth, drivers, regulation, key players.

Execution — worker agents (hybrid pattern).

Launch 3 (express/quick) or 4 (deep) subagents in parallel via the Agent tool (subagent_type: "general-purpose") in a SINGLE message — all calls at once. Each worker runs in its own clean context and returns a finished section (300-500 words). Raw data (deep research dumps, crawling HTML) stays inside the agent's context and dies with it — the main context is not polluted with tens of thousands of tokens of raw material.

Worker A: Market Size & Growth

You are a research worker for a market research project. Collect quantitative data
about the "{brief_vars.market}" market in "{brief_vars.country}" for
{current_year - 1}-{current_year}.

Tools (in priority order):
1. deep_researcher_start with the prompt:
   "Research the {brief_vars.market} market in {brief_vars.country}
   ({current_year - 1}-{current_year}). Focus on: TAM in {brief_vars.currency},
   revenue pool, sub-segments relevant to {brief_vars.icp_hypothesis},
   YoY growth rates, adjacent markets for benchmark."
2. Fallback (if deep_researcher is empty/errors out): web_search_advanced_exa
   (numResults: 15, startPublishedDate: "{current_year - 1}-01-01") with the query
   "{brief_vars.market} market {brief_vars.country} {current_year}"
   + crawling_exa on the top-5 URLs.

Return EXACTLY this format (≤400 words, no commentary):

## Market Size & Growth
- TAM: X {brief_vars.currency} [V/S/E] (source URLs)
- YoY growth: X% [V/S/E] (URL)
- Key sub-segments with shares: ...
- Adjacent markets for benchmark: ...

## Sources
| # | Source | URL | Date | What was taken |

Requirements: every number with a confidence label. [V] — 2+ URLs, [S] — 1 URL, [E] — formula.

Worker B: Drivers & Trends

You are a research worker. Collect growth drivers, macro trends, technological and
behavioral shifts, and demographics for the "{brief_vars.market}" market in
"{brief_vars.country}".

Tools: web_search_advanced_exa × 2 in parallel:
- Query 1: "{brief_vars.icp_hypothesis} statistics growth count {current_year}"
  (startPublishedDate: "{current_year - 1}-06-01", numResults: 8, type: neural)
- Query 2: "{brief_vars.market} trends drivers {current_year}"
  (startPublishedDate: "{current_year - 1}-01-01", numResults: 8, type: neural)
+ crawling_exa on the top-3 URLs.

Return (≤400 words):

## Drivers & Trends
- Macro drivers: ...
- Technological shifts: ...
- Behavioral changes: ...
- Demographics: ...

## Sources
| # | Source | URL | Date | What was taken |

Requirements: every fact with a confidence label and URL.

Worker C: Regulation & Players

You are a research worker. Collect regulation and key players in the
"{brief_vars.market}" market in "{brief_vars.country}".

Tools: web_search_advanced_exa × 2:
- "regulation {brief_vars.market} {brief_vars.country} changes law"
  (startPublishedDate: "{current_year - 1}-01-01", numResults: 8)
- "{brief_vars.known_competitors joined by ', '} new players {current_year}"
  (numResults: 10)
+ crawling_exa.

Return (≤500 words):

## Regulation
- Key regulatory acts: ...
- Upcoming changes: ...
- Enforcement trends: ...
- Licensing requirements: ...

## Key Players (short list — details in Phase 2)
Name + 1 line of positioning each. NO detailed cards.

## Sources
| # | Source | URL | Date | What was taken |

Worker D: Global Benchmarks (deep mode only)

You are a research worker. Find English-language analytical sources on the global
state of the "{brief_vars.market in English}" market and benchmarks from mature markets.

Tools: web_search_advanced_exa in English (numResults: 10) + crawling_exa.

Return (≤300 words):

## Global Benchmarks
- Global market size: ...
- Global vs. local growth: ...
- Leaders from other countries as examples: ...

## Sources
| # | Source | URL | Date | What was taken |

Assembly by the main Claude (after receiving all responses):

  1. Create 01-landscape.md in the order: Market Size → Drivers → Regulation → Players → Global Benchmarks (deep only)
  2. Merge all ## Sources tables into a single Source Registry at the end of the file — deduplicate by URL, combine the "What was taken" column:
## Source Registry

| # | Source | URL | Publication date | What was taken |
|---|--------|-----|------------------|-----------------|
| 1 | Data Insight | https://... | 2025-02 | TAM, GMV growth |
| 2 | FTS via Interfax | https://... | 2025-01 | Number of self-employed |
| ... | | | | |
  1. Add each key fact to insights[] in state with source_url and confidence

Output: 01-landscape.md

Gate (for checkpoint 1): sources_count ≥ 10 (unique URLs in the Source Registry)


Phase 2: Competitive Intelligence

Goal: Build a comparative matrix of every competitor.

Number of competitors:

  • Express: 5 direct
  • Quick: 7 direct + 2 global benchmark
  • Deep: all that can be found (typically 10-15 direct + 3-5 global)

Execution — worker agents (hybrid pattern).

For EVERY competitor, launch a separate subagent via the Agent tool (subagent_type: "general-purpose"). All agents — in parallel in a SINGLE message. Each returns a finished card (~400 words). Raw crawling/company_research data stays in the worker's context and dies with it — by the end of Phase 2 the main context receives only 10-15 finished cards instead of hundreds of kilobytes of raw material.

Worker prompt (template, identical for every worker):

You are a research worker. Collect data on ONE competitor and return a finished
card for the comparative matrix.

Competitor: {competitor_name}
Known URL: {competitor_url | "find it yourself"}
Context: market {brief_vars.market}, {brief_vars.country}

Tools (in order of use):
1. company_research_exa({competitor_name}) — primary collection
2. crawling_exa({url}) — pricing, features, clients from site pages
3. web_search_exa("{competitor_name} reviews customers g2") — reputation

Fallback: if company_research_exa is empty →
crawling_exa on the site + puppeteer_navigate + puppeteer_screenshot of the pricing page.

Return EXACTLY this format, nothing extra (≤400 words):

### {competitor_name}

| Field | Value |
|-------|-------|
| URL | ... |
| Year founded | ... [S] (URL) |
| Services | checklist |
| Target customers | ... |
| Pricing model | ... |
| Specific numbers | ... [V/S/E] (URL) |
| Automation | self-serve / API / manual |
| Known customers | ... |
| Geography | ... |
| Strengths | ... |
| Weaknesses | ... |
| Positioning | 1 sentence |

### Sources
| # | Source | URL | What was taken |

Requirements: every number/fact with a confidence label [V/S/E/G]. No commentary,
only the card and sources. If data is missing — write "⚠️ not found".

Assembly by the main Claude (after all cards are received):

  1. Create 02-competitors.md with the structure:
  • Summary matrix at the top — one row per competitor (key columns: name, URL, pricing model, positioning) for quick comparison
  • Per-competitor cards — details from workers, direct first, then benchmark
  • Source Registry at the end — merged from all workers, deduplicated by URL
## Source Registry

| # | Competitor | Data source | URL | What was taken |
|---|------------|-------------|-----|-----------------|
| 1 | CompanyA | Official website | https://... | Pricing, features |
| 2 | CompanyA | G2 review | https://... | NPS, complaints |
| ... | | | | |
  1. Check the cards: if a competitor has no pricing → mark ⚠️ pricing not found in the summary matrix

Output: 02-competitors.md

Gate (for checkpoint 1): competitors_count ≥ 5


Phase 3: JTBD Segments

Goal: Identify 5 attractive segments and enrich them with data from Phase 1-2.

Sub-skill invocation: Use the Skill tool with skill: "jtbd-segment", passing the context:

Product: {brief_vars.product}
Market: (data from 01-landscape.md — TAM, drivers, regulation)
Competitors: (data from 02-competitors.md — positioning gaps)

After receiving the segments:

  • Enrich TAM/SAM/SOM with specific numbers from Phase 1 (with confidence labels and URLs)
  • Verify: every segment must reference landscape data
  • For [E] numbers — the formula is mandatory: SAM: 42B RUB [E] (TAM 280 × 0.15 segment share)

Output: 03-segments.md

Gate (for checkpoint 1): segments_count ≥ 3, each with TAM


─── CHECKPOINT 1: Research Review ───

When: After Phase 3 (all three artifacts ready).

In express mode: this is the final checkpoint. After it, propose: "Express complete. Want to continue in quick/deep mode? State is saved, phases 1-3 don't need to be repeated."

Gate criteria (all must be true):

  • [ ] Phase 1: ≥10 sources with URLs in the Source Registry
  • [ ] Phase 2: ≥5 competitors in the matrix
  • [ ] Phase 3: ≥3 segments with TAM/SAM/SOM

If the gate is not met: tell the user exactly what is missing and offer to redo the specific phase.

Message to the user:

## Checkpoint 1: Research Review

**Landscape:** {sources_count} sources, TAM = {tam_value}
**Competitors:** {competitors_count} in the matrix
**Segments:** {segments_count}, top-3 by attractiveness:
  1. {segment_1} — TAM {tam_1}
  2. {segment_2} — TAM {tam_2}
  3. {segment_3} — TAM {tam_3}

**Decisions:**
1. Does the landscape match your picture of the market? What is missing?
2. Which competitors are missing?
3. Which 1-2 segments should be prioritized for deep analysis?
   - Quick mode: pick 1
   - Deep mode: pick 2

Record the decisions in checkpoints.1.decisions:

{
  "landscape_approved": true,
  "missing_competitors": [],
  "selected_segments": ["segment-name-1"],
  "user_notes": "..."
}

Update selected_segments at the root of state.


STRATEGY BLOCK (Phases 4-6) — quick and deep only

Phase 4: Job Graph + Forces of Progress

Goal: Decompose the Core Job of the selected segments. Include Forces of Progress.

Sub-skill invocation: Use the Skill tool with skill: "jtbd-jobgraph" for each selected segment, passing:

Segment: {segment_name}
Core Jobs: {core_jobs from 03-segments.md}
Market context: (key insights from 01-landscape.md)

After receiving the Job Graph — add a Forces of Progress section:

## Forces of Progress

### Push (what pushes away from the current solution)
- ...

### Pull (what attracts to the new solution)
- ...

### Anxiety (what creates anxiety about switching)
- ...

### Habit (what holds the customer on the current solution)
- ...

For each Force, cite concrete data from Phase 1-2 (with confidence labels and source URLs).

Output: 04-jobgraph-{segment-slug}.md (×1-2 depending on mode)


##

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.