release: 0.5.1b3

## Bump
- [ ] Major
- [ ] Minor
- [x] Beta
- [ ] Patch
- [ ] Skip

## Changelog

### Fixed
- Existence-only reverse relations (presence or type on a scalar through-property with a stub neighbour shape) resolve via `instances.aggregate` and a few lightweight witness nodes per focus, instead of loading every reverse neighbour. A high-fan-out reverse property no longer exhausts `max_auto_load_instances` and starves later focuses or later reverse properties in the same chunk.
- Live instance, sync-cursor, and pre-persist reverse existence loads query Postgres (`instances.query`) directly so a stale search-index count after a relation is deleted cannot create a false witness.
- When the focus shape declares reverse cardinality (`sh:minCount` / `sh:maxCount`), the engine materializes `max(minCount, maxCount + 1)` witnesses so those checks still run without loading the full neighbour set.
- Two views that share a through-property name no longer authorize each other's reverse loads when SPARQL PREFIX declarations bind sources by focus class.
- Sync-cursor releases the sync lock when setup fails (missing rules, parameters, or `job_run_id`), so a failed start does not leave the view locked.
- Adding an instance space after historic validation already completed for that Data Product version enqueues a separate historic job for only the new spaces. The queue manager keeps that space filter when it rebuilds the orchestrator payload, and existing jobs for the same version stay in place.

### Changed
- Chunk-size and auto-load docs describe aggregate witnesses for existence-only reverse rules. Full neighbour search still runs when a rule inspects extra neighbour properties.
- Redeploy the validation function after this release so reverse existence witnesses, the sync-cursor lock release, and scoped historic enqueue run in Cognite Functions.
