> ## Documentation Index
> Fetch the complete documentation index at: https://learn.actionist.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Skills

> Reusable task packs an agent loads on demand. How to choose, add, review and maintain them for a client when the skills permission is granted.

<div className="mxp-hero xc-border">
  <div className="exp-eyebrow mxp-rise">REUSABLE PLAYBOOKS</div>

  <h2 className="mxp-hero-title mxp-rise" style={{animationDelay:'0.06s'}}>
    A skill is a playbook an agent reaches for on its own. <span style={{background:'linear-gradient(90deg,#24A4FF,#9000FF,#E3008E)',WebkitBackgroundClip:'text',backgroundClip:'text',color:'transparent'}}>You stock the shelf, the agent picks the book.</span>
  </h2>

  <p className="mxp-hero-dek mxp-rise" style={{animationDelay:'0.13s'}}>
    With the `skills` permission granted, you can install, upload, enable, disable and remove skills for a client's workspace from the Apps section. This page covers how to pick the right ones, add them safely, wire up any secret they need, and keep a live client's skill set healthy. It also covers the single most confusing part of this permission: what `skills` unlocks on its own, and what it silently doesn't.
  </p>
</div>

<div className="w-full py-10">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">The basics</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">What a skill is, quickly.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      A skill is a portable behaviour pack an agent loads at runtime. Physically it's a folder containing a `SKILL.md` file: YAML frontmatter on top, a Markdown body underneath holding the actual instructions. Nobody invokes a skill by hand. The agent reads the incoming request, matches it against every enabled skill's trigger phrases, and loads whichever playbook wins. That matching happens the same way in chat, inside a workflow, and on an unattended schedule or trigger, so a skill you set up once keeps firing everywhere the agent runs.

      Because a skill is just a folder, it isn't tied to the workspace it was built in. A skill you wrote for one client's recurring task can be uploaded as an archive into a different client's workspace, provided that client has actually granted you `skills`.
    </p>
  </div>

  <div className="mxp-window">
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">skills/refund-request-handler/SKILL.md</span>
    </div>

    <div className="mxp-window-body" style={{minHeight:'auto', fontFamily:'"JetBrains Mono",monospace', fontSize:'12.5px'}}>
      <div className="mxp-stream-line mxp-s1"><span className="mxp-stream-time">name:</span><span className="mxp-stream-text">refund-request-handler</span></div>
      <div className="mxp-stream-line mxp-s1"><span className="mxp-stream-time">title:</span><span className="mxp-stream-text">Refund Request Handler</span></div>
      <div className="mxp-stream-line mxp-s2"><span className="mxp-stream-time">description:</span><span className="mxp-stream-text">Confirms an order, checks refund eligibility, then issues the refund in Stripe.</span></div>
      <div className="mxp-stream-line mxp-s2"><span className="mxp-stream-time">version:</span><span className="mxp-stream-text">1.3.0</span></div>
      <div className="mxp-stream-line mxp-s3"><span className="mxp-stream-time">triggers:</span><span className="mxp-stream-text">"process a refund for {'{'}order{'}'}", "customer wants their money back"</span></div>
      <div className="mxp-stream-line mxp-s4"><span className="mxp-stream-time">credentials:</span><span className="mxp-stream-text">stripe\_api\_key</span></div>
      <div className="mxp-stream-line mxp-s4"><span className="mxp-stream-time">context:</span><span className="mxp-stream-text">fork</span></div>
      <div className="mxp-stream-line mxp-s5" style={{marginTop:'8px',opacity:0.85}}><span className="mxp-stream-time"># </span><span className="mxp-stream-text">Refund Request Handler</span></div>
      <div className="mxp-stream-line mxp-s5" style={{opacity:0.85}}><span className="mxp-stream-time">1.</span><span className="mxp-stream-text">Confirm the order number and the stated reason before touching Stripe.<span className="mxp-caret" /></span></div>
    </div>
  </div>

  A few frontmatter fields matter more than the rest once you're the one adding skills for a client:

  <div className="exp-surface-grid" style={{marginTop:'22px'}}>
    <div className="exp-surface-tile"><strong>`name` and `title`.</strong> The internal identifier and the human-readable label you see in the catalogue and in an agent's Skills tab.</div>
    <div className="exp-surface-tile"><strong>`description` and `version`.</strong> What the skill is for, and which build of it is currently installed.</div>
    <div className="exp-surface-tile"><strong>`triggers`.</strong> The natural-language phrases that make an agent reach for this skill instead of another one.</div>
    <div className="exp-surface-tile"><strong>`credentials`.</strong> Any secret the skill declares it needs. Covered in full further down this page.</div>
    <div className="exp-surface-tile"><strong>`context`.</strong> `inline` runs the skill in the main conversation. `fork` runs it in a sub-agent with its own context budget, useful for a long or noisy task you don't want cluttering the main chat.</div>
  </div>

  What makes a skill worth adding is that it fires the same way everywhere. Once a skill is enabled and an agent is watching for its triggers, a chat message, a workflow step, and an unattended schedule run all match against the same phrases the same way. You aren't configuring three separate behaviours for three surfaces, you're configuring one.

  This page is about choosing, adding and maintaining skills in a delegated session, not the field-by-field mechanics of authoring one. For the full reference on `SKILL.md`, triggers, and everything else a skill can declare, see [Skills](/Folders/skills).

  Keep that page open alongside this one if you're drafting a new skill's frontmatter for the first time. It's the place to check a field you're unsure about before you save.
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Read this before you touch anything</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">One permission runs the shelf. A second runs the agent.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      `skills` unlocks the Skills sub-page under **Apps**, plus a Skills tab inside **Agent Studio**. Those are two different surfaces, and only one of them actually responds to your clicks with `skills` alone.
    </p>
  </div>

  <Info>
    The client sees this as a single toggle: "Allow reseller to manage Skills", described to them as "Install, enable, disable, or remove skills from the skill marketplace." That "skill marketplace" wording is older client-facing copy. The Apps section itself calls the same collection the catalogue today, which is the term used throughout this page.
  </Info>

  <div className="xrs-two">
    <div className="xrs-two-col can">
      <div className="xrs-two-tag">With Skills alone</div>
      <div className="xrs-two-item">Browse and search the catalogue from Apps → Skills.</div>
      <div className="xrs-two-item">Install a skill, or upload one as an archive.</div>
      <div className="xrs-two-item">Enable or disable a skill at the workspace level.</div>
      <div className="xrs-two-item">Remove a skill from the workspace entirely.</div>
      <div className="xrs-two-item">Author a new skill conversationally with the built-in skill creator.</div>
    </div>

    <div className="xrs-two-col cant">
      <div className="xrs-two-tag">Needs Agents too</div>
      <div className="xrs-two-item">Turn a skill on or off for one specific agent, in that agent's Skills tab.</div>
      <div className="xrs-two-item">Open the credential binding drawer for a skill that needs a secret.</div>
      <div className="xrs-two-item">Any other control inside Agent Studio, for any tab, not just Skills.</div>
    </div>
  </div>

  <Warning>
    **`skills` alone does not give you working per-agent controls.** It gives you the workspace-level skill set: install, upload, enable, disable, remove, all from Apps. But the per-agent Skills tab lives inside **Agent Studio**, and the whole studio is wrapped in a disabled fieldset unless the session also holds `prompts_and_instructions`. With `skills` alone, you can open an agent's Skills tab and *see* which skills it has enabled, but every control on it is disabled. You cannot toggle a skill on or off for that agent, and you cannot open its credential binding drawer. This is the single most confusing thing on this page, and it catches people who assume "manage Skills" means the whole skills story end to end.
  </Warning>

  In practice: with only `skills` granted, you're stocking and maintaining the shelf. Whether a given agent actually picks a skill up, and whether it's wired to the secret it needs, is a decision made from Agent Studio, which needs `prompts_and_instructions` as well. If a client wants you fully hands-on with skills, tell them both toggles need to be on, not just the one labelled Skills.

  It's worth saying plainly why this split exists rather than treating it as an inconsistency. A skill installed at the workspace level is still just sitting on the shelf. Deciding which agent picks it up, and whether it's allowed to touch a paid API on the client's behalf, is closer to editing that agent's actual configuration than it is to app management, which is exactly the boundary `prompts_and_instructions` already draws for prompts and instructions. Skills sits on both sides of that line, which is why it needs a partner scope to be fully usable.

  The same shape shows up one level up, too. Apps itself unlocks with either `tools_and_integrations` or `skills`, so a client can grant you access to install and enable skills without handing over anything else in Apps. That's a deliberate, narrow grant, and the Agent Studio lock is the same idea applied one layer deeper.
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Sourcing</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Where skills come from.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Every skill in a workspace arrived by one of four routes. All four land in the same place: the workspace's own skill catalogue, visible from Apps → Skills.
    </p>
  </div>

  <div className="mxp-pipe">
    <div className="mxp-pipe-node"><strong>Bundled</strong><span>Ships with the app by default. Nothing to install.</span></div>

    <div className="mxp-pipe-link" />

    <div className="mxp-pipe-node"><strong>Catalogue install</strong><span>Pulled in from the shared skill catalogue.</span></div>

    <div className="mxp-pipe-link d2" />

    <div className="mxp-pipe-node"><strong>Uploaded archive</strong><span>A packaged skill folder, dropped in from outside Actionist.</span></div>

    <div className="mxp-pipe-link d3" />

    <div className="mxp-pipe-node"><strong>Skill creator</strong><span>Authored conversationally, by describing what you want to an agent.</span></div>

    <div className="mxp-pipe-link d4" />

    <div className="mxp-pipe-node"><strong>Workspace catalogue</strong><span>Where every skill lives once it's in, regardless of how it got there.</span></div>
  </div>

  "Catalogue install" above means browsing the shared catalogue and pulling a single skill into this specific workspace. Once it's in, it sits in that workspace's own catalogue view alongside anything that arrived by the other three routes, that's the "Workspace catalogue" node the pipe ends on. Two different things share the word catalogue here: the shared source you install from, and the workspace's own list of what's currently installed.

  With `skills` granted, you can drive three of those four routes yourself: installing from the catalogue, uploading an archive, and running the conversational skill creator to author something new. The fourth, bundled skills, needs no action from anyone.

  <Note>
    **Publishing to the community catalogue is off, categorically, in a delegated session.** This applies to every kind of listing, whether you authored it yourself in that session or are trying to push up something built earlier. Authoring and publishing on someone else's behalf isn't something the reseller programme allows. You can build a skill for a client and use it in their workspace. You cannot put it out for other workspaces to install.
  </Note>

  Once a skill lands in the workspace catalogue, Apps → Skills treats it the same regardless of which of the four routes brought it in. There's no separate "uploaded" or "bundled" tab to check later, install, enable, disable and remove all work identically no matter where the skill originally came from.
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Walkthrough</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Adding a skill for a client.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Everything up to the last step happens with `skills` alone. The last step needs `prompts_and_instructions` too, so read it as a checkpoint rather than something you can always finish yourself.
    </p>
  </div>

  <Steps>
    <Step title="Open Apps → Skills">
      A session holding only `skills` lands directly on the Skills sub-page, not on Browse. The Apps container itself opens with either `tools_and_integrations` or `skills`, whichever the session has.
    </Step>

    <Step title="Search the catalogue, or upload an archive">
      Look for a skill that matches a task the client actually does repeatedly. If nothing in the catalogue fits and you have a packaged skill folder, upload it as an archive instead.
    </Step>

    <Step title="Install it, then enable it">
      Installing adds the skill to the workspace. Enabling makes it available for an agent to load the next time a trigger phrase matches. Both steps happen from Apps, and both work with `skills` alone.
    </Step>

    <Step title="Confirm it's actually turned on for the agent that needs it">
      Open that agent's Skills tab in Agent Studio. If the session also holds `prompts_and_instructions`, flip the per-agent toggle on there. If it doesn't, the tab is view-only for you, so ask the client to flip it, or confirm with them that both scopes should be granted going forward.
    </Step>
  </Steps>

  <Tip>
    Install for what the client's team actually does over and over, not for everything that looks useful. A workspace full of enabled skills gives an agent more trigger phrases to weigh against every incoming request, which makes it slower to find the right one and easier to mismatch. Start from a real recurring task, add the one skill that covers it, and confirm it fires correctly before you add the next.

    If you're not sure a task is recurring yet, wait. A skill installed for a one-off request is one more thing to review later, for no ongoing benefit.
  </Tip>

  <div className="xc-recipes" style={{marginTop:'26px'}}>
    <div className="xc-recipe">
      <div className="xc-recipe-who"><i style={{background:'linear-gradient(135deg,#9000FF,#00DBFF)'}} />Priya · Agency ops lead</div>
      <div className="xc-recipe-flow">A client's support team keeps asking their agent to handle the same kind of refund request by hand. Priya installs a refund-handling skill from the catalogue, enables it workspace wide, then confirms with the client that the agent should also have it turned on directly.</div>
      <span className="xc-recipe-save">setup in about 10 minutes</span>
    </div>

    <div className="xc-recipe">
      <div className="xc-recipe-who"><i style={{background:'linear-gradient(135deg,#486EFF,#24A4FF)'}} />Priya · weekly reporting</div>
      <div className="xc-recipe-flow">A different client wants a weekly summary sent every Friday. Priya uploads a skill built for a previous client's near-identical reporting format, enables it, and leaves the per-agent assignment and any credential binding to the client's admin since this session only holds `skills`.</div>
      <span className="xc-recipe-save">upload in under 5 minutes</span>
    </div>

    <div className="xc-recipe">
      <div className="xc-recipe-who"><i style={{background:'linear-gradient(135deg,#FD840C,#FF0068)'}} />Priya · quarterly cleanup</div>
      <div className="xc-recipe-flow">Reviewing a long-running client's Apps → Skills list, Priya finds two skills nobody has referenced in months. She disables both rather than removing them straight away, in case they're still bound somewhere she hasn't checked, then removes them for good once a few weeks pass with no complaints.</div>
      <span className="xc-recipe-save">review in about 15 minutes</span>
    </div>
  </div>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Credentials</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Skills that need a secret.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Some skills declare a `credentials` requirement in their frontmatter, the refund-handling example above needed `stripe_api_key`. That requirement has to be satisfied before the skill can actually run.
    </p>
  </div>

  A skill's credential requirement is wired up in a **binding drawer**, opened from that skill's row in an agent's Skills tab, which puts it squarely inside the two-scope catch above. To open it at all, the session needs both `skills` and `prompts_and_instructions`. Once it's open:

  <div className="exp-surface-grid" style={{marginTop:'4px', marginBottom:'22px'}}>
    <div className="exp-surface-tile"><strong>You can reference an existing stored credential.</strong> Pick one already saved in the client's Credentials Vault and bind it to the skill, without ever seeing the plaintext value.</div>
    <div className="exp-surface-tile"><strong>You cannot create or reveal a secret.</strong> Pasting in a brand-new value, or viewing what's already stored, is permanently off-limits, no matter what else is enabled.</div>
  </div>

  If a skill needs a secret the client hasn't stored yet, the honest answer is to ask them to add it to the Credentials Vault first. Once it exists, you can bind it. See [Credentials and API keys](/resellers/credentials) for the full boundary, including why there's no reveal button anywhere in a delegated session.

  <AccordionGroup>
    <Accordion title="I have skills granted but the binding drawer won't open" icon="lock">
      Check whether the session also holds `prompts_and_instructions`. The binding drawer lives inside an agent's Skills tab in Agent Studio, and that whole studio is disabled without it. `skills` alone gets you to the workspace-level install and enable, not the drawer.
    </Accordion>

    <Accordion title="Can I paste in a temporary API key just to test the skill" icon="ban">
      No. Creating or revealing a secret is off-limits regardless of what else is enabled, including for testing. Bind an existing stored credential, or ask the client to add the one you need.
    </Accordion>

    <Accordion title="What if the skill needs a credential kind the client hasn't used before" icon="circle-question-mark">
      That's a conversation for the client, not a workaround on your end. Point them at [Credentials and API keys](/resellers/credentials) so they know what the vault expects, then bind it once it's stored.
    </Accordion>

    <Accordion title="Does rotating the client's credential break the skill" icon="refresh-cw">
      No. Rotating a stored credential doesn't touch existing bindings. The skill picks up the new secret automatically the next time it resolves the credential, so a rotation on the client's side doesn't require you to redo the binding.
    </Accordion>
  </AccordionGroup>

  None of this is a workaround to route around. It's the same hard limit that applies everywhere else in a delegated session: reference what's stored, never see or set the value underneath it.
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Keeping the shelf healthy</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Maintaining them.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Enable, disable and remove sound like three flavours of the same action. They aren't. Each one behaves differently against a run that's already using the skill, and picking the wrong one on a client that's mid-workday is the fastest way to turn a routine cleanup into a support ticket.
    </p>
  </div>

  <div className="exp-surface-grid" style={{marginBottom:'22px'}}>
    <div className="exp-surface-tile"><strong>Enable.</strong> Turns availability back on for the next matching trigger. The fastest way to undo a disable.</div>
    <div className="exp-surface-tile"><strong>Disable.</strong> Pauses future loads without touching a run already in progress. The safe default when you're unsure.</div>
    <div className="exp-surface-tile"><strong>Remove.</strong> Deletes the skill folder outright. Undoing it means reinstalling, not flipping a switch back.</div>
  </div>

  <div>
    | Action             | Effect on a live agent                                                                                                                   | Reversible                           |
    | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
    | Enable             | Makes the skill available to load the next time a trigger phrase matches. No effect on runs already in progress.                         | Yes, disable it whenever you like    |
    | Disable            | Does not interrupt a run that has already loaded the skill. It only stops the agent from loading it again on the next trigger match.     | Yes, re-enable it whenever you like  |
    | Remove (uninstall) | Deletes the skill folder from the workspace entirely. An agent still referencing it simply stops matching, there's nothing left to load. | Only by reinstalling it from scratch |
  </div>

  Read that middle row twice if you're about to disable something on a client that's mid-workday. Disabling is the gentle option: nothing currently running gets cut off, it just won't be picked up again. Removing is the blunt one: the skill is gone, and any agent that used to reach for it quietly stops reaching for anything at all, with no error to flag it.

  <Warning>
    Changing a client's skill set while their team is actively working on it can produce confusing behaviour even when nothing technically breaks. A disabled skill still finishes its current run, but the very next request that would have matched it now falls through to something else, or to nothing. If you're removing a skill rather than just disabling it, do it outside the client's active hours when you can, or tell them beforehand so a sudden change in an agent's behaviour doesn't read as a bug.
  </Warning>

  When you're not sure which action is appropriate, disable first. It costs nothing to reverse, it never interrupts a run already underway, and it buys you time to confirm with the client before you commit to something that needs a fresh install to undo. Save removal for a skill you're confident the client's workspace genuinely doesn't need anymore.

  That single habit, disable before you remove, covers most of the situations that would otherwise turn into an awkward conversation with a client mid-workday.
