Build, publish, and verify a Deepline Play as a durable state machine over Customer DB tables, including a small paid pilot. Invoke this skill explicitly when the user asks to build an engine.
84%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
npm install -g deepline
deepline -hRun 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.
Build an engine from the state machine the user defines.
An engine is an orchestrator Deepline Play that accepts an input, determines its state, calls the transition Play for that state, and produces a new state. The durable data plane lives in Customer DB: every state has an input table and an output table. The output of one transition can become the input to the next state.
The user owns the states, transition rules, transformations, and terminal behavior. This skill owns the reusable structure for turning those decisions into a replay-safe Play. Infer routine names, schemas, advancement behavior, and implementation details from the request and repository conventions. Ask only when missing information would force the engine to invent substantive business policy or create an unsafe side effect. Do not import an outbound workflow, GTM recipes, provider choices, or domain-specific policy unless the user asks for them.
For each state, define:
| Part | Meaning |
|---|---|
| Input table | Rows waiting to be handled in this state |
| State decision | The user-defined rule that establishes the row's current state |
| Transition Play | The child Play that performs the transformation for this state |
| Output table | The input, result, transition status, and next state |
| Next input | The row admitted to the next state's input table, unless the transition is terminal |
Keep the state decision explicit. Inferring state from incidental fields creates transitions the user did not define and makes replay behavior hard to explain.
tmp/ scaffold; temporary paths hide work from version control and make the engine disposable.deepline search "<transition input -> transition outcome>" --type plays. Inspect owned and prebuilt candidates with deepline describe <name>. Reuse an exact contract match; names are only hints, so verify input, output, and inline-composition compatibility. If no candidate fits, author one new Play for that transition instead of embedding its transformation in the orchestrator..play.ts file that default-exports an async function of its input (import deepline from 'deepline'; export default async function (input: EngineInput) { ... return { ... }; }; the file name is the default Play name, export const config = { name } overrides it). Determine the state, select the matching transition Play, and call it through deepline.runPlay(...) with a stable key. The orchestrator owns state routing and Customer DB persistence; transition Plays own transformations.from_state, to_state, status, error or miss information, timestamps, workflow version, transition Play identity/version, and idempotency key. If the transition continues, write the next state's input idempotently.docs/production-paid-call-verification.md.billing.maxCreditsPerRun on the orchestrator and every newly authored provider-backed child. Disclose the aggregate pilot exposure as the maximum top-level run count multiplied by the orchestrator cap; each run resets a per-run cap. Publish only capped paid Plays. Run this multi-record authoring pilot only in an explicit internal/test workspace. Do not use third-party customer workspaces, credentials, credits, or data. If no eligible internal/test workspace is available, stop and report the blocker; do not substitute the operator's personal workspace for this broader pilot. The distinct one-case post-fix acceptance may use an owner-verified operator personal or designated Deepline Production workspace under docs/production-paid-call-verification.md. Re-run one completed record with the same idempotency key to prove replay safety without buying the transition twice, counting that attempt in the aggregate bound even though a correct replay costs zero. Stop after the pilot if outputs are wrong, coverage is poor, or cost per usable result is too high. If the engine has no paid transition, run the same live pilot and report zero spend instead of adding a provider merely to create a charge. Do not use real customer rows or install triggers.Read references/state-machine-contract.md when designing the transition table, Customer DB table roles, Play shape, and tests.
Put the orchestrator in an engine folder and newly authored sub-plays in descriptive subfolders beneath it. For example, keep the orchestrator at team/<engine> and transition Plays at team/<engine>/Transitions/<state>. Group helpers under team/<engine>/Helpers when needed. This keeps the engine's entry point easy to find and lets users browse its supporting Plays by purpose.
Local source subfolders do not set the UI location. After publication, set each Play's path setting with the CLI, then read it back:
deepline plays settings set --play <orchestrator-name> --name path --value "team/<engine>"
deepline plays settings set --play <transition-name> --name path --value "team/<engine>/Transitions/<state>"
deepline plays settings get --play <orchestrator-name> --name path
deepline plays settings get --play <transition-name> --name pathChoose folder names from the user's engine and state names, following existing workspace conventions. Use deepline plays settings describe --name path and deepline plays settings set --help to confirm the current path contract. Keep stable Play names and deepline.runPlay references; folders organize navigation without renaming callable identities. Leave reused workspace and prebuilt Plays in their existing locations, since moving a shared dependency would disrupt other workflows.
tmp/ scaffold.deepline.dataset(), deepline.csv(), event waits, or another lifecycle boundary cannot be composed with deepline.runPlay; create or adapt a scalar transition Play instead.deepline.dataset(...) creates a run-scoped Runtime Sheet and cannot replace the durable state input and output tables.docs/production-paid-call-verification.md; neither path authorizes a third-party customer workspace or real customer data, trigger installation, a larger run, or unrelated Customer DB mutations.This user-requested engine pilot is separate from product-fix verification. Do
not use a third-party customer's workspace or data to verify a Deepline fix.
For a post-fix paid-path check, use only the explicitly operator-owned personal
workspace or designated Deepline internal Production workspace allowed by
docs/production-paid-call-verification.md; this skill's customer-pilot
approval path does not override that rule. That one post-fix acceptance is
required when the fix depends on a real paid-provider response or Production
usage admission/settlement, even if this engine-authoring pilot already passed.
Use the runbook's one-case cap and keep its ordinary settled charge; the
pilot's multi-record/replay and credit-restoration rules do not apply to it.
After implementation checks pass, complete one dependency-ordered workflow:
(pilot runs + one replay attempt) × billing.maxCreditsPerRun. If credits are unavailable, stop without attempting a top-up.billing.maxCreditsPerRun on every newly authored provider-backed child before its first check or publication. A child cap must be no greater than the orchestrator cap so launching the published child directly cannot bypass the pilot bound.deepline.runPlay name and contract resolution. Never publish an uncapped revision of a newly authored paid child.billing.maxCreditsPerRun before its first check or publication.deepline plays get <name>: read its Live version and Live max credits per run lines, which come from the live revision, not a working revision. If the cap is not a literal, read it from deepline plays get <name> --source --live. Reconcile that live version with the publication result and deepline plays versions --name <name>. deepline describe and revision summaries do not expose the billing limit and cannot prove the cap by themselves.docs/production-paid-call-verification.md.Do not request approval during dependency publication. If the explicit internal/test workspace is unavailable or any check, publication, version verification, or pilot run fails, stop the workflow, preserve successful results, and report the exact blocker or failure rather than switching to a customer workspace or advancing with an unresolved dependency.
The automatic paid pilot is bounded to synthetic inputs, at most three records plus one replay attempt, and the disclosed aggregate maximum derived from the published billing.maxCreditsPerRun. Obtain separate approval before using real customer data, installing triggers, scaling beyond the pilot, or causing other external side effects. Scaling requires a newly checked and published revision with the approved Deepline-credit cap; never silently remove or raise the pilot cap.
Return:
stateDiagram-v2 diagram showing the complete state machine, including initial, terminal, and unresolved transitions.play.ts file and any newly required transition .play.ts filesdeepline.runPlay dispatch logicRetain the exact per-step trace for each paid pilot record, including state determination, child Play calls, provider calls, persistence, handoffs, terminal completion, charges, and the replay attempt. Keep the default deliverable concise: show each pilot input and final output, not the full traces. Tell the user the traces are available and show them only when requested.
getaero-io/gtm-eng-skills
6776244
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.