Systems Lab

Agent skill

gtmos-onboarding

Guide a user through the per-organization GTM OS setup wizard over MCP (gtm_describe / gtm_query / gtm_act) -- Welcome, Connect your data, Your definitions, Rules and who approves what, The build, First motion and 90 days -- citing the evidence behind every draft, never inventing a value, and stopping for the human-only steps and the four-eyes approvals.

activeSelf-containedInstructions only7,620 words

Filed under Onboarding, retention and expansion.

From ay-automate/gtmos-skills · 107 skill entries · 0 · pushed 2026-11-02

What it does when it runs

Guide a user through the per-organization GTM OS setup wizard over MCP (gtm_describe / gtm_query / gtm_act) -- Welcome, Connect your data, Your definitions, Rules and who approves what, The build, First motion and 90 days -- citing the evidence behind every draft, never inventing a value, and stopping for the human-only steps and the four-eyes approvals. Use when the user wants to set up (or finish setting up) an organization in a running GTM OS instance; run gtmos-setup first if no instance is connected.

Automated analysis of the skill and the 0 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
None found.
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
No allowed-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about gtmos-onboarding

Opens your assistant with this page's recorded context. Check the linked sources before relying on it.

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/ay-automate/gtmos-skills.git /tmp/gtmos-skills
git -C /tmp/gtmos-skills sparse-checkout set "skills/gtmos-onboarding"
mkdir -p ~/.claude/skills/gtmos-onboarding
cp -R "/tmp/gtmos-skills/skills/gtmos-onboarding/." ~/.claude/skills/gtmos-onboarding/

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 107 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add ay-automate/gtmos-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.

Reproduced in full from ay-automate/gtmos-skills/blob/86780d2f545cdc0a1de971917aa04b41bb0b3ccd/skills/gtmos-onboarding/SKILL.md, which is licensed MIT (repository). 7,620 words, 13 headings.

GTM OS per-org setup runbook (the agent executes this)

The console's setup wizard and this runbook drive the SAME operations: whatever you save here, the user sees in the console (Setup), and the other way round. Before this skill, the workspace must be connected to an instance (.claude/gtmos-instance.json has an apiUrl, /mcp shows the gtmos server). If not, run the gtmos-setup skill first.

Step 0 -- probe the instance first

Before the first screen, and again at the start of a new session:

  1. Call harness.status with gtm_query {"name":"harness.status"}. Compare operationsHash with referenceOpsHash in .claude/gtmos-instance.json, and expectedSkillsTag with the skills tag you were installed from. A difference means the instance changed since gtm init: tell the user and suggest gtm init --refresh.
  2. Call gtm_describe with no argument for the catalog of this instance, and again with a name for every operation a screen needs, just before you use it.
  3. If the instance does not know an operation, skip that part of the screen and say why in the same reply ("this instance has no <operation>"). Add an Open item. Never call a different operation in its place and never invent one.
  4. If harness.status itself is unknown, the instance is older than GTM OS 0.2.6: carry on with the catalog from gtm_describe alone.

Rules (all of them, every time)

  1. Read the schema before every call. gtm_describe {"name":"<operation>"} returns the exact input schema; docs/gtmos/reference/operations.md has the same entries. Never guess a field or a value of an enum. Reads go through gtm_query {"name":"<op>","input":{...}}, writes through gtm_act {"name":"<op>","input":{...}}.
  2. Never invent a value. A value you save comes from one of: the user's own words in this conversation, an evidence entry of a drafted card, a reasons[].fact of onboarding.suggest, the crawled site (research.workspace_profile.get), an uploaded setup document, or a connected source's real counts. If none of these has it, leave the field empty and open a numbered ask (asks.create, or onboarding.request_access / onboarding.request_docs) with an owner. "I don't know yet" is a valid answer; a plausible guess is not.
  3. Cite the evidence. When you show a draft, show where each value comes from: quote the card's evidence item (or the suggestion's { fact, source }) next to the value, e.g. "ICP country DE, weight 30 -- evidence: 14 of 22 closed-won accounts are in DE (closed-won deals)". A value with no evidence is shown as "no evidence -- please confirm or leave empty".
  4. The model drafts, the human owns. Present drafts; save a value only after the user confirms it (onboarding.card.edit / onboarding.update). Never approve a card the user has not seen.
  5. Human-only operations. Agent keys are refused on some operations (the tables say human only; the full list and what you do instead is in "Human-only: what you do instead" below). The refusal reads FORBIDDEN: Operation "<name>" can only be performed by a human. Over MCP every call counts as an agent call, even when the MCP bearer is a human's own session token: roles.assign, onboarding.launch and the rest are refused there too, so the human does them in the console. Never retry, never route around it (another key, the user's session, a raw API call): propose what you can, prepare the draft, then ask the human to finish it in the console and tell them where to click.
  6. The ARR band is private. profile.arrBand is set and read by human owners / admins only; agents get FORBIDDEN ("the ARR band is private: only a human owner or admin can set it") and see it redacted. Never ask the user to paste it to you: tell them to set it themselves in Setup > Welcome (or leave it empty, which keeps it private). Never write it to a file or the memory.
  7. Four-eyes. An operation that proposes (blueprint.apply, env.promote, stage_map.set, the ICP / pilot / customer-type / suppression ChangeSets, the journeys, what a build step proposes) is approved by a DIFFERENT human: not the proposer and not the person you act for. You never approve, never ask for the approver's password, and never use their session. Report the approval id and <console>/org/<org id>/approvals, then continue.
  8. Optimistic concurrency. Every write takes expectedVersion from the last onboarding.get. A CONFLICT means someone else (often the user in the console) changed the session: re-read, show what changed, and ask before you redo the write.
  9. Never silent. A refusal (FORBIDDEN, NOT_CONFIGURED, VALIDATION_FAILED, CONFLICT) or a proposal is told to the user in the same reply: the operation, the error, the fix and who owns it. Record it as an Open item in .claude/memory/setup-status.md.
  10. Only what exists. Use the operations listed below; if gtm_describe does not know one, see "On an older instance".
  11. Say why. A gtm_act that proposes an effect takes an optional justification (the MCP argument of gtm_act; over REST the x-gtmos-justification header): why now, in your own words, for the person who approves. In GTM OS 0.2.6 it is optional. An agent proposal at tier T2 or above without one is still recorded, and the approver sees "No reason given by the agent". From GTM OS 0.2.7 (GTMOS_JUSTIFICATION_ENFORCE on by default) it is required for agent proposals at T2 or above: at least 10 characters that are not spaces, or the call is refused with VALIDATION_FAILED and nothing is written. Always send one now. A good reason names the evidence and the effect: "14 of 22 closed-won accounts are in DE, so this saves the ICP card with country DE". A bad one repeats the operation name or says "as requested". It is a statement, not a proof: never write a reason you cannot back with a number or a source. A person may leave it out. At tier T3 and above a named person other than you approves, whatever the reason says.

