Skip to content

feat(sdk+wfctl): ResolveBuildVersion + WithBuildVersion + plugin validate-contract (#758 Layer 1)#759

Merged
intel352 merged 16 commits into
mainfrom
feat/758-plugin-version-ldflag
May 23, 2026
Merged

feat(sdk+wfctl): ResolveBuildVersion + WithBuildVersion + plugin validate-contract (#758 Layer 1)#759
intel352 merged 16 commits into
mainfrom
feat/758-plugin-version-ldflag

Conversation

@intel352
Copy link
Copy Markdown
Contributor

Summary

Layer 1 of workflow#758 — SDK + wfctl foundation that enables per-plugin migration in Layer 3 (deferred to follow-up PRs).

SDK additions

  • sdk.ResolveBuildVersion(declared string) — returns declared when non-empty and not a dev sentinel (typical for goreleaser-built binaries where the ldflag injects the release tag), else consults runtime/debug.ReadBuildInfo() and returns (devel) [@ shortsha[.dirty]] for local builds. Mirrors the pattern wfctl itself uses at cmd/wfctl/main.go:37-50.
  • IaCServeOptions.BuildVersion string field — populates the iacPluginServiceBridge's runtime version, overriding diskManifest.Version in GetManifest.
  • sdk.WithBuildVersion(string) ServeOption — same single-channel precedence for non-IaC plugins via sdk.Serve.

Both bridges now augment GetManifest: if buildVersion is non-empty, it overrides whichever Version came from disk/embedded manifest. Single-channel precedence; explicit + unit-tested.

wfctl: plugin validate-contract subcommand

  • Always checks: plugin.json valid + populated capabilities/minEngineVersion + main.go wires sdk.ResolveBuildVersion via IaCServeOptions.BuildVersion or sdk.WithBuildVersion + .goreleaser.{yaml,yml} carries -X .*\.Version= ldflag.
  • --for-publish: resolved tag (--tag flag > $GITHUB_REF_NAME > git describe) must match strict-semver ^v\d+\.\d+\.\d+$. Prerelease tags rejected; engine ParseSemver doesn't accept them.
  • --release-dir <path>: assert <path>/plugin.json.version equals --tag (minus leading v) — post-goreleaser tarball verification.

Eliminates a curl|bash supply-chain risk that an earlier design proposed (separate check-plugin-contract.sh delivered via raw.githubusercontent.com); collapses into the wfctl binary plugin authors already install via setup-wfctl@v1.

Docs

  • docs/PLUGIN_RELEASE_GATES.md — operator + plugin-author-facing reference: contract, release.yml two-step gate pattern (pre-build static checks + post-build tarball verify), migration checklist.

Out of scope (this PR)

  • Layer 2 (workflow-registry tag-string semver gate in sync-versions.sh) — separate PR.
  • Layer 3 (per-plugin migration — delete sync-plugin-version.yml + sentinel committed version + wire ResolveBuildVersion + release.yml gates). Pilot covers 5 repos (DO, AWS, GCP, Azure, github); remaining 56 deferred to follow-up issue.

Test plan

  • GOWORK=off go test ./plugin/external/sdk/... ./cmd/wfctl/ -count=1 — green
  • TestResolveBuildVersion_* (5 tests covering pass-through + 3 sentinels + non-standard declared)
  • TestIaCBridgeGetManifest_BuildVersionOverridesDiskVersion + _BuildVersionOnlyNoDisk
  • TestGetManifest_BuildVersionOverridesDiskVersion + _BuildVersionOverridesProviderVersion + TestWithBuildVersion_OptionSetsField
  • TestRunPluginValidateContract_* (9 tests: good + bad-missing-caps + bad-missing-ldflag + good-tag + prerelease-tag-fails + non-semver-tag-fails + release-dir-good + release-dir-stale-fails + GITHUB_REF_NAME-fallback + missing-arg)

Rollback

Pure-additive: SDK fields/methods are new; existing plugins that don't use BuildVersion keep current GetManifest behavior. wfctl plugin validate-contract is a new subcommand; existing wfctl plugin validate unchanged. Revert is single git revert.

🤖 Generated with Claude Code

intel352 added 15 commits May 23, 2026 12:17
Cycle 1 surfaced 3 Critical defects in the original ldflag-injected
design. Pivot to a much smaller scope per reviewer's Options 1+4:

- KEEP version field in committed plugin.json (registry depends on it via
  sync-versions.sh:122 and downloads[].url version-tagged paths)
- Replace sync-plugin-version.yml PR-opening with direct-push-to-main
  (or auto-merge variant for stricter repos)
- Add tag-format semver gate (whitelist alpha|beta|rc pre-releases) in
  each release.yml as a first step
- Add same gate in workflow-registry ingest as defense in depth

No engine changes. No plugin SDK changes. No cross-version compatibility
cliffs. Cycle-1 C1/C2/C3 + I1-I7 collapsed by not dropping the field.
…le 2 (workflow#758)

- NC1 addressed: §4 adds sdk.ResolveBuildVersion + IaCServeOptions.BuildVersion contract + check-plugin-contract.sh lint
- NC2 addressed: ResolveBuildVersion uses runtime/debug.ReadBuildInfo for test-build branch-nature surfacing
- NI1 addressed: regex widened to (alpha|beta|rc)\.?[0-9]+ (rc1 + rc.1)
- NI2 addressed: concurrency group on workflows + git pull --ff-only before commit in direct-push
- NI3 addressed: registry gate validates tag string (same source as release.yml gate)
- NI4 addressed: 24-row plugin audit table in migration plan; variant choice (direct-push|auto-merge) enumerated per-repo
…orization (workflow#758)

Cycle 1 found 6 Critical + 9 Important against the plan. Audit table is
factually wrong on 8 of 23 listed plugin repos (missing release pipelines).
sdk.Serve gap for non-IaC plugins. curl|bash supply-chain risk. branch-
nature unmet on go test path. Rebuilding the audit + rescoping is a
user-intent-line decision; pause until user returns to authorize rework
direction.
…contract (workflow#758)

Per user direction post plan-cycle-1: collapse to delete-sync-workflow +
wfctl subcommand for contract gate. Eliminates curl|bash (C4),
audit-mismatch (C1), sdk.Serve gap (C3) by removing the sync-mechanism
entirely. Sentinel committed version (v0.0.0-dev) keeps PluginManifest
Validate happy; goreleaser before-hook still writes correct version into
shipped tarball; registry derives version from upstream tag (verified
sync-versions.sh:122,125,169). No engine change, no manifest schema
break.
…rsion() no-arg (workflow#758)

C1 fix: sentinel changed v0.0.0-dev → 0.0.0 (verified parses through strict
ParseSemver; v0.0.0-dev was rejected as reviewer empirically demonstrated).
C2 fix: tag regex tightened to ^v\d+\.\d+\.\d+$ — no prereleases since
engine ParseSemver rejects them.
C3 fix: sdk.BuildVersion() no-arg helper uses runtime/debug.ReadBuildInfo
directly; eliminates internal.Version symbol-path variance across repos.
I1/I2/I4/I5/I6 addressed; I3 acknowledged out-of-scope.
…tch *grpcServer (workflow#758)

N-C1 fix: restored sdk.ResolveBuildVersion(declared) arg-taking helper.
Verified goreleaser uses go build (not go install), so Main.Version is
pseudo-version, not the tag. Ldflag is the only correct mechanism.
N-C2 fix: §6 swept for consistent vocabulary (sentinel 0.0.0; arg-taking
helper; ldflag verify present; Version-var-name variance documented).
N-I1 fix: design now references actual *grpcServer struct + buildVersion
field on it (mirroring diskManifest).
N-I2 fix: explicit GetManifest code blocks for both grpc_server.go and
iacserver.go showing single-channel precedence.
N-I3 fix: --release-dir flag added to validate-contract; Layer 3 release
.yml gains post-build tarball verification step.
I1: post-build verify step placement clarified (between goreleaser + Publish)
I2: hard-ordering gate documented for v0.61.0 tag → Layer 3 dispatch
I3: Task 7 github clarified (current main.go has no ServeOption; migration adds first)
I4: pre-flight audit grep updated to accept Serve|ServeIaCPlugin
I5: AWS Task 4 spells out var-existence audit + import-add requirement
I6: validate-contract rule 4 spec'd as whole-file scoped + multi-binary repos
…uildVersion (#758)

- New sdk.ResolveBuildVersion(declared) helper: pass-through for non-sentinel
  declared values (typical for goreleaser-injected ldflag tag); fallback to
  runtime/debug.ReadBuildInfo() (devel + VCS shortsha) for empty/dev sentinels
- IaCServeOptions.BuildVersion field + iacPluginServiceBridge.buildVersion
  + GetManifest single-channel precedence: BuildVersion wins over diskManifest
- WithBuildVersion(string) ServeOption + grpcServer.buildVersion + identical
  precedence in grpcServer.GetManifest
- Unit tests for all precedence cases (BuildVersion override, no-disk path,
  ServeOption wiring) + ResolveBuildVersion sentinel/pass-through coverage

No existing API breaks: BuildVersion field is additive on IaCServeOptions;
WithBuildVersion is a new ServeOption; plugins that don't use either keep
existing GetManifest behavior. Closes part of workflow#758.
…ES.md (#758)

New 'wfctl plugin validate-contract' subcommand:
- Always: plugin.json valid + capabilities + minEngineVersion + main.go
  wires sdk.ResolveBuildVersion via IaCServeOptions.BuildVersion or
  sdk.WithBuildVersion + goreleaser ldflag -X *.Version=
- --for-publish: strict-semver tag (^v\d+\.\d+\.\d+$); resolves from
  --tag flag > $GITHUB_REF_NAME > git describe
- --release-dir: assert tarball plugin.json.version equals --tag (post-build)

Eliminates curl|bash supply-chain risk by collapsing the contract-check
script into the binary plugin authors already install via setup-wfctl.

Test coverage: good fixture passes; bad-missing-caps + bad-missing-ldflag +
prerelease tag + non-semver tag + release-dir-stale all fail; GITHUB_REF_NAME
fallback verified.

PLUGIN_RELEASE_GATES.md documents the full contract + migration checklist.
@codecov
Copy link
Copy Markdown

codecov Bot commented May 23, 2026

Codecov Report

❌ Patch coverage is 76.16580% with 46 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
cmd/wfctl/plugin_validate_contract.go 75.91% 18 Missing and 15 partials ⚠️
plugin/external/sdk/buildversion.go 52.17% 10 Missing and 1 partial ⚠️
cmd/wfctl/plugin.go 33.33% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 23, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:276: parsing iteration count: invalid syntax
baseline-bench.txt:313564: parsing iteration count: invalid syntax
baseline-bench.txt:632417: parsing iteration count: invalid syntax
baseline-bench.txt:926205: parsing iteration count: invalid syntax
baseline-bench.txt:1206409: parsing iteration count: invalid syntax
baseline-bench.txt:1496657: parsing iteration count: invalid syntax
benchmark-results.txt:276: parsing iteration count: invalid syntax
benchmark-results.txt:348052: parsing iteration count: invalid syntax
benchmark-results.txt:598772: parsing iteration count: invalid syntax
benchmark-results.txt:874890: parsing iteration count: invalid syntax
benchmark-results.txt:1182487: parsing iteration count: invalid syntax
benchmark-results.txt:1472786: 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               8.421m ± 62%
ComponentLoad-4                     3.855m ±  2%
ComponentExecute-4                  1.980µ ±  2%
PoolContention/workers-1-4          1.115µ ±  3%
PoolContention/workers-2-4          1.114µ ±  1%
PoolContention/workers-4-4          1.104µ ±  1%
PoolContention/workers-8-4          1.110µ ±  1%
PoolContention/workers-16-4         1.104µ ±  0%
ComponentLifecycle-4                3.700m ±  1%
SourceValidation-4                  2.371µ ±  0%
RegistryConcurrent-4                816.4n ±  3%
LoaderLoadFromString-4              3.746m ±  2%
geomean                             19.43µ

                            │ 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                  6.433m ± 78%
ComponentLoad-4                        3.585m ±  1%
ComponentExecute-4                     1.831µ ±  4%
PoolContention/workers-1-4             1.026µ ±  3%
PoolContention/workers-2-4             1.027µ ±  2%
PoolContention/workers-4-4             1.022µ ±  4%
PoolContention/workers-8-4             1.028µ ±  1%
PoolContention/workers-16-4            1.025µ ±  2%
ComponentLifecycle-4                   3.648m ±  4%
SourceValidation-4                     2.097µ ±  1%
RegistryConcurrent-4                   737.7n ±  1%
LoaderLoadFromString-4                 3.596m ±  3%
geomean                                17.74µ

                            │ 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                  287.1n ± 4%
CircuitBreakerExecution_Success-4          21.33n ± 0%
CircuitBreakerExecution_Failure-4          66.80n ± 0%
geomean                                    74.23n

                                  │ 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                     296.9n ± 4%
CircuitBreakerExecution_Success-4             22.71n ± 2%
CircuitBreakerExecution_Failure-4             71.11n ± 0%
geomean                                       78.27n

                                  │ 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       │
IaCStateBackend_InProcess-4              311.3n ± 27%
IaCStateBackend_GRPC-4                   9.560m ±  3%
JQTransform_Simple-4                     665.1n ± 38%
JQTransform_ObjectConstruction-4         1.526µ ±  1%
JQTransform_ArraySelect-4                3.567µ ±  2%
JQTransform_Complex-4                    39.99µ ±  2%
JQTransform_Throughput-4                 1.901µ ±  2%
SSEPublishDelivery-4                     64.12n ±  7%
geomean                                  3.891µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
IaCStateBackend_InProcess-4              416.0 ± 0%
IaCStateBackend_GRPC-4                 5.926Mi ± 8%
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.836k ± 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                
                                 │ benchmark-results.txt │
                                 │        sec/op         │
IaCStateBackend_InProcess-4                 301.7n ± 29%
IaCStateBackend_GRPC-4                      10.23m ±  2%
JQTransform_Simple-4                        656.0n ± 30%
JQTransform_ObjectConstruction-4            1.434µ ±  1%
JQTransform_ArraySelect-4                   3.512µ ±  2%
JQTransform_Complex-4                       42.19µ ±  1%
JQTransform_Throughput-4                    1.769µ ±  0%
SSEPublishDelivery-4                        64.17n ±  2%
geomean                                     3.855µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
IaCStateBackend_InProcess-4                416.0 ±  0%
IaCStateBackend_GRPC-4                   5.848Mi ± 14%
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.862k ± 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

pkg: github.com/GoCodeAlone/workflow/schema
cpu: AMD EPYC 7763 64-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                   1.091µ ± 11%
SchemaValidation_AllFields-4                1.675µ ±  3%
SchemaValidation_FormatValidation-4         1.593µ ±  4%
SchemaValidation_ManySchemas-4              1.819µ ±  2%
geomean                                     1.517µ

                                    │ 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.094µ ± 11%
SchemaValidation_AllFields-4                   1.642µ ±  5%
SchemaValidation_FormatValidation-4            1.585µ ±  3%
SchemaValidation_ManySchemas-4                 1.597µ ±  2%
geomean                                        1.460µ

                                    │ 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.184µ ± 11%
EventStoreAppend_SQLite-4                  1.413m ±  7%
GetTimeline_InMemory/events-10-4           13.93µ ±  4%
GetTimeline_InMemory/events-50-4           76.91µ ±  2%
GetTimeline_InMemory/events-100-4          151.7µ ± 18%
GetTimeline_InMemory/events-500-4          635.5µ ±  1%
GetTimeline_InMemory/events-1000-4         1.295m ±  4%
GetTimeline_SQLite/events-10-4             108.5µ ±  1%
GetTimeline_SQLite/events-50-4             250.6µ ±  1%
GetTimeline_SQLite/events-100-4            425.9µ ±  1%
GetTimeline_SQLite/events-500-4            1.837m ±  2%
GetTimeline_SQLite/events-1000-4           3.669m ±  2%
geomean                                    225.7µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  816.0 ± 9%
EventStoreAppend_SQLite-4                  1.986Ki ± 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.53Ki

                                   │ 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.175µ ± 15%
EventStoreAppend_SQLite-4                     1.080m ±  4%
GetTimeline_InMemory/events-10-4              13.09µ ±  3%
GetTimeline_InMemory/events-50-4              72.36µ ±  2%
GetTimeline_InMemory/events-100-4             116.4µ ± 17%
GetTimeline_InMemory/events-500-4             596.3µ ±  2%
GetTimeline_InMemory/events-1000-4            1.221m ±  1%
GetTimeline_SQLite/events-10-4                90.08µ ±  4%
GetTimeline_SQLite/events-50-4                238.0µ ±  2%
GetTimeline_SQLite/events-100-4               413.8µ ±  1%
GetTimeline_SQLite/events-500-4               1.781m ±  1%
GetTimeline_SQLite/events-1000-4              3.453m ±  1%
geomean                                       205.1µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                    782.0 ± 10%
EventStoreAppend_SQLite-4                    1.985Ki ±  0%
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.29Ki

                                   │ 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.

…ct (#758)

Lint nilerr: returned nil when werr was non-nil. Propagate werr instead so
permission errors / broken symlinks surface as walk errors.
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