@skill.<name>. The parent stays on the stack, the sub-skill runs, and the parent resumes with the sub-skill’s public memory available to it.
The @skill.<name> reference
@skill.authentication, it parks Card Replace on the stack, runs Authentication to completion, then resumes Card Replace, which can now read Authentication’s public fields such as authenticated and party_id.
Write @skill.<name> when the parent needs another skill’s result to carry on.
A customer who changes topic mid-conversation is handled by the engine on its
own, with no authoring needed. For how each case parks and resumes the parent,
see Jumps to blocks and skills.
Composition rules
- Default to small, focused skills. Each skill does one thing and exports results as public memory. Transaction lookup is its own skill, not embedded in disputes, refunds, and fraud review.
- Compose when you need context continuity. A dispute skill calls transaction-lookup as a sub-skill. The parent owns the conversation.
- The parent must have meaningful business logic of its own. If you strip out all the
@skill.<name>references and the skill is empty, it’s not a skill. That’s the orchestrator’s job.
Depending on another skill’s outcome
A skill can declare its ownrequires:, and the orchestrator offers it only
once that condition holds:
skills/card_replace/skill.md
authenticated, never on the authentication skill itself. The memory key is the
whole contract, which is why it lives in the project-level memory.yml rather
than inside either skill.
Reach for this when one skill simply must not start before another has done its
job, and for @skill.<name> when the parent needs the result mid-conversation.
Which one to use
Both take the id, not the display name:
@skill.card_disambiguation for a
skill in skills/card_disambiguation/, and @block.pick_card for a block
declared as :::ordered_block id=pick_card.
Tools need no token. They are already in the model’s schema while their skill is
active, so name them in plain prose.