## phasehq/console — v2.70.0…v2.71.0

_30 commits._

### Features
- **feat: sync envs with references (#827)** (081cadf)
- **feat: show pending invites on lobby, skip onboard redirect when invites exist (#924)** (5cf0b3b)

### Fixes
- **fix(quotas): correct custom-environment plan gating and require valid licenses (#936)** (341ae47)
- **Merge pull request #934 from tomaskir/fix/self-hosted-bulk-invite-seats** (d226111)
- **Merge branch 'main' into fix/self-hosted-bulk-invite-seats** (fb1338b)
- **Merge pull request #809 from phasehq/fix/lockbox-view-counting** (dff5df1)
- **fix(lockbox): validate key format and block double-reveal** (fb225fc)
- **fix: handle unlimited (null) seat limit in bulk invite on self-hosted** (4a75e01)
- **fix(lockbox): don't burn the view when the decryption key is missing** (d539aa1)
- **Merge branch 'main' into fix/lockbox-view-counting** (eb77a87)
- **fix(lockbox): split metadata read from atomic reveal; real DB tests** (0766553)
- **fix: correct Apps empty-state copy for owners/admins (#931)** (0bd1d67)
- **Merge branch 'main' into fix/lockbox-view-counting** (f6f9b88)
- **Merge branch 'main' into fix/lockbox-view-counting** (505581d)
- **Merge pull request #927 from phasehq/fix--single-env-action-menu** (2be8c59)
- **fix: clean up comments** (02d1a79)
- **fix: prevent secret action menu being hidden behind table header** (beefab1)
- **fix: mock transaction.atomic to avoid DB access in lockbox tests** (01e5785)
- **fix: set MockLockbox.DoesNotExist to real exception class in tests** (3479527)
- **fix: enforce lockbox view count server-side** (80bde19)

### Backend
- **Merge pull request #925 from phasehq/chore/bump-posthog-js-latest** (4e15a4c)
- **Merge pull request #910 from phasehq/dependabot/npm_and_yarn/frontend/shell-quote-1.8.4** (c46e9ca)
- **Merge branch 'main' into dependabot/npm_and_yarn/frontend/shell-quote-1.8.4** (d129ae1)
- **Merge branch 'main' into dependabot/npm_and_yarn/frontend/shell-quote-1.8.4** (3314345)

### Tests
- **test: cover seat-availability calc and self-hosted seat limit** (043d269)
- **test(lockbox): assert atomic enforcement via mocks; drop CI Postgres** (33d4467)

### Chore
- **chore: bump version to v2.71.0 (#932)** (a33fad7)
- **refactor(performance): discover and trigger reference-based syncs asynchronously (#930)** (667b90f)
- **chore(deps): bump posthog-js to 1.391.2** (16a8030)
- **chore(deps-dev): bump shell-quote from 1.8.1 to 1.8.4 in /frontend** (239bd77)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/phasehq/console?utm_source=github-action)._