Skip to content

feat(iac): capability extension — canonical_keys + compute_plan_version (ADR-0029)#619

Merged
intel352 merged 1 commit into
mainfrom
feat/capability-extension-canonical-keys
May 10, 2026
Merged

feat(iac): capability extension — canonical_keys + compute_plan_version (ADR-0029)#619
intel352 merged 1 commit into
mainfrom
feat/capability-extension-canonical-keys

Conversation

@intel352
Copy link
Copy Markdown
Contributor

Summary

Closes the SupportedCanonicalKeys + ComputePlanVersionDeclarer regressions left open by the strict-contracts force-cutover (ADRs 0024-0028) per the deferred option-d follow-up agreed during Task 30 + Task 17 reviews.

Proto — adds 2 optional fields to CapabilitiesResponse:

  • canonical_keys (repeated string): provider-level override of interfaces.CanonicalKeys() default. DO plugin override path restored.
  • compute_plan_version (string): provider-level apply-time dispatch version. *typedIaCAdapter now satisfies wfctlhelpers.ComputePlanVersionDeclarer so DispatchVersionFor reads the plugin's declaration instead of silently defaulting to v1.

Adapter — caches CapabilitiesResponse on first access; subsequent SupportedCanonicalKeys / ComputePlanVersion / Capabilities calls reuse the cached value. Capabilities are advertised once at plugin startup + don't change during a wfctl invocation; cache avoids RPC thrash on the apply-time dispatch hot path.

Tests

5 new cases on *typedIaCAdapter:

  • _SupportedCanonicalKeys_PluginOverride — strict-subset declaration honored
  • _SupportedCanonicalKeys_FallbackToDefault — empty list → interfaces.CanonicalKeys() default (set-based comparison)
  • _ComputePlanVersion_PluginDeclares\"v2\" declaration surfaces through DispatchVersionFor
  • _ComputePlanVersion_EmptyMeansV1 — empty string default → \"v1\" via DispatchVersionFor
  • _CapabilitiesCacheReusedAcrossCalls — RPC fired exactly once across 5×3 accessor calls

Local: GOWORK=off go test ./cmd/wfctl/ -count=1 -short + -race both PASS.

ADR

decisions/0029-capability-extension-canonical-keys-and-compute-plan-version.md documents the decision, alternatives rejected (per-type canonical_keys, dedicated SupportedCanonicalKeys RPC, separate ComputePlanVersionDeclarer service), plugin-author migration shape.

Wire compat

Additive proto field numbers (2, 3); old plugin binaries return empty values; new wfctl interprets empty as "use defaults". No flag-day required. AWS/GCP/Azure plugins (when they cut over) populate as needed; backward-compatible.

Hard constraints

NO compat shim, NO fallback path, NO build-tag dual-path. Empty proto fields default to legacy/wfctl-side behavior — fix-forward to a typed gRPC field, not a compat surface.

🤖 Generated with Claude Code

…on on CapabilitiesResponse

Closes the SupportedCanonicalKeys + ComputePlanVersionDeclarer regressions
left open by the strict-contracts force-cutover (ADRs 0024-0028) per the
deferred option-d follow-up:

Proto: adds 2 optional fields to CapabilitiesResponse —
- canonical_keys (repeated string): provider-level override of
  interfaces.CanonicalKeys() default. DO plugin override path restored.
- compute_plan_version (string): provider-level apply-time dispatch
  version. typedIaCAdapter now satisfies wfctlhelpers.ComputePlanVersionDeclarer
  so DispatchVersionFor reads the plugin's declaration instead of
  silently defaulting to v1.

Adapter: caches CapabilitiesResponse on first access; subsequent
SupportedCanonicalKeys / ComputePlanVersion / Capabilities calls reuse
the cached value (capabilities are advertised once at plugin startup +
don't change during a wfctl invocation; cache avoids RPC thrash on the
apply-time dispatch hot path).

