Skip to content

Fix durable recovery and upgrade to Go 1.27.1 - #60

Merged
ncode merged 3 commits into
mainfrom
fix/durable-recovery-go127
Sep 14, 2026
Merged

ncode merged 3 commits into
mainfrom
fix/durable-recovery-go127

Conversation

@ncode

@ncode ncode commented Sep 14, 2026 •

Copy link
Copy Markdown
Owner

Durable tasks could be deleted after a failed dead-letter write or delivered again after exhausting their retry limit. Reserve attempts before delivery, pin each task's limit, and retain recoverable work until archival and cleanup succeed. Failed storage operations retry without additional sends, and atomic file replacement preserves the prior pending record. Startup pending-load failures also retry automatically; processor-specific task IDs prevent recovery from requeuing live work or overwriting its attempt count.

Remove duplicated async state from the audit server, upgrade Go to 1.27.1 and compatible dependencies, and have CI read its Go version from go.mod. Include the recovery specification, regression tests, documentation, and generated project workflow skills.

A crash after reservation can consume an unsent attempt. Legacy records adopt a fixed limit during recovery; older binaries do not enforce this recovery contract.

Validation on Go 1.27.1:

  • go fmt ./..., go vet ./..., go build ./...
  • go test -v -race ./...
  • go test -tags=integration -v -race ./... against an isolated local test service
  • go test ./... -coverpkg=./... -coverprofile=coverage.out and go tool cover -func=coverage.out: 98.2% overall; 100% statement coverage in all changed production files
  • go mod verify and go mod tidy -diff
  • go run golang.org/x/vuln/cmd/govulncheck@latest ./...: no vulnerabilities found
  • GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build ./...
  • openspec validate --all --strict: all four canonical specifications pass

Both completed proposals are archived and their deltas are synchronized. The earlier architecture specification now follows the durable recovery contract; no open changes remain.

Follow-up validation: deterministic regression tests cover repeated pending-load failures, recovery across processor instances, and live work already queued or retrying. Race-enabled unit and integration tests, vet, build, and strict specification validation pass. All changed production files retain 100% statement coverage. The medium review finding is resolved; a second independent review of the two changed production files reported no findings.

@ncode
ncode merged commit 0bd8324 into main Sep 14, 2026
5 checks passed
@ncode
ncode deleted the fix/durable-recovery-go127 branch September 14, 2026 18:43
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.

1 participant