Change. A target stores how many delivery attempts it gets in all, at least 1, instead of a retry count. Target.MaxRetries (column max_retries) becomes MaxAttempts (column max_attempts); the names follow the new meaning everywhere (max_attempts form field, parseMaxAttempts, maxTargetAttempts). 1 means a single attempt with no retry and no circuit breaker (today's path for 0). More than 1 means retries with the circuit breaker, up to that many attempts in all. The form's default is 1 and it refuses 0 or less.
Why. Today 0 and 1 both mean one attempt, 0 without the breaker and 1 with it; the UI shows both as "1" and explains one of them in words, and the README spends two paragraphs on the difference. The name is the confusion recorded in #316 and #399.
What it touches.
internal/db/migrations/main/001_schema.sql (pre-1.0: edit the file) and internal/database/model_target.go.
internal/handlers/target_retries.go, target_create.go, target_edit.go, and every place that copies the value into a delivery task (webhook.go, delivery_replay.go, event_log.go).
internal/delivery/engine.go (the task field), target_http.go (httpCore.deliver, handleRetry), target_slack.go, target_config_view.go (maxRetriesField).
The templates that show or edit the value, and the README Target section and every other mention.
Definition of done. No stored value means "0 retries". A target saved with 1 is attempted once without the breaker; one saved with 3 is attempted at most 3 times with the breaker. The form refuses 0 and defaults to 1. The target page shows the number of attempts with no special wording for any value. Tests cover the form's bounds and both delivery paths. The README's two paragraphs on 0 against 1 become one sentence.
Builds after #532 merges, which changes the same delivery code.
Model: opus-5-5
Approved by sneak on https://git.eeqj.de/sneak/webhooker/issues/499#issuecomment-142500.
**Change.** A target stores how many delivery attempts it gets in all, at least 1, instead of a retry count. `Target.MaxRetries` (column `max_retries`) becomes `MaxAttempts` (column `max_attempts`); the names follow the new meaning everywhere (`max_attempts` form field, `parseMaxAttempts`, `maxTargetAttempts`). 1 means a single attempt with no retry and no circuit breaker (today's path for 0). More than 1 means retries with the circuit breaker, up to that many attempts in all. The form's default is 1 and it refuses 0 or less.
**Why.** Today 0 and 1 both mean one attempt, 0 without the breaker and 1 with it; the UI shows both as "1" and explains one of them in words, and the README spends two paragraphs on the difference. The name is the confusion recorded in https://git.eeqj.de/sneak/webhooker/issues/316 and https://git.eeqj.de/sneak/webhooker/issues/399.
**What it touches.**
- `internal/db/migrations/main/001_schema.sql` (pre-1.0: edit the file) and `internal/database/model_target.go`.
- `internal/handlers/target_retries.go`, `target_create.go`, `target_edit.go`, and every place that copies the value into a delivery task (`webhook.go`, `delivery_replay.go`, `event_log.go`).
- `internal/delivery/engine.go` (the task field), `target_http.go` (`httpCore.deliver`, `handleRetry`), `target_slack.go`, `target_config_view.go` (`maxRetriesField`).
- The templates that show or edit the value, and the README Target section and every other mention.
**Definition of done.** No stored value means "0 retries". A target saved with 1 is attempted once without the breaker; one saved with 3 is attempted at most 3 times with the breaker. The form refuses 0 and defaults to 1. The target page shows the number of attempts with no special wording for any value. Tests cover the form's bounds and both delivery paths. The README's two paragraphs on 0 against 1 become one sentence.
Builds after https://git.eeqj.de/sneak/webhooker/pulls/532 merges, which changes the same delivery code.
Model: opus-5-5
clawbot
self-assigned this 2026-10-15 11:57:18 +02:00
Built in #547: targets store max_attempts, at least 1, and the PR body lists what changed and the judgement calls.
Model: opus-5-5
Built in https://git.eeqj.de/sneak/webhooker/pulls/547: targets store `max_attempts`, at least 1, and the PR body lists what changed and the judgement calls.
Model: opus-5-5
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Approved by sneak on #499 (comment).
Change. A target stores how many delivery attempts it gets in all, at least 1, instead of a retry count.
Target.MaxRetries(columnmax_retries) becomesMaxAttempts(columnmax_attempts); the names follow the new meaning everywhere (max_attemptsform field,parseMaxAttempts,maxTargetAttempts). 1 means a single attempt with no retry and no circuit breaker (today's path for 0). More than 1 means retries with the circuit breaker, up to that many attempts in all. The form's default is 1 and it refuses 0 or less.Why. Today 0 and 1 both mean one attempt, 0 without the breaker and 1 with it; the UI shows both as "1" and explains one of them in words, and the README spends two paragraphs on the difference. The name is the confusion recorded in #316 and #399.
What it touches.
internal/db/migrations/main/001_schema.sql(pre-1.0: edit the file) andinternal/database/model_target.go.internal/handlers/target_retries.go,target_create.go,target_edit.go, and every place that copies the value into a delivery task (webhook.go,delivery_replay.go,event_log.go).internal/delivery/engine.go(the task field),target_http.go(httpCore.deliver,handleRetry),target_slack.go,target_config_view.go(maxRetriesField).Definition of done. No stored value means "0 retries". A target saved with 1 is attempted once without the breaker; one saved with 3 is attempted at most 3 times with the breaker. The form refuses 0 and defaults to 1. The target page shows the number of attempts with no special wording for any value. Tests cover the form's bounds and both delivery paths. The README's two paragraphs on 0 against 1 become one sentence.
Builds after #532 merges, which changes the same delivery code.
Model: opus-5-5
Built in #547: targets store
max_attempts, at least 1, and the PR body lists what changed and the judgement calls.Model: opus-5-5