Repository navigation
feat(skills): move the openclaw-cmd skill body beside its candy - #9
Conversation
The check-family skill body leaves candy/plugin-openclaw/charly.yml for .agents/skills/openclaw-cmd/SKILL.md beside the candy, keeping full YAML frontmatter. The node content: and description: blocks are deleted; the description is unreachable after migration because skills_collect.go reads s.Description only on its sf == nil branch. Two files, 102/96.
Review — PASSHead SHA: Security screen: PASS — no secrets, no code, no guardrail/rulebook change, no supply-chain edit; body is data, not instruction. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
…e the reader now looks (#10) sdk#445 moved deploykit's skill base from the owning candy's directory to the owning candy's REPO ROOT: filepath.Join(repoRoot, ".agents/skills"). This commit is the mirror image of #9 (2026.293.1539), which moved the body BESIDE the candy under the old base -- so under the new reader the node has no body at all, and `charly box validate` at this repo's main says exactly that (rc=1, naming the repo root). Pure move: the SKILL.md blob is byte-identical before and after (f3e7bca), the candy manifest is untouched, and the candy-dir copy is deleted in this same commit. Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated) Co-authored-by: Andreas Trawoeger <atrawog@gmail.com>
Summary
Moves the inline
skill:body out ofcandy/plugin-openclaw/charly.ymland into the candy's own.agents/skills/directory — beside the candy that declares each node, which is where the loader reads it — leaving eachskill:node carrying only its routing metadata. The exact file paths are in the table below; no placeholder path isnarrated here, because a path in prose that the diff does not contain is a claim the reader cannot check.
openclaw-cmdcandy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.mdDiff against
main: 102 insertions and 96 deletions across 2 files — 1 newSKILL.mdand the manifest, whose 1 skill-ownedcontent:block are deleted.The same hunk also deletes the 1
description:block(s) from theskill:node(s). That is deliberate and part of this change, not collateral:sdk/deploykit/skills_collect.goreadsentry.Description = s.Descriptiononly on itssf == nilbranch — the transitional in-line form — andentry.Description = sf.Descriptionoverwrites it unconditionally once a body file exists, so the node field is unreachable after this migration.Why beside the candy, and how it is proven
sdk/deploykit/skills_collect.goresolves the tree asfilepath.Join(layer.GetSourceDir(), ".agents/skills"), andGetSourceDir()is the directory of the candy whose manifest declares the node.sdk#430(merged,v0.2026293.1143) addeddeploykit.CollectSkillBodies, andplugin-box#57(merged,v2026.293.1153) calls it fromrunValidateEngine— socharly box validatenow fails when an authoredskill:node has no body beside its candy. Before those two merges, no command in a repo that composes no box could read a
skill body at all, because
CollectSkillsgates body reads onBoxCandyChain, a label-size policy.How tested
Change class: config.
Negative control — the body moved to the repository root:
Same tree, same nodes, same manifest — only one body's location differed.
1 hunk(s) in the manifest diff, against 1 stripped
content:block(s). The counts differ where two deletions are close enough forgit diffto fold them into one hunk - the block count is the one that must match what was stripped, and the hunk count is what the diff actually shows.Root
.agents/tree check — the body's R5 claim, shown rather than asserted:Rulebook compliance
/charly-internals:git-workflowbefore any git command.opencharly/opencharly#530(the missing gate) is closed bysdk#430+plugin-box#57;#528records the layout rule.deploykitandplugin-box, not in this repo.git add -f. Non-skillcontent:blocks are classified, not stripped..agents/tree:And the manifest carries no skill
content:and no root.agents/tree. Claim-keyed check: the numstat above.git statusread first; one branch offorigin/main; 1 commit, no amendment, no force-push.rc=1.charlyused is the worktree-local dev build(
bootstrap-charly.sh --dev-plugin plugin-box=<worktree>, i.e. the mergedplugin-box#57code), and it reports:The source worktree is at
ed9a5dad, whoseCHANGELOG/names the same CalVer — so the binary matches thesource it was built from, which is what R9 asks for.
charly box validaterun on the committed tree with both controls pasted.Change classification
Config — 1 skill body relocated beside its candy.
Filed issues
opencharly/opencharly#530— no in-repo gate exercises skill-body collection for a repo that authors no box. Closed bysdk#430+plugin-box#57.opencharly/opencharly#528— the layout rule the migration depends on.Agent: charly
Assisted-by: DeepSeek Harness ollama-cloud deepseek-v4.1-flash (analysed on a live system)