Skip to content

fix(wfctl): plugin CLI registry binary path uses dir name + manifest name#595

Merged
intel352 merged 1 commit into
mainfrom
fix/cli-registry-binary-path
May 10, 2026
Merged

fix(wfctl): plugin CLI registry binary path uses dir name + manifest name#595
intel352 merged 1 commit into
mainfrom
fix/cli-registry-binary-path

Conversation

@intel352

Copy link
Copy Markdown
Contributor

Summary

PR #591 wired `BuildCLIRegistry` into `cmd/wfctl/main.go`'s dispatch fallback, but the binary-path computation joins `manifest.Name` twice:

```go
binaryPath := filepath.Join(pluginsDir, pluginName, pluginName)
```

This works only when the install directory name matches the manifest name. In practice the `setup-plugins` composite + `wfctl plugin install` both extract tarballs to short directory names (`data/plugins/payments`, `data/plugins/digitalocean`, …) while the binary inside is named after the manifest (`workflow-plugin-payments`). Path resolves to `data/plugins/workflow-plugin-payments/workflow-plugin-payments` which doesn't exist.

Reproduction (pre-fix)

```
$ tar -xzf workflow-plugin-payments-linux-amd64.tar.gz -C /tmp/data/plugins/payments/
$ WFCTL_PLUGIN_DIR=/tmp/data/plugins ./wfctl payments
error: plugin workflow-plugin-payments command payments:
fork/exec /tmp/data/plugins/workflow-plugin-payments/workflow-plugin-payments:
no such file or directory
```

Surfaced from buymywishlist #260 retrigger where v0.27.2 wfctl + workflow-plugin-payments v0.3.1 hit this for the first real-world plugin-CLI dispatch.

Fix

Refactor `BuildCLIRegistry` to walk the plugins directory once, capturing both the dir name (for the install path) and the manifest name (for the binary file name):

```go
binaryPath := filepath.Join(pluginsDir, dirEntry, manifest.Name)
```

`LoadPluginManifests` is no longer used by this path because its keyed return collapses on `manifest.Name` and loses the dir name.

Tests

Test Coverage
`TestPluginCLIRegistry_DirVsManifestNameMismatch` dir=`payments` + manifest=`workflow-plugin-payments` (the bug); asserts BinaryPath joins both names correctly + the file exists
`TestPluginCLIRegistry_EmptyManifestNameUsesDirName` manifest.Name empty → fallback uses dir name for both registry PluginName and binary file
(existing) matching dir/manifest names continue to work; conflict + reserved name handling preserved

Verification

  • `GOWORK=off go build ./...` clean
  • `GOWORK=off go vet ./cmd/wfctl/` clean
  • `GOWORK=off go test ./cmd/wfctl/ -count=1 -run "TestPluginCLIRegistry|TestStaticCommand"` green

🤖 Generated with Claude Code

…name

PR #591 wired BuildCLIRegistry into main.go's dispatch fallback, but the
binary-path computation joined manifest.Name twice:

  binaryPath := filepath.Join(pluginsDir, pluginName, pluginName)

where pluginName comes from the manifest map key (= manifest.Name).

This works only when the install directory name matches the manifest
name. In practice setup-plugins composite + `wfctl plugin install` both
extract tarballs to short directory names — `data/plugins/payments`,
`data/plugins/digitalocean`, etc. — while the binary inside is named
after the manifest (`workflow-plugin-payments`). The path therefore
resolved to:

  data/plugins/workflow-plugin-payments/workflow-plugin-payments

which doesn't exist, so DispatchCLICommand reported a fork/exec
failure. Worse, when LookupCLICommand succeeded but Dispatch failed,
operators got a confusing "no such file" error rather than the
plugin's own help.

Refactor BuildCLIRegistry to walk the plugins directory once and
capture both the dir name (for the install path) and the manifest name
(for the binary file name):

  binaryPath := filepath.Join(pluginsDir, dirEntry, manifest.Name)

LoadPluginManifests is no longer used by this path because its keyed
return collapses on manifest.Name and loses the dir name.

Reproducer + regression tests:
  TestPluginCLIRegistry_DirVsManifestNameMismatch — short dir +
    full manifest name (the bug from buymywishlist#260 retrigger).
  TestPluginCLIRegistry_EmptyManifestNameUsesDirName — covers the
    fallback when manifest.Name is empty.

Local repro (pre-fix) reported:
  fork/exec /tmp/test-plugins/workflow-plugin-payments/workflow-plugin-payments:
  no such file or directory

Same plugin tree post-fix dispatches correctly (binary lives at
/tmp/test-plugins/payments/workflow-plugin-payments).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 10, 2026 05:56

Copilot AI 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.

Pull request overview

Fixes wfctl’s dynamic plugin-CLI dispatch so the plugin binary path is resolved using the installed directory name plus the manifest-declared binary name, instead of incorrectly assuming they match. This aligns wfctl with real-world plugin installation layouts where tarballs extract into short directory names but ship binaries named after plugin.json’s name.

Changes:

  • Refactors BuildCLIRegistry to scan plugin subdirectories and compute BinaryPath as <pluginsDir>/<dirName>/<manifestName> (with a dir-name fallback when manifest.name is empty).
  • Preserves reserved-command and conflict validation while keeping deterministic behavior via directory-name sorting.
  • Adds regression tests covering the dir-vs-manifest name mismatch and the empty-manifest-name fallback.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
cmd/wfctl/plugin_cli_commands.go Updates CLI registry construction to track both plugin install dir name and manifest name when computing plugin binary paths.
cmd/wfctl/plugin_cli_commands_test.go Adds tests and helpers to validate correct binary path resolution for mismatched dir/manifest names and for empty manifest names.

@github-actions

Copy link
Copy Markdown

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:262: parsing iteration count: invalid syntax
baseline-bench.txt:344837: parsing iteration count: invalid syntax
baseline-bench.txt:648567: parsing iteration count: invalid syntax
baseline-bench.txt:942052: parsing iteration count: invalid syntax
baseline-bench.txt:1254230: parsing iteration count: invalid syntax
baseline-bench.txt:1583760: parsing iteration count: invalid syntax
benchmark-results.txt:262: parsing iteration count: invalid syntax
benchmark-results.txt:353963: parsing iteration count: invalid syntax
benchmark-results.txt:619863: parsing iteration count: invalid syntax
benchmark-results.txt:960064: parsing iteration count: invalid syntax
benchmark-results.txt:1297922: parsing iteration count: invalid syntax
benchmark-results.txt:1605162: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4              3.469m ± 190%
ComponentLoad-4                    3.621m ±  10%
ComponentExecute-4                 1.990µ ±   2%
PoolContention/workers-1-4         1.093µ ±   3%
PoolContention/workers-2-4         1.093µ ±   3%
PoolContention/workers-4-4         1.097µ ±   1%
PoolContention/workers-8-4         1.101µ ±   1%
PoolContention/workers-16-4        1.097µ ±   1%
ComponentLifecycle-4               3.627m ±   1%
SourceValidation-4                 2.322µ ±   0%
RegistryConcurrent-4               824.0n ±  13%
LoaderLoadFromString-4             3.634m ±   1%
geomean                            17.78µ

                            │ 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

cpu: AMD EPYC 9V74 80-Core Processor                
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                 3.236m ± 187%
ComponentLoad-4                       3.473m ±   1%
ComponentExecute-4                    1.850µ ±   2%
PoolContention/workers-1-4            1.020µ ±   3%
PoolContention/workers-2-4            1.013µ ±   3%
PoolContention/workers-4-4            1.019µ ±   1%
PoolContention/workers-8-4            1.012µ ±   2%
PoolContention/workers-16-4           1.023µ ±   1%
ComponentLifecycle-4                  3.480m ±   1%
SourceValidation-4                    2.075µ ±   1%
RegistryConcurrent-4                  732.1n ±   4%
LoaderLoadFromString-4                3.521m ±   0%
geomean                               16.55µ

                            │ 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

pkg: github.com/GoCodeAlone/workflow/middleware
cpu: AMD EPYC 7763 64-Core Processor                
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                  285.9n ± 4%
CircuitBreakerExecution_Success-4          21.54n ± 0%
CircuitBreakerExecution_Failure-4          66.21n ± 0%
geomean                                    74.16n

                                  │ 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

cpu: AMD EPYC 9V74 80-Core Processor                
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                     300.3n ± 4%
CircuitBreakerExecution_Success-4             22.68n ± 0%
CircuitBreakerExecution_Failure-4             70.91n ± 0%
geomean                                       78.46n

                                  │ 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

pkg: github.com/GoCodeAlone/workflow/module
cpu: AMD EPYC 7763 64-Core Processor                
                                 │ baseline-bench.txt │
                                 │       sec/op       │
JQTransform_Simple-4                     893.9n ± 26%
JQTransform_ObjectConstruction-4         1.477µ ±  2%
JQTransform_ArraySelect-4                3.292µ ±  0%
JQTransform_Complex-4                    37.95µ ±  0%
JQTransform_Throughput-4                 1.794µ ±  1%
SSEPublishDelivery-4                     65.56n ±  1%
geomean                                  1.639µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
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      │
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                
                                 │ benchmark-results.txt │
                                 │        sec/op         │
JQTransform_Simple-4                        830.5n ± 27%
JQTransform_ObjectConstruction-4            1.394µ ±  0%
JQTransform_ArraySelect-4                   3.344µ ±  1%
JQTransform_Complex-4                       40.82µ ±  0%
JQTransform_Throughput-4                    1.716µ ±  0%
SSEPublishDelivery-4                        64.55n ±  1%
geomean                                     1.611µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
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       │
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                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                   1.099µ ±  2%
SchemaValidation_AllFields-4                1.704µ ± 19%
SchemaValidation_FormatValidation-4         1.584µ ±  2%
SchemaValidation_ManySchemas-4              1.811µ ±  2%
geomean                                     1.522µ

                                    │ 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

cpu: AMD EPYC 9V74 80-Core Processor                
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                      1.126µ ± 11%
SchemaValidation_AllFields-4                   1.664µ ±  1%
SchemaValidation_FormatValidation-4            1.593µ ±  2%
SchemaValidation_ManySchemas-4                 1.585µ ±  1%
geomean                                        1.474µ

                                    │ 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

pkg: github.com/GoCodeAlone/workflow/store
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.225µ ± 18%
EventStoreAppend_SQLite-4                  1.310m ±  3%
GetTimeline_InMemory/events-10-4           13.78µ ±  3%
GetTimeline_InMemory/events-50-4           77.11µ ± 20%
GetTimeline_InMemory/events-100-4          124.0µ ±  0%
GetTimeline_InMemory/events-500-4          639.1µ ±  3%
GetTimeline_InMemory/events-1000-4         1.303m ±  1%
GetTimeline_SQLite/events-10-4             115.2µ ±  1%
GetTimeline_SQLite/events-50-4             256.1µ ±  2%
GetTimeline_SQLite/events-100-4            419.7µ ±  0%
GetTimeline_SQLite/events-500-4            1.803m ±  2%
GetTimeline_SQLite/events-1000-4           3.497m ±  0%
geomean                                    221.2µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  833.0 ± 4%
EventStoreAppend_SQLite-4                  1.984Ki ± 3%
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.64Ki

                                   │ 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

cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.040µ ±  9%
EventStoreAppend_SQLite-4                     1.023m ±  2%
GetTimeline_InMemory/events-10-4              12.87µ ±  4%
GetTimeline_InMemory/events-50-4              62.77µ ± 20%
GetTimeline_InMemory/events-100-4             112.7µ ±  1%
GetTimeline_InMemory/events-500-4             578.4µ ±  0%
GetTimeline_InMemory/events-1000-4            1.181m ±  0%
GetTimeline_SQLite/events-10-4                84.90µ ±  0%
GetTimeline_SQLite/events-50-4                223.7µ ±  0%
GetTimeline_SQLite/events-100-4               389.5µ ±  1%
GetTimeline_SQLite/events-500-4               1.707m ±  0%
GetTimeline_SQLite/events-1000-4              3.313m ±  1%
geomean                                       193.6µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                    762.0 ± 14%
EventStoreAppend_SQLite-4                    1.985Ki ±  1%
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.14Ki

                                   │ 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

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

@intel352 intel352 merged commit ff87615 into main May 10, 2026
22 checks passed
@intel352 intel352 deleted the fix/cli-registry-binary-path branch May 10, 2026 06:12
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