Skip to content

feat(skills)!: the skill lives beside the resolve/merge code it documents - #40

Merged
github-actions[bot] merged 1 commit into
mainfrom
feat/deploypod-skills
Oct 23, 2026
Merged

github-actions[bot] merged 1 commit into
mainfrom
feat/deploypod-skills

Conversation

@aitrawog

Copy link
Copy Markdown
Contributor

Summary

pod-charly-automation is a skills-only carrier (0 .go, 0 .cue, no candy directory). The
sidecar model's implementation is this candy — sidecar_resolve.go (resolve/merge),
sidecar_embedded.go (the embedded template library) and the charly config --sidecar
attachment — which the skill's own ## Source section names. plugin-sidecar was the tempting
wrong home: it only decodes the sidecar: entity (kind:sidecar), the same shim-vs-substance
distinction that moved egress to plugin-egress in opencharly#611.

The gate, per skill (opencharly#606): the entity comes from the skill's own prose,
never from its name; then where that entity exists; then the negative control.

skill the entity its own prose names where it exists (measured)
sidecar the sidecar model — its ## Source names sidecar_resolve.go, sidecar_embedded.go, spec/spec/config.go and config_setup.go, all in this candy plugin-deploy-pod/candy/plugin-deploy-pod/ → sidecar_resolve.go + sidecar_embedded.go + config_setup.go (deploy:pod)

What is in this diff (3 files changed, 326 insertions(+), 4 deletions(-))

  • 1 skill bodies, byte-identical to the carrier's (full sha256sum output below).
  • 1 routing-only skill: node(s) in candy/plugin-deploy-pod/charly.yml —
    name/family/owner, and no inline description:/content:: the
    prose is the file. An inline body that disagrees with its file is a hard error in the
    marketplace generator.
  • family: is kept unchanged (automation), so every existing
    /charly-<family>:<name> address and every external reference to it still resolves;
    owner: becomes plugin-deploy-pod, so the bodies are read from
    <repo root>/.agents/skills/<name>/SKILL.md.
  • AGENTS.md: the R0 entry carried the "carries no skill: entity of its own" claim
    with a link to the closed opencharly#291; it now points at the skill this candy owns, and its
    /charly-pod:pod entry names schema/pod.cue as that skill's source of truth instead of the
    carrier.

Two things this body deliberately does NOT claim, because they are worth stating.

  • A duplicate exists for now, and the generator tolerates it. The carrier still
    declares the same (kind, family, name); plugin-marketplace's preferEntity
    (resolve.go) dedupes on exactly that triple, so one page is published — currently the
    carrier's, until its node is removed. This PR does not prove the dedupe path; the
    carrier-removal PR (Policy: a skill lives with the code it describes — retire the skills-only repo class (22 repos / 94 skills measured) opencharly#600) and the marketplace refs switchover do.
  • The node KEY is not the identity. A skill: node's id is its name: when it
    states one (spec#247), which is why <name>-skill: keys and the name: field can
    differ without consequence.

Producer-first. No carrier loses a node here: those removals and retirements belong
to the session that claimed the carriers (opencharly/opencharly#600).

How tested

Change class: documentation + candy-config (skill prose and skill: routing nodes;
no Go, no schema, no runtime path). The gate that owns it is charly box validate, which
reads the skill files through the same CollectSkills path the ai.opencharly.skill
OCI label and the marketplace corpus use, so a body that is not found is a red gate.

# head 300ede046f55362cd52d3e0afef99bde7b6fe7a9  (git rev-parse HEAD)
$ git rev-parse HEAD && git rev-parse HEAD^{tree}
300ede046f55362cd52d3e0afef99bde7b6fe7a9
b8242e5513ceef1d7cb15a662ae5b2f745e50232

$ sha256sum <carrier copy>; sha256sum <this tree>   # full 64-hex digests, as printed
4d848280ecc06f05d604f9bff97f698807bbadd64e6f7004b35fe7274a1bdacd  pod-charly-automation/.agents/skills/sidecar/SKILL.md
4d848280ecc06f05d604f9bff97f698807bbadd64e6f7004b35fe7274a1bdacd  .agents/skills/sidecar/SKILL.md

$ diff -r <carrier>/.agents/skills/<name> .agents/skills/<name>   # per skill
(no output — exit 0: the bytes are equal)

$ charly box validate
charly box validate: OK — checked 1 candy, 3 deploys, 7 distros, 7 builders; 0 warnings, 0 errors
rc=0

The gate CAN fail — negative control, run on this exact tree, with one moved body
removed:

$ rm .agents/skills/sidecar/SKILL.md && charly box validate
charly: error: command "validate": validation error: skills: skill "sidecar": 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-deploy-pod"
rc=1

No R10 disposable bed: the diff changes no runtime path (no Go, no schema, no service,
no build step), so a bed would prove something this diff cannot break. The binary is the
worktree-local build: charly version = 2026.295.1709, equal to charly/charly's HEAD
stamp (R9).

Rulebook compliance

  • R0 — /charly-internals:skills, :git-workflow, :cutover-policy loaded before
    the first action; opencharly#611/#606/#600 read in full first.
  • R1 — charly box validate green with zero warnings, and the negative control proves
    that green is not vacuous.
  • R2 — routing only in the node; the body stays the single file.
  • R3 — no workaround: no inline body, no hand-written corpus entry.
  • R4/R5 — AGENTS.md's false claim and its two stale R0 attributions are corrected in this diff.
  • R6 — branch off origin/main, one commit, one push, no force-push, no bypass.
  • R7 — the proof is a gate that fails without the change.
  • R9 — worktree-local binary, version equal to the source stamp; no Go changed.
  • R10 — the change class's gate ran on the committed tree.
  • A3 — the attribution tier this footer claims is justified by the gate above. This
    session's delivered system message reads, verbatim,
    You are a coding agent powered by the deepseek-v4.1-flash model. — harness
    DeepSeek Harness, model deepseek-v4.1-flash. It is quoted because the operator's
    dispatch requires the tier's proof to name the runtime as delivered, and it is cited
    with The pr-validator's model allowlist rejects a real runtime: deepseek-v4.1-flash via ollama-cloud opencharly#538, the open record of this runtime being rejected by
    the validator's model allowlist although it is real and running.

Change classification

feat(skills)! — documentation + candy-config, documentation reviewed. No runtime
behaviour, no schema, no Go, no pins.

Filed issues

None — the destination was measured, and every claim this change falsifies is fixed here rather than filed.

Assisted-by: DeepSeek Harness deepseek-v4.1-flash (documentation reviewed)

…e it documents

`pod-charly-automation` is a skills-only carrier: 0 `.go`, 0 `.cue`, no candy directory. The
sidecar model's implementation is THIS candy — `sidecar_resolve.go` (types/merge/resolution),
`sidecar_embedded.go` (the embedded template library), `config_setup.go` (the `charly config
--sidecar` attachment + quadlet emission) — and the skill's own `## Source` section names exactly
those files, so the body moves here byte-identically.

`plugin-sidecar` is deliberately NOT the destination: its `kind:sidecar` provider only decodes the
authored entity (a pb Invoke (OpLoad) envelope), the same shim-vs-substance split that sent `egress`
to `plugin-egress` rather than `plugin-fleet` in opencharly#611.

`AGENTS.md`'s "carries no `skill:` entity" claim (link to the CLOSED opencharly#291) is corrected,
and its `/charly-pod:pod` entry now names `schema/pod.cue` as that skill's source of truth.
Routing only: `name`/`family`/`owner` + the carrier's `triggers:`; `family: automation` is kept.

Assisted-by: DeepSeek Harness deepseek-v4.1-flash (documentation reviewed)
@github-actions

Copy link
Copy Markdown

Review — PASS

What the diff actually does

Three files, matching the body's "3 files changed, 326 insertions(+), 4 deletions(-)":

  • .agents/skills/sidecar/SKILL.md — new, +297. A complete skill body with frontmatter (name: sidecar, folded description), architecture, env-contract, Tailscale sidecar, and a ## Source section naming candy/plugin-deploy-pod/sidecar_resolve.go, sidecar_embedded.go, config_setup.go/config_write.go, and spec/spec/config.go.
  • AGENTS.md — +7/−4. Removes the "this candy carries no skill: entity of its own … opencharly#291" claim from the /charly-pod:pod R0 entry, adds a /charly-automation:sidecar entry that points at the file this PR adds, and re-points /charly-pod:pod at schema/pod.cue.
  • candy/plugin-deploy-pod/charly.yml — +22. One sidecar-skill: node carrying only skill: {name, family, owner, triggers}; no inline description:/content:, matching the body's "routing only" claim.

Verification against the body's claims

  • File count / line counts reproduce exactly (297 + 7 + 22 = 326; 4 deletions). ✅
  • Node is routing-only and carries no inline body — consistent with "the prose is the file." ✅
  • family: automation and owner: plugin-deploy-pod are present exactly as described, and the node key (sidecar-skill) differing from name: is explicitly explained by the body (spec#247). ✅
  • AGENTS.md no longer asserts the "no skill: entity" falsehood and now references the skill file; consistent with the body's R4/R5 claim. ✅
  • Change class is documentation + candy-config; the diff touches no Go, no schema, no runtime path — matching the "no R10 bed" justification. ✅

Comments

There are 0 comments, so there is no maintainer/operator sign-off to weigh. The change must stand on its own evidence, and for a docs/config-only diff the structural evidence above is coherent.

Non-blocking notes (do not gate)

  1. Path typo in the body table. The table writes plugin-deploy-pod/candy/plugin-deploy-pod/, but the repo layout (and the skill's own ## Source) is candy/plugin-deploy-pod/. The duplicate repo-name prefix is a display error, not a claim about what the diff changes — the diff and SKILL.md use the correct path.
  2. Unverifiable external evidence. The sha256sum parity with the carrier copy and the charly box validate / negative-control output are asserted in the body; they cannot be independently reproduced from the supplied context (no shell, no repo tree, no carrier checkout). The internal consistency of those claims is good (same 64-hex digest listed twice; the negative control's error string is specific and plausible), but they remain author-reported rather than independently reproduced here.
  3. The body's A3 runtime quote (deepseek-v4.1-flash) is irrelevant to the code change; harmless but adds noise.

Assessment

The change is coherent and complete: the skill file is present, the node is correctly routing-only, AGENTS.md's stale claim is corrected, and the body's quantitative claims match the diff. No secrets, no injection surface, no dependency or privilege changes, no dead/legacy path introduced. No blocking defect found.

Verdict: PASS


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

View action run

@github-actions
github-actions Bot enabled auto-merge (squash) October 23, 2026 08:56
@github-actions
github-actions Bot merged commit 5732ec2 into main Oct 23, 2026
1 check passed
charly-auto-merge Bot added a commit that referenced this pull request Oct 23, 2026
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