</div>

<hr className="xc-divider" />

<div className="w-full py-10">
  <div className="actionist-cta-panel xc-border">
    <div className="relative z-10 flex flex-col items-center gap-5 max-w-2xl mx-auto">
      <span className="actionist-eyebrow">Skills, for a client workspace</span>

      <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-white leading-tight">
        Stock the shelf. Let the client wire the last mile.
      </h2>

      <p className="text-base md:text-lg text-white/85">
        Install, enable and maintain from Apps with `skills` alone. Per-agent assignment and credential binding need `prompts_and_instructions` alongside it.
      </p>

      <div className="flex flex-wrap items-center justify-center gap-3 pt-2">
        <a className="actionist-cta-btn-primary" href="https://app.actionist.ai" target="_blank" rel="noreferrer">
          Open the Dashboard

          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round">
            <path d="M5 12h14" />

            <path d="m12 5 7 7-7 7" />
          </svg>
        </a>

        <a className="actionist-cta-btn-secondary" href="https://actionist.ai/partners/" target="_blank" rel="noreferrer">
          Signup as a Partner
        </a>
      </div>
    </div>
  </div>
</div>

<div className="w-full pt-2 pb-6">
  <p className="actionist-trust-line">
    Publishing to the community catalogue is never available in a delegated session, for any listing.<br />
    Credential binding references stored secrets only, and never reveals or creates one.
  </p>
</div>

<div className="w-full pb-16 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Keep going</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Next steps.</h2>
  </div>

  <Columns cols={4}>
    <Card title="Skills" icon="puzzle" href="/Folders/skills">
      The full reference: SKILL.md fields, trigger design, and how the skill creator works.
    </Card>

    <Card title="Agents" icon="users" href="/resellers/agents">
      Where the per-agent Skills tab lives, and what else needs prompts and instructions.
    </Card>

    <Card title="Apps, tools and integrations" icon="plug" href="/resellers/apps">
      The Apps section skills sits inside, and how it splits from tools and MCP servers.
    </Card>

    <Card title="Credentials and API keys" icon="key" href="/resellers/credentials">
      Why binding references a stored secret instead of ever showing you one.
    </Card>
  </Columns>
</div>