The six screens

  1. Welcome (screen welcome; steps company, motion)
  2. Connect your data (screen connect; steps connections)
  3. Your definitions (screen definitions; steps definitions)
  4. Rules and who approves what (screen rules; steps rules, team)
  5. The build (screen build; steps build)
  6. First motion and 90 days (screen first_motion; steps plan, launch)

Start every session with gtm_query {"name":"onboarding.get"}: it starts the session on first read and returns session.currentStep, completedSteps, version, the cards and the progress. Resume at currentStep; never redo a completed step unless the user asks (onboarding.update with reopenStep). After each screen, mark its steps done with onboarding.update {"completeStep":"<step>","expectedVersion":<v>} (one step per call, in order).

Operations for every screen:

OperationAccessUse
onboarding.getread (gtm_query)The session (status, currentStep, completedSteps, profile, version), cards with evidence, runbook, docs checklist, seats, plan, progress. Read it first and after every write.
onboarding.updateyou may call it (gtm_act)Save answers the USER gave (profile, pains, engines, sources, team, stakeholders) and step progress (completeStep / reopenStep / currentStep). Always pass expectedVersion.
asks.listread (gtm_query)The org's open asks (access requests, document requests, questions) with their numbers and owners.
asks.getread (gtm_query)One open ask.
asks.createyou may call it (gtm_act)Turn a value nobody gave you into a numbered open ask with an owner, instead of guessing it.
asks.answeryou may call it (gtm_act)Record an answer -- an agent answers only asks it owns; for any other ask, relay the answer to its owner (they answer it, or a member relays it in the console).
runtime.list_approvalsread (gtm_query)What is waiting for a human approver (your proposals included).
harness.statusread (gtm_query)Step 0 probe: the operation count and hash of this instance, the skills tag it expects and the first-win path. Compare operationsHash with referenceOpsHash in .claude/gtmos-instance.json; a difference means the instance changed since gtm init (run gtm init --refresh). No secret, no org data.

Screen 1 -- Welcome (company, motion)

  1. Ask the user, in one grouped question: company name, website, industry, team size, markets, deal sizes, sales cycles, motions, maturity, the tools in their stack, up to 3 pains, who runs it and the hours a week they give it, and the five free answers (what you sell, who buys, a great next quarter, what has not worked, what the OS must never do). Use the enum values of onboarding.update (gtm_describe); map the user's words to them and show the mapping. Unanswered = left empty. The stack decides which sources are selected by default and which access asks open; the hours size the 90-day plan.
  2. With a website, run research.workspace_profile.refresh, then read research.workspace_profile.get: offer facts from it (with the page it came from) for the user to confirm; never copy them in unconfirmed.
  3. Save the confirmed answers with onboarding.update (profile, pains, team, stakeholders). The ARR band: rule 6.
  4. Read onboarding.suggest. Show the engines and blueprints with their reasons (and against). The user picks the engines (onboarding.update {"engines":[...]}, or null = take the suggestion) and, optionally, a blueprint (blueprint.get shows what it installs). Save the pick with onboarding.update {"blueprint":"<id>"}: the build (Screen 5) applies it adapted to the approved cards. Apply it now (blueprint.apply, it proposes: rule 7) only when the user asks, and then save {"seed":{"changeSetId":"...","approvalId":"..."}} too. Applying the same input again while its proposal still waits (and its base versions are current) returns that proposal with reused: true, not a duplicate.
  5. completeStep company, then motion.
