Skip to content

feat(wfctl): lockfile dep tracking + always-track plain installs (workflow#771)#772

Merged
intel352 merged 16 commits into
mainfrom
feat/771-lockfile-deps
May 24, 2026
Merged

feat(wfctl): lockfile dep tracking + always-track plain installs (workflow#771)#772
intel352 merged 16 commits into
mainfrom
feat/771-lockfile-deps

Conversation

@intel352
Copy link
Copy Markdown
Contributor

Summary

Closes workflow#771. Extends wfctl plugin install to track transitively-installed deps in .wfctl-lock.yaml (both legacy + new-format) AND always-track plain install <name> (drops @version gate). Preserves installFromLockfile / installFromWfctlLockfile no-clobber contracts via chokepoint guard inside updateLockfileWithChecksum.

Architecture

Per cycle-5 chokepoint pattern + cycle-4 mutually-exclusive format paths:

  • mergeIntoNewFormatLockfile helper preserves Platforms / Compatibility; handles real-world long-form keys via normalized-equivalent scan; returns bool to gate legacy fallback.
  • updateLockfileWithChecksum checks installSkipLockfileUpdate flag at TOP (single chokepoint covers all 5 call sites). V1 format takes precedence (returns after v1 write); legacy fallback only when v1 absent.
  • Outer-frame installers (installFromLockfile, installFromWfctlLockfile) set+defer-clear flag at function scope — protects against inner installs clobbering pinned entries before checksum verification.
  • resolveDependencies + installPluginReqDirect newly call updateLockfileWithChecksum; installPluginFromManifest (the dep install path) doesn't write lockfile on its own.

Test plan

  • GOWORK=off go test -count=1 -timeout 300s ./cmd/wfctl/... — PASS (113s)
  • GOWORK=off go vet ./... — clean
  • golangci-lint run ./cmd/wfctl/... — 0 issues
  • wfctl plugin install --help — help text correct
  • CI green

Design + plan

Iterated through 5 design cycles + 4 plan cycles + alignment-check + scope-lock:

  • docs/plans/2026-05-24-lockfile-deps-design.md (cycle 5 PASS adversarial)
  • docs/plans/2026-05-24-lockfile-deps.md (cycle 4 PASS adversarial + alignment PASS + Locked 2026-05-24T08:57:59Z)

Implementer deviations (minor)

  1. Task 3 Step 2 expected TestInstallFromLockfile_NoClobberInvariant to FAIL pre-implementation; it PASSED because mergeIntoNewFormatLockfile's preservation semantics (Source preserved when empty; Platforms never touched) make the inner write a no-op for the test's pinned data. Test remains as regression check; guard IS correctly installed.
  2. Task 4 test fixture used depa instead of depA (lowercase per verifyInstalledPlugin name regex). No functional impact.

Reviewer override (cycle 1 plan)

Plan-phase reviewer cycle 1 flagged Tasks 4+5 as redundant claiming line-846 is in installPluginFromManifest. Verified factually wrong: line 846 lives inside installFromURL (lines 760+); installPluginFromManifest body (325-431) contains zero updateLockfileWithChecksum calls. Tasks 4+5 are necessary. Override documented in plan.

Out of scope (deferred follow-ups)

  • wfctl plugin remove lockfile cleanup
  • Repository fallback URL construction for empty manifest entries
  • Platforms-data backfill for newly-tracked deps
  • --no-lock user-facing opt-out flag
  • Concurrent-wfctl lockfile race handling

intel352 added 16 commits May 24, 2026 04:19
Extends resolveDependencies to call updateLockfileWithChecksum after each dep install (was: only parent tracked). Also drops the name@version gate so plain 'install <name>' captures resolved registry version. Closes #771 ACs.
Cycle 1 FAIL: 2 Critical (C1 early-return no-op on new-format dominant case; C2 dropped gate breaks installFromLockfile no-clobber contract).

Cycle 2:
- Refactor updateLockfileWithChecksum to fan out to BOTH legacy + new-format paths; preserve Platforms data on new-format merge.
- Replace gate with installSkipLockfileUpdate package-level flag set+deferred by installFromLockfile (preserves no-clobber).
- Document Repository field gap; defer fallback construction.
- Test plan splits legacy + new-format scenarios; regression test for installFromLockfile invariant.
…tallPluginReqDirect)

Cycle 2 FAIL: 1 Critical + 1 Important. Cycle 3:
- C3: installSkipLockfileUpdate guard around installFromWfctlLockfile's runPluginInstall fallback call (mirror of cycle-2 fix for legacy installFromLockfile).
- I4: append updateLockfileWithChecksum to installPluginReqDirect's parent install (closes user-intent asymmetry: --from-config deps were tracked, parents weren't).
- Test plan §e + §f added for both regression coverage.
…Checksum chokepoint)

