Systems Lab

Agent skill

deepline-plays

Use for Deepline GTM work that searches, enriches, scores, collects signals, or automates a workflow: find companies or people, enrich a CSV, find emails or LinkedIn, compare providers, build a waterfall, create a webhook or cron, or write a Play.

activeNeeds a keyActs undeclared1,074 words

Filed under Prospecting and list building.

From getaero-io/gtm-eng-skills · 14 skills · 54 · pushed 2026-08-28

What it does when it runs

Use for Deepline GTM work that searches, enriches, scores, collects signals, or automates a workflow: find companies or people, enrich a CSV, find emails or LinkedIn, compare providers, build a waterfall, create a webhook or cron, or write a Play. For live information work, run a small heterogeneous experiment, exploit the observed winner, and reopen misses. Skip pure copywriting and non-GTM research.

Read from the skill and the 41 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • NAME_TOKEN
Hosts it reaches
  • code.deepline.com
  • deepline.com
  • registry.example
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shellwrites filesnetwork

Ask about deepline-plays

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/getaero-io/gtm-eng-skills.git /tmp/gtm-eng-skills
git -C /tmp/gtm-eng-skills sparse-checkout set "skills/deepline-plays"
mkdir -p ~/.claude/skills/deepline-plays
cp -R "/tmp/gtm-eng-skills/skills/deepline-plays/." ~/.claude/skills/deepline-plays/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 14 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add getaero-io/gtm-eng-skills
/plugin

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs NAME_TOKEN, which you have to obtain separately.

Reproduced in full from getaero-io/gtm-eng-skills/blob/ff9a4787453249dd74fe7753bc270f54b1a29a56/skills/deepline-plays/SKILL.md, which is licensed MIT (repository). 1,074 words, 10 headings.

Deepline Plays

Quick Start

npm install -g deepline
# Fallback for secure sandboxes: mkdir -p "$HOME/.local" && npm config set prefix "$HOME/.local" && export PATH="$HOME/.local/bin:$PATH" && npm install -g deepline --registry https://code.deepline.com/api/v2/npm/
deepline auth register --wait auto
deepline auth wait --timeout 120 # completes Cowork/browser approval; no-op if already connected
deepline auth status
deepline -h

CLI resolution

Run deepline when it is available. If the shell reports that command is missing, use <workspace-root>/.deepline/runtime/bin/deepline (or the npm-created .cmd shim on Windows). If neither exists, follow https://code.deepline.com/INSTALL.md to set up Deepline.

contract → compare → exploit → recover → export → price

Ordinary TypeScript, no DSL. A SearchProgram is one function that calls a tool, a fetch, a child Play, a connector, or a local artifact and returns a typed attempt. runSearchExperiment owns the pilot, ranked waterfall, holdout, gap-only retries, and cost/coverage report.

Deliverable

PartContents
Result linerows in / accepted / marginal credits per accepted row / run id
CSVthe user's exact headers, per-claim source, miss_reason on every null
Unresolved rowsin the same file; a null carries an absence receipt
Route tableinitial and final waterfall, cost and completions per route
COST RECEIPTthe block run-and-export-search-experiment.py prints, verbatim
Next actionsdormant routes and what each would buy, at measured cost deltas
  • Marginal, never amortized. Total ÷ successes reported 1.51 credits/email for a route whose real marginal cost was 0.21.
  • Pass the printed block through. Do not recompute credits in prose.
  • A catalog ceiling stops the run; it is not spend. Label it. A 120-credit ceiling truncated recovery at ~12 credits actual, and two apparent logic regressions were budget artifacts.

Read one job page

Read the row that matches this job, and only that row. Each page is complete for its job: source geometry, route ladder, pilot sizing, stop conditions.

The jobPage
Companies or people that are not rows yetjobs/finding.md
Columns to fill on rows you already havejobs/enriching.md
Claims that need attributable evidencejobs/researching.md
A trigger, review gate, or external side effectjobs/automating.md

Two lookups, consulted on a trigger rather than read up front: shared/authoring.md for Play syntax outside the scaffold, and references/debugging.md for a failed, empty, or misshapen run.