OperationAccessUse
research.workspace_profile.refreshyou may call it (gtm_act)Crawl the company website so drafts can cite it. An agent key needs engine.configure (the build scope), else FORBIDDEN: ask an owner / admin to run it.
research.workspace_profile.getread (gtm_query)The crawled site profile (evidence for the company answers).
onboarding.suggestread (gtm_query)Suggested engines, blueprints and sources, each with reasons [{ fact, source }].
blueprint.listread (gtm_query)The blueprint catalog.
blueprint.getread (gtm_query)One blueprint: what it installs.
blueprint.applyproposes (gtm_act); a different human approvesSeed the picked motion; returns a ChangeSet + approval a different human approves. Usually left to the build (Screen 5), which applies it adapted to the approved cards.

Screen 2 -- Connect your data (connections)

  1. Read onboarding.signal_coverage: per category, what is connected, real record counts, the most accounts one source covers (never a sum), stackMissing, and catalog (each connector: how it connects, where its data lands, the operations that pull it, what it still needs). Report only these numbers; no percentage or score that the operation did not return.
  2. Read onboarding.get runbook: per source, what to ask for, who grants it, lead time, and whether it is EARLY. Connecting a source follows the gtmos-setup skill (Step 6: Connections): provider keys as connections, Composio apps through composio.sync_connections; a new OAuth sign-in is clicked by a human in the console.
  3. A connected source the catalog says still needs a setting (a project id, an event map): ask the user for the value and save it with connections.set_provider_setting. Never guess an id.
  4. Pull now, once a source is connected, so the next screens draft from real data: product_analytics.sync (PostHog, Mixpanel, Amplitude), transcripts.sync (Fireflies, Gong, Zoom, Fathom), outbound_rails.sync_replies (Smartlead, Instantly, lemlist). NOT_CONFIGURED means that tool is not connected: say so. outbound_rails.list shows which rail senders / campaigns a lane can bind; every send through a rail still goes through the approval-gated outreach.send_message.
  5. For the grants the user cannot give now, run onboarding.request_access (optionally grantors = the emails the user names) and hand the user the numbered list it returns to forward.
  6. completeStep connections (missing sources stay as numbered open asks; that is fine).

Imports (GTM OS 0.2.6): a file import goes through a review gate. import.review.list shows the batches and each row's gate result; rows the gate blocked are held back from the CRM. You may fix or skip a row with import.review.decide and show the user the reasons. You never override the gate: that needs a reason of 10 or more characters from the person, and a legal block (suppression, consent, do-not-contact) cannot be overridden at all.

OperationAccessUse
onboarding.signal_coverageread (gtm_query)Real coverage per category (CRM, analytics, ads, calls, warehouse, outbound), the stack tools not connected yet, and per category the catalog: every connector we read, how it connects, where its data lands, the operations that pull it, what it still needs.
sources.coverageread (gtm_query)The per-source counts behind the coverage.
instance.readinessread (gtm_query)Which live seams are configured on this instance (Composio seams included).
connections.listread (gtm_query)The org's connections and their state (configured_unverified, live, ...).
composio.statusread (gtm_query)Each app connected through Composio and whether it is ACTIVE.
composio.sync_connectionsyou may call it (gtm_act)Record every app already connected in the org's Composio account (needs the connection.manage scope). Connecting a NEW app (composio.connect, OAuth) is human-only: gtmos-setup Step 6.
connections.set_provider_settingyou may call it (gtm_act)A per-org connector setting the catalog says is missing (posthog / mixpanel project_id, tiktok_ads advertiser_id, an event_map, gsc site_url, ...). Only values the user gave you.
product_analytics.syncyou may call it (gtm_act)Pull now: PostHog, Mixpanel and Amplitude events of the last 7 days become contact signals (and the 6-hourly pull stays scheduled). Owner / admin, or an agent key they scoped.
transcripts.syncyou may call it (gtm_act)Pull now: call transcripts from Fireflies, Gong, Zoom and Fathom into conversation memory. Owner / admin, or an agent key they scoped.
outbound_rails.listread (gtm_query)The Smartlead senders and Instantly / lemlist campaigns a sending lane can bind, and why a campaign cannot carry an approved message (owner / admin).
outbound_rails.sync_repliesyou may call it (gtm_act)Pull now: replies from Smartlead, Instantly and lemlist into conversation memory (they stop the sequence). Owner / admin, or an agent key they scoped.
onboarding.request_accessyou may call it (gtm_act)One numbered open ask per missing grant (what, who grants it, lead time); returns the list to forward.
import.review.listread (gtm_query)The import batches with staged rows, or one batch's rows with each row's gate result and reasons. Rows the gate blocked are held back from the CRM until someone decides.
import.review.decideyou may call it (gtm_act)Fix or skip one staged import row. Do not override the gate yourself: an override needs a reason of 10 or more characters from the person, and legal blocks (suppression, consent denied or withdrawn, do-not-contact) cannot be overridden at all.

