Skip to content

feat: add webhook jobs work-queue and delivery history tables with store methods and tests - #5248

Merged
Pratham-Mishra04 merged 1 commit into
devfrom
07-14-feat_webhook_delivery_queue_and_history_stores
Jul 17, 2026
Merged

feat: add webhook jobs work-queue and delivery history tables with store methods and tests#5248
Pratham-Mishra04 merged 1 commit into
devfrom
07-14-feat_webhook_delivery_queue_and_history_stores

Conversation

@Pratham-Mishra04

Copy link
Copy Markdown
Collaborator

Summary

Adds the persistence layer for webhook delivery: a webhook_jobs work-queue table for in-flight deliveries and a webhook_deliveries history table for delivery attempt records, along with the store methods needed to drive the delivery worker loop.

Changes

  • webhook_jobs table (configstore): New TableWebhookJob model and add_webhook_jobs_table migration. Rows exist only while a delivery is pending or retrying and are deleted on terminal outcome. The row ID doubles as the stable webhook-id wire header across attempts.
  • Webhook job store methods (configstore): CreateWebhookJob, ListDueWebhookJobs, ClaimWebhookJob, RescheduleWebhookJob, and DeleteWebhookJob. Claiming uses a conditional UPDATE so at most one concurrent worker wins per job; expired leases make rows reclaimable for crash recovery.
  • Endpoint delivery counters (configstore): RecordWebhookEndpointSuccess and RecordWebhookEndpointFailure update consecutive_failures and the last-success/failure timestamps via atomic column expressions, bypassing save hooks so config fields and updated_at are never touched.
  • webhook_deliveries table (logstore): New WebhookDelivery model, webhook_deliveries_init migration, and ClickHouse table creation. Rows are insert-only delivery attempt metadata (no payloads). Expiry is handled by DeleteExpiredWebhookDeliveries with batched deletes.
  • async_jobs schema (logstore): async_jobs_add_webhook_endpoint_id_column migration adds webhook_endpoint_id to reference the endpoint to notify on job completion.
  • LogStore and ConfigStore interfaces extended with all new methods; HybridLogStore delegates to its inner store.
  • MockConfigStore in the HTTP transport test suite updated to satisfy the expanded ConfigStore interface.

Type of change

  • Bug fix
  • Feature
  • Refactor
  • Documentation
  • Chore/CI

Affected areas

  • Core (Go)
  • Transports (HTTP)
  • Providers/Integrations
  • Plugins
  • UI (React)
  • Docs

How to test

go test ./framework/configstore/... ./framework/logstore/...

Key test coverage added:

  • TestWebhookEndpointRecordFailureAndSuccess — counter increment/reset and not-found errors
  • TestWebhookEndpointCounterUpdatesLeaveConfigUntouched — verifies updated_at and config fields are not modified
  • TestWebhookJobCreateValidation, TestWebhookJobCreateDefaultsAndDuplicate — input validation and duplicate detection
  • TestWebhookJobClaimRace, TestWebhookJobClaimLeaseExpiryReclaim, TestWebhookJobClaimNotDueRejected — claim fencing and lease expiry recovery
  • TestWebhookJobListDue — ordering, future-job exclusion, live-lease exclusion, expired-lease inclusion
  • TestWebhookJobReschedule, TestWebhookJobDelete — ownership fencing on reschedule and delete
  • TestWebhookJobClaimCycleWithEmptyRunnerID — single-node mode with empty runner ID
  • TestWebhookDeliveryCreateAndFind, TestWebhookDeliverySearchPagination, TestWebhookDeliveryDeleteExpired — delivery history CRUD
  • TestLogStoreParity extended with a WebhookDeliveries phase covering all three backends

Breaking changes

  • Yes
  • No

Security considerations

Webhook secrets are not stored in or exposed by any of the new tables. Delivery counter updates bypass GORM save hooks to prevent accidental secret re-encryption or field clobbering during high-frequency operational writes.

Checklist

  • I read docs/contributing/README.md and followed the guidelines
  • I added/updated tests where appropriate
  • I updated documentation where needed
  • I verified builds succeed (Go and UI)
  • I verified the CI pipeline passes locally if applicable

@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

Pratham-Mishra04 commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 6ae03567-5816-4637-af74-2d2dc099f3b4

📥 Commits

Reviewing files that changed from the base of the PR and between ffbfc01 and 53be07c.

📒 Files selected for processing (16)
  • framework/configstore/migrations.go
  • framework/configstore/rdb.go
  • framework/configstore/rdb_test.go
  • framework/configstore/store.go
  • framework/configstore/tables/webhooks.go
  • framework/logstore/clickhousemigrate.go
  • framework/logstore/clickhousestore.go
  • framework/logstore/clickhousestore_test.go
  • framework/logstore/hybrid.go
  • framework/logstore/logstoreparity_test.go
  • framework/logstore/migrations.go
  • framework/logstore/rdb.go
  • framework/logstore/store.go
  • framework/logstore/tables.go
  • framework/logstore/webhookdelivery_test.go
  • transports/bifrost-http/lib/config_test.go

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added durable webhook delivery job queuing with retries, leasing, and safe concurrent processing.
    • Added webhook delivery history, including attempt outcomes, status details, endpoint-scoped search, and pagination.
    • Added endpoint delivery success and failure tracking with timestamps and consecutive-failure counts.
    • Added automatic cleanup of expired delivery records.
    • Linked asynchronous jobs to their webhook endpoints for improved delivery tracking.
  • Tests

    • Added comprehensive coverage for queue behavior, delivery history, pagination, retries, expiration, and concurrency.

Walkthrough

Adds persistent webhook delivery jobs, endpoint outcome counters, and webhook delivery history with migrations, store APIs, SQLite/Postgres/ClickHouse support, hybrid delegation, and lifecycle and parity tests.

Changes

Webhook delivery persistence

Layer / File(s) Summary
Webhook job contracts and schema
framework/configstore/tables/webhooks.go, framework/configstore/store.go, framework/configstore/migrations.go
Defines TableWebhookJob, exposes queue methods, and adds the webhook_jobs migration.
Endpoint counters and job lifecycle
framework/configstore/rdb.go, framework/configstore/rdb_test.go, transports/bifrost-http/lib/config_test.go
Records endpoint outcomes and implements validated, leased webhook job operations with tests and mock support.
Webhook delivery records and migrations
framework/logstore/tables.go, framework/logstore/store.go, framework/logstore/migrations.go, framework/logstore/clickhousemigrate.go
Adds delivery models, outcomes, async-job linkage, relational migrations, and ClickHouse table creation.
Delivery history store implementations
framework/logstore/rdb.go, framework/logstore/clickhousestore.go, framework/logstore/hybrid.go
Implements insertion, lookup, pagination, expiration cleanup, ClickHouse batching, and hybrid delegation.
Cross-backend delivery validation
framework/logstore/webhookdelivery_test.go, framework/logstore/logstoreparity_test.go, framework/logstore/clickhousestore_test.go
Tests delivery persistence and verifies lookup, pagination, cleanup, and backend parity.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

Suggested reviewers: akshaydeo, danpiths, impoiler

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 55.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarizes the main addition: webhook queue/history persistence, store methods, and tests.
Description check ✅ Passed The PR description follows the template well and includes summary, changes, testing, scope, security, and checklist sections.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 07-14-feat_webhook_delivery_queue_and_history_stores

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.12.2)

level=error msg="[linters_context] typechecking error: pattern ./...: directory prefix . does not contain main module or its selected dependencies"


Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Confidence Score: 5/5

This looks safe to merge.

  • Exact lease deadlines now fence reschedule and delete operations.
  • Stale attempts cannot mutate a job reclaimed with the same or empty runner ID.
  • Tests cover stale reschedule and delete calls after lease expiry and reclaim.

Important Files Changed

Filename Overview
framework/configstore/rdb.go Adds endpoint counters and leased webhook-job operations with exact-lease fencing.
framework/configstore/rdb_test.go Adds queue lifecycle, concurrency, timestamp, and stale-owner tests.
framework/configstore/tables/webhooks.go Defines the webhook-job queue model and lease fields.
framework/logstore/rdb.go Adds relational storage, grouped search, and expiry cleanup for webhook delivery history.
framework/logstore/clickhousestore.go Adds batched expiry cleanup for ClickHouse webhook delivery history.

Reviews (5): Last reviewed commit: "feat: webhook delivery queue and history..." | Re-trigger Greptile

Comment thread framework/configstore/rdb.go Outdated
Comment thread framework/configstore/rdb.go

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@framework/configstore/store.go`:
- Around line 692-694: Update the webhook job lease API around ClaimWebhookJob,
RescheduleWebhookJob, and DeleteWebhookJob so each successful claim issues a
unique lease generation/token, and both mutation methods require and validate
that token along with the job ownership context. Ensure stale tokens cannot
reschedule or delete a job after expiry and reclaim, including when runnerID is
empty, and add a regression test covering stale-owner mutations after reclaim
with race-safe state handling.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 8fa39ee6-6320-4535-a81f-872ea364db75

📥 Commits

Reviewing files that changed from the base of the PR and between b098b0b and e623f4b.

📒 Files selected for processing (16)
  • framework/configstore/migrations.go
  • framework/configstore/rdb.go
  • framework/configstore/rdb_test.go
  • framework/configstore/store.go
  • framework/configstore/tables/webhooks.go
  • framework/logstore/clickhousemigrate.go
  • framework/logstore/clickhousestore.go
  • framework/logstore/clickhousestore_test.go
  • framework/logstore/hybrid.go
  • framework/logstore/logstoreparity_test.go
  • framework/logstore/migrations.go
  • framework/logstore/rdb.go
  • framework/logstore/store.go
  • framework/logstore/tables.go
  • framework/logstore/webhookdelivery_test.go
  • transports/bifrost-http/lib/config_test.go

Comment thread framework/configstore/store.go Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@framework/configstore/rdb_test.go`:
- Around line 2678-2698: Update TestWebhookJobClaimRace to run both
ClaimWebhookJob calls concurrently, using a synchronization barrier so node-a
and node-b begin claiming at the same time. Collect both results and assert that
exactly one claimer returns true, while preserving error checks and the final
stored-claim assertions.

In `@framework/configstore/rdb.go`:
- Around line 7607-7632: Update CreateWebhookJob to validate that a new job has
the initial queue state: reject nonzero attempt counts and any existing claim or
lease fields before persisting it. Update ClaimWebhookJob so successful claims
always assign a lease strictly in the future, preserving race-safe ownership and
preventing immediately expired claims.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: b5a2233f-717a-40e1-9ebd-cb051592c264

📥 Commits

Reviewing files that changed from the base of the PR and between e623f4b and 44ef0a1.

📒 Files selected for processing (16)
  • framework/configstore/migrations.go
  • framework/configstore/rdb.go
  • framework/configstore/rdb_test.go
  • framework/configstore/store.go
  • framework/configstore/tables/webhooks.go
  • framework/logstore/clickhousemigrate.go
  • framework/logstore/clickhousestore.go
  • framework/logstore/clickhousestore_test.go
  • framework/logstore/hybrid.go
  • framework/logstore/logstoreparity_test.go
  • framework/logstore/migrations.go
  • framework/logstore/rdb.go
  • framework/logstore/store.go
  • framework/logstore/tables.go
  • framework/logstore/webhookdelivery_test.go
  • transports/bifrost-http/lib/config_test.go
🚧 Files skipped from review as they are similar to previous changes (12)
  • framework/logstore/hybrid.go
  • framework/logstore/clickhousemigrate.go
  • framework/configstore/tables/webhooks.go
  • framework/configstore/migrations.go
  • framework/logstore/clickhousestore.go
  • framework/configstore/store.go
  • transports/bifrost-http/lib/config_test.go
  • framework/logstore/tables.go
  • framework/logstore/logstoreparity_test.go
  • framework/logstore/webhookdelivery_test.go
  • framework/logstore/rdb.go
  • framework/logstore/migrations.go

Comment thread framework/configstore/rdb_test.go
Comment thread framework/configstore/rdb.go
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 07-14-feat_webhook_endpoint_registry_in_configstore branch from 5354465 to fbcfb94 Compare July 16, 2026 09:41
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 07-14-feat_webhook_delivery_queue_and_history_stores branch from 44ef0a1 to f759018 Compare July 16, 2026 09:41
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 16, 2026
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 07-14-feat_webhook_delivery_queue_and_history_stores branch from f759018 to ffbfc01 Compare July 16, 2026 13:04

Pratham-Mishra04 commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator Author

Merge activity

  • Jul 17, 8:36 AM UTC: A user started a stack merge that includes this pull request via Graphite.
  • Jul 17, 8:42 AM UTC: Graphite rebased this pull request as part of a merge.
  • Jul 17, 8:43 AM UTC: @Pratham-Mishra04 merged this pull request with Graphite.

@Pratham-Mishra04
Pratham-Mishra04 changed the base branch from 07-14-feat_webhook_endpoint_registry_in_configstore to graphite-base/5248 July 17, 2026 08:38
@Pratham-Mishra04
Pratham-Mishra04 changed the base branch from graphite-base/5248 to dev July 17, 2026 08:41
@Pratham-Mishra04
Pratham-Mishra04 dismissed coderabbitai[bot]’s stale review July 17, 2026 08:41

The base branch was changed.

@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 07-14-feat_webhook_delivery_queue_and_history_stores branch from ffbfc01 to 53be07c Compare July 17, 2026 08:42
@Pratham-Mishra04
Pratham-Mishra04 merged commit 7ad3d41 into dev Jul 17, 2026
13 of 15 checks passed
@Pratham-Mishra04
Pratham-Mishra04 deleted the 07-14-feat_webhook_delivery_queue_and_history_stores branch July 17, 2026 08:43
@coderabbitai
coderabbitai Bot requested a review from impoiler July 17, 2026 08:47
akshaydeo pushed a commit that referenced this pull request Jul 17, 2026
…ore methods and tests (#5248)

## Summary

Adds the persistence layer for webhook delivery: a `webhook_jobs` work-queue table for in-flight deliveries and a `webhook_deliveries` history table for delivery attempt records, along with the store methods needed to drive the delivery worker loop.

## Changes

- **`webhook_jobs` table** (`configstore`): New `TableWebhookJob` model and `add_webhook_jobs_table` migration. Rows exist only while a delivery is pending or retrying and are deleted on terminal outcome. The row ID doubles as the stable `webhook-id` wire header across attempts.
- **Webhook job store methods** (`configstore`): `CreateWebhookJob`, `ListDueWebhookJobs`, `ClaimWebhookJob`, `RescheduleWebhookJob`, and `DeleteWebhookJob`. Claiming uses a conditional UPDATE so at most one concurrent worker wins per job; expired leases make rows reclaimable for crash recovery.
- **Endpoint delivery counters** (`configstore`): `RecordWebhookEndpointSuccess` and `RecordWebhookEndpointFailure` update `consecutive_failures` and the last-success/failure timestamps via atomic column expressions, bypassing save hooks so config fields and `updated_at` are never touched.
- **`webhook_deliveries` table** (`logstore`): New `WebhookDelivery` model, `webhook_deliveries_init` migration, and ClickHouse table creation. Rows are insert-only delivery attempt metadata (no payloads). Expiry is handled by `DeleteExpiredWebhookDeliveries` with batched deletes.
- **`async_jobs` schema** (`logstore`): `async_jobs_add_webhook_endpoint_id_column` migration adds `webhook_endpoint_id` to reference the endpoint to notify on job completion.
- **`LogStore` and `ConfigStore` interfaces** extended with all new methods; `HybridLogStore` delegates to its inner store.
- **`MockConfigStore`** in the HTTP transport test suite updated to satisfy the expanded `ConfigStore` interface.

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [ ] Documentation
- [ ] Chore/CI

## Affected areas

- [x] Core (Go)
- [x] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [ ] Docs

## How to test

```sh
go test ./framework/configstore/... ./framework/logstore/...
```

Key test coverage added:
- `TestWebhookEndpointRecordFailureAndSuccess` — counter increment/reset and not-found errors
- `TestWebhookEndpointCounterUpdatesLeaveConfigUntouched` — verifies `updated_at` and config fields are not modified
- `TestWebhookJobCreateValidation`, `TestWebhookJobCreateDefaultsAndDuplicate` — input validation and duplicate detection
- `TestWebhookJobClaimRace`, `TestWebhookJobClaimLeaseExpiryReclaim`, `TestWebhookJobClaimNotDueRejected` — claim fencing and lease expiry recovery
- `TestWebhookJobListDue` — ordering, future-job exclusion, live-lease exclusion, expired-lease inclusion
- `TestWebhookJobReschedule`, `TestWebhookJobDelete` — ownership fencing on reschedule and delete
- `TestWebhookJobClaimCycleWithEmptyRunnerID` — single-node mode with empty runner ID
- `TestWebhookDeliveryCreateAndFind`, `TestWebhookDeliverySearchPagination`, `TestWebhookDeliveryDeleteExpired` — delivery history CRUD
- `TestLogStoreParity` extended with a `WebhookDeliveries` phase covering all three backends

## Breaking changes

- [ ] Yes
- [x] No

## Security considerations

Webhook secrets are not stored in or exposed by any of the new tables. Delivery counter updates bypass GORM save hooks to prevent accidental secret re-encryption or field clobbering during high-frequency operational writes.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [x] I added/updated tests where appropriate
- [ ] I updated documentation where needed
- [x] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
akshaydeo pushed a commit that referenced this pull request Jul 18, 2026
…ore methods and tests (#5248)

## Summary

Adds the persistence layer for webhook delivery: a `webhook_jobs` work-queue table for in-flight deliveries and a `webhook_deliveries` history table for delivery attempt records, along with the store methods needed to drive the delivery worker loop.

## Changes

- **`webhook_jobs` table** (`configstore`): New `TableWebhookJob` model and `add_webhook_jobs_table` migration. Rows exist only while a delivery is pending or retrying and are deleted on terminal outcome. The row ID doubles as the stable `webhook-id` wire header across attempts.
- **Webhook job store methods** (`configstore`): `CreateWebhookJob`, `ListDueWebhookJobs`, `ClaimWebhookJob`, `RescheduleWebhookJob`, and `DeleteWebhookJob`. Claiming uses a conditional UPDATE so at most one concurrent worker wins per job; expired leases make rows reclaimable for crash recovery.
- **Endpoint delivery counters** (`configstore`): `RecordWebhookEndpointSuccess` and `RecordWebhookEndpointFailure` update `consecutive_failures` and the last-success/failure timestamps via atomic column expressions, bypassing save hooks so config fields and `updated_at` are never touched.
- **`webhook_deliveries` table** (`logstore`): New `WebhookDelivery` model, `webhook_deliveries_init` migration, and ClickHouse table creation. Rows are insert-only delivery attempt metadata (no payloads). Expiry is handled by `DeleteExpiredWebhookDeliveries` with batched deletes.
- **`async_jobs` schema** (`logstore`): `async_jobs_add_webhook_endpoint_id_column` migration adds `webhook_endpoint_id` to reference the endpoint to notify on job completion.
- **`LogStore` and `ConfigStore` interfaces** extended with all new methods; `HybridLogStore` delegates to its inner store.
- **`MockConfigStore`** in the HTTP transport test suite updated to satisfy the expanded `ConfigStore` interface.

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [ ] Documentation
- [ ] Chore/CI

## Affected areas

- [x] Core (Go)
- [x] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [ ] Docs

## How to test

```sh
go test ./framework/configstore/... ./framework/logstore/...
```

Key test coverage added:
- `TestWebhookEndpointRecordFailureAndSuccess` — counter increment/reset and not-found errors
- `TestWebhookEndpointCounterUpdatesLeaveConfigUntouched` — verifies `updated_at` and config fields are not modified
- `TestWebhookJobCreateValidation`, `TestWebhookJobCreateDefaultsAndDuplicate` — input validation and duplicate detection
- `TestWebhookJobClaimRace`, `TestWebhookJobClaimLeaseExpiryReclaim`, `TestWebhookJobClaimNotDueRejected` — claim fencing and lease expiry recovery
- `TestWebhookJobListDue` — ordering, future-job exclusion, live-lease exclusion, expired-lease inclusion
- `TestWebhookJobReschedule`, `TestWebhookJobDelete` — ownership fencing on reschedule and delete
- `TestWebhookJobClaimCycleWithEmptyRunnerID` — single-node mode with empty runner ID
- `TestWebhookDeliveryCreateAndFind`, `TestWebhookDeliverySearchPagination`, `TestWebhookDeliveryDeleteExpired` — delivery history CRUD
- `TestLogStoreParity` extended with a `WebhookDeliveries` phase covering all three backends

## Breaking changes

- [ ] Yes
- [x] No

## Security considerations

Webhook secrets are not stored in or exposed by any of the new tables. Delivery counter updates bypass GORM save hooks to prevent accidental secret re-encryption or field clobbering during high-frequency operational writes.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [x] I added/updated tests where appropriate
- [ ] I updated documentation where needed
- [x] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants