Skip to content

feat: dyndns + secrets setup --plugin (consolidated; supersedes #736 + #737)#740

Merged
intel352 merged 1 commit into
mainfrom
fix/lint-dns-prs-1779284698
May 20, 2026
Merged

feat: dyndns + secrets setup --plugin (consolidated; supersedes #736 + #737)#740
intel352 merged 1 commit into
mainfrom
fix/lint-dns-prs-1779284698

Conversation

@intel352
Copy link
Copy Markdown
Contributor

Consolidates the two DNS-providers PRs with lint fixes applied. Implements T3+T4+T14+T15+T16 from workflow#735 SPEC. 19 tests; lint clean.

Supersedes #736 + #737 with lint fixes applied:

dyndns/ (T14..T16):
- IP-detect multi-source quorum + diff + Update callback +
  exp-backoff with jitter. 12 tests.

cmd/wfctl/secrets_setup_plugin.go (T3+T4):
- secrets setup --plugin reads plugin.json required_secrets[],
  prompts each (masked iff sensitive), writes to chosen GH scope
  (repo|env|org). 7 tests.

Lint fixes vs the original PRs:
- dyndns/dyndns.go Run() — replaced empty-branch (SA9003) with
  explicit `_ = d.Tick(...)` ignoring the error.
- dyndns/dyndns.go jitter — math/rand/v2 G404 false-positive
  silenced with nolint:gosec annotation (decorrelation, not
  crypto).
- dyndns/dyndns.go timeAfter — replaced unlambda wrapper with
  direct `var timeAfter = time.After`.
- cmd/wfctl/secrets.go — hoisted `args[1:]` into a local var
  to silence gosec G602 (already bounded by outer switch).

All tests pass; golangci-lint clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 20, 2026 13:55
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a new dynamic DNS daemon package and extends wfctl secrets setup with a --plugin mode that reads required_secrets[] from a plugin’s plugin.json and prompts the user to set them into GitHub secrets scopes.

Changes:

  • Introduces dyndns package with quorum-based public IP detection, update callback, and backoff/jitter behavior (+ unit tests).
  • Adds wfctl secrets setup --plugin ... dispatcher and implementation that loads plugin.json required secrets and writes them to repo/env/org GitHub secrets.
  • Adds tests for plugin manifest loading, prompting, and scope routing.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
dyndns/dyndns.go New dyndns daemon implementation: detectors quorum, update loop, backoff/jitter, HTTP detector.
dyndns/dyndns_test.go Unit tests for Tick behavior, quorum logic, backoff, and concurrency safety.
cmd/wfctl/secrets.go Routes secrets setup to plugin-based setup when --plugin is present.
cmd/wfctl/secrets_setup_plugin.go New secrets setup --plugin implementation: loads plugin manifest, prompts, and writes to GitHub secrets scope.
cmd/wfctl/secrets_setup_plugin_test.go Tests for manifest parsing, prompt behavior, and scope routing.

Comment thread dyndns/dyndns.go
Comment on lines +64 to +66

// Sleep is injectable for tests. Defaults to time.Sleep.
Sleep func(time.Duration)
Comment thread dyndns/dyndns.go
Comment on lines +209 to +214
var winner string
for ipStr, votes := range tally {
if votes >= d.cfg.QuorumSize && votes > tally[winner] {
winner = ipStr
}
}
Comment thread dyndns/dyndns.go
Comment on lines +144 to +156
currentSame := d.current != nil && d.current.Equal(ip)
d.mu.Unlock()
if currentSame {
d.recordSuccess()
return nil
}

if err := d.cfg.Update(ctx, ip); err != nil {
d.recordFailure()
return fmt.Errorf("dyndns: update IP %s: %w", ip, err)
}

d.mu.Lock()
Comment thread dyndns/dyndns.go
Comment on lines +288 to +293
body, _ := io.ReadAll(io.LimitReader(resp.Body, 256))
s := strings.TrimSpace(string(body))
ip := net.ParseIP(s)
if ip == nil {
return nil, fmt.Errorf("not an IP: %q", s)
}
Comment thread cmd/wfctl/secrets.go
// env-name flow stays on runSecretsSetup.
rest := args[1:]
for _, a := range rest {
if a == "--plugin" || strings.HasPrefix(a, "--plugin=") {
Comment on lines +144 to +152
if in != nil {
// Test/piped path — read one line.
buf := make([]byte, 4096)
n, err := in.Read(buf)
if err != nil && err != io.EOF {
return "", err
}
return strings.TrimRight(string(buf[:n]), "\r\n"), nil
}
Comment on lines +166 to +171
// Non-sensitive interactive — echo.
var line string
if _, err := fmt.Fscanln(os.Stdin, &line); err != nil && err.Error() != "unexpected newline" {
return "", err
}
return line, nil
Comment on lines +100 to +136
func TestRunSecretsSetupPlugin_PiperReadsRequiredSecrets(t *testing.T) {
dir := t.TempDir()
writePluginManifestFile(t, dir, "wp-fake", `{
"name": "wp-fake",
"required_secrets": [
{"name": "A", "sensitive": false},
{"name": "B", "sensitive": true}
]
}`)
// Stub the writer side by setting the org via env so
// buildSecretWriter is short-circuited (we just want to exercise
// the prompt loop). Use --scope=org with a stub provider not
// reachable in tests; the call will fail at network → we assert
// we got at least to the writer construction.
in := io.Reader(strings.NewReader("alice\nhunter2\n"))
var out bytes.Buffer
t.Setenv("GITHUB_TOKEN", "stub")

// We can't actually hit the GH API; use --scope=org pointing
// at a non-resolvable token+org, then assert error returns from
// the network-side path (after the prompts succeed).
err := runSecretsSetupPluginWithIO([]string{
"--plugin", "wp-fake",
"--plugin-dir", dir,
"--scope", "org",
"--org", "test-org",
"--token-env", "GITHUB_TOKEN",
}, in, &out)
if err == nil {
t.Fatal("expected network-side error reaching GH (test runs offline)")
}
// The output buffer should still show that we entered the setup
// loop (prompt prelude).
if !strings.Contains(out.String(), "Setting up secrets for plugin") {
t.Errorf("setup prelude missing from output:\n%s", out.String())
}
}
Comment on lines +95 to +100
// TestRunSecretsSetupPlugin_PiperReadsRequiredSecrets exercises the
// full flow with a piped reader for input. Output goes to a buffer.
//
// We swap out stdin via the io.Reader arg + verify the buffered out
// reports each secret as "set".
func TestRunSecretsSetupPlugin_PiperReadsRequiredSecrets(t *testing.T) {
Comment thread dyndns/dyndns.go
}
if cfg.MaxBackoff == 0 {
cfg.MaxBackoff = 1 * time.Hour
}
@codecov
Copy link
Copy Markdown

codecov Bot commented May 20, 2026

Codecov Report

❌ Patch coverage is 57.08955% with 115 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
cmd/wfctl/secrets_setup_plugin.go 42.01% 55 Missing and 14 partials ⚠️
dyndns/dyndns.go 71.52% 35 Missing and 6 partials ⚠️
cmd/wfctl/secrets.go 0.00% 5 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions
Copy link
Copy Markdown

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:274: parsing iteration count: invalid syntax
baseline-bench.txt:527483: parsing iteration count: invalid syntax
baseline-bench.txt:814911: parsing iteration count: invalid syntax
baseline-bench.txt:1155076: parsing iteration count: invalid syntax
baseline-bench.txt:1484603: parsing iteration count: invalid syntax
baseline-bench.txt:1783395: parsing iteration count: invalid syntax
benchmark-results.txt:276: parsing iteration count: invalid syntax
benchmark-results.txt:292705: parsing iteration count: invalid syntax
benchmark-results.txt:556442: parsing iteration count: invalid syntax
benchmark-results.txt:859716: parsing iteration count: invalid syntax
benchmark-results.txt:1143193: parsing iteration count: invalid syntax
benchmark-results.txt:1443191: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                  6.547m ± 53%
ComponentLoad-4                        3.528m ± 10%
ComponentExecute-4                     1.895µ ±  1%
PoolContention/workers-1-4             1.068µ ±  3%
PoolContention/workers-2-4             1.065µ ±  1%
PoolContention/workers-4-4             1.068µ ±  2%
PoolContention/workers-8-4             1.073µ ±  2%
PoolContention/workers-16-4            1.074µ ±  4%
ComponentLifecycle-4                   3.522m ±  1%
SourceValidation-4                     2.247µ ±  0%
RegistryConcurrent-4                   767.3n ±  4%
LoaderLoadFromString-4                 3.531m ±  0%
geomean                                18.19µ

                            │ benchmark-results.txt │
                            │         B/op          │
InterpreterCreation-4                  2.027Mi ± 0%
ComponentLoad-4                        2.180Mi ± 0%
ComponentExecute-4                     1.203Ki ± 0%
PoolContention/workers-1-4             1.203Ki ± 0%
PoolContention/workers-2-4             1.203Ki ± 0%
PoolContention/workers-4-4             1.203Ki ± 0%
PoolContention/workers-8-4             1.203Ki ± 0%
PoolContention/workers-16-4            1.203Ki ± 0%
ComponentLifecycle-4                   2.183Mi ± 0%
SourceValidation-4                     1.984Ki ± 0%
RegistryConcurrent-4                   1.133Ki ± 0%
LoaderLoadFromString-4                 2.182Mi ± 0%
geomean                                15.25Ki

                            │ benchmark-results.txt │
                            │       allocs/op       │
InterpreterCreation-4                   15.68k ± 0%
ComponentLoad-4                         18.02k ± 0%
ComponentExecute-4                       25.00 ± 0%
PoolContention/workers-1-4               25.00 ± 0%
PoolContention/workers-2-4               25.00 ± 0%
PoolContention/workers-4-4               25.00 ± 0%
PoolContention/workers-8-4               25.00 ± 0%
PoolContention/workers-16-4              25.00 ± 0%
ComponentLifecycle-4                    18.07k ± 0%
SourceValidation-4                       32.00 ± 0%
RegistryConcurrent-4                     2.000 ± 0%
LoaderLoadFromString-4                  18.06k ± 0%
geomean                                  183.3

cpu: AMD EPYC 9V74 80-Core Processor                
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4               8.509m ± 63%
ComponentLoad-4                     3.607m ± 11%
ComponentExecute-4                  1.843µ ±  2%
PoolContention/workers-1-4          1.029µ ±  2%
PoolContention/workers-2-4          1.024µ ±  2%
PoolContention/workers-4-4          1.020µ ±  1%
PoolContention/workers-8-4          1.020µ ±  1%
PoolContention/workers-16-4         1.027µ ±  1%
ComponentLifecycle-4                3.651m ±  1%
SourceValidation-4                  2.132µ ±  1%
RegistryConcurrent-4                725.1n ±  6%
LoaderLoadFromString-4              3.757m ±  3%
geomean                             18.23µ

                            │ baseline-bench.txt │
                            │        B/op        │
InterpreterCreation-4               2.027Mi ± 0%
ComponentLoad-4                     2.180Mi ± 0%
ComponentExecute-4                  1.203Ki ± 0%
PoolContention/workers-1-4          1.203Ki ± 0%
PoolContention/workers-2-4          1.203Ki ± 0%
PoolContention/workers-4-4          1.203Ki ± 0%
PoolContention/workers-8-4          1.203Ki ± 0%
PoolContention/workers-16-4         1.203Ki ± 0%
ComponentLifecycle-4                2.183Mi ± 0%
SourceValidation-4                  1.984Ki ± 0%
RegistryConcurrent-4                1.133Ki ± 0%
LoaderLoadFromString-4              2.182Mi ± 0%
geomean                             15.25Ki

                            │ baseline-bench.txt │
                            │     allocs/op      │
InterpreterCreation-4                15.68k ± 0%
ComponentLoad-4                      18.02k ± 0%
ComponentExecute-4                    25.00 ± 0%
PoolContention/workers-1-4            25.00 ± 0%
PoolContention/workers-2-4            25.00 ± 0%
PoolContention/workers-4-4            25.00 ± 0%
PoolContention/workers-8-4            25.00 ± 0%
PoolContention/workers-16-4           25.00 ± 0%
ComponentLifecycle-4                 18.07k ± 0%
SourceValidation-4                    32.00 ± 0%
RegistryConcurrent-4                  2.000 ± 0%
LoaderLoadFromString-4               18.06k ± 0%
geomean                               183.3

pkg: github.com/GoCodeAlone/workflow/middleware
cpu: AMD EPYC 7763 64-Core Processor                
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                     283.6n ± 3%
CircuitBreakerExecution_Success-4             21.36n ± 1%
CircuitBreakerExecution_Failure-4             66.29n ± 1%
geomean                                       73.77n

                                  │ benchmark-results.txt │
                                  │         B/op          │
CircuitBreakerDetection-4                    144.0 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

                                  │ benchmark-results.txt │
                                  │       allocs/op       │
CircuitBreakerDetection-4                    1.000 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                  298.9n ± 4%
CircuitBreakerExecution_Success-4          22.67n ± 1%
CircuitBreakerExecution_Failure-4          71.08n ± 0%
geomean                                    78.39n

                                  │ baseline-bench.txt │
                                  │        B/op        │
CircuitBreakerDetection-4                 144.0 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │
                                  │     allocs/op      │
CircuitBreakerDetection-4                 1.000 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
cpu: AMD EPYC 7763 64-Core Processor                
                                 │ benchmark-results.txt │
                                 │        sec/op         │
IaCStateBackend_InProcess-4                 305.1n ± 28%
IaCStateBackend_GRPC-4                      9.376m ±  4%
JQTransform_Simple-4                        648.9n ± 38%
JQTransform_ObjectConstruction-4            1.467µ ±  1%
JQTransform_ArraySelect-4                   3.418µ ±  3%
JQTransform_Complex-4                       38.49µ ±  2%
JQTransform_Throughput-4                    1.822µ ±  1%
SSEPublishDelivery-4                        71.52n ±  0%
geomean                                     3.834µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
IaCStateBackend_InProcess-4                416.0 ±  0%
IaCStateBackend_GRPC-4                   5.811Mi ± 11%
JQTransform_Simple-4                     1.273Ki ±  0%
JQTransform_ObjectConstruction-4         1.773Ki ±  0%
JQTransform_ArraySelect-4                2.625Ki ±  0%
JQTransform_Complex-4                    16.22Ki ±  0%
JQTransform_Throughput-4                 1.984Ki ±  0%
SSEPublishDelivery-4                       0.000 ±  0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                 │ benchmark-results.txt │
                                 │       allocs/op       │
IaCStateBackend_InProcess-4                 2.000 ± 0%
IaCStateBackend_GRPC-4                     6.837k ± 0%
JQTransform_Simple-4                        10.00 ± 0%
JQTransform_ObjectConstruction-4            15.00 ± 0%
JQTransform_ArraySelect-4                   30.00 ± 0%
JQTransform_Complex-4                       324.0 ± 0%
JQTransform_Throughput-4                    17.00 ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                 │ baseline-bench.txt │
                                 │       sec/op       │
IaCStateBackend_InProcess-4              297.5n ±  9%
IaCStateBackend_GRPC-4                   10.38m ± 10%
JQTransform_Simple-4                     675.0n ± 26%
JQTransform_ObjectConstruction-4         1.440µ ±  2%
JQTransform_ArraySelect-4                3.465µ ±  2%
JQTransform_Complex-4                    43.50µ ±  3%
JQTransform_Throughput-4                 1.886µ ±  5%
SSEPublishDelivery-4                     65.05n ±  1%
geomean                                  3.918µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
IaCStateBackend_InProcess-4             416.0 ±  0%
IaCStateBackend_GRPC-4                5.821Mi ± 13%
JQTransform_Simple-4                  1.273Ki ±  0%
JQTransform_ObjectConstruction-4      1.773Ki ±  0%
JQTransform_ArraySelect-4             2.625Ki ±  0%
JQTransform_Complex-4                 16.22Ki ±  0%
JQTransform_Throughput-4              1.984Ki ±  0%
SSEPublishDelivery-4                    0.000 ±  0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │
                                 │     allocs/op      │
IaCStateBackend_InProcess-4              2.000 ± 0%
IaCStateBackend_GRPC-4                  6.860k ± 1%
JQTransform_Simple-4                     10.00 ± 0%
JQTransform_ObjectConstruction-4         15.00 ± 0%
JQTransform_ArraySelect-4                30.00 ± 0%
JQTransform_Complex-4                    324.0 ± 0%
JQTransform_Throughput-4                 17.00 ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
cpu: AMD EPYC 7763 64-Core Processor                
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                      1.105µ ± 20%
SchemaValidation_AllFields-4                   1.642µ ±  1%
SchemaValidation_FormatValidation-4            1.580µ ±  4%
SchemaValidation_ManySchemas-4                 1.858µ ±  4%
geomean                                        1.519µ

                                    │ benchmark-results.txt │
                                    │         B/op          │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

                                    │ benchmark-results.txt │
                                    │       allocs/op       │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                   1.099µ ± 16%
SchemaValidation_AllFields-4                1.644µ ±  9%
SchemaValidation_FormatValidation-4         1.588µ ±  3%
SchemaValidation_ManySchemas-4              1.602µ ±  1%
geomean                                     1.464µ

                                    │ baseline-bench.txt │
                                    │        B/op        │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │
                                    │     allocs/op      │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.143µ ± 22%
EventStoreAppend_SQLite-4                     1.413m ± 14%
GetTimeline_InMemory/events-10-4              13.48µ ±  2%
GetTimeline_InMemory/events-50-4              71.77µ ± 17%
GetTimeline_InMemory/events-100-4             120.4µ ±  1%
GetTimeline_InMemory/events-500-4             618.6µ ±  0%
GetTimeline_InMemory/events-1000-4            1.262m ±  0%
GetTimeline_SQLite/events-10-4                103.5µ ±  2%
GetTimeline_SQLite/events-50-4                242.0µ ±  4%
GetTimeline_SQLite/events-100-4               414.8µ ±  1%
GetTimeline_SQLite/events-500-4               1.749m ±  4%
GetTimeline_SQLite/events-1000-4              3.412m ±  0%
geomean                                       213.8µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                    843.5 ± 12%
EventStoreAppend_SQLite-4                    1.987Ki ±  2%
GetTimeline_InMemory/events-10-4             7.953Ki ±  0%
GetTimeline_InMemory/events-50-4             46.62Ki ±  0%
GetTimeline_InMemory/events-100-4            94.48Ki ±  0%
GetTimeline_InMemory/events-500-4            472.8Ki ±  0%
GetTimeline_InMemory/events-1000-4           944.3Ki ±  0%
GetTimeline_SQLite/events-10-4               16.74Ki ±  0%
GetTimeline_SQLite/events-50-4               87.14Ki ±  0%
GetTimeline_SQLite/events-100-4              175.4Ki ±  0%
GetTimeline_SQLite/events-500-4              846.1Ki ±  0%
GetTimeline_SQLite/events-1000-4             1.639Mi ±  0%
geomean                                      67.72Ki

                                   │ benchmark-results.txt │
                                   │       allocs/op       │
EventStoreAppend_InMemory-4                     7.000 ± 0%
EventStoreAppend_SQLite-4                       53.00 ± 0%
GetTimeline_InMemory/events-10-4                125.0 ± 0%
GetTimeline_InMemory/events-50-4                653.0 ± 0%
GetTimeline_InMemory/events-100-4              1.306k ± 0%
GetTimeline_InMemory/events-500-4              6.514k ± 0%
GetTimeline_InMemory/events-1000-4             13.02k ± 0%
GetTimeline_SQLite/events-10-4                  382.0 ± 0%
GetTimeline_SQLite/events-50-4                 1.852k ± 0%
GetTimeline_SQLite/events-100-4                3.681k ± 0%
GetTimeline_SQLite/events-500-4                18.54k ± 0%
GetTimeline_SQLite/events-1000-4               37.29k ± 0%
geomean                                        1.162k

cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.060µ ± 11%
EventStoreAppend_SQLite-4                  1.056m ±  6%
GetTimeline_InMemory/events-10-4           12.40µ ±  2%
GetTimeline_InMemory/events-50-4           70.35µ ±  5%
GetTimeline_InMemory/events-100-4          137.5µ ± 19%
GetTimeline_InMemory/events-500-4          565.2µ ±  1%
GetTimeline_InMemory/events-1000-4         1.147m ±  2%
GetTimeline_SQLite/events-10-4             84.96µ ±  1%
GetTimeline_SQLite/events-50-4             222.9µ ±  9%
GetTimeline_SQLite/events-100-4            391.3µ ±  1%
GetTimeline_SQLite/events-500-4            1.684m ±  3%
GetTimeline_SQLite/events-1000-4           3.331m ±  2%
geomean                                    198.0µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  765.5 ± 4%
EventStoreAppend_SQLite-4                  1.985Ki ± 2%
GetTimeline_InMemory/events-10-4           7.953Ki ± 0%
GetTimeline_InMemory/events-50-4           46.62Ki ± 0%
GetTimeline_InMemory/events-100-4          94.48Ki ± 0%
GetTimeline_InMemory/events-500-4          472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%
GetTimeline_SQLite/events-10-4             16.74Ki ± 0%
GetTimeline_SQLite/events-50-4             87.14Ki ± 0%
GetTimeline_SQLite/events-100-4            175.4Ki ± 0%
GetTimeline_SQLite/events-500-4            846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%
geomean                                    67.17Ki

                                   │ baseline-bench.txt │
                                   │     allocs/op      │
EventStoreAppend_InMemory-4                  7.000 ± 0%
EventStoreAppend_SQLite-4                    53.00 ± 0%
GetTimeline_InMemory/events-10-4             125.0 ± 0%
GetTimeline_InMemory/events-50-4             653.0 ± 0%
GetTimeline_InMemory/events-100-4           1.306k ± 0%
GetTimeline_InMemory/events-500-4           6.514k ± 0%
GetTimeline_InMemory/events-1000-4          13.02k ± 0%
GetTimeline_SQLite/events-10-4               382.0 ± 0%
GetTimeline_SQLite/events-50-4              1.852k ± 0%
GetTimeline_SQLite/events-100-4             3.681k ± 0%
GetTimeline_SQLite/events-500-4             18.54k ± 0%
GetTimeline_SQLite/events-1000-4            37.29k ± 0%
geomean                                     1.162k

Benchmarks run with go test -bench=. -benchmem -count=6.
Regressions ≥ 20% are flagged. Results compared via benchstat.

@intel352 intel352 merged commit f10dbf2 into main May 20, 2026
26 checks passed
@intel352 intel352 deleted the fix/lint-dns-prs-1779284698 branch May 20, 2026 14:07
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