Screen 3 -- Your definitions

  1. Documents first. onboarding.get docs is the checklist (ICP notes, stage definitions, pricing, brand voice, suppression lists, DPA). A document the user hands you (a file in this workspace): onboarding.docs.upload with its docKey (it answers that document's open ask); onboarding.docs.list shows what was extracted. A document they mention but have not shared: onboarding.request_docs with an owner each. Never upload a file the user did not point you at.
  2. onboarding.draft_cards drafts every card from the org's own data, answers and documents. With a model configured (mode auto), each value cites evidence ids; an uncited value is dropped and opens a numbered question ask; without a model the card says so (evidence.model). Edited, approved, pending and skipped cards are kept (pass force only when the user asks to redraft one).
  3. For each card of this step (onboarding.get cards), show the draft WITH its evidence (rule 3). The user confirms, changes or skips it: onboarding.card.edit (shape per card in the reference) / onboarding.card.skip.
  4. Approve with onboarding.card.approve only what the card table lets you; for the rest, tell the user to approve it in Setup > Your definitions (rule 5). The answer's card.status is approved, pending_approval (a different human approves: rule 7) or failed (say why; the card stays editable). A card whose draft is not complete yet is refused with VALIDATION_FAILED and its issues (e.g. an icp card with no rules on an org without closed-won deals): fill it with the user's own criteria (onboarding.card.edit), or skip it. Seen live: with no revenue source connected, the money card opens the numbered ask "Connect a CRM with deals or Stripe" and fails until one is connected; brand_voice needs at least one tone word in the user's words.
  5. The cards of this screen:
    • crm_stages: stage_map.unmapped lists the CRM's REAL stage values; stage_map.suggest / stage_map.ai_suggest propose a mapping; the user confirms it on the card (or you save it with stage_map.set, which an agent proposes for the approver).
    • customer_types: compare with customer_type.list (and customer_type.classify for a sample record the user names); approving proposes a ChangeSet.
    • brand_voice: compare with brand.get; brand voice is human-only (brand.set).
    • suppression: built from their suppression documents and words; approving proposes a ChangeSet a different human approves. Suppression lists are RESTRICTED documents: an agent cannot read them, so your draft has the competitors and existing-customer rules but NOT the do-not-contact list. Say so, and ask an owner / admin to redraft that card (onboarding.draft_cards {"force":["suppression"]}, or Redraft in the console) and approve it. Never ask for the addresses in the chat.
  6. onboarding.blueprint_adaptations shows what the picked blueprint will take from the approved cards when the build applies it: show it before the build.
  7. Definitions you publish land in dev; prod needs signing + promotion (Screen 6).
  8. completeStep definitions.

Newer definitions (GTM OS 0.2.6), only when the user asks for them and Step 0 showed the instance has them: a data-quality policy (identity_dq.dq_policy.get, then identity_dq.dq_policy.propose), a funnel (funnel.list, funnel.evaluate), a revenue target (board.target.get, board.target.propose) and the recommendation rules (recommendation.rules.get, recommendation.rules.propose). Each is a definition a person signs. Read before you propose. Quote the coverage block with every funnel rate and say "unavailable" where board.evaluate does. A data steward bundle (identity_dq.steward_plan, then identity_dq.steward_bundle) is shown as a plan first; a different person approves it.

The cards of this screen and who can approve them:

CardPublishes throughApprove
stages (Lifecycle stages)journey.propose, journey.applyyou may approve it: it becomes pending_approval and a different human approves the ChangeSet / journey / mapping in Approvals
icp (ICP and the weights sheet)config.propose_changeset, config.validate_changeset, config.applyyou may approve it: it becomes pending_approval and a different human approves the ChangeSet / journey / mapping in Approvals
money (Revenue truth and currency)money.settings.set, crm.settings.seta human approves it in the console (its target is human-only): you prepare the draft, they click Approve
deal_words (Your words for deals)deal_type.seta human approves it in the console (its target is human-only): you prepare the draft, they click Approve
owners (Who owns what)territory.upserta human approves it in the console (its target is human-only): you prepare the draft, they click Approve
pilot (Pilot scope)config.propose_changeset, config.validate_changeset, config.applyyou may approve it: it becomes pending_approval and a different human approves the ChangeSet / journey / mapping in Approvals
customer_types (Customer types and their journeys)config.propose_changeset, config.validate_changeset, config.applyyou may approve it: it becomes pending_approval and a different human approves the ChangeSet / journey / mapping in Approvals
crm_stages (Your CRM stage values)stage_map.setyou may approve it: it becomes pending_approval and a different human approves the ChangeSet / journey / mapping in Approvals
brand_voice (Brand voice and forbidden claims)brand.seta human approves it in the console (its target is human-only): you prepare the draft, they click Approve
suppression (Who the engines never contact)config.propose_changeset, config.validate_changeset, config.applyyou may approve it: it becomes pending_approval and a different human approves the ChangeSet / journey / mapping in Approvals
OperationAccessUse
onboarding.docs.uploadyou may call it (gtm_act)Upload a setup document the user GAVE you (<= 10 MB: PDF with text, .docx, .xlsx, CSV, TSV, JSON, Markdown, text) so the drafts can cite it; with docKey it answers that document's open ask. Images and scans are refused with the reason.
onboarding.docs.listread (gtm_query)The uploaded setup documents and what was extracted (restricted ones -- suppression lists, the DPA, contact data -- show their text to owners / admins only).
onboarding.docs.removeyou may call it (gtm_act)Remove a setup document (its uploader or an admin). Drafted cards keep their values.
onboarding.request_docsyou may call it (gtm_act)Ask for the setup documents (ICP notes, stage definitions, pricing, brand voice, suppression lists, DPA) as numbered open asks.
onboarding.draft_cardsyou may call it (gtm_act)Needs engine.configure (the build scope). Draft the definition cards from the org's own data, answers and documents (mode auto: the org's model drafts with cited evidence, else the deterministic drafter with the reason). Each draft carries its evidence.
onboarding.card.edityou may call it (gtm_act)Needs engine.configure (the build scope). Change a card's draft to a value the user confirmed.
onboarding.card.skipyou may call it (gtm_act)Needs engine.configure (the build scope). Skip a card for now, or reopen it.
onboarding.card.approveyou may call it (gtm_act)Needs engine.configure (the build scope). Publish a card through the operation that owns it, as the caller. Only for the cards the card table lets you finish: a human-only target refuses you and marks the card failed.
stage_map.unmappedread (gtm_query)CRM stage values not mapped to a canonical stage yet (real values from the CRM): the crm_stages card.
stage_map.suggestread (gtm_query)Deterministic stage mapping suggestions.
stage_map.ai_suggestyou may call it (gtm_act)Model-assisted stage mapping suggestions (review them with the user). An agent key needs engine.configure.
stage_map.setproposes (gtm_act); a different human approvesSave a stage mapping the user confirmed. An agent key needs engine.configure, and an agent's call becomes an approval proposal: the approver signs it.
journey.listread (gtm_query)The org's journeys (the stages card's current state).
customer_type.listread (gtm_query)The org's customer types, the journeys they route to and how many companies each holds (the customer_types card's current state).
customer_type.classifyread (gtm_query)Which customer type a company, person or deal is, and which types it matches.
brand.getread (gtm_query)The brand voice and kit in force (the brand_voice card's current state).
brand.sethuman only: agent keys are refusedBrand voice and kit: a human approves the brand_voice card (or sets it) in the console.
proof.listread (gtm_query)The proof library: sources (case studies, metrics, testimonials, logos) with permission (public / anonymized / internal_only), expiry, state and claims. Only active proof backs a claim in outreach.
proof.extract_from_documentyou may call it (gtm_act)Turn a case study the user hands you (file or pasted text) into a DRAFT proof source; the org's model proposes claims, each quoted word for word (no model = the text is saved and you add claims with proof.update). Ask the user the permission and expiry; never guess them.
proof.updateyou may call it (gtm_act)Add / fix / remove a draft's claims (each excerpt copied exactly from the text, holding every number of the claim).
proof.propose_activationhuman only: agent keys are refusedActivating proof: a person proposes it in Settings > Proof library and a different person approves it.
voice.customer_language.mineyou may call it (gtm_act)Find the customers' own words (pains, outcomes, objections, triggers) in transcripts, classified replies and won-deal notes; each phrase keeps its source. They wait for a human to approve.
voice.customer_language.approvehuman only: agent keys are refusedApproving customer phrases: a person reviews them in Settings > Proof library > Customer language.
onboarding.blueprint_adaptationsread (gtm_query)What the chosen blueprint takes from the approved cards (ICP, pilot, stages, customer types, suppression, trust caps) before it is applied.
identity_dq.dq_policy.getread (gtm_query)The data-quality policy in force (definition.data_quality_policy): required fields, validity rules, the staleness window. The import gate reads it.
identity_dq.dq_policy.proposeyou may call it (gtm_act)Propose a new data-quality policy version from what the user confirmed. A person signs it; nothing is live until then.
identity_dq.steward_planread (gtm_query)Plan one data steward bundle (duplicate merges and value fixes) with the evidence and the count, before anyone is asked to approve.
identity_dq.steward_bundleproposes (gtm_act); a different human approvesPropose that bundle for a person to approve. Show the plan first; the approval says what runs.
funnel.listread (gtm_query)The org's funnels (definition.funnel) with their stages and status.
funnel.evaluateread (gtm_query)The cohort funnel: per stage entered, converted, rate, sample and median days, with an honest coverage block. Quote the coverage block with every rate.
board.target.getread (gtm_query)The revenue target that applies (the signed definition.revenue_target in prod), the dev draft and the spec an editor starts from.
board.target.proposeyou may call it (gtm_act)Propose a revenue target version from the closed-won figures the user gave. A person signs it. Never invent a period or an amount.
board.evaluateread (gtm_query)The board: weighted pipeline, conversion, win rate, coverage against the target, slip rate. A number that cannot be computed honestly says unavailable; repeat that, never fill it in.
recommendation.rules.getread (gtm_query)The interpretation rules the recommendation loop applies (the signed ones, else the shipped ones) and the vocabulary a rule may use.
recommendation.rules.proposeyou may call it (gtm_act)Propose a new definition.recommendation_rules version: thresholds, minimum samples and one allowed action per rule. A person signs it.

Screen 4 -- Rules and who approves what (rules, team)

  1. The cards of this step (below): show the draft and its evidence; the user approves them in the console (their targets are human-only). For autonomy, say plainly that outreach never acts within caps unless the org baseline already grants it, and that engines go live only at Launch.
  2. Show the current policy as read (policy.get_dry_mode, policy.guardrails.get, policy.engine_modes.get, policy.get_autonomy_scopes) next to the draft, so the user sees the change.
  3. Seats: roles.list shows the profiles and the members. Save the seats the user names (member user ids from roles.list members) with onboarding.seats.set. Its roles.errors for an agent is expected: the binding to a role profile (roles.assign) is human-only -- the user saves the seats again in the console, or assigns the profiles in Settings > Members. Warn before a seat is bound: a profile caps its holder at its base role and removes its denied operations (Operator = member; Exec = admin without config / journey / send operations; Ops lead = admin; Engineer = builder). roles.list returns keepsSetupAuthority per profile and setupStewards (the owners / admins who can still run the build, approve the cards and launch). Never put the sole owner in the Operator or Exec seat: seat them as Ops lead (or leave them unseated). The kernel refuses a change that would narrow, demote or remove the last setup steward with CONFLICT details.reason LAST_OWNER_NARROWING: the fix is another un-narrowed owner or admin first.
  4. Custom role profiles (roles.upsert) are human-only: describe what the user wants (base role, denied operations, KPIs, actions) and let them create it in the console. A profile only narrows.
  5. completeStep rules, then team.
CardPublishes throughApprove
buying_roles (Buying roles)buying_roles.seta human approves it in the console (its target is human-only): you prepare the draft, they click Approve
consent (Consent and GDPR)privacy.settings.seta human approves it in the console (its target is human-only): you prepare the draft, they click Approve
trust (Dry mode and guardrails)policy.set_dry_mode, policy.guardrails.seta human approves it in the console (its target is human-only): you prepare the draft, they click Approve
autonomy (Autonomy per engine)policy.engine_modes.set, policy.set_autonomy_scopea human approves it in the console (its target is human-only): you prepare the draft, they click Approve

Before the user decides who approves what, owners and admins can read risk.tier_readiness: it lists the operations that would start needing a named approver when the stricter risk tiers turn on (default on from GTM OS 0.2.7).

OperationAccessUse
policy.get_dry_moderead (gtm_query)Whether the org is in dry mode.
policy.guardrails.getread (gtm_query)The caps, quiet hours, timezone and channels in force.
policy.engine_modes.getread (gtm_query)Each engine's dry / live mode.
policy.get_autonomy_scopesread (gtm_query)The autonomy grants (org baseline and per engine).
policy.set_dry_modehuman only: agent keys are refusedDry mode: part of the trust card, a human approves it.
policy.guardrails.sethuman only: agent keys are refusedCaps, quiet hours, timezone, channels: part of the trust card, a human approves it.
policy.engine_modes.sethuman only: agent keys are refusedEngine live / dry: part of the autonomy card (and Launch), a human approves it.
policy.set_autonomy_scopehuman only: agent keys are refusedAutonomy grants: part of the autonomy card, a human approves it.
roles.listread (gtm_query)Role profiles (Operator, Ops lead, Exec, Engineer + custom) with keepsSetupAuthority, who holds which, setupStewards, the KPI / action catalog.
roles.my_dashboardread (gtm_query)The caller's seat dashboard (an agent sees its delegator's).
roles.upserthuman only: agent keys are refusedCreate or edit a role profile: owner / admin, human only.
roles.assignhuman only: agent keys are refusedGive a member a role profile: owner / admin, human only.
onboarding.seats.setyou may call it (gtm_act)Save the seats (operator, ops lead, exec, deputy); the role-profile binding it runs is human-only and comes back in roles.errors for an agent.
risk.tier_readinessread (gtm_query)Owner or admin. Which operations would start needing approval when the stricter risk-tier flag turns on (default on from 0.2.7), and the org's T3 limits. Read it before the user decides who approves what.

Screen 5 -- The build

  1. onboarding.engine_readiness: per picked engine, each requirement met / missing / unknown, with the evidence and the remediation. An unknown is reported as unknown, never as met.
  2. Tell the user what the build will do (the steps below), then onboarding.build.start. It returns at once (run.status queued); one run at a time per org (a second start returns the running one with alreadyRunning: true).
  3. Follow it with onboarding.build.get every few seconds until run.terminal: report each step's status and its real result (ChangeSet, approval, ask and adapter ids). A step you may not run is skipped with the refusal; a failure carries its reason and the run continues. Stop it with onboarding.build.cancel only when the user asks.
  4. needsHuman lists what waits for a person: the proposals of this run (a different human approves them in Approvals) and the asks raised. Nothing you do executes an approval. A finished run with failed, partial or cancelled steps: fix the cause with the user, then onboarding.build.start {"retryRunId":"<run id>"} re-runs only the failed, partial, cancelled and unfinished steps. A skipped step is NOT retried that way: once its cause is fixed (a CRM connected, a website given), start a new run, optionally only that step: onboarding.build.start {"steps":["<step key>"]}.
  5. Walk the missing readiness requirements with the user: each one maps to an earlier screen, a connection, or an open ask. Do not mark the build done while a required requirement is missing without telling the user it is.
  6. completeStep build.

The build steps, in run order:

StepWhat it doesRuns
cardsSettle the definition cards waiting on an approvalonboarding.cards.resolve
blueprintAdapt the chosen blueprint to your approved cards and propose itblueprint.apply, onboarding.update
stagesSuggest a stage for each unmapped CRM value and ask you to decidestage_map.unmapped, stage_map.ai_suggest, asks.create
crm_adaptersRead each connected CRM's schema, audit it and propose the mappingadapter.get, adapter.start, adapter.audit, adapter.propose
completenessCheck how complete your synced data issync.completeness.run
playsRe-rank the plays catalog for your orgplays.rescore
scoreRescore your accounts (no outbound action)policy.engine_modes.get, score.rescan_organization
siteRead your website again for the workspace profileresearch.workspace_profile.refresh
indexReindex search and agent memorysearch.reindex_now
readinessSnapshot what each engine still waits ononboarding.engine_readiness
briefRegenerate the OS brief (readiness snapshot + your model's cited summary)onboarding.brief.refresh
OperationAccessUse
onboarding.build.startproposes (gtm_act); a different human approvesStart the build run (a worker job). Each step runs real operations AS YOU (your scopes, your delegator's role profile); what a step proposes waits for a different human in Approvals. One run at a time; retryRunId re-runs only a finished run's failed / partial / cancelled / unrun steps. Needs engine.configure (the build scope).
onboarding.build.getread (gtm_query)The run's live log: each step's status, real results and linked ids (ChangeSets, approvals, asks #n, adapters, jobs), and needsHuman (your proposals still waiting, the asks you raised).
onboarding.build.cancelyou may call it (gtm_act)Needs engine.configure (the build scope). Stop a run between steps (its requester or an owner / admin). What a finished step proposed stays proposed.
onboarding.cards.resolveyou may call it (gtm_act)Needs engine.configure (the build scope). Settle the cards waiting on an approval: executed = approved, rejected / expired = failed (editable again). Never approves anything; the build's first step runs it.
onboarding.engine_readinessread (gtm_query)Per picked engine: each requirement met / missing / unknown, with the evidence read and the next step.
config.promotion_statusread (gtm_query)Definitions still in dev (not live) and what must be signed.
plays.rescoreyou may call it (gtm_act)Rescore the plays once the definitions changed (the build's plays step runs it too).

Screen 6 -- First motion and 90 days (plan, launch)

  1. Read the plan in onboarding.get (plan.phases, deferred, overCapacity, sized by the hours a week; each item says why it is there, who owns it and what it waits on). The user shapes it with onboarding.plan.set (keys from plan.phases[].items[].key / plan.deferred[].key, play refs from plays.catalog): add, remove, defer with a reason, undefer, order, phase, hours. A play they want that the catalog does not have: request (it runs studio.request as you); a catalog play not installed yet: add with install: true (it ships only after a different person approves it in Studio).
  2. onboarding.brief.refresh (readiness checked live + the model's cited summary), then onboarding.brief: give the user the Markdown, or save it where they ask. A withheld section says why (role, scopes); a summary sentence without evidence is never shown.
  3. Going live: onboarding.launch.preview says per definition what Launch would sign / promote and per engine what the approved autonomy card allows. Launch (onboarding.launch) is human-only: show the preview and ask the user to click Launch in Setup > First motion (signing is four-eyes: the signer is never the proposer; each promotion is approved by a teammate). Outside Launch you may propose env.promote (rule 7).
  4. completeStep plan, then launch. Then summarise: what is live, what waits for whom (approval ids, ask numbers), and the Open items.

The motion and the recommendation loop (GTM OS 0.2.6, check Step 0 first). motion.assess ranks the motions on real counts; motion.decide and motion.change are the person's, so show the ranking and let them record it. After launch, recommendation.generate reads the funnel and proposes at most one recommendation per finding; recommendation.accept, recommendation.dismiss and recommendation.start_mission are the owner's (agent keys are refused). After an accept you may call recommendation.act (a different person approves it) and, later, recommendation.measure. motion.checkpoint (the +30, +60 and +90 day readings) is the person's too: bring the real numbers.

OperationAccessUse
motion.assessread (gtm_query)Rank the GTM motions on the org's real counts and the seven intake answers: fit, blocking gaps, why not. Never answer an intake question for the user.
motion.getread (gtm_query)The motion in force: the decision and its reason, the history and the +30, +60 and +90 day checkpoints.
motion.decidehuman only: agent keys are refusedRecord the motion the person chose and why. A person's decision, append-only.
motion.changehuman only: agent keys are refusedChange the motion with a reason; the new blueprint is proposed and a different person approves it.
motion.checkpointhuman only: agent keys are refusedRecord a +30, +60 or +90 day checkpoint: what was expected against what was observed. A person records it; agent keys are refused.
recommendation.listread (gtm_query)The recommendations from the funnel, newest first, with evidence, proposed action, tier, owner, state and outcome.
recommendation.getread (gtm_query)One recommendation with its approval and measured outcome.
recommendation.generateyou may call it (gtm_act)Read the funnel, apply the rules and create at most one recommendation per finding. It only proposes; nothing runs.
recommendation.accepthuman only: agent keys are refusedThe owner says yes to a recommendation. Nothing runs yet. Agent keys are refused.
recommendation.dismisshuman only: agent keys are refusedDismiss a recommendation with a reason. Agent keys are refused.
recommendation.start_missionhuman only: agent keys are refusedStart a bounded mission from an accepted low-risk recommendation. Agent keys are refused; nothing runs until a person approves the mission plan.
recommendation.actproposes (gtm_act); a different human approvesAct on an accepted recommendation: its operation is proposed at its own tier and a different person approves.
recommendation.measureyou may call it (gtm_act)Read the same funnel again over the same cohorts and write before and after into the recommendation's outcome.
plays.catalogread (gtm_query)The plays the plan can use (refs catalog:<key>, org:<key>, request:<id>).
onboarding.plan.setyou may call it (gtm_act)Shape the 90-day plan: add plays from plays.catalog to a lane, remove, defer with a reason, bring back, reorder, pin a lane, set your own hours, ask Studio for a new play (request). Capacity comes from the Welcome hours; what does not fit is deferred with the reason. Publishes nothing.
studio.requestyou may call it (gtm_act)Request a new play the catalog does not have (onboarding.plan.set request does the same and puts its review in the plan).
onboarding.briefread (gtm_query)The smart OS brief for the caller (Markdown + sections): company, their words, engines + readiness, data, approved definitions, rules + seats, guessed-for-you drafts, numbered open asks, the 90-day plan, decisions (approval ids), the model's cited summary.
onboarding.brief.refreshyou may call it (gtm_act)Check engine readiness live (the plan reads it) and have the org's model write the cited summary (uncited sentences dropped; no model = said so).
onboarding.launch.previewread (gtm_query)What Launch would sign, promote and turn live (nothing written): tell the person what launching needs.
onboarding.launchhuman only: agent keys are refusedLaunch: sign + promote every setup definition, engines live only per the approved autonomy card. A human runs it in the console.
definition.sign_manyhuman only: agent keys are refusedSign the proposed definitions: a human, never the person who proposed them.
env.promoteproposes (gtm_act); a different human approvesNeeds engine.configure (the build scope). Propose promoting dev -> prod; a different human approves and executes it.

Human-only: what you do instead

Every operation below refuses an agent key with FORBIDDEN: Operation "<name>" can only be performed by a human (the ARR band with its own FORBIDDEN). That is expected, not an error to work around. For each one: do the part you may do (prepare and edit the draft, propose, read the preview), then ask the human to finish it, naming the screen and the button, and record it as an Open item.

Refused for agentsWhat you do instead
profile.arrBandNever ask for it, never store it. Tell the user to set it in Setup > Welcome themselves (or leave it empty: it stays private).
composio.connectConnecting a new app is an OAuth sign-in: give the user the console link (Connections > Composio > Connect), then run composio.sync_connections when they say done.
money.settings.setPrepare the money card (edit it to what the user confirmed); the user approves it in Setup > Your definitions.
deal_type.setPrepare the deal_words card; the user approves it in Setup > Your definitions.
territory.upsertPrepare the owners card; the user approves it in Setup > Your definitions.
brand.setPrepare the brand_voice card from their words and their brand documents; the user approves it in Setup > Your definitions.
buying_roles.setPrepare the buying_roles card; the user approves it in Setup > Rules.
privacy.settings.setPrepare the consent card; the user approves it in Setup > Rules.
policy.set_dry_modePrepare the trust card; the user approves it in Setup > Rules.
policy.guardrails.setPrepare the trust card (caps, quiet hours, timezone, channels); the user approves it in Setup > Rules.
policy.engine_modes.setPrepare the autonomy card; the user approves it in Setup > Rules. Engines go live only at Launch, per that approved card.
policy.set_autonomy_scopePrepare the autonomy card; the user approves it in Setup > Rules.
roles.upsertDescribe the profile the user wants (base role, denied operations, KPIs, actions: it only narrows); an owner / admin creates it in Settings > Members.
roles.assignSave the seats with onboarding.seats.set (its roles.errors is expected); an owner / admin saves them again in Setup > Rules, or assigns the profile in Settings > Members (never the sole owner as Operator or Exec: LAST_OWNER_NARROWING).
definition.sign_manyList what waits to be signed (config.promotion_status, onboarding.launch.preview); a human other than the proposer signs it.
proof.propose_activationPrepare the draft proof (proof.extract_from_document / proof.update) and tell the user to propose activation in Settings > Proof library; a different person approves it.
voice.customer_language.approveMine the phrases (voice.customer_language.mine) and tell the user to review them in Settings > Proof library > Customer language.
onboarding.launchRead onboarding.launch.preview and tell the user exactly what Launch will sign, promote and turn live; they click Launch in Setup > First motion.
motion.decideRun motion.assess and show the ranking with its gaps; the person decides in the console and gives the reason. Never record a motion for them.
motion.checkpointRead motion.get for the checkpoint dates and bring the real numbers (funnel.evaluate, board.evaluate); the person records what they expected against what they observed in the console.
motion.changeShow motion.get and the checkpoints; the person changes the motion in the console with a reason.
recommendation.acceptShow the recommendation with its evidence (recommendation.get); the owner accepts it in the console.
recommendation.dismissSay what you would dismiss and why; the owner dismisses it in the console.
recommendation.start_missionTell the owner the recommendation is eligible once accepted; they start the mission in the console and a different person approves its plan.

Open asks

Every gap becomes a numbered ask with an owner, never a guess: asks.list shows them (number, kind, owner, status). When the owner answers in the conversation, record it with asks.answer and then save the value through the screen's own operation. You answer only the asks you own: for any other, give the answer to the ask's owner (or a member relays it in the console). Report the open asks in every summary.

On an older instance

The setup operations above ship with GTM OS 0.2.5. If gtm_describe does not know one, the instance is older: say which part needs the update, carry on with what exists, and ask an operator to update the instance (console Settings > Updates, or gtm upgrade). Never imitate a missing operation with other writes.

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 gtmos-onboarding 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.

Build my GTM engine

Tell us what you want to improve. Fedor reviews the workflow and replies by email when there is a useful fit.

Fedor reviews every request personally. If there is a useful fit, he will reply by email.