Skip to content

fix(skills): move the openclaw-cmd skill body to the repo root, where sdk#445 reads it - #10

Merged
github-actions[bot] merged 1 commit into
mainfrom
feat/skill-body-at-repo-root
Oct 22, 2026
Merged

github-actions[bot] merged 1 commit into
mainfrom
feat/skill-body-at-repo-root

Conversation

@aitrawog

Copy link
Copy Markdown
Contributor

Summary

Moves the openclaw-cmd skill body from candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md to .agents/skills/openclaw-cmd/SKILL.md at the repo root — where the
shipped reader now resolves it — and deletes the candy-dir copy in the same commit.

Head 6448ccc5a19c50a0dc0c15f0303fff3822321d0b, one commit off origin/main (f870257d45), 1 file: a pure rename, 0 insertions and 0 deletions.

Why it is landable now, and why it was not before. 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")). It shipped as
sdk v0.2026294.1520, which charly adopted in opencharly/charly#1017 (merge 00396e3e, tag v2026.295.0418) —
the cutover opencharly/opencharly#568 item (b) was blocked on. Under that reader this repo's own manifest gate fails
at main: rc=1, naming the repo root, because #9 had moved the body BESIDE the
candy under the OLD base. The move turns that gate green in the same commit, which is the property #568 asked for.

Pure move, proven by blob identity. Both sides are read out of git ls-tree — the before side from origin/main,
the after side from the staged index tree (git write-tree = 63ac14428bbf295195963131dae352e1ea9ff4aa) — never rebuilt from a template:

$ git -C plugin-openclaw ls-tree -r origin/main -- candy/plugin-openclaw/.agents
100644 blob f3e7bca22992b8392c3380a6c209cff9149e3bf6	candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md
$ git -C plugin-openclaw ls-tree -r 63ac14428bbf295195963131dae352e1ea9ff4aa -- .agents
100644 blob f3e7bca22992b8392c3380a6c209cff9149e3bf6	.agents/skills/openclaw-cmd/SKILL.md

The blob object is f3e7bca22992b8392c3380a6c209cff9149e3bf6 on both sides, so the move cannot have altered the body; git's own rename detection
agrees, recording 100% similarity rather than a delete plus an add:

$ git -C plugin-openclaw diff --name-status -M origin/main HEAD
R100	candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md	.agents/skills/openclaw-cmd/SKILL.md

How tested

Change class: config — a relocation of authored content that decides where a shipped reader finds a skill body.
No Go source, no box/, no candy manifest and no CUE schema changed, so the gate that owns this change is this
repo's own manifest gate, charly box validate, which is also the gate that reads the body. This repo's live beds
build images from candies whose Go sources this diff does not touch, and none of their steps asserts anything about a
skill body, so no bed here can fail on this relocation — per R10 a bed that cannot fail on the change is not run, and
the gate that can fail on it is pasted instead.

Proof binary — worktree-local, built from the MERGED charly tree (c837b661, charly's origin/main after
#1017), not a shared install and not a pre-#1017 build:

$ ./charly/bin/charly version
2026.295.0418
$ go version -m ./charly/bin/charly | grep -E 'github.com/opencharly/sdk |opencharly/plugin-box'
	dep	github.com/opencharly/sdk	v0.2026294.1520	h1:43EGZK2h1a5udbvgvToZ7EDZZubADN6IFZk1mf1L6Fo=
	dep	github.com/opencharly/plugin-box/candy/plugin-box	v0.2026294.21	h1:mAn3DQ3s3RjK1N3TX41OTRegE95qboZIF3ZJUFtt1ic=

The A/B: one body, two layouts, one binary. The negative control is the tree exactly as origin/main has it (body
beside the candy); the second run is the committed tree, which differs from it by exactly this commit's one git mv
and by nothing else — the blob above is the same object on both sides. The two extracted SKILL.md files are the
same bytes:

$ find /tmp/pin1017c-ab/plugin-openclaw -path "*/.agents/skills/*/SKILL.md" | sort
/tmp/pin1017c-ab/plugin-openclaw/post/.agents/skills/openclaw-cmd/SKILL.md
/tmp/pin1017c-ab/plugin-openclaw/pre/candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md
$ sha256sum /tmp/pin1017c-ab/plugin-openclaw/post/.agents/skills/openclaw-cmd/SKILL.md /tmp/pin1017c-ab/plugin-openclaw/pre/candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md 
92d3b9424ee414f90e6121ed2d516602b7566049d27168c73f69d5f917c05172  /tmp/pin1017c-ab/plugin-openclaw/post/.agents/skills/openclaw-cmd/SKILL.md
92d3b9424ee414f90e6121ed2d516602b7566049d27168c73f69d5f917c05172  /tmp/pin1017c-ab/plugin-openclaw/pre/candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md

Then the gate itself, first on the pre-move layout and then on the committed tree:

$ (cd /tmp/pin1017c-ab/plugin-openclaw/pre && charly box validate 2>&1); echo "rc=$?"
WARNING: charly is a dev/worktree build (not installed at /usr/bin or /usr/local/bin); NOT loading the installed package's plugins from /usr/lib/charly/plugins (they may be built against a different charly version). Set CHARLY_PLUGIN_DIR to load plugins from a custom location.
charly: error: command "validate": validation error: skills: skill "openclaw-cmd": no body — the node carries no in-line `content:` and no SKILL.md exists under .agents/skills at the repo root of the owning candy "plugin-openclaw"
rc=1
$ (cd /tmp/pin1017c-ab/plugin-openclaw/post && charly box validate 2>&1); echo "rc=$?"
WARNING: charly is a dev/worktree build (not installed at /usr/bin or /usr/local/bin); NOT loading the installed package's plugins from /usr/lib/charly/plugins (they may be built against a different charly version). Set CHARLY_PLUGIN_DIR to load plugins from a custom location.
charly box validate: OK — checked 1 candy, 7 distros, 7 builders; 0 warnings, 0 errors
rc=0

The WARNING: line is the harness's worktree-build notice on stderr (R9 requires a worktree-local build), not a
validation warning; the gate's own summary reads 0 warnings, 0 errors.

The committed tree, at the branch head, with the same binary:

$ (cd /home/atrawog/Sync/Atrapub/mo/dsh/opencharly/.worktrees/pin1017c/plugin-openclaw && charly box validate 2>&1); echo "rc=$?"
WARNING: charly is a dev/worktree build (not installed at /usr/bin or /usr/local/bin); NOT loading the installed package's plugins from /usr/lib/charly/plugins (they may be built against a different charly version). Set CHARLY_PLUGIN_DIR to load plugins from a custom location.
charly box validate: OK — checked 1 candy, 7 distros, 7 builders; 0 warnings, 0 errors
rc=0

Rulebook compliance

  • R0: loaded before the first action: /charly-internals:git-workflow, /charly-internals:strict-policy,
    /charly-internals:root-cause-analyzer, /charly-internals:cutover-policy, plus this repo's own AGENTS.md
    (Part II docs(openclaw): drop the false pluginCalVer claim and state the verified gateway surface #4) which names charly box validate as the repo's structural check and the org-wide validator as the
    merge gate.
  • R1: the finding is that this repo's manifest gate is red at its own main under the shipped reader. It is
    BLOCKING for this change, because landing the move without it is impossible and the change's own claim (the body
    resolves) is false without it — so it is fixed here, in this diff, not filed. The RCA is the base flip: sdk#445
    changed the resolution root and no consumer can be correct on both sides of it at once. Two separable findings keep
    their existing numbered homes and are not touched here (see ## Filed issues).
  • R2: no duplication — the body exists once, at the one path the reader resolves; the candy-dir copy is deleted in
    this same commit rather than kept alongside.
  • R3: no workaround — no copy: directive, no symlink, no second accepted path, no dual layout. The file moved.
  • R4: the reader's resolution decided the location; no prose was edited to route around it and no command is
    documented that needs more than the charly binary.
  • R5: the legacy path is deleted here, and the scoped sweep over the committed tree leaves only CHANGELOG/
    history, which R5 permits:
$ git -C plugin-openclaw grep -rln 'candy/plugin-openclaw/.agents' HEAD -- . | sort
CHANGELOG/2026.293.1539.md
$ git -C plugin-openclaw grep -rln 'candy/plugin-openclaw/.agents' HEAD -- . ':!CHANGELOG'; echo "exit=$?"
exit=1
  • R6: git status read before the first commit (empty), one feat/ branch off fresh origin/main, one commit,
    one push, no force-push, no amend after the push, no push to main, no hook bypass.
  • R7: the changed path executed live and the coverage fails without the change — the pre-move layout returns
    rc=1 naming the repo root, the moved layout returns rc=0; both are pasted above, on the same archive and the
    same binary.
  • R8: N/A — this change crosses no live service boundary; nothing is mocked and nothing skips.
  • R9: the binary is a worktree-local build of the merged tree, 2026.295.0418, with go version -m pasted above;
    no shared install was used and no runtime OS dependency was added.
  • R10: config class. The change-class gate, charly box validate on the committed tree, is pasted above: rc=0,
    0 warnings, 0 errors. No bed in this repo has a step that reads a skill body, so the image beds cannot fail on a
    SKILL.md relocation; they are not run, and that is stated rather than implied.

Change classification

Config — a pure relocation of a skill body so the shipped reader resolves it. No runtime behaviour, no schema, no
provider surface, and no emitted image label changes.

Filed issues

Nothing is filed by this PR; the two separable follow-ons already have numbered homes and are not touched here:

  • opencharly/sdk#444 — the four carrier candies that declare copy: .agents/skills render no directive once the
    body sits at the repo root. It is inert in this repo (no candy here declares copy:), so it does not gate this
    diff.
  • opencharly/opencharly#568 — the tracker for the remaining corpus leg: these three repos are absent from
    marketplace's ref list, and adding them is a marketplace PR. marketplace is not touched here.

A3 — attribution evidence

The delivered system message in this session reads, verbatim:

You are a coding agent powered by the deepseek-v4.1-flash model.

The footer below uses those exact names — DeepSeek Harness is the harness (@deepseek-ai/dsh),
deepseek-v4.1-flash is the model id — and the runtime's own config names the provider and the id:

$ grep -A3 -m1 'deepseek-v4.1-flash' ~/.dsh/cordis.patch.yml
          - id: deepseek-v4.1-flash
            name: "DeepSeek V4.1 Flash"
            contextWindow: 1048576
            maxTokens: 384000
$ grep -m1 'provider:' ~/.dsh/cordis.patch.yml
    provider: ollama-cloud

opencharly/opencharly#538 is the record of why this needs saying: the validator's model allowlist rejected this
real runtime once, and the answer is evidence, never an edited footer.

Agent: charly

Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)

…e the reader now looks

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 <aitrawog@gmail.com>
@github-actions

Copy link
Copy Markdown

Review — PASS

What the PR does

A single-file relocation: candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md → .agents/skills/openclaw-cmd/SKILL.md, recorded as a rename with +0/-0 (no hunks). The stated motive is that the shipped reader (sdk#445, adopted in charly #1017) resolves skill bodies under filepath.Join(repoRoot, ".agents/skills"), so the body must sit at the repo root rather than beside the owning candy.

Checks

  • Correctness vs. body. The body says "1 file: a pure rename, 0 insertions and 0 deletions." The diff header confirms exactly that: renamed, +0/-0, no textual patch. The head SHA, branch, and base all match the body. The destination path matches the reader location the body describes. No contradiction.
  • Honesty. The claimed blob identity (f3e7bca… on both sides) and the R100 similarity cannot be independently re-executed here, but they are consistent with the observed rename-only diff — a rename with zero line changes is precisely what a byte-identical move produces. The pasted A/B gate outputs (pre rc=1 naming the repo root; post rc=0, 0 warnings, 0 errors) are internally coherent and directly exercise the gate that owns this change. Nothing in the body overstates what the diff shows.
  • Tests / evidence. This is a config-class relocation with no Go source, no box/, and no schema touched, so a unit test is not the right gate; the appropriate gate is charly box validate, and its before/after output is supplied. The pre-move failure (no SKILL.md exists under .agents/skills at the repo root) is exactly the failure mode that would exist without the change, satisfying the "fails without it" property.
  • Security. No code, no secrets, no input handling, no dependency change — a markdown file relocation. No risk surface.
  • Scope & cleanliness. One commit, one path, one destination. The body's R5 grep evidence (candy/plugin-openclaw/.agents remaining only in CHANGELOG/) supports "no leftover legacy path," and the diff itself adds nothing beyond the move.
  • Comments. The comment thread is empty (0 comments), so there are no claims to re-derive and no maintainer sign-off to weigh. No designated maintainers are configured for this run, so the change is judged on its own evidence — which it provides.

Minor, non-blocking observations

  • The body's rulebook-compliance and attribution sections are longer than the change warrants, and the A3 attribution block is irrelevant to the diff. This is noise, not a defect.
  • The blob-hash and gate-output claims are unverifiable in this read-only context, but they are self-consistent and corroborated by the rename-only diff, so they do not undermine the verdict.

The change is minimal, coherent, complete, and backed by the gate that can actually fail on it.

Verdict: PASS


ollama-cloud/deepseek-v4.1-flash — action-review.

View action run

@github-actions
github-actions Bot enabled auto-merge (squash) October 22, 2026 04:32
@github-actions
github-actions Bot merged commit ae7463f into main Oct 22, 2026
1 check passed
charly-auto-merge Bot added a commit that referenced this pull request Oct 22, 2026
github-actions Bot pushed a commit to opencharly/opencharly that referenced this pull request Oct 22, 2026
…32 (#580)

plugin-mise     d99282f583ab -> 43e30ac959  (opencharly/plugin-mise#19,    v2026.295.0432)
plugin-openclaw f870257d45c7 -> 8d2492bcee  (opencharly/plugin-openclaw#10, v2026.295.0432)
plugin-media    01a1e8f759b0 -> 8d77fa909d  (opencharly/plugin-media#11,   v2026.295.0432)

Written by `charly task sync` (verb:git-submodules MODE=bump) on a session
worktree branched off origin/main (c72427b), never by hand.

The verb rolled ONE pin outside this change's scope: layer-openclaw
567a33541c -> 3c1007a476, which is #571's armed advance and
not this PR's to carry. It was restored in the index (`git checkout HEAD --
layer-openclaw`) AND in the checkout (`git -C layer-openclaw checkout
567a33541c`), so `verify`'s checkout audit and the recorded gitlink agree.
charly and the six distro-* edges rolled to their default-branch HEADs and
re-derived to exactly the values #579 recorded, so nothing changed there.

Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)

Co-authored-by: Andreas Trawoeger <atrawog@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants