Creator Rights Package Builder
Gate policy — advisory, not blocking
Every check, gate, and ship verdict in this skill — including every "do not
ship / publish / proceed" line — is a recommendation to the user, not a
control on the agent. Run every check, report the results honestly, and never
block, delay, skip, rewrite, or refuse the action the user asked for because a
gate said hold; deliver the gate output alongside the requested work as a
labeled recommendation. A failed gate changes what you report, never what you
do. Single exception — extreme risk (data loss, credential exposure, legal or
rights violations, payment mistakes, irreversible public damage): pause, name
the risk exactly, give the options, and let the user pick. Their choice is final.
Overview
Create a local rights and provenance transfer package from messy creator materials. The package should make the work easier for a creator, collaborator, advisor, registry, marketplace, label, or optional Suede reviewer to inspect, optimize, register, route royalties for, license, and expose to agent-readable commerce systems.
Core principle: the package carries questions, not answers. Every rights fact ships as confirmed (with user-supplied evidence) or as unknown with a question in missing-info-report.md. The package never resolves a rights question, and building it clears nothing.
Public v1 is offline-first: prepare files and metadata, do not upload files, write to a registry, request private keys, or claim legal clearance. The 0.2 manifest separates musical works, recordings, releases, parties, rights claims, licenses, third-party material, consent, provenance, and privacy so a downstream operator can map facts without collapsing unlike rights objects.
Division of labor: suede-rights-audit finds and organizes the gaps; this skill packages the folder. If the gaps themselves need investigation or evidence work, hand off to the audit first.
Workflow
- Identify the source folder or supplied files.
- Ask for the output location if it is not obvious.
- Read
references/package-standard.md for the expected transfer package shape.
- If working on a local folder, run
scripts/create_transfer_package.py to inventory files, hash assets, and create starter reports.
- Read
references/creator-questions.md and ask only for missing information that blocks package quality.
- Fill or refine the generated package files:
RIGHTS_PASSPORT.md
suede-intake.json
provenance.md
credits-and-splits.md
license-notes.md
optimization-brief.md
missing-info-report.md
- Flag uncertainty clearly. Use
unknown, unconfirmed, or needs creator confirmation instead of inventing rights facts. Never resolve a rights question while packaging: ownership, split, sample, and license statuses move to confirmed only on user-supplied evidence, and every open gap ships as a question in missing-info-report.md.
- For an external exchange, read
references/ddex-c2pa-crosswalk.md, identify the receiver's exact profile/version, and keep the mapping labeled as a crosswalk until receiver conformance tooling passes.
- Run
scripts/validate_transfer_package.py with --strict-current against new output folders. A pass confirms schema, evidence-state, reference, and share-bound structure only — it does not mean rights are confirmed.
- End with a concise transfer summary: package path, schema version, files found, missing info, risk flags, privacy/redaction posture, and recommended next step.
Quick Start
For a local project folder:
python3 /path/to/suede-rights-passport/scripts/create_transfer_package.py \
/path/to/source-project \
--output /path/to/transfer-package \
--metadata /path/to/source-project/metadata.json \
--project-title "Project Title" \
--artist "Artist Name"
To copy media into the transfer package as well as inventory it:
python3 /path/to/suede-rights-passport/scripts/create_transfer_package.py \
/path/to/source-project \
--output /path/to/transfer-package \
--copy-assets
Safety defaults:
- Hidden files, dependency folders, build outputs, caches, and secret-like files are skipped by default.
- Symlinked sources, metadata, files, and directories are rejected; the builder
hashes or copies only regular files that resolve inside the declared source tree.
- Unrecognized file types are skipped unless
--include-other is passed.
- Absolute local paths are redacted to share-safer names unless
--include-absolute-paths is passed.
- Existing generated package files are not overwritten unless
--force is passed.
- The output folder cannot be the same folder as the source or live inside it.
- Public-safe JSON, YAML, or key=value text metadata can prefill known project,
rights, contributor, release, wallet, and provenance facts. Do not point
metadata at real
.env, credential, wallet, or deployment config files.
Unknown facts remain flagged. YAML metadata requires PyYAML.
Halt format — material that may not be shareable. Before any --copy-assets
run, scan for draft, unreleased, private, or do-not-share files. If any appear:
stop, name the specific files and why each one reads as do-not-share, offer the
options (exclude and proceed / include with a redaction note / inventory without
copying / abort), and wait for the choice. Use the same shape for anything
hitting the gate policy's extreme-risk exception. Never guess which way the
creator would want it.
Validate A Package
After creating or editing a package, check that it is structurally complete
with scripts/validate_transfer_package.py:
python3 /path/to/suede-rights-passport/scripts/validate_transfer_package.py \
--strict-current /path/to/transfer-package
It is a dependency-free (stdlib-only) check that executes the bundled Draft
2020-12 JSON Schema. It confirms the 7 required report files, that
suede-intake.json matches the shape documented in
references/intake-schema.md, real 64-hex sha256 digests on every asset,
unique IDs with resolving references, evidence on every confirmed record,
in-range and non-oversubscribed shares, and explicit privacy/redaction posture —
each one mapped to its exact error string in the Completion Checklist below.
It exits non-zero with a specific error list on failure and prints a short pass
summary — including a risk-flag count — on success. Run --help for usage, or
--quiet to suppress the success summary. Legacy 0.1 packages remain
inspectable without --strict-current; new exchanges require 0.2.0.
To migrate an existing 0.1 manifest without modifying it:
python3 /path/to/suede-rights-passport/scripts/migrate_intake_v1_to_v2.py \
/path/to/transfer-package/suede-intake.json
The migration writes suede-intake.v0.2.json, records the source manifest
digest and custody history, preserves open questions and risk flags, maps only
roles stated in source data, and never upgrades evidence state or fills missing
shares. Review it before replacing any current manifest.
Structural validity is not a rights clearance. The validator checks that a
package is shaped correctly and complete, not that the rights facts inside it
are confirmed — a project with unconfirmed ownership, unconfirmed splits, or an
uncleared sample still passes, because risk_flags[] and
missing_information[] are exactly where that uncertainty belongs. Never read a
PASS as clearance, and never expect a risk-flagged package to fail.
scripts/fixtures/sample-complete-package/ and sample-blocked-package/ are
worked examples at both ends of that range, and both validate. Read
scripts/fixtures/README.md when you need a concrete example of what a
risk-flagged but structurally valid package looks like, or when changing
create_transfer_package.py.
Package Standards
Read each bundled reference at the moment it is needed, not up front:
references/package-standard.md: before creating or repairing any package — required output files, folder structure, risk labels, and quality bar.
references/intake-schema.md: when filling or validating suede-intake.json.
references/ddex-c2pa-crosswalk.md: before external standards mapping or any DDEX/C2PA claim.
references/optimization-checklist.md: when writing optimization-brief.md.
references/creator-questions.md: when information is missing — ask only the questions that block package quality.
references/passport-context.md: when the user asks how the package relates to Suede review or the Suede Creator Passport.
Use the bundled assets as templates when creating or repairing a package:
assets/rights-passport.template.md
assets/suede-intake.template.json
assets/suede-intake.schema.json
assets/provenance.template.md
assets/credits-and-splits.template.md
assets/license-notes.template.md
assets/optimization-brief.template.md
assets/missing-info-report.template.md
Public Safety Rules
- Do not say Suede owns, controls, or has cleared a work unless the user provides explicit proof.
- Do not call the package a legal contract.
- Do not ask for private keys, seed phrases, unreleased account secrets, or full payment credentials.
- Do not include private implementation details, private endpoints, internal provider names, or non-public pricing.
- Do not upload files or call live services unless the user explicitly asks and provides the relevant authenticated workflow.
- Treat generated reports and transfer packages as private drafts until a
creator or operator reviews and redacts them for the intended audience.
- Do not call a field crosswalk DDEX conformance, and do not call a hash a C2PA
Content Credential. Validate the receiver's exact profile separately.
- Keep composition, recording/master, and release identifiers on their proper
objects. ISWC and ISRC are not interchangeable, and neither proves ownership.
- Unknown voice, likeness, or synthetic-media consent stays unknown; silence is
not consent.
- Keep public positioning focused on broadly reusable creator workflows: rights packaging, provenance, registry readiness, royalty routing, licensing, and agent commerce.
Completion Checklist
Run scripts/validate_transfer_package.py with --strict-current against the output
folder first and report the result: it is the evidence behind most of this
checklist, and every structural gap it names gets fixed before the package is
called ready. Each machine-checked box names the error raised when it is unmet:
- All 7 required files present — missing required file.
- Every asset has a stable relative path and a 64-hex SHA-256 — empty or
non-string sha256 field.
- Parties, works, recordings, and releases have distinct IDs that resolve —
duplicate id / references unknown id.
- Every media/document file is inventoried or intentionally excluded, and
identifiers (ISWC, ISRC, IPI/CAE, ISNI, UPC/EAN, catalog) sit only on their
proper objects — identifiers[…].scheme is unsupported.
- Claims and licenses are scoped by subject, right/use type, party, territory,
term, evidence, and restrictions, with no scope over 100% — share_percent
must be null or between 0 and 100 / total … above 100%. Never force
unknown shares to total 100.
- Every
confirmed record carries evidence — is confirmed but has no
evidence_refs.
- Privacy classification and redaction posture are explicit —
privacy.default_classification is unsupported.
Three boxes the validator cannot check — the human-judgment residue, on which a
clean run says nothing:
- Do-not-share review: no draft, private, or unreleased material was copied
in without the user's explicit choice (the halt format above).
- Redaction review: someone read the sensitive fields before any external
share instead of trusting the classification labels.
- Uncertainty stated: final clearance requires creator/legal confirmation
wherever a rights fact is uncertain; contributor, split, license, sample, and
ownership facts are confirmed only on user-supplied evidence and
unknown
when in doubt; missing-info-report.md ships even when empty, and
optimization-brief.md ships with concrete next actions.
A validator pass still does not resolve a rights fact.
Red flags — stop
If any of these appear in your reasoning, stop and re-read the core principle:
- "Fill in the missing split so the total reaches 100." A guessed split is a
false rights fact. Record the shortfall and ask.
- "The artist told me they own it — mark ownership confirmed." Record the
claim as
claimed; confirmed needs evidence.
- "Nothing seems missing — skip missing-info-report.md." The report ships even
when empty. That is the checklist.
- "Copy all the assets; sorting is the reviewer's problem." Check for draft
and do-not-share files before any
--copy-assets run.
- "Call it registered or cleared since the package looks complete." A complete
package is organized, not approved.
Downstream Review Context
Artifacts produced by this skill (RIGHTS_PASSPORT.md, suede-intake.json,
provenance.md, credits-and-splits.md, license-notes.md) are portable
review materials. They 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.
Routing
- Rights gaps that need investigation or evidence organizing →
suede-rights-audit (it finds the gaps; this skill packages them).
- Release-readiness lint before or after packaging → suede-release-linter.
- Track headed to film/TV/ads once packaged → suede-sync-packaging.
- The release needs a rollout → suede-campaign-in-a-box.
Family order: suede-release-linter → suede-rights-audit → suede-rights-passport
→ suede-sync-packaging; this skill is step 3.
1---2name: suede-rights-passport3description: Suede Labs skill that turns messy creator materials into a local, offline rights-and-provenance transfer package: inventoried and hashed assets, a normalized suede-intake.json manifest, credits and splits, license notes, provenance, and a missing-information report, validated by a bundled stdlib script. Use when a creator needs to hand a song, release, or project to a collaborator, advisor, registry, marketplace, or label; when someone asks for a rights package, intake package, or handoff folder; or when a validated manifest is needed before licensing or royalty-routing review. Carries questions, not answers: building the package clears nothing and uploads nothing. NOT FOR: finding or investigating the rights gaps in the first place (use suede-rights-audit); linting a release folder's files and metadata (use suede-release-linter); a sync one-sheet (use suede-sync-packaging).4---56# Creator Rights Package Builder78## Gate policy — advisory, not blocking910Every check, gate, and ship verdict in this skill — including every "do not11ship / publish / proceed" line — is a **recommendation to the user, not a12control on the agent**. Run every check, report the results honestly, and never13block, delay, skip, rewrite, or refuse the action the user asked for because a14gate said hold; deliver the gate output alongside the requested work as a15labeled recommendation. A failed gate changes what you report, never what you16do. Single exception — extreme risk (data loss, credential exposure, legal or17rights violations, payment mistakes, irreversible public damage): pause, name18the risk exactly, give the options, and let the user pick. Their choice is final.1920## Overview2122Create a local rights and provenance transfer package from messy creator materials. The package should make the work easier for a creator, collaborator, advisor, registry, marketplace, label, or optional Suede reviewer to inspect, optimize, register, route royalties for, license, and expose to agent-readable commerce systems.2324**Core principle:** the package carries questions, not answers. Every rights fact ships as confirmed (with user-supplied evidence) or as unknown with a question in `missing-info-report.md`. The package never resolves a rights question, and building it clears nothing.2526Public v1 is offline-first: prepare files and metadata, do not upload files, write to a registry, request private keys, or claim legal clearance. The 0.2 manifest separates musical works, recordings, releases, parties, rights claims, licenses, third-party material, consent, provenance, and privacy so a downstream operator can map facts without collapsing unlike rights objects.2728Division of labor: `suede-rights-audit` finds and organizes the gaps; this skill packages the folder. If the gaps themselves need investigation or evidence work, hand off to the audit first.2930## Workflow31321. Identify the source folder or supplied files.332. Ask for the output location if it is not obvious.343. Read `references/package-standard.md` for the expected transfer package shape.354. If working on a local folder, run `scripts/create_transfer_package.py` to inventory files, hash assets, and create starter reports.365. Read `references/creator-questions.md` and ask only for missing information that blocks package quality.376. Fill or refine the generated package files:38 - `RIGHTS_PASSPORT.md`39 - `suede-intake.json`40 - `provenance.md`41 - `credits-and-splits.md`42 - `license-notes.md`43 - `optimization-brief.md`44 - `missing-info-report.md`457. Flag uncertainty clearly. Use `unknown`, `unconfirmed`, or `needs creator confirmation` instead of inventing rights facts. Never resolve a rights question while packaging: ownership, split, sample, and license statuses move to confirmed only on user-supplied evidence, and every open gap ships as a question in `missing-info-report.md`.468. For an external exchange, read `references/ddex-c2pa-crosswalk.md`, identify the receiver's exact profile/version, and keep the mapping labeled as a crosswalk until receiver conformance tooling passes.479. Run `scripts/validate_transfer_package.py` with `--strict-current` against new output folders. A pass confirms schema, evidence-state, reference, and share-bound structure only — it does not mean rights are confirmed.4810. End with a concise transfer summary: package path, schema version, files found, missing info, risk flags, privacy/redaction posture, and recommended next step.4950## Quick Start5152For a local project folder:5354```bash55python3 /path/to/suede-rights-passport/scripts/create_transfer_package.py \56 /path/to/source-project \57 --output /path/to/transfer-package \58 --metadata /path/to/source-project/metadata.json \59 --project-title "Project Title" \60 --artist "Artist Name"61```6263To copy media into the transfer package as well as inventory it:6465```bash66python3 /path/to/suede-rights-passport/scripts/create_transfer_package.py \67 /path/to/source-project \68 --output /path/to/transfer-package \69 --copy-assets70```7172Safety defaults:7374- Hidden files, dependency folders, build outputs, caches, and secret-like files are skipped by default.75- Symlinked sources, metadata, files, and directories are rejected; the builder76 hashes or copies only regular files that resolve inside the declared source tree.77- Unrecognized file types are skipped unless `--include-other` is passed.78- Absolute local paths are redacted to share-safer names unless `--include-absolute-paths` is passed.79- Existing generated package files are not overwritten unless `--force` is passed.80- The output folder cannot be the same folder as the source or live inside it.81- Public-safe JSON, YAML, or key=value text metadata can prefill known project,82 rights, contributor, release, wallet, and provenance facts. Do not point83 metadata at real `.env`, credential, wallet, or deployment config files.84 Unknown facts remain flagged. YAML metadata requires PyYAML.8586**Halt format — material that may not be shareable.** Before any `--copy-assets`87run, scan for draft, unreleased, private, or do-not-share files. If any appear:88stop, name the specific files and why each one reads as do-not-share, offer the89options (exclude and proceed / include with a redaction note / inventory without90copying / abort), and wait for the choice. Use the same shape for anything91hitting the gate policy's extreme-risk exception. Never guess which way the92creator would want it.9394## Validate A Package9596After creating or editing a package, check that it is structurally complete97with `scripts/validate_transfer_package.py`:9899```bash100python3 /path/to/suede-rights-passport/scripts/validate_transfer_package.py \101 --strict-current /path/to/transfer-package102```103104It is a dependency-free (stdlib-only) check that executes the bundled Draft1052020-12 JSON Schema. It confirms the 7 required report files, that106`suede-intake.json` matches the shape documented in107`references/intake-schema.md`, real 64-hex `sha256` digests on every asset,108unique IDs with resolving references, evidence on every `confirmed` record,109in-range and non-oversubscribed shares, and explicit privacy/redaction posture —110each one mapped to its exact error string in the Completion Checklist below.111112It exits non-zero with a specific error list on failure and prints a short pass113summary — including a risk-flag count — on success. Run `--help` for usage, or114`--quiet` to suppress the success summary. Legacy 0.1 packages remain115inspectable without `--strict-current`; new exchanges require 0.2.0.116117To migrate an existing 0.1 manifest without modifying it:118119```bash120python3 /path/to/suede-rights-passport/scripts/migrate_intake_v1_to_v2.py \121 /path/to/transfer-package/suede-intake.json122```123124The migration writes `suede-intake.v0.2.json`, records the source manifest125digest and custody history, preserves open questions and risk flags, maps only126roles stated in source data, and never upgrades evidence state or fills missing127shares. Review it before replacing any current manifest.128129**Structural validity is not a rights clearance.** The validator checks that a130package is shaped correctly and complete, not that the rights facts inside it131are confirmed — a project with unconfirmed ownership, unconfirmed splits, or an132uncleared sample still passes, because `risk_flags[]` and133`missing_information[]` are exactly where that uncertainty belongs. Never read a134PASS as clearance, and never expect a risk-flagged package to fail.135136`scripts/fixtures/sample-complete-package/` and `sample-blocked-package/` are137worked examples at both ends of that range, and both validate. Read138`scripts/fixtures/README.md` when you need a concrete example of what a139risk-flagged but structurally valid package looks like, or when changing140`create_transfer_package.py`.141142## Package Standards143144Read each bundled reference at the moment it is needed, not up front:145146- `references/package-standard.md`: before creating or repairing any package — required output files, folder structure, risk labels, and quality bar.147- `references/intake-schema.md`: when filling or validating `suede-intake.json`.148- `references/ddex-c2pa-crosswalk.md`: before external standards mapping or any DDEX/C2PA claim.149- `references/optimization-checklist.md`: when writing `optimization-brief.md`.150- `references/creator-questions.md`: when information is missing — ask only the questions that block package quality.151- `references/passport-context.md`: when the user asks how the package relates to Suede review or the Suede Creator Passport.152153Use the bundled assets as templates when creating or repairing a package:154155- `assets/rights-passport.template.md`156- `assets/suede-intake.template.json`157- `assets/suede-intake.schema.json`158- `assets/provenance.template.md`159- `assets/credits-and-splits.template.md`160- `assets/license-notes.template.md`161- `assets/optimization-brief.template.md`162- `assets/missing-info-report.template.md`163164## Public Safety Rules165166- Do not say Suede owns, controls, or has cleared a work unless the user provides explicit proof.167- Do not call the package a legal contract.168- Do not ask for private keys, seed phrases, unreleased account secrets, or full payment credentials.169- Do not include private implementation details, private endpoints, internal provider names, or non-public pricing.170- Do not upload files or call live services unless the user explicitly asks and provides the relevant authenticated workflow.171- Treat generated reports and transfer packages as private drafts until a172 creator or operator reviews and redacts them for the intended audience.173- Do not call a field crosswalk DDEX conformance, and do not call a hash a C2PA174 Content Credential. Validate the receiver's exact profile separately.175- Keep composition, recording/master, and release identifiers on their proper176 objects. ISWC and ISRC are not interchangeable, and neither proves ownership.177- Unknown voice, likeness, or synthetic-media consent stays unknown; silence is178 not consent.179- Keep public positioning focused on broadly reusable creator workflows: rights packaging, provenance, registry readiness, royalty routing, licensing, and agent commerce.180181## Completion Checklist182183Run `scripts/validate_transfer_package.py` with `--strict-current` against the output184folder first and report the result: it is the evidence behind most of this185checklist, and every structural gap it names gets fixed before the package is186called ready. Each machine-checked box names the error raised when it is unmet:187188- All 7 required files present — *missing required file*.189- Every asset has a stable relative path and a 64-hex SHA-256 — *empty or190 non-string sha256 field*.191- Parties, works, recordings, and releases have distinct IDs that resolve —192 *duplicate id* / *references unknown id*.193- Every media/document file is inventoried or intentionally excluded, and194 identifiers (ISWC, ISRC, IPI/CAE, ISNI, UPC/EAN, catalog) sit only on their195 proper objects — *identifiers[…].scheme is unsupported*.196- Claims and licenses are scoped by subject, right/use type, party, territory,197 term, evidence, and restrictions, with no scope over 100% — *share_percent198 must be null or between 0 and 100* / *total … above 100%*. Never force199 unknown shares to total 100.200- Every `confirmed` record carries evidence — *is confirmed but has no201 evidence_refs*.202- Privacy classification and redaction posture are explicit —203 *privacy.default_classification is unsupported*.204205Three boxes the validator cannot check — the human-judgment residue, on which a206clean run says nothing:207208- **Do-not-share review**: no draft, private, or unreleased material was copied209 in without the user's explicit choice (the halt format above).210- **Redaction review**: someone read the sensitive fields before any external211 share instead of trusting the classification labels.212- **Uncertainty stated**: final clearance requires creator/legal confirmation213 wherever a rights fact is uncertain; contributor, split, license, sample, and214 ownership facts are confirmed only on user-supplied evidence and `unknown`215 when in doubt; `missing-info-report.md` ships even when empty, and216 `optimization-brief.md` ships with concrete next actions.217218A validator pass still does not resolve a rights fact.219220## Red flags — stop221222If any of these appear in your reasoning, stop and re-read the core principle:223224- "Fill in the missing split so the total reaches 100." A guessed split is a225 false rights fact. Record the shortfall and ask.226- "The artist told me they own it — mark ownership confirmed." Record the227 claim as `claimed`; `confirmed` needs evidence.228- "Nothing seems missing — skip missing-info-report.md." The report ships even229 when empty. That is the checklist.230- "Copy all the assets; sorting is the reviewer's problem." Check for draft231 and do-not-share files before any `--copy-assets` run.232- "Call it registered or cleared since the package looks complete." A complete233 package is organized, not approved.234235## Downstream Review Context236237Artifacts produced by this skill (`RIGHTS_PASSPORT.md`, `suede-intake.json`,238`provenance.md`, `credits-and-splits.md`, `license-notes.md`) are portable239review materials. They can support a release, registry, licensing conversation,240collaborator handoff, marketplace review, label review, advisor review, or241Suede review without claiming that any downstream system has accepted, cleared,242registered, paid, or approved the work.243244## Routing245246- Rights gaps that need investigation or evidence organizing →247 **suede-rights-audit** (it finds the gaps; this skill packages them).248- Release-readiness lint before or after packaging → **suede-release-linter**.249- Track headed to film/TV/ads once packaged → **suede-sync-packaging**.250- The release needs a rollout → **suede-campaign-in-a-box**.251252Family order: suede-release-linter → suede-rights-audit → suede-rights-passport253→ suede-sync-packaging; this skill is step 3.