Skill
A saved procedure your agent invokes. Reusable, parameterized, auditable. Like Claude Skills, family-shaped.
A skill is a saved procedure your agent invokes. Like Claude Skills or custom GPTs, family-shaped. Reusable, parameterized, auditable. A skill captures what your agent does: the prompt, the tool list, the inputs: so it can re-run with new context tomorrow without re-prompting.
Skills are tagged by where they make sense to run, not who runs them. generic skills only touch Sprout and can run anywhere; home_agent skills reach outside Sprout (school portal, your calendar, your folders) and only make sense in your home agent's context.
Where you'll see this
In the wild: Save it as a skill
A worked example
A skill that refreshes today's Daily check-in to reflect what actually happened at school. Tagged home_agent because it reads the school portal before updating the task.
skill.write({
name: "Refresh today's check-in",
description: "Pull today's school events and rewrite the check-in chat to match.",
category: "home_agent",
prompt: `For {{input.child_name}} ({{input.child_id}}) on {{input.today}}:
1. Read today's events for this kid from the school portal connector.
2. task.list({ assignedChildIds:[{{input.child_id}}], status:'open' });
find the open task named 'Daily check-in'.
3. Rewrite conversationSpec.guidance to fit today specifically.
4. task.update(taskId, { conversationSpec: { goalType:'share', guidance: <rewrite> } }).`,
handsReferenced: ["task_list", "task_update"],
inputVariables: [
{ name: "child_name" },
{ name: "child_id" },
{ name: "today" }
]
})
# Then each morning:
skill.invoke({ skillId: "<skill>", input: { child_name, child_id, today } })The Save it as a skill page walks this top to bottom.
Shape
name·description: what the skill is and what it does, in the parent's language.category,generic(default) orhome_agent. The audience fork.prompt: the procedure your agent reads on invoke. Templates use{{input.*}}placeholders; child names verbatim are refused withPII_IN_PROMPT.handsReferenced: declared tools the procedure uses. Advisory, not an allowlist; biases attention.inputVariables: what your agent passes on each invoke.kidCallable: flag. Whether the kid app can launch this directly. Extra scrutiny if true.canvasIds: optional. Canvases linked to the skill.skill.updateusesaddCanvasIds/removeCanvasIds(incremental, not full replacement).
Lifecycle
The skill lifecycle is flat: a skill exists or it's archived. There is no separate "activate" beat: invocation records its own usage event, and skill.get surfaces the most recent timestamp as lastTriggeredAt. Archived skills can't be invoked or scheduled; create a fresh one to reuse the pattern.
When to use it (and when not to)
Save as a skill when:
- You'll want the same procedure tomorrow with different inputs.
- The content has to change between runs (today's school day, this week's themes).
- You want an audit trail and library entry, not a one-off shell command.
Stick with a standalone task when:
- The content is the same every time; the schedule does the work.
- It's truly one-off and you don't expect a sibling pattern.
Common errors
BAD_INPUT·PII_IN_PROMPT: a real child's name appeared verbatim inpromptordescription. Use{{input.child_name}}.BAD_INPUT·SPEC_HASH_MISMATCH: your commit input changed between dry-run and commit. Re-dry-run.BAD_INPUT·SCHEDULER_AS_RUN_SKILL: passed a scheduler-shaped skill as the run skill of a heartbeat.PERMISSION_DENIED: invoking or heartbeating ahome_agentskill from Sprout-runtime. By design.
Related tools
skill.write: author. SupportsdryRun+specHash.skill.update: partial patch. Conditional gates: name/desc-only skips safety + policy.skill.invoke: your agent renders the skill into the conversation. Not kid delivery.skill.list/skill.get: read shape; canvas metadata denormalized onget.skill.post_result: explicit publish to the family inbox.
Roadmap for this noun
- Soon Cross-family skill library: subscribe to skills other families' agents publish. Metadata review becomes a hard gate.
- Soon Granular consent: per-skill parent approval at first invoke, not just at OAuth time.
Related reading
Save it as a skill Task How safety works