Install
$ agentstack add skill-doctormozg-claude-pipelines-freelance-pitch ✓ 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
Freelance Pitch
Overview
You generate a single grounded freelance proposal for a selected gig. The gig may be referenced by rank (against the latest /freelance-search run), by URL (looked up in the latest run; if absent, WebFetched off-pipeline with a warning), or picked interactively from a list of the top-10 scored gigs.
The proposal is a markdown file at .mz/outreach//proposals/.md. Word cap: 350. Hard. Pricing and milestones must be grounded in verbatim text from the gig or the strategist's rate floor — no fabrication.
When to Use
Invoke when the user wants to draft a proposal for one specific freelance gig. Trigger phrases: "draft a proposal", "pitch this gig", "freelance pitch", "proposal for gig ", "proposal for ".
When NOT to use
- The user wants to find gigs — use
/freelance-searchinstead. - The user wants a salaried cover letter — use
/job-searchor the copywrite skill. - The user has no scored runs and no gig URL — the pipeline asks for a URL or aborts.
Input
$ARGUMENTS— optional, one of:- An integer rank (e.g.
3) → resolve against the latest/scored.json. - A URL → look up in the latest
scored.json; if not found, WebFetch with a warning. - Empty → interactive picker.
Directory Structure
- State —
.mz/task//state.md. - Output — when resolving against an existing freelance-search run:
.mz/outreach//proposals/.md. When operating off-pipeline (URL with no prior run):.mz/outreach/_freelance_pitch_/proposals/.md.
Core Process
Phase Overview
| # | Phase | Agent(s) | Details | | --- | ----------------------------- | --------------------------------- | ----------------------------- | | 0 | Resolve gig (rank/URL/picker) | — (orchestrator, AskUserQuestion) | phases/resolve_and_pitch.md | | 1 | Read CV + gig + tone pick | — (orchestrator, AskUserQuestion) | phases/resolve_and_pitch.md | | 1.5 | Tone preference approval | — (orchestrator) | phases/resolve_and_pitch.md | | 2 | Generate proposal | freelance-proposal-writer | phases/resolve_and_pitch.md | | 3 | Proposal review + edit loop | — (orchestrator, AskUserQuestion) | phases/resolve_and_pitch.md | | 4 | Write final proposal file | — (orchestrator) | phases/resolve_and_pitch.md |
Read the phase file when reaching Phase 0.
Techniques
Delegated to phase file.
Common Rationalizations
N/A — orchestration skill.
Red Flags
- You generated a proposal without a CV — proposal-writer cannot ground the credibility hook.
- You allowed a milestone with no verbatim grounding from
gig.project_scope_raw. - You let a pricing figure stand that does not trace to
gig.budget_range_raworstrategy.rate_floor. - The final proposal contains any banned phrase from the proposal-writer's list.
- The proposal exceeds 350 words.
- You skipped the user approval gate at Phase 3.
Verification
Before completing, output a visible block showing: gig title, gig URL, source, output file path, word count, engagement type assumed, and a one-line excerpt of the opener. Confirm the proposal file exists on disk.
______________________________________________________________________
Phase 0 entry
Parse $ARGUMENTS:
- Integer (e.g.
3) →rank_arg. - URL (starts with
http://orhttps://) →url_arg. personality:offtoken (anywhere in$ARGUMENTS) →personality_mode = off(defaulton); disables the Phase 1.6 reader-style read so proposals use neutral structure.- Empty (no rank or URL) → interactive picker.
Discover the most recent freelance-search run:
latest_run=$(ls -dt .mz/outreach/*freelance_search_* 2>/dev/null | head -n 1)
Branching:
rank_argset → requirelatest_run. If absent, AskUserQuestion: "No prior /freelance-search run found. Provide a gig URL, or Cancel."url_argset → iflatest_runexists, look up the URL inlatest_run/scored.json. If found, use the scored record. If not found, WebFetch the URL and treat as off-pipeline (warn: no prior scoring).- Empty → if
latest_runexists, AskUserQuestion with a single-select menu of the top-10 scored gigs (label =# — (score )) plus an "Other URL" option. If nolatest_run, AskUserQuestion demands a URL or aborts.
Set task_name = _freelance_pitch_. Set run_dir:
- If gig came from
latest_run'sscored.json:run_dir = latest_run(proposals nested under existing run). - If gig is off-pipeline (URL with no prior scoring):
run_dir = .mz/outreach/(new sibling directory).
mkdir -p .mz/task/
mkdir -p /proposals
Read phases/resolve_and_pitch.md for the rest.
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 existing 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.
Error Handling
- Off-pipeline WebFetch fails: AskUserQuestion to retry the URL or Cancel.
- proposal-writer returns
STATUS: BLOCKED(all milestones ungrounded): emit a chat block explaining the scope is too vague to produce a grounded proposal; offer to re-run with a different gig. - proposal-writer returns
STATUS: DONE_WITH_CONCERNS: show concerns in the Phase 3 review gate so the user can accept or request a regenerate.
Resume Support
Phase 0 always re-resolves the gig (cheap). Phases 2-4 are not resumed — if interrupted, re-run /freelance-pitch with the same args.
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.