Cycle 4 FAIL: 1 Critical (gate at runPluginInstall:256 inert for line-86 installFromURL path which writes lockfile at 846). Cycle 5 adopts reviewer Option 1: gate INSIDE updateLockfileWithChecksum. Single chokepoint; all 5 call sites (256/846/934/dep-recursion/installPluginReqDirect) auto-respect. Resolves C1 + I6 together.
6 tasks, 1 PR. Chokepoint guard at top of updateLockfileWithChecksum + fan-out to both legacy + new-format lockfile + outer-frame guards in installFromLockfile/installFromWfctlLockfile + dep tracking in resolveDependencies + parent tracking in installPluginReqDirect.
Cycle 1 FAIL: 2 Critical. Cycle 2:
- C1 OVERRIDDEN: line 846 is in installFromURL (760+), NOT installPluginFromManifest (325-431). installPluginFromManifest verified to NOT call updateLockfileWithChecksum. Tasks 4+5 ARE necessary; reviewer misread. Override documented inline.
- C2 ACCEPTED: each task's Step 1.5 added — rewrite tests to invoke actual production entrypoints via httptest pattern (precedent at plugin_install_lockfile_test.go:38+).
- Task 2 Step 4 wrong commentary corrected (test survives via mergeIntoNewFormatLockfile's preservation, not Task 3 guards).
- Task 3 Step 3 anon-func wrap explicitly picked.
- Task 1 var comment: t.Parallel() warning.
- Task 5 variable names pre-resolved.
… normalized name)

Cycle 2 FAIL: 2 Critical (test snippets use const assignment; anon-func wrapper breaks continue) + 4 Important. Cycle 3:
- CYC2-C1: tests use os.Chdir(dir) pattern (precedent at existing tests:30/95/160) instead of reassigning const wfctlLockPath.
- CYC2-C2: Task 3 installFromWfctlLockfile uses FUNCTION-SCOPE guard (set+defer at top of function), not anon-func-per-iter (illegal continue inside func literal).
- CYC2-I1: Task 5 uses normalized pluginName (line 87) for both hash path AND lockfile key, not raw req.Name.
- CYC2-I3: test name reference fixed to existing TestRunPluginInstall_DoesNotRewriteNewFormatLockfile.
…lization)

Cycle 3 FAIL: 2 Critical (CYC3-C1: legacy Save wipes Platforms via PluginLockEntry lacking field; CYC3-C2: helper doesn't normalize keys → duplicate short/long-form entries). Cycle 4:
- Mutually-exclusive format paths: if v1 lockfile present, write ONLY v1 (returns true; skip legacy). Legacy write only when v1 absent. Restores Platforms protection that the dropped early-return provided.
- mergeIntoNewFormatLockfile returns bool + scans for normalized-equivalent existing key when exact match missing (handles real-world long-form lockfile keys).
- Task 4 dep tracking normalizes depKey for both hash path AND lockfile key (CYC3-I1).
- Task 3 installFromLockfile guard moved to function scope (CYC3-I2; mirrors installFromWfctlLockfile fix).
…d comment)

Adversarial PASS cycle 4 with 3 micro-edit Importants. Apply inline:
- I1 Option (b): Task 4 uses raw dep.Name for hash + lockfile key (matches un-normalized install at line 268). Reverts cycle-4's normalize-only-on-write asymmetry.
- I3 Option (a): documentary note in installFromWfctlLockfile about dep auto-pin suppression under function-scope guard.
- I2: dep entries always short-form (already documented behavior; existing runPluginInstall:257 pattern).
@codecov
Copy link
Copy Markdown

codecov Bot commented May 24, 2026

Codecov Report

❌ Patch coverage is 76.47059% with 12 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
cmd/wfctl/plugin_deps.go 64.70% 3 Missing and 3 partials ⚠️
cmd/wfctl/plugin_lockfile.go 83.33% 3 Missing and 1 partial ⚠️
cmd/wfctl/plugin_install.go 75.00% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

@intel352 intel352 merged commit f434205 into main May 24, 2026
22 checks passed
@intel352 intel352 deleted the feat/771-lockfile-deps branch May 24, 2026 09:22
@github-actions
Copy link
Copy Markdown

⏱ 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:305836: parsing iteration count: invalid syntax
baseline-bench.txt:572414: parsing iteration count: invalid syntax
baseline-bench.txt:829095: parsing iteration count: invalid syntax
baseline-bench.txt:1157920: parsing iteration count: invalid syntax
baseline-bench.txt:1498262: parsing iteration count: invalid syntax
benchmark-results.txt:276: parsing iteration count: invalid syntax
benchmark-results.txt:375139: parsing iteration count: invalid syntax
benchmark-results.txt:641126: parsing iteration count: invalid syntax
benchmark-results.txt:914325: parsing iteration count: invalid syntax
benchmark-results.txt:1308415: parsing iteration count: invalid syntax
benchmark-results.txt:1608026: 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               7.065m ± 56%
ComponentLoad-4                     3.572m ±  9%
ComponentExecute-4                  1.907µ ±  2%
PoolContention/workers-1-4          1.073µ ±  2%
PoolContention/workers-2-4          1.086µ ±  2%
PoolContention/workers-4-4          1.089µ ±  1%
PoolContention/workers-8-4          1.075µ ±  3%
PoolContention/workers-16-4         1.085µ ±  5%
ComponentLifecycle-4                3.576m ±  0%
SourceValidation-4                  2.296µ ±  1%
RegistryConcurrent-4                792.8n ±  3%
LoaderLoadFromString-4              3.603m ±  1%
geomean                             18.56µ

                            │ 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: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                  9.402m ± 64%
ComponentLoad-4                        3.717m ±  3%
ComponentExecute-4                     1.975µ ±  3%
PoolContention/workers-1-4             1.225µ ±  2%
PoolContention/workers-2-4             1.228µ ±  0%
PoolContention/workers-4-4             1.227µ ±  2%
PoolContention/workers-8-4             1.199µ ±  1%
PoolContention/workers-16-4            1.199µ ±  2%
ComponentLifecycle-4                   3.532m ±  4%
SourceValidation-4                     2.273µ ±  1%
RegistryConcurrent-4                   935.2n ±  4%
LoaderLoadFromString-4                 3.540m ±  2%
geomean                                20.29µ

                            │ 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                  293.9n ± 8%
CircuitBreakerExecution_Success-4          21.52n ± 0%
CircuitBreakerExecution_Failure-4          66.33n ± 0%
geomean                                    74.86n

                                  │ 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: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                     453.7n ± 3%
CircuitBreakerExecution_Success-4             59.80n ± 2%
CircuitBreakerExecution_Failure-4             64.99n ± 0%
geomean                                       120.8n

                                  │ 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              307.4n ± 11%
IaCStateBackend_GRPC-4                   9.601m ± 10%
JQTransform_Simple-4                     660.8n ± 35%
JQTransform_ObjectConstruction-4         1.489µ ±  1%
JQTransform_ArraySelect-4                3.435µ ±  1%
JQTransform_Complex-4                    38.91µ ±  1%
JQTransform_Throughput-4                 1.864µ ±  2%
SSEPublishDelivery-4                     64.44n ±  4%
geomean                                  3.833µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
IaCStateBackend_InProcess-4              416.0 ± 0%
IaCStateBackend_GRPC-4                 5.942Mi ± 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.839k ± 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: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                 │ benchmark-results.txt │
                                 │        sec/op         │
IaCStateBackend_InProcess-4                 348.2n ± 29%
IaCStateBackend_GRPC-4                      9.895m ±  2%
JQTransform_Simple-4                        706.6n ± 30%
JQTransform_ObjectConstruction-4            1.534µ ±  1%
JQTransform_ArraySelect-4                   3.384µ ±  2%
JQTransform_Complex-4                       36.88µ ±  0%
JQTransform_Throughput-4                    1.845µ ±  1%
SSEPublishDelivery-4                        76.32n ±  1%
geomean                                     4.000µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
IaCStateBackend_InProcess-4                416.0 ±  0%
IaCStateBackend_GRPC-4                   5.679Mi ± 16%
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.879k ± 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.105µ ±  2%
SchemaValidation_AllFields-4                1.663µ ± 20%
SchemaValidation_FormatValidation-4         1.593µ ±  1%
SchemaValidation_ManySchemas-4              1.850µ ±  2%
geomean                                     1.525µ

                                    │ 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: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                      1.051µ ± 12%
SchemaValidation_AllFields-4                   1.536µ ±  5%
SchemaValidation_FormatValidation-4            1.497µ ±  1%
SchemaValidation_ManySchemas-4                 1.480µ ±  1%
geomean                                        1.375µ

                                    │ 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.176µ ± 22%
EventStoreAppend_SQLite-4                  1.283m ±  7%
GetTimeline_InMemory/events-10-4           13.58µ ±  3%
GetTimeline_InMemory/events-50-4           62.87µ ±  1%
GetTimeline_InMemory/events-100-4          125.6µ ±  1%
GetTimeline_InMemory/events-500-4          645.7µ ±  0%
GetTimeline_InMemory/events-1000-4         1.324m ±  1%
GetTimeline_SQLite/events-10-4             105.7µ ±  1%
GetTimeline_SQLite/events-50-4             247.8µ ±  1%
GetTimeline_SQLite/events-100-4            423.9µ ±  0%
GetTimeline_SQLite/events-500-4            1.824m ±  1%
GetTimeline_SQLite/events-1000-4           3.545m ±  1%
geomean                                    215.3µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  826.0 ± 8%
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.60Ki

                                   │ 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: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.151µ ± 18%
EventStoreAppend_SQLite-4                     1.016m ±  6%
GetTimeline_InMemory/events-10-4              13.29µ ±  4%
GetTimeline_InMemory/events-50-4              69.13µ ± 13%
GetTimeline_InMemory/events-100-4             118.6µ ±  0%
GetTimeline_InMemory/events-500-4             604.6µ ±  1%
GetTimeline_InMemory/events-1000-4            1.234m ±  2%
GetTimeline_SQLite/events-10-4                83.70µ ±  1%
GetTimeline_SQLite/events-50-4                239.4µ ±  3%
GetTimeline_SQLite/events-100-4               435.1µ ±  1%
GetTimeline_SQLite/events-500-4               1.936m ±  1%
GetTimeline_SQLite/events-1000-4              3.833m ±  4%
geomean                                       206.9µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     823.5 ± 6%
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.58Ki

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

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.

wfctl plugin install: track transitively-installed dependencies in .wfctl-lock.yaml

1 participant