Tests: 5 new cases on *typedIaCAdapter cover override path, default
fallback (set-based comparison since CanonicalKeys() iteration order
isn't guaranteed), apply-version declaration, empty-declaration default,
and cache-reuse invariant. Full -short suite + -race PASS.

ADR-0029 documents the decision, alternatives rejected (per-type
canonical_keys, dedicated SupportedCanonicalKeys RPC, separate
ComputePlanVersionDeclarer service), and plugin-author migration shape.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 10, 2026 15:46
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

Extends the typed IaC plugin capability surface to restore two regressions from the strict-contracts cutover: provider-specific canonical key overrides and apply-time dispatch version selection, both delivered via additive fields on CapabilitiesResponse (ADR-0029).

Changes:

  • Added canonical_keys and compute_plan_version to the IaC external plugin CapabilitiesResponse proto (and regenerated iac.pb.go).
  • Updated *typedIaCAdapter to read these fields and to cache CapabilitiesResponse after first fetch.
  • Added focused unit/in-process gRPC tests covering canonical key override behavior, plan version dispatch behavior, and capability caching.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
plugin/external/proto/iac.proto Adds the new canonical_keys and compute_plan_version fields to CapabilitiesResponse.
plugin/external/proto/iac.pb.go Regenerated protobuf output reflecting the new capability fields.
decisions/0029-capability-extension-canonical-keys-and-compute-plan-version.md Documents ADR-0029 rationale, decision, and migration guidance for plugin authors.
cmd/wfctl/iac_typed_adapter.go Implements capability caching and exposes SupportedCanonicalKeys() + ComputePlanVersion() via cached capabilities.
cmd/wfctl/iac_typed_adapter_test.go Adds tests validating the new behavior and the intended caching invariant.

Comment on lines +294 to +310
// fetchCapabilities returns the plugin's CapabilitiesResponse, caching the
// first result for the adapter's lifetime. RPC errors are also cached so
// repeated accesses don't repeatedly fail against an unreachable plugin.
// Capabilities are advertised at plugin startup and don't change during
// a wfctl invocation; caching is correct + cheap.
func (a *typedIaCAdapter) fetchCapabilities() (*pb.CapabilitiesResponse, error) {
if a.capsFetch {
return a.cachedCaps, a.capsErr
}
a.capsFetch = true
resp, err := a.required.Capabilities(context.Background(), &pb.CapabilitiesRequest{})
if err != nil {
a.capsErr = err
return nil, err
}
a.cachedCaps = resp
return resp, nil
@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:336737: parsing iteration count: invalid syntax
baseline-bench.txt:620538: parsing iteration count: invalid syntax
baseline-bench.txt:948097: parsing iteration count: invalid syntax
baseline-bench.txt:1241549: parsing iteration count: invalid syntax
baseline-bench.txt:1526022: parsing iteration count: invalid syntax
benchmark-results.txt:262: parsing iteration count: invalid syntax
benchmark-results.txt:335663: parsing iteration count: invalid syntax
benchmark-results.txt:688227: parsing iteration count: invalid syntax
benchmark-results.txt:1047889: parsing iteration count: invalid syntax
benchmark-results.txt:1408172: parsing iteration count: invalid syntax
benchmark-results.txt:1760895: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 9V74 80-Core Processor                
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4              3.380m ± 193%
ComponentLoad-4                    3.517m ±   2%
ComponentExecute-4                 1.837µ ±   1%
PoolContention/workers-1-4         1.020µ ±   0%
PoolContention/workers-2-4         1.018µ ±   4%
PoolContention/workers-4-4         1.011µ ±   1%
PoolContention/workers-8-4         1.016µ ±   1%
PoolContention/workers-16-4        1.016µ ±   1%
ComponentLifecycle-4               3.504m ±   1%
SourceValidation-4                 2.109µ ±   7%
RegistryConcurrent-4               749.9n ±   3%
LoaderLoadFromString-4             3.562m ±   1%
geomean                            16.69µ

                            │ 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                  5.994m ± 82%
ComponentLoad-4                        3.417m ±  4%
ComponentExecute-4                     1.841µ ±  0%
PoolContention/workers-1-4             1.177µ ±  1%
PoolContention/workers-2-4             1.180µ ±  1%
PoolContention/workers-4-4             1.180µ ±  1%
PoolContention/workers-8-4             1.193µ ±  1%
PoolContention/workers-16-4            1.185µ ±  1%
ComponentLifecycle-4                   3.440m ±  1%
SourceValidation-4                     2.227µ ±  2%
RegistryConcurrent-4                   893.9n ±  4%
LoaderLoadFromString-4                 3.500m ±  1%
geomean                                18.91µ

                            │ 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 9V74 80-Core Processor                
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                  298.2n ± 1%
CircuitBreakerExecution_Success-4          22.66n ± 0%
CircuitBreakerExecution_Failure-4          70.94n ± 0%
geomean                                    78.27n

                                  │ 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                     449.2n ± 0%
CircuitBreakerExecution_Success-4             59.70n ± 0%
CircuitBreakerExecution_Failure-4             64.77n ± 0%
geomean                                       120.2n

                                  │ 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 9V74 80-Core Processor                
                                 │ baseline-bench.txt │
                                 │       sec/op       │
JQTransform_Simple-4                     815.8n ± 31%
JQTransform_ObjectConstruction-4         1.390µ ±  1%
JQTransform_ArraySelect-4                3.409µ ±  1%
JQTransform_Complex-4                    41.48µ ±  0%
JQTransform_Throughput-4                 1.694µ ±  1%
SSEPublishDelivery-4                     64.59n ±  4%
geomean                                  1.612µ

                                 │ 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: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                 │ benchmark-results.txt │
                                 │        sec/op         │
JQTransform_Simple-4                        889.6n ± 30%
JQTransform_ObjectConstruction-4            1.463µ ±  1%
JQTransform_ArraySelect-4                   3.102µ ±  1%
JQTransform_Complex-4                       34.83µ ±  0%
JQTransform_Throughput-4                    1.787µ ±  1%
SSEPublishDelivery-4                        76.81n ±  0%
geomean                                     1.638µ

                                 │ 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 9V74 80-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                   1.088µ ± 20%
SchemaValidation_AllFields-4                1.635µ ±  5%
SchemaValidation_FormatValidation-4         1.573µ ±  1%
SchemaValidation_ManySchemas-4              1.595µ ±  1%
geomean                                     1.453µ

                                    │ 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.028µ ± 2%
SchemaValidation_AllFields-4                    1.537µ ± 6%
SchemaValidation_FormatValidation-4             1.504µ ± 1%
SchemaValidation_ManySchemas-4                  1.518µ ± 3%
geomean                                         1.378µ

                                    │ 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 9V74 80-Core Processor                
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.025µ ± 35%
EventStoreAppend_SQLite-4                  1.043m ±  4%
GetTimeline_InMemory/events-10-4           12.48µ ±  3%
GetTimeline_InMemory/events-50-4           69.81µ ± 21%
GetTimeline_InMemory/events-100-4          110.5µ ±  1%
GetTimeline_InMemory/events-500-4          564.6µ ±  0%
GetTimeline_InMemory/events-1000-4         1.141m ±  1%
GetTimeline_SQLite/events-10-4             83.42µ ±  1%
GetTimeline_SQLite/events-50-4             220.3µ ±  0%
GetTimeline_SQLite/events-100-4            393.8µ ±  0%
GetTimeline_SQLite/events-500-4            1.677m ±  1%
GetTimeline_SQLite/events-1000-4           3.290m ±  2%
geomean                                    192.9µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                 760.0 ± 11%
EventStoreAppend_SQLite-4                 1.983Ki ±  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.12Ki

                                   │ 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.106µ ±  4%
EventStoreAppend_SQLite-4                     902.4µ ±  6%
GetTimeline_InMemory/events-10-4              13.47µ ±  4%
GetTimeline_InMemory/events-50-4              74.73µ ±  3%
GetTimeline_InMemory/events-100-4             147.0µ ± 21%
GetTimeline_InMemory/events-500-4             587.7µ ±  1%
GetTimeline_InMemory/events-1000-4            1.198m ±  1%
GetTimeline_SQLite/events-10-4                80.27µ ±  1%
GetTimeline_SQLite/events-50-4                229.0µ ±  0%
GetTimeline_SQLite/events-100-4               413.2µ ±  1%
GetTimeline_SQLite/events-500-4               1.856m ±  2%
GetTimeline_SQLite/events-1000-4              3.630m ±  0%
geomean                                       204.4µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     781.0 ± 8%
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.28Ki

                                   │ 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 ee31338 into main May 10, 2026
26 checks passed
@intel352 intel352 deleted the feat/capability-extension-canonical-keys branch May 10, 2026 15:58
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