Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions crates/runx-cli/src/official_skills.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,11 @@ pub(crate) const OFFICIAL_SKILLS: &[OfficialSkillLockEntry] = &[
version: "sha-537dd9fc3c6b",
digest: "b073ec884f56c9e412d0c1039d5f28f163df0f5530eb0bee922ed4c557955c52",
},
OfficialSkillLockEntry {
skill_id: "runx/prospect-sequence",
version: "sha-14eddf4ad0e3",
digest: "c0f2e2d71a46d9ee9756a4c30203a735b30476f455118efb3057be9def3d9387",
},
OfficialSkillLockEntry {
skill_id: "runx/prior-art",
version: "sha-2555f66bde78",
Expand Down
7 changes: 7 additions & 0 deletions packages/cli/src/official-skills.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,13 @@
"catalog_visibility": "public",
"catalog_role": "context"
},
{
"skill_id": "runx/prospect-sequence",
"version": "sha-14eddf4ad0e3",
"digest": "c0f2e2d71a46d9ee9756a4c30203a735b30476f455118efb3057be9def3d9387",
"catalog_visibility": "public",
"catalog_role": "context"
},
{
"skill_id": "runx/prior-art",
"version": "sha-2555f66bde78",
Expand Down
98 changes: 98 additions & 0 deletions skills/prospect-sequence/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
---
name: prospect-sequence
description: Research an account from allowlisted public sources and draft a gated outreach sequence.
metadata:
category: sales
tags:
- prospecting
- outreach
- research
---

# Prospect Sequence

`prospect-sequence` turns bounded public account research into a sourced sales
angle, a short multi-touch outreach sequence, and a gated `send-as` proposal. It
is for operators who need the judgment and evidence behind an AI SDR motion
without allowing the skill to send anything itself.

## When To Use

Use this skill when:

- You have a named prospect company and contact reference.
- You can provide public source snippets from an explicit allowlist.
- You need a reviewable outreach angle and sequence before a human or provider
adapter sends.

Do not use it to scrape private networks, infer facts without source evidence,
or send messages directly.

## Inputs

- `prospect` (required): object with `company` and optional `contact`.
- `icp` (required): object describing the target customer profile, pain, and
offer.
- `source_allowlist` (required): list of permitted hosts or URL prefixes.
- `sources` (required): public source objects with `url`, `title`, and
`excerpt`. Every source URL must match the allowlist.

## Outputs

- `research`: object with `sources[]` and `angle`.
- `sequence`: array of outreach touches with channel, subject, body, and source
citations.
- `send_proposal`: gated proposed Effect for `send-as`.

## Guardrails

1. Treat `source_allowlist` as the network boundary. Reject private or
off-allowlist URLs before synthesizing.
2. Refuse when no source is available; the skill does not fabricate account
facts.
3. Cite each source used in the angle and sequence.
4. Emit only a proposed `send-as` effect with `approval_required: true` and
`sends_directly: false`.
5. Keep output deterministic enough for harness replay.

## Example

Input:

```yaml
prospect:
company: Acme Logistics
contact: VP Operations
icp:
offer: governed agent workflows for operations teams
pain: manual exception handling across support and finance
source_allowlist:
- acme.example
sources:
- url: https://acme.example/blog/exception-ops
title: Exception operations update
excerpt: Acme describes new SLA pressure from invoice and shipment exceptions.
```

Output:

```yaml
research:
angle: Acme's public operations update shows SLA pressure around invoice and
shipment exceptions, which maps to governed workflow automation.
sequence:
- step: 1
channel: email
subject: Reducing exception-handling drag at Acme
send_proposal:
effect: send-as
gated: true
approval_required: true
```

## Failure Modes

- No public sources: return `decision.status: refused`.
- Off-allowlist or private-network URL: return `decision.status:
policy_denied`.
- Missing prospect or ICP: return `decision.status: refused`.
82 changes: 82 additions & 0 deletions skills/prospect-sequence/X.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
skill: prospect-sequence
version: "0.1.0"
catalog:
kind: skill
audience: operator
visibility: public
role: context
runners:
decide:
default: true
type: cli-tool
command: node
args:
- run.mjs
outputs:
decision: object
research: object
sequence: array
send_proposal: object
artifacts:
wrap_as: prospect_sequence_packet
packet: runx.sales.prospect_sequence.v1
inputs:
prospect:
type: json
required: true
description: Prospect account and contact reference.
icp:
type: json
required: true
description: Ideal customer profile, pain, and offer context.
source_allowlist:
type: json
required: true
description: Allowed public hosts or URL prefixes for source evidence.
sources:
type: json
required: true
description: Public source records with url, title, and excerpt.
stop:
type: cli-tool
command: /bin/false
outputs:
decision: object
inputs:
reason:
type: string
required: false
description: Harness-only stop path proving the package records stop/error outcomes.
harness:
cases:
- name: public-sources-yield-sequence
runner: decide
inputs:
prospect:
company: Acme Logistics
contact: VP Operations
icp:
offer: governed agent workflows for operations teams
pain: manual exception handling across support and finance
source_allowlist:
- acme.example
sources:
- url: https://acme.example/blog/exception-ops
title: Exception operations update
excerpt: Acme describes new SLA pressure from invoice and shipment exceptions.
- url: https://acme.example/news/finance-automation
title: Finance automation note
excerpt: The finance team is consolidating manual approval queues this quarter.
expect:
status: sealed
receipt:
schema: runx.receipt.v1
state: sealed
disposition: closed
reason_code: process_closed
- name: stop-runner-fails
runner: stop
inputs:
reason: off-allowlist network target
expect:
status: failure
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
name: missing-public-sources-refuses
input:
prospect:
company: PrivateCo
contact: Revenue Operations
icp:
offer: governed outreach planning
pain: unverified account context
source_allowlist:
- private.example
sources: []
expect:
decision:
status: needs_agent
sequence: []
18 changes: 18 additions & 0 deletions skills/prospect-sequence/fixtures/off-allowlist-denied.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: off-allowlist-denied
input:
prospect:
company: Acme Logistics
contact: VP Operations
icp:
offer: governed workflows
pain: manual queues
source_allowlist:
- acme.example
sources:
- url: https://evil.example/post
title: Untrusted source
excerpt: This source should not be used because its host is outside the allowlist.
expect:
decision:
status: policy_denied
sequence: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: public-sources-yield-sequence
input:
prospect:
company: Acme Logistics
contact: VP Operations
icp:
offer: governed agent workflows for operations teams
pain: manual exception handling across support and finance
source_allowlist:
- acme.example
sources:
- url: https://acme.example/blog/exception-ops
title: Exception operations update
excerpt: Acme describes new SLA pressure from invoice and shipment exceptions.
- url: https://acme.example/news/finance-automation
title: Finance automation note
excerpt: The finance team is consolidating manual approval queues this quarter.
expect:
decision:
status: sealed
sequence:
min_items: 3
send_proposal:
effect: send-as
gated: true
sends_directly: false
Loading