Become a tributary — contribute your data source to Cambridge TCG
Establish rights, document the source, then implement a bounded module.
If you operate or are authorized to share a TCG data source, start by documenting written rights for the intended automated access, storage, use, and redistribution. A SourceModule is a technical adapter, not a license. Nothing is fetched or emitted until the relevant gate passes.
Steps revised after the last walk-through; the revised steps have not been walked through yet.
Prerequisites
- • You control the source or hold written approval for the intended access and use
- • TypeScript familiarity
- • Repository collaborator access (the source repository is private; request it via [email protected])
Steps
- 1
Read the source protocol
Start with docs/methodology/source-protocol.md in the repository (private; not publicly readable) and the public summary at /methodology/upstream-sources. Understand the pre-network rights gate, SourceMeta, inert blocked modules, read + normalize, and the independent pre-publication review. CardRush is a blocked policy example, not a runnable reference implementation.
- 2
Add the row to the-tributaries catalog
Edit docs/connections/the-tributaries.md to add a row for your source: name, upstream URL, access method, license tier, freshness budget, ToS notes, written-rights evidence, game coverage, and status: blocked until reviewed. Submit this first; no probe request is part of intake.
- 3
Implement the SourceModule
Create packages/data-ingest/src/<your-source-id>/ with index.ts exporting `SourceMeta`, `read`, `normalize`. Type the raw row and the canonical record. Keep `read` inert while status is blocked. For an approved source, declare a bounded rate limit, cancellation, and a pure normalizer.
- 4
Pass the audits
Run `pnpm audit:tributaries` — it runs ten checks (module exists, shape conforms, required meta non-empty, id parity, catalog anchor resolved, ToS non-empty, license coherence, game codes valid, ingest-run recency for shipped sources, license-propagation drift). Pass all of them. Then send the change to the operator; outside pull requests are not possible while the repository is private.
- 5
Operator review + first dry-run
The operator reviews the code and current source-specific rights. Only if acquisition is affirmatively covered may a bounded dry-run occur. Public emission remains off until a separate field-level redistribution review passes.
Common gotchas
If your source has redistribute: false, declare it
Set the conservative metadata, but do not confuse metadata with permission. `redistribute: false`, authentication, attribution, or an internal-only label cannot authorize acquisition or publication.
Your normalizer must be pure
Same input → same output. No I/O, no clock reads, no random. Failed normalizations return `{ ok: false, reason }` — never throw. The reason must be actionable ('unmapped lang qya; add to LANG_MAP'), not 'normalization failed'.
Next guide
How to carry Cambridge TCG provenance and rights →
Cite the exact resource, source chain, and declared license.