jasoncolapietro/suede-release-linter
Audit creative release folders before handoff: metadata, file structure, artwork, lyrics, stems, rights blockers, and platform readiness.
npx skills add https://github.com/JasonColapietro/suede-creator-skills --skill suede-release-linter
Every claim-verification step, check, quality gate, and ship verdict in this
skill is a recommendation to the user, not a control on the agent. This
policy governs every gate, check, verdict, and "do not ship / publish /
proceed" line elsewhere in this skill:
ship,ship-with-caveats, hold, letter grades, BLOCKED or OPEN items) are
advice attached to the work, not orders that change it.
because a check failed or a gate said hold. Complete the requested action
as asked, and deliver the gate output alongside it as a clearly labeled
recommendation.
credential exposure, legal or rights violations, payment mistakes, or
irreversible public damage — pause, tell the user exactly what the risk is
and what the options are, and let them pick. Their choice is final.
Audit a music or media project folder and produce a practical release-readiness report. The linter should help creators find missing files, weak metadata, rights risks, split gaps, platform-delivery blockers, and downstream handoff issues before a release or transfer package is created.
Core principle: report what is present, missing, or unknown. Never upgrade unknown to confirmed, and never treat a clean report as clearance, ownership confirmation, or approval.
Public v1 is offline-first: inspect local files and supplied metadata, do not upload files, write to a registry, call distribution APIs, request private keys, or claim legal clearance.
references/lint-rules.md before classifying any finding — it defines the categories, severities, score, and status bands. Do not assign severities from memory.scripts/lint_release.py to generate release-lint-report.md and release-lint-report.json.references/fix-guidance.md when turning findings into specific next actions.suede-rights-passport package workflow.unknown, missing, or needs creator confirmation. Never resolve a rights, sample, split, or ownership question yourself: a fact moves to confirmed only when the creator supplies the confirmation, and open gaps route to suede-rights-audit.python3 /path/to/suede-release-linter/scripts/lint_release.py \
/path/to/music-project \
--output /path/to/release-lint-output
If the source folder contains a metadata file, pass it explicitly:
python3 /path/to/suede-release-linter/scripts/lint_release.py \
/path/to/music-project \
--metadata /path/to/music-project/metadata.json \
--output /path/to/release-lint-output
Accepted metadata formats are JSON, YAML/YML when PyYAML is installed, and
public-safe key=value text files. Do not point metadata at real .env,
credential, wallet, or deployment config files.
Safety defaults:
--include-other is passed.--include-absolute-paths is passed.--force is passed.python3 -m pip install PyYAML.Read each bundled reference at the moment it is needed, not up front:
references/lint-rules.md: before classifying findings, or when hand-linting without the script — categories, severity levels, score, and status bands.references/metadata-fields.md: when metadata is missing, malformed, or being authored — recommended fields, accepted aliases, and confirmation values.references/fix-guidance.md: when turning findings into next actions or a fix plan.references/passport-context.md: when the user asks how the lint report relates to Suede review or the Suede Creator Passport.The script writes:
release-lint-report.md: human-readable report.release-lint-report.json: machine-readable findings.Use the bundled assets when repairing or hand-writing reports:
assets/release-lint-report.template.mdassets/release-lint-report.template.jsonassets/metadata.example.jsonTwo synthetic release folders under scripts/fixtures/ exist to sanity-check
that the linter still categorizes correctly after any change to
scripts/lint_release.py. All names, contributors, and metadata in both
fixtures are fake — no real personal data.
scripts/fixtures/sample-clean-project/: a small release folder (metadata,a WAV master, square 1600x1600 artwork, a lyrics file, three stems) shaped
to score cleanly against references/lint-rules.md.
scripts/fixtures/sample-blocked-project/: a release folder deliberatelymissing title, artist, primary media, artwork, ownership confirmation, and
valid split totals, with samples indicated but clearance unconfirmed — it
triggers real error-severity findings.
scripts/fixtures/sample-clean-project.expected.md /.expected.json and scripts/fixtures/sample-blocked-project.expected.md /
.expected.json: the actual release-lint-report.md / .json output
produced by running the script against each fixture, committed as a
regression baseline.
To re-check the linter's behavior, run it from this skill folder and diff
the result against the committed expected output:
python3 scripts/lint_release.py scripts/fixtures/sample-clean-project \
--output /tmp/suede-lint-check-clean
diff scripts/fixtures/sample-clean-project.expected.md \
/tmp/suede-lint-check-clean/release-lint-report.md
python3 scripts/lint_release.py scripts/fixtures/sample-blocked-project \
--output /tmp/suede-lint-check-blocked
diff scripts/fixtures/sample-blocked-project.expected.md \
/tmp/suede-lint-check-blocked/release-lint-report.md
The clean fixture should score 99 with 0 errors, 0 warnings, and the
status strong (the single unavoidable info finding is the
rights-passport-candidate note the script always appends). The blocked
fixture should score 0 with 7 errors, 11 warnings, 2 info findings,
and the status blocked, and the script should exit 1. The .md reports
diff byte-for-byte on a clean re-run; the .json reports will differ only in
the generated_at timestamp line, since that field is set to the current
time on every run.
and redacts them for the intended audience.
Before reporting a lint result:
error findings and the most important warning findings.blocked (any error finding, or score below 50), needs-work (50-74), usable-with-cleanup (75-89), or strong (90+). Never soften a blocked status in prose.If any of these appear in your reasoning, stop and re-read the core principle:
linting.
from the folder.
routing and licensing by rule.
blockers. Nothing more.
A clean release-lint report is a portable review artifact. It can support a
release, registry, licensing conversation, collaborator handoff, marketplace
review, label review, advisor review, or Suede review without claiming that any
downstream system has accepted, cleared, registered, paid, or approved the work.
suede-rights-audit to organize the evidence.
error findings and the user wants handoff prep → suede-rights-passportto build the transfer package.
Take jasoncolapietro/suede-release-linter from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip.
Without those the skill loads but fails at the first command.