If your configuration forbids subagents, say so before starting serial work. Resolving that conflict silently cost one run ~30 minutes.

Topology

Write unit + decision + required facts + scale before touching tools. Requested fields stay required; demoting one to promote a run is not a pass. A null needs an absence receipt: materially different routes tried, typed outcomes retained.

One shape. Known rows: one experiment over the supplied rows. Open-world discovery: rows are query/page/geography/registry partitions, never remembered companies. Company → person: two sequential stages, not consensus; only companyExperiment.finalResults become contact rows. End-to-end: compare only when every program produces the same complete final row from the same seam.

Catalog

deepline tools search "<information role and controls>" --json
deepline tools grep "<substring>" --json   # ranked search has returned the same
                                           # irrelevant hits for three different queries
deepline tools list <returned-category> --json
deepline tools describe <tool-id> --json | python3 <skill-root>/scripts/show-declared-getters.py
python3 <skill-root>/scripts/show-declared-getters.py "$WORKDIR/<tool-id>.json"   # saved contract

tools describe is the authoring contract and can disagree with runtime: a declared getter has been absent, and a tool documenting one scalar has returned a full list. Bind a named declared playExpression and sentinel-probe one row before scaling. toolResponse.raw is for an exact source excerpt, debugging, or an undeclared field after that probe — never a cast into an invented Company[].

Cover source classes before provider names — index, SERP, primary document, registry, event feed, first-party data, aggregator, validator. Two vendors reaching the same terminal corpus are one evidence lineage.

Record each route's pricing basis: per call, per returned result, or unknown. A confirmed-uncharged miss justifies a broader challenge wave, not a narrower one.

Build and run

python3 <skill-root>/scripts/scaffold-search-experiment.py \
  ./deepline/data/<task-slug> --name <task-slug> --input-csv <rows.csv>

Read its printed next list: it carries the four seams, tools: [...], coherenceChecks, and the company→person handoff at the point you edit them. --input-csv also writes a stratified fixture.csv. Iterate route code against that; use the full cohort only for a scored run.

Keep the top-level definePlay description short and concrete. The UI shows it below the Play identifier. Catalog categories are derived from the registered tools used by the Play; do not author category metadata on the Play itself.

deepline billing balance --json
python3 <skill-root>/scripts/run-and-export-search-experiment.py \
  ./deepline/data/<task-slug>/<task-slug>.play.ts --input '{}' --out ./results.csv
python3 <skill-root>/scripts/cost-receipt.py <run-id> --scorecard <scorecard>.csv  # already-run

run-and-export does the structural check, Play check, completed Play, run-bound export of both the results dataset and the route scorecard, then the COST RECEIPT. Its {ok: true, runId, output} is the completion receipt: before it the work is a probe, and a CSV written from remembered values hides which route won.

Receipt labels:

  • CUT CANDIDATE — spent credits, completed nothing. Cut it. One route at 3.95 credits/call, 200× a search, ran ten rounds for zero results because the scorecard reported no cost at all.
  • NEVER REACHED — never invoked, so its zero results are not a ceiling and not a source miss. maxFallbacks bounds the dependency-closed waterfall and defaults to 2; raise it (up to 4, scaled to pool size) or drop the route.
  • cached calls — reruns of the same inputs reuse tool receipts. Quote the marginal rate, not this run's total.

Quality gates precede economics; among valid results prefer fewer observed credits, then fewer calls. Never expose provider spend.

Reusing a route across jobs is an eval, not a score: freeze the contract, verifier, cases and ceiling, and stratify the case set (normal, sparse, likely-miss, collision-prone) rather than picking easy rows after seeing results. A concept is an information geometry, never a vendor.

Subagents

One or two, only when several source geometries are plausible: same contract, one source lane each, returning a strategy card and ordinary TypeScript. The parent binds, runs, and judges. Verification fans out the same way — four defects found in four sequential rounds of eyeballing output fit in one pass over row batches.

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what deepline-plays does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.