- git.sql: provider/repo/webhook CRUD, push-dispatch service matcher
- ListServicesForPush folds the dynamic branch clause into a static
predicate; COALESCE fallbacks match other service loaders
- git_receiver dispatch writes reuse deployment queries
- TestGitLiveInvariants: live coverage for upsert, search, webhook,
and branch matching semantics
Authored By: TDvorak <[email protected]>
Two fixes in the push receiver:
- Accept repo-sync events (`sync`, `repository_dispatch`, `workflow_run`)
that carry no ref — fork-sync bots and Actions dispatch these instead
of pushes. Branch falls back to the webhook filter then the service's
own git_branch; repo-only match when no branch is known.
- The deployment INSERT omitted the NOT NULL `version` column, so every
webhook-triggered deploy failed the insert silently and enqueued
nothing. Push-triggered deploys have been dead since the receiver
shipped. Now set `v<unix>` like the manual deploy path.
Verified live: repository_dispatch → branch=main, 1 deployment enqueued;
push → 1; star → ignored.
Generated with [Devin](https://devin.ai)
Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- Webhook-triggered deploys now go through the per-service deploy queue
and default to no_cache builds (dflow convention — prevents stale
layer surprises on push).
- Boot sweep marks deployments interrupted by restart as failed instead
of leaving phantom queued/building rows.
- is_secret environment variables are AES-GCM-encrypted at rest
(enc:v1: prefix); key from SECRETS_KEY or JWT_SECRET fallback.
Existing plaintext secrets encrypt on boot; deploy/exec paths decrypt
transparently. Masked-echo writes preserve stored ciphertext.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>