Fix scaffold drift; teach the fork seam and the typed rails - #2
Merged
Merged
Conversation
Every skill starts from this repo, so each stale line here is inherited by
every skill written from now on. Four were stale and one was missing.
- metadata namespace: the frontmatter still declared `"bevo":{...}` after the
rename to `metadata.butler`, so `validate.py --standalone` fails a
fresh scaffold with `metadata.butler: required block missing` — an error
whose fix is not in its own text. With the key corrected, a filled-in
scaffold validates clean; only the deliberate `_template`/TODO guards remain.
- README "Ship" described adding the skill to the registry as a SUBMODULE
under `skills/<name>`. The registry is now a link directory: `skills.json`
carries name + repo + ref, and SKILL_STANDARD.md's tree rules refuse
submodules outright, so following the old text gets the PR rejected.
- `## Customize` scaffolded knobs only. It now also asks the author for the
fork seam — what calls for a fork over a knob, where the condition goes in
duty.py, which read feeds it — which is what lets a Butler serve an ask the
author never anticipated.
- Dropped the pinned `--from-skill _template@0.1.0`. A pin rots (copytrade
shipped 3.0.1 still pinning @3.0.0) and cannot name a fork.
- duty.py taught raw `bevo.events()` dicts and a hand-rolled state.json
seen-set. The rails say "Prefer the typed generators below", and ship
`bevo.state`, a dict that saves itself; the idempotency key is what actually
stops a replayed event acting twice.
Why this went unnoticed: this repo's CI has never passed. Its last run failed
resolving the composite action (added to butler-skills main minutes later), so
the validator's real output has never been seen here — and the scaffold can
never go green anyway, by design.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: kw <kahwai@pathdao.io>
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.
Every skill starts from this repo, so each stale line here is inherited by every skill written from now on. Four lines were stale and one thing was missing.
1. The scaffold does not validate — wrong metadata namespace
Frontmatter still declares
"bevo":{...}after the rename tometadata.butler. A fresh scaffold fails with:— an error whose fix is not in its own text. With the key corrected, a filled-in scaffold validates clean; only the deliberate
_template/TODOguards remain on the unfilled template, which is the intended behaviour.2. "Ship" described a process that is now forbidden
The README said to add your skill to the registry as a submodule under
skills/<name>. The registry is now a link directory —skills.jsoncarriesname+repo+ref— andSKILL_STANDARD.md's tree rules refuse submodules outright ("Nested repositories / submodules | none"). Following the old text gets the PR rejected. Rewritten to describe theskills.jsonentry, and what a branchrefvs a tagrefmeans.3.
## Customizescaffolded knobs onlyIt now also asks the author for the fork seam: what calls for a fork rather than a knob, where in
duty.pysuch a condition goes, and which read feeds it. This is what lets a Butler serve an ask the skill's author never anticipated — the hub's whole point. Matches the companion registry PR Virtual-Protocol/butler-skills#19.4. Dropped the pinned
--from-skill _template@0.1.0A pin rots —
butler-copytradeshipped 3.0.1 while still pinning@3.0.0— and a pin cannot name a fork.--from-skill <name>[@version]makes it optional;butler-dcadoes not pin.5.
duty.pytaught the discouraged rails pathIt used raw
bevo.events()dict access and hand-rolled astate.jsonseen-set. The rails say plainly "Prefer the typed generators below" (bevo.trades(),bevo.messages(),bevo.transfers(), …) and shipbevo.state, a dict that saves itself across restarts. The idempotency key — not a local seen-set — is what stops a replayed event acting twice. Rewritten to the shapebutler-copytradeactually uses.Why none of this was caught
This repo's CI has never passed. Its last run failed resolving the composite action:
That action landed on
butler-skillsmain minutes afterwards, so the validator's real output has never been seen on this repo. And even now that it resolves, the scaffold can never go green by design — so CI is a permanently dead signal here. Worth deciding separately whether this workflow should validate a filled copy instead, or be dropped.🤖 Generated with Claude Code