Expand one skill into text
Reads one skill’s instructions and returns them framed the way the model’s own skill tool frames them — whose they are and which directory their relative paths resolve against — with whatever the person typed after the name appended. The file is read NOW, through the confinement its origin was discovered with, so a skill edited since it was listed is returned as edited and a project skill whose path has since become a symlink out of the checkout is refused. A body that cannot be read comes back as a sentence saying so rather than as an error: the caller asked for text to put in front of a person, and text is what it gets.
Path Parameters
The skill's name, as listSkills reports it.
128^[^\s/\\]+$Body
What to expand a skill or a command file against: the repository the work is happening in, and whatever the person typed after the name.
Absolute path of the repository, which decides which rungs are read and — for a command — where its shell blocks run and whether they may.
4096Everything typed after the name, verbatim. A command file's $ARGUMENTS and $1..$9 are filled from it, AFTER its shell blocks have already run, so text pasted here can never become a block.
65536Response
The expanded text.
The text one expansion produced, ready to be put in front of a person. It is never sent anywhere on their behalf: the whole point of expanding into a composer is that somebody reads what a file wrote in their name before a model does.

