Repository navigation
feat(skills): move the github-runner skill body to .agents/skills - #14
Merged
Merged
Conversation
The bodies lived only as inline content: blocks on the skill: nodes. They now live in the repo that owns them, at .agents/skills/<name>/SKILL.md, and each node keeps its routing metadata (name, family, owner, description) with no body of its own. The plugin-marketplace generator reads this shape (skillfile.go): it takes the body from the first declared tree that holds the file and hard-errors when an inline content: disagrees with the file, so no stale second copy can survive.
Review — PASSHead SHA: Security screen: PASS Notes (non-blocking):
Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Moves the 1
github-runnerskill body out of the manifest and into the repo that owns them:.agents/skills/<name>/SKILL.md. Eachskill:node keeps its routing metadata —name,family,owner,description— and no longer carries a body of its own.The generator reads this shape already:
plugin-marketplace/candy/plugin-marketplace/skillfile.gotakes the body from the first declared tree that holds the file, defaults the id to the node name, and hard-errors when a node's inlinecontent:disagrees with the file — and likewise when itsdescription:disagrees with the file's frontmatter. That is what makes R5 mechanical rather than a convention.Why the gate below is the generator and not
charly box validate:box validatereports no skills at all, and measured on these repos it still returnsrc=0with a relocatedSKILL.mddeleted outright. It cannot see this change, so it is pasted for completeness and not as the proof.How tested
Run on the committed tree at head
d5f2b5e.That last block is why the routing metadata is intact rather than merely asserted: it counts each field in the
base and at the head, so
name,family,owneranddescriptionare shown to survive unchanged while the skill bodies go.contentgoes from 1 to zero. A diff hunk's context is not evidence for this — it shows only the lines near the deletion.Skill nodes at the head that still carry a body: 0 of 1 — which is the claim that
actually matters, and it is counted rather than asserted.
The generator's own reader, from a clone of
plugin-marketplaceat its released state, pointed at this tree:ReadsFromAgentsSkillsasserts the body comes from the file and equals it byte-for-byte, and that the description comes from the file's frontmatter.RejectsStaleInlineBodyasserts the inline-content:disagreement rule fires.The description-equality rule is exercised separately, because the generic reader above passes an empty
description and therefore skips
if s.Description != "" && s.Description != sf.Description. The test passes thenode's real
description:and the log line states the comparison result, not merely byte counts — two stringsthat differ only in newline-versus-space have equal lengths, so equal lengths alone prove nothing. No claim is made
here about the YAML scalar style the node happens to use; the equality is measured, not inferred from the style:
Negative control — the same gate, red: the reader run against a copy of this tree with
.agents/skills/github-runner/SKILL.mddeleted:Green on the tree being pushed, red when a relocated body goes missing.
The manifest gate, for completeness:
AGENTS.mdnames every one of these skills, so its enumeration needed no change.Runtime identity
The attribution footer uses the runtime's own names, verified rather than guessed:
The model and provider are read from the harness's own record of this session (keyed by
DSH_SESSION_ID),not from a config file:
record.rows.modelSelection.val.lastUsedis what the runtime wrote for the turns thatproduced this change.
dshis the harness (DeepSeek Harness) anddeepseek-v4.1-flashthe model it reports —the same identity that signs this repo's own validator run.
Rulebook compliance
/charly-internals:git-workflow,/charly-internals:cutover-policyand/charly-internals:skillsloaded before the first git action.nameanddescriptionon the node are the routing identity the generator matches the file against; the generator errors ifdescriptiondiverges, so the two cannot drift silently.git statusread first; worktree off freshorigin/main; no force-push, no bypass, no push tomain.rc=0, with a red control, pluscharly box validaterc=0and zero warnings.Change classification
Config + authored skill content: 1
.agents/skills/*/SKILL.mdfile added, 1 inlinecontent:block removed fromcharly.yml. No runtime, no Go, no pin.Filed issues
opencharly/charly#983—charly box validatedoes not validate skill bodies: a deleted or empty.agents/skills/<name>/SKILL.mdpasses withrc=0. Filed from this leg's evidence. The generator gate above exists in addition to that filing, not instead of it.Agent: charly
Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)