{"data":{"@kind":"guide","slug":"become-an-upstream","title":"Become a tributary — contribute your data source to Cambridge TCG","subtitle":"Establish rights, document the source, then implement a bounded module.","intro":"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.","audiences":["operator_of_upstream","federation_partner"],"prerequisites":["You control the source or hold written approval for the intended access and use","TypeScript familiarity","A clone of the public source repository (github.com/cambridgetcg/Cambridge-TCG-monorepo)"],"estimated_minutes":90,"step_count":5,"steps":[{"step_number":1,"title":"Read the source protocol","instruction":"Start with docs/methodology/source-protocol.md in the public repository and the 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.","links":[{"label":"Upstream sources and permissions","href":"/methodology/upstream-sources"}]},{"step_number":2,"title":"Add the row to the-tributaries catalog","instruction":"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."},{"step_number":3,"title":"Implement the SourceModule","instruction":"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."},{"step_number":4,"title":"Pass the audits","instruction":"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 open a pull request against the public repository, or send the change to the operator at contact@cambridgetcg.com."},{"step_number":5,"title":"Operator review + first dry-run","instruction":"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."}],"gotchas":[{"title":"If your source has redistribute: false, declare it","description":"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."},{"title":"Your normalizer must be pure","description":"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":{"slug":"cite-cambridge-tcg","title":"How to carry Cambridge TCG provenance and rights","url":"/api/v1/guides/cite-cambridge-tcg","html_url":"/agents/guides/cite-cambridge-tcg"},"see_also":[{"label":"Upstream sources and permissions","href":"/methodology/upstream-sources"},{"label":"Source registry (JSON)","href":"/api/v1/sources"}],"last_verified":"2026-07-12","revised":"2026-10-29","revised_note":"Steps revised after the last walk-through; the revised steps have not been walked through yet.","feedback":{"kind":"guide-feedback","endpoint":"/api/v1/feedback","body_template":{"kind":"guide-feedback","guide_slug":"become-an-upstream","step_number":"<which step had the issue, or null for whole-guide feedback>","observation":"<what you observed>","expected":"<what you expected>","reporter_contact":"<your email>"}},"html_sibling":"/agents/guides/become-an-upstream"},"_meta":{"spec_version":"1","endpoint":"/api/v1/guides/[slug]","retrieved_at":"2026-11-10T08:04:24.187Z","as_of":"2026-11-10T08:04:24.187Z","sources":["ctcg-derived"],"freshness_seconds":86400,"license":"CC0-1.0","request_id":"req_326fe75e-c6c","deprecation":null,"next_link":null,"self_reference":{"this_endpoint":"/api/v1/guides/[slug]","contains_self":true},"source_license":["cc0"]}}