Skip to content
Back to skills

New Motion

ASecurity

Scaffold a new GTM motion end to end across all three layers. Use whenever creating a new motion, campaign, play, or automation in this repo, so the narrative (context), the implementation (infra), and the regression suite (evals) ship together and never drift apart. Enforces the outreach hypothesis rule.

  • 10 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 2, 2026
ai-agentsgo

Security analysis

A100/100

Scanned September 2, 2026

npx -y skills add getcargohq/cargo-manifest --skill new-motion --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of New Motion?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for New Motion
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/getcargohq-new-motion/badge)](https://www.skillsdirectory.com/skills/getcargohq-new-motion)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: new-motion
description: Scaffold a new GTM motion end to end across all three layers. Use whenever creating a new motion, campaign, play, or automation in this repo, so the narrative (context), the implementation (infra), and the regression suite (evals) ship together and never drift apart. Enforces the outreach hypothesis rule.
---

# New motion, three layers at once

A motion is not just the automation. It is the narrative, the code, and the
guardrail. Create all three in one PR.

**On vocabulary:** a **motion** is the go-to-market move, and its narrative
lives in `context/motion/`. A **play** is a specific Cargo resource
(`definePlay`: an automation that watches a data model and runs per row). A
motion is implemented as a Cargo play, a Cargo tool, or an agent, depending on
how it is triggered. Do not confuse the two.

## Step 0: is this a campaign?

Set `kind:` in the narrative's frontmatter. It changes what you must declare.

| kind | What it is | Must declare a hypothesis? |
| --- | --- | --- |
| `outreach` | A campaign: it sends messages to humans | **Yes** |
| `enrichment` | Fills in data | No |
| `scoring` | Ranks records | No |
| `routing` | Assigns records to people | No |
| `signal` | Detects a trigger | No |

Only outreach motions are campaigns. The others declare their intent through the
outcome they serve in `plan/outcomes.md`.

## Steps

1. **Context first.** Copy `context/motion/_template.md` to
   `context/motion/<name>.md`. Fill in the trigger, the sequence, the owner, the
   success metric, and `serves:` (the outcome in `plan/outcomes.md` this makes
   real). Reference the ICP and personas with `[[icp/<slug>]]` and
   `[[persona/<slug>]]` wikilinks.

   **If `kind: outreach`, write the hypothesis before a single line of copy
   exists**: segment, angle, trigger, expected_reply_rate. This is what lets the
   result be judged against a bar set in advance rather than one invented
   afterwards. The linter fails the PR if it is missing.

   **Outreach motions may cite only `validated` or `proven` knowledge.** If the
   angle leans on a claim that is still `confidence: hypothesis`, there are two
   honest options: validate the claim first (see the `capture-feedback` skill),
   or change the angle. Never upgrade a claim just to unblock the copy.

2. **Infra second.** Pick the implementation by how it is triggered:
   - Watches a data model, runs per row: `definePlay` + `defineWorkflow`.
   - Runs on demand, or called by an agent: `defineTool` + `defineWorkflow`.
   - Reasons, decides, and calls several tools: `defineAgent`.

   The file goes in `infra/` as `<name>.ts`. `infra/` is flat by default: only
   nest (`infra/plays/`, `infra/tools/`, `infra/agents/`) once a use case has
   enough files that finding one is work, or because a cookbook you installed
   already nests. Check `infra/README.md` for what the directory looks like now
   before you decide.

   Workflow bodies are parsed, not executed: no await, no try/catch, no
   closures, no destructuring inside the body. Reference existing resources by
   imported handle, never by pasted UUID. Run `npm run typecheck`.

3. **Eval third.** If the motion calls an agent or an `ai()` step whose prompt
   you wrote, add `evals/<name>/` with representative cases and wire it into
   `evals/promptfooconfig.yaml`.

4. **Verify.** Run `npm run lint`, then open the PR. Confirm the cargo plan
   comment shows only the resources you intended to add. The narrative and the
   plan diff should tell the same story.

## Naming

Kebab-case, verb-first where possible: `inbound-router`, `churn-winback`,
`signal-to-sequence`. Same slug across all three layers.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…