renderSkill method
Renders the SKILL.md for skillId, substituting every {{key}} from
args (the manifest's declared skill args — e.g. runner, gridHome
for discover). The composing station's delivery leg calls this at
materialization time.
Throws a StateError when any {{…}} hole survives substitution — an
installed skill has NO unbound template holes (a leftover {{runner}}
would read as a literal in the seat's skill, a silent packaging bug).
Implementation
String renderSkill(String skillId, {required Map<String, String> args}) =>
_renderOrRefuse(
'renderSkill("$skillId")',
loadSkillTemplate(skillId),
args,
);