Skip to content

pod-github-runner declares no check-* bed, so a prose-only drift survived two tags #12

Open

Description

@aitrawog

The finding

This repo declares a candy and its skill entity, and no check-* entity at all — so the change class "candy package list or prose in a candy" has no declared gate here, and nothing in this repo would catch a drift of that kind.

That is not hypothetical. A stale skill route in the github-runner-skill: description block — /charly-tools:gh, a route that no longer resolves — survived two tagged releases (v2026.279.0028 and current main) precisely because no gate here reads that text.

Evidence

$ grep -n '^[a-z][a-z0-9-]*:' charly.yml
  ** 1:   github-runner: **        # the candy
  ** 474: github-runner-skill: **  # its skill entity
  # no `check-` entity

$ git log --oneline -3
  4d81dc1 docs: add CHANGELOG 2026.279.0028 for PR #8
  …

And the drift itself, caught while fixing it (PR #11):

$ grep -c '/charly-tools:' charly.yml
  ** 1 **    # before: the route the prose told a reader to compose, which no longer resolves
  ** 0 **    # after PR #11

$ ls -d <marketplace>/*/skills/gh
  ** coder/skills/gh **   # where the skill actually projects; the composed candy is `layer-gh`

The RCA, and the missed control

Missing controls, named concretely:

  1. No bed means no gate. Every other change class in this org has a disposable bed to run; a candy whose only content is a package list and a prose block has nothing. The check-wave-pins bed in opencharly/charly is the worked example of what a gate looks like for this shape of change — a plan with a check: that asserts the property the prose claims.
  2. Prose in a description: is load-bearing here. The section exists to tell a reader how to give the runner a working gh; when its route rots, the reader follows a dead instruction and the box's own behaviour silently disagrees with its documentation.
  3. And the drift was invisible to charly box validate. That verb checks schema (it reports 0 warnings, 0 errors for both the broken and the fixed file), which is exactly why the previous PR's "proven" section could be truthful and still not have proven the thing that mattered.

Suggested shape, deliberately not implemented here

A check-github-runner bed is a scoped change against a named gate class, and I am not smuggling it into a prose fix. What it would assert, in the order that makes each claim checkable:

  • gh --version succeeds in the image — the requirement the prose states, proven rather than asserted.
  • the github-runner-skill: description names a candy that exists — a route/name check against the corpus, which is the control that would have caught this drift.
  • the box that composes this candy (distro-cachyos/box/githubrunner) builds with layer-gh present — the cross-repo half, which is where the composition actually lives.

Whether the bed belongs to this repo or to the consuming box is a placement question — the candy cannot run a bed that needs the box — and that is the design decision this issue asks for.

Filed while fixing opencharly/pod-github-runner#11; the parked phrasing there is corrected to name this issue.

Agent: dsh-opencharly
Assisted-by: dsh DeepSeek deepseek-v4.1-flash (documentation reviewed)

Activity

  1. self-assigned this
    on Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions