Skip to content

feat(scripts): read what a skill ships, not what it says - #56

Merged
Ap6pack merged 2 commits into
mainfrom
claude/read-skill-payloads
Aug 16, 2026
Merged

feat(scripts): read what a skill ships, not what it says#56
Ap6pack merged 2 commits into
mainfrom
claude/read-skill-payloads

Conversation

@Ap6pack

@Ap6pack Ap6pack commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Why

Every verdict this project holds was formed from SKILL.md alone — the file where a skill describes itself. The behaviour is in the scripts it invokes, and until this branch there was no way to read them.

buddy-card was the case that exposed it. Its SKILL.md extracts a Claude OAuth token from the macOS Keychain and pipes the resulting UUID into node ${SKILL_DIR}/scripts/buddy-algorithm.js. I had asserted that token "only goes to Anthropic's own API" — on no evidence, because that script had never been fetched by anything.

With --fetch I read both scripts:

  • scripts/buddy-algorithm.js — 40 lines, pure computation. Appends a salt, FNV-1a hash, mulberry32 PRNG, derives species/rarity/stats, prints JSON. No imports, no network, no filesystem. It even truncates the input to userId.substring(0, 8) + '...'.
  • scripts/generate-image.ts — posts the card prompt to generativelanguage.googleapis.com using the user's own GOOGLE_API_KEY. The OAuth token is never passed to either script.

So the claim happened to be correct, and is now evidenced rather than assumed. A skill that says "I make a trading card" while its script does something else is exactly the supply-chain case worth finding, and reviewing prose cannot find it.

What this adds

  • --ls <slug> — probes for a file listing. Result: there isn't one. /files, /tree, /contents all 404; ?include=files ignores the parameter. Worth recording so nobody re-derives it.
  • --fetch <slug>=<path> — fetches any file a skill ships, so referenced scripts can be read directly.

What it established

The registry serves every file. Our scanner reads one.

content = await client.get_skill_file(meta.slug)   # path defaults to "SKILL.md"

74,158 skills, every sweep since the project began, one file each. buddy-algorithm.js and generate-image.ts are real, published, executable code that no scan has looked at. This time they were clean; nothing in the pipeline could have told us that.

Scope

Tooling only — no engine or rule changes. Measuring the size of that unread surface is PR #55; fetching and scanning those files is the change after it.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DNoTXU8k3pfSBzR7aJubqL


Generated by Claude Code

claude and others added 2 commits August 16, 2026 03:43
Every verdict reviewed so far rests on SKILL.md, which is the skill's
description of itself. The behaviour lives in the scripts it invokes:
buddy-card extracts a Claude OAuth token from the Keychain and then runs
scripts/buddy-algorithm.js with it, and that script has never been read.
A skill whose stated purpose differs from what its code does is precisely
the supply-chain case worth finding, and reviewing only the prose cannot
find it.

--ls probes for a file listing (no documented endpoint, so try the
plausible ones and report what answers). --fetch takes slug=path pairs so
the referenced scripts can be read directly.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01DNoTXU8k3pfSBzR7aJubqL
@Ap6pack
Ap6pack merged commit fafcdeb into main Aug 16, 2026
5 checks passed
@Ap6pack
Ap6pack deleted the claude/read-skill-payloads branch August 16, 2026 04:08
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