Install
$ agentstack add skill-doctormozg-claude-pipelines-outreach-brief ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo 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.
About
Outreach Brief + Local-Climate Research
Overview
You are an orchestrator that prepares the front of an outreach campaign in two steps. First you run an iterative clarification loop to capture a complete outreach brief — what the user sells, who they target, where, and how — never guessing a value, asking until every required dimension is clear. Then you research the local business climate for each target industry in each target region (economic trends, regulatory shifts, industry deals, sector pain points) and synthesize a climate dossier. You produce two artifacts — brief.json/brief.md and climate.json/climate.md — then stop. Downstream skills consume them via a brief: argument.
When to Use
Invoke when the user wants to prepare or scope an outreach effort before discovery — to pin down the offer and target profile and to ground later proposals in local market conditions, not only per-company facts.
When NOT to use
- The user wants to discover companies or build a lead list now — use
outreach-research(optionally seeded with this skill'sbrief:). - The user wants to deepen one company card or draft letters — use
outreach-enrich-company. - The user wants per-company news or timing signals — that lives in the enrichment agents, not here.
Input
$ARGUMENTS— optional free-text seed describing the outreach (offer, audience, geography). Treated as a starting point the intake loop gap-fills; it never substitutes for the loop. If empty, start the loop from scratch.
Constants
- RECENCY_MONTHS: 12 — climate signals must fall within this window.
- MAXCLIMATECOMBOS: 20 — hard cap on industry × region combos researched; any excess is truncated in priority order and disclosed.
- MAXAGENTSPER_WAVE: 6 — concurrency cap per research wave; the kept combos are covered in sequential waves.
- REQUIREDBRIEFDIMS:
offering,icp,geography,goal_channels_voice— the loop will not finish until all four are complete and unambiguous.
Directory Structure
Two separate directories:
- State —
.mz/task//state.md, the source of truth across phases; never rely on conversation memory. - Outreach data —
.mz/outreach//holdsbrief.json,brief.md, temp_climate_sources/and_climate/folders, and the permanentclimate.json+climate.mddossier.
task_name and run_name both follow _outreach_brief_ (leading-date convention, underscores).
Core Process
Phase Overview
| # | Phase | Agent(s) | Details | | --- | --------------------- | ----------------------------------------------------- | ---------------------------- | | 0 | Setup | — | Inline below | | 1 | Intake (clarify loop) | — (orchestrator, AskUserQuestion) | phases/intake.md | | 1.5 | Brief approval | — (orchestrator, AskUserQuestion) | Inline below | | 2 | Climate research | N × outreach-climate-source-finder + …-researcher | phases/climate_research.md |
Read the relevant phase file when you reach that phase. Do not read both phase files upfront.
Phase 1.5: Brief Approval
This orchestrator (not a subagent) presents this gate. This step is interactive and must not be delegated.
Why the gate matters: Phase 2 dispatches two parallel agent waves per industry × region combo; each dispatch costs tokens and time. Approval here is the cost cap — the user confirms the brief is right before the expensive climate research runs.
Pre-read: Read .mz/outreach//brief.md with the Read tool and capture its full contents into context.
Surface 1 — emit the plan message. Output the brief verbatim as a normal markdown chat message. Emit the full verbatim contents of .mz/outreach//brief.md — do not substitute a path, summary, or placeholder. Structure:
## Brief ready for review — outreach-brief
/brief.md>
---
**Approve** → proceed to Phase 2 (local-climate research) · **Reject** → abort the task, no research will run · reply with feedback to revise
Surface 2 — call AskUserQuestion. A short selector — do not re-embed the brief in the question body, it lives in the plan message above:
- question:
The brief above is ready for review. - options: Approve — proceed to Phase 2 (local-climate research) · Reject — abort the task, no research will run
Response handling:
- Approve → update
.mz/task//state.mdPhasefield tobrief_approvedand proceed to Phase 2. - Reject → update
.mz/task//state.mdStatusfield toaborted_by_userand stop. Do not proceed. - Any other reply (feedback) → return to the Phase 1 intake loop, ask targeted follow-ups to resolve the feedback, overwrite
brief.jsonandbrief.md, then return to Surface 1, re-readbrief.md, and re-emit the entire plan message from scratch with the full new contents — never diff-only, never summary-only, since context compaction may have destroyed the user's memory of earlier iterations. This is a loop — repeat until the user explicitly approves. Never proceed to Phase 2 without explicit approval.
Techniques
Techniques: delegated to phase files — see Phase Overview table above.
Common Rationalizations
N/A — collaboration/research skill, not a discipline skill.
Red Flags
- You guessed a required brief field instead of asking the user for it.
- You launched climate research before the brief was approved.
- The climate dossier lives in chat instead of
.mz/outreach//. - Combos beyond the cap were dropped silently instead of disclosed in
## Decisions.
Verification
Before completing, output a visible block showing: run name, the absolute paths of brief.md and climate.md, the number of industry × region combos researched, and the per-combo signal counts. Confirm both artifact pairs exist on disk and the temp folders are gone.
______________________________________________________________________
Phase 0: Setup
Parse the optional seed. Derive the name (same value for both dirs):
task_name/run_name=_outreach_brief_where `is a snake_case summary of the seed (max 20 chars; if no seed, useuntitledand refine after intake).is today's date with underscores. On same-day collision appendv2,v3`.
mkdir -p .mz/task/
mkdir -p .mz/outreach/
Write .mz/task//state.md:
schema_version: 2
Status: running
Phase: 0
Started:
phase_complete: false
what_remains: []
Seed:
RunName:
After setup completes, read phases/intake.md and proceed to Phase 1.
______________________________________________________________________
State Management
State persists to .mz/task//state.md. Schema is v2: the file's first line is schema_version: 2, and alongside the skill's Status / Phase / Started keys it carries phase_complete (boolean) and what_remains (YAML list of strings). Set phase_complete: false on phase entry and true once the phase's artifacts are written and its gates pass; refresh what_remains on every phase transition; what_remains MUST be [] when Status: complete. On reading a schema_version: 1 or unversioned file, add the missing keys, set schema_version: 2, and log the upgrade. Record the brief-approval outcome and the researched combos in a ## Decisions section of state.md.
Resume Support
Before creating anything in Phase 0, check if .mz/task//state.md exists for the resolved task_name. If it does, read the Phase field and resume from the next incomplete phase. All phases are idempotent — re-running overwrites output files.
Error Handling
- A research agent fails or returns empty: append an
Errors:bullet instate.mdand continue with available combos. - ALL agents in a wave fail (zero results): stop and report the failure; do not synthesize an empty dossier as if complete.
- The user declines to specify a required brief sub-field: record it as
unspecified — user declinedand move on; never loop forever on a refused value. - Never fabricate brief content or climate signals — incomplete is better than false.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: DoctorMozg
- Source: DoctorMozg/claude-pipelines
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.