# Resource Manifest

Each `sources/*.json` file describes one upstream resource. The first resource is a Bible translation, but the same manifest discipline should also cover study notes, commentaries, maps, lexicons, dictionaries, timelines, cross-references, and other Bible-study resources.

Required fields:

- `id`: Stable package id used by apps.
- `resource_type`: Type of resource, such as `translation`, `study_notes`, `commentary`, `map`, `lexicon`, `dictionary`, `cross_reference`, or `timeline`.
- `title`: Human-readable title.
- `short_title`: Short human title when different from `title`.
- `abbreviation`: Short label.
- `alternate_ids`: Upstream or ecosystem ids for the same resource.
- `language`: Object with language code, name, and dialect when relevant.
- `script`: Script code when useful.
- `canon`: Scope and notes for biblical canon coverage.
- `translation`: Translation-specific metadata, including translation year, edition year, source text basis, tradition, and public description.
- `contributors`: Names and roles for translators, maintainers, publishers, source providers, or package providers.
- `features`: Structured feature list, not just strings.
- `attachments`: Included and future-supported attachment metadata.
- `source.provider`: Upstream publisher or repository.
- `source.url`: Human-facing upstream page.
- `source.download_url`: Machine download URL used by importers.
- `source.format`: Upstream source format, such as `usfm-zip`.
- `source.upstream_id`: Upstream resource id.
- `source.upstream_last_updated`: Upstream last-updated date when known.
- `license.name`: License or rights label.
- `license.redistribution`: Whether this repo may redistribute normalized outputs.
- `license.jurisdiction_notes`: Practical rights notes.
- `license.attribution`: Attribution text when needed.
- `checks.expected_sha256`: Last accepted source archive checksum.
- `checks.last_checked_at`: Last automated check timestamp.
- `importer.name`: Script/importer id.
- `importer.version`: Importer version.
- `packages`: Generated package paths.
- `catalog_display`: Human-facing summary and primary feature labels.

Attachment metadata should record:

- `resource_type`: Attachment type, such as `concordance_links`, `study_notes`, `commentary`, `map`, `morphology`, `lexicon`, or `timeline`.
- `relationship`: How the attachment connects, such as `word-to-strongs`, `verse-to-note`, `range-to-commentary`, or `place-to-map`.
- `anchor_types`: The target surfaces it can attach to: translation, book, chapter, verse, verse range, word/token, Strong's number, lemma, topic, place, or timeline event.
- `languages`: Original or target languages involved, including Hebrew, Greek, and Aramaic when applicable.
- `systems`: Concordance or tagging systems involved, such as Strong's or morphology codes.
- `package`: Generated package path when the attachment is packaged.

Update flow:

1. Download the upstream artifact to `cache/<resource-id>/`.
2. Calculate SHA-256.
3. Compare against `checks.expected_sha256`.
4. If unchanged, update `checks.last_checked_at` only when intentionally accepting that metadata churn.
5. If changed, inspect upstream release notes/license, regenerate packages, verify counts/checksums, then update the manifest in the same commit.
