- Release.product and requires; unique (product, version); latest version
per product (latest_version stays Cross Events' latest)
- Release sources per product (Releases page): repository, tag prefix,
notes file. Defaults: every product from crosscode-platform plus Cross
Events' v1.2.3 tags from hope-events. A product's releases are only
removed when all its sources were read and found tags
- "— requires accounts 1.2.0" in a notes heading: Request update answers
409 REQUIREMENT_NOT_MET until the church's install of that product is new
enough; install page and Releases page show it; v2 replies carry requires
- @crosscode/contracts 1.1.0 vendored (optional requires on releases)
- Alerts, dashboard and install lists compare against each product's latest
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Accepts protocol 1 and 2 (utils/protocol.js); v2 bodies checked with the
contracts' zod schemas (400 INVALID_REQUEST), v1 unchanged
- v2 register/heartbeat carry product (409 WRONG_PRODUCT on a mismatch),
register stores the install's public key, stats stored per product
- v2 replies add linkedProducts (the church's other installs in use with a
public key); v1 replies unchanged
- Licence tokens carry customerId and product
- Until releases per product, only Events installs get releases / "behind"
- Tests: every contract sample through the real routes, replies checked
against the contract response schemas
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>