Skip to content

docs: plugin-modules-on-iac plan + ADR 0038 (Configure-RPC sibling for module factories)#682

Merged
intel352 merged 9 commits into
mainfrom
feat/plugin-modules-on-iac
May 15, 2026
Merged

docs: plugin-modules-on-iac plan + ADR 0038 (Configure-RPC sibling for module factories)#682
intel352 merged 9 commits into
mainfrom
feat/plugin-modules-on-iac

Conversation

@intel352
Copy link
Copy Markdown
Contributor

Summary

  • Locked plan Feature: Implement Workflow UI #2docs/plans/2026-05-15-plugin-modules-on-iac.md (5 PRs / 19 tasks). Extends sdk.ServeIaCPlugin to also serve module + step factories via a thin mapBackedProvider adapter; absorbs the locked B/C/D plan's blocked tasks (aws/gcp standalone modules + workflow-core deletions).
  • decisions/0038 — records the SDK-extension decision (Approach A: IaCServeOptions.Modules/.Steps + mapBackedProvider reusing grpc_server.go's existing PluginService impl).
  • Scope-lock file (alignment-check passed; adversarial-design-review cycle 2 PASS-with-acceptance both phases).

Docs/decisions only. Lands plan + ADR on main so the 5 execution PRs (each off main) can reference decisions/0038 + the plan tasks.

Test plan

  • plan-scope-check.sh PASS (manifest 5 PRs / 19 tasks)
  • adversarial-design-review --phase=design: cycle-2 PASS-with-acceptance
  • adversarial-design-review --phase=plan: cycle-2 PASS-with-acceptance
  • alignment-check: PASS, zero drift
  • docs-only — no build/test impact

🤖 Generated with Claude Code

intel352 and others added 8 commits May 15, 2026 00:25
…ories

Closes the architectural gap surfaced mid-execution of the locked B/C/D plan:
plugins served via sdk.ServeIaCPlugin currently can't register
ModuleFactories/StepFactories (the iacPluginServiceBridge implements only
GetContractRegistry + GetManifest; everything else returns Unimplemented).
This blocks B/C/D's standalone-modules extraction (Tasks 8/9/23 + downstream
Tasks 14-18, 27-29).

Approach: extend IaCServeOptions with Modules + Steps factory maps;
iacPluginServiceBridge delegates the Module/Step lifecycle RPCs to the
existing grpc_server.go PluginService implementation (extracted into a
shared helper so legacy sdk.Serve and the new bridge use one source of
truth for handle state). Backwards compatible; one entrypoint preserved;
no proto change.

Absorbs the locked B/C/D plan's blocked tasks so the plan needs no unlock.

ADR 0038 records the decision (Approaches A/B/C, why A wins, the load-
bearing assumption about grpc_server.go extractability).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Critical: corrected iacserver.go citation (line 196 → struct at 206-218,
forward-extension comment at 200-205).

Important: switched IaCServeOptions.Modules/.Steps to sdk.ModuleProvider /
sdk.StepProvider (eliminates the factory-map-to-PluginProvider adapter
shim — same interface grpc_server.go already consumes). Added explicit
non-goals for MessageAwareModule (no broker plumbed through iacGRPCPlugin)
and TypedModuleProvider (STRICT_PROTO contracts) for v1 scope. Rephrased
the misleading "no structpb" claim to clarify no NEW structpb surface is
introduced (Config remains structpb on the legacy path).

Minor: PR-count estimate now a range (5+/15-20); plugin.json ↔ runtime
parity test pinned with the locked-plan precedent; user-direction citation
added to §Problem.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Important findings addressed by precision: explicitly named the thin
mapBackedProvider adapter (not "no shim" — the adapter IS the shim, just
small ~30 LOC) so plan-writing isn't surprised by the constructor
mismatch with newGRPCServer(PluginProvider). Added explicit nil-broker
test note (SDK extension task includes a regression-guard test that
SetMessagePublisher/SetMessageSubscriber are never called via the bridge
path). Added explicit minEngineVersion floor note in Migration (mirrors
the locked B/C/D plan's universal rule).

Cycle 2 reviewer verdict: "design is substantially correct and
implementable" — no architecture changes needed; documentation precision
fixes only. PASS-with-acceptance per the recorded findings + recommended
fixes incorporated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Implements the SDK extension from decisions/0038 + absorbs the locked B/C/D
plan's blocked scope (aws/gcp standalone modules, Phase B + Phase C
workflow-core deletions). Builds on the design's mapBackedProvider
adapter approach + the locked plan's already-shipped IaCStateBackend
contract + Configure RPC.

Plan structure: PR 1 (workflow SDK extension) → PR 2/3 (aws/gcp plugin
modules + releases, parallel after workflow v0.53.0 tag) → PR 4 (Phase B
core deletion, deps PR 2 + locked-plan PR 5) → PR 5 (Phase C core
deletion, deps PR 3 + locked-plan PR 9).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Critical: Manifest() method added to mapBackedProvider (was missing,
deterministic compile error); PR 3 pre-step added to coordinate the
in-progress locked-plan Task #22 owner (otherwise commit-collision risk).
Important: explicit subprocess runtime-launch validation steps in Tasks
7+11 (in-process bufconn was insufficient for the change class); explicit
'gh release view' pre-merge gate for PR 4 (#118 release tag); ContractRegistry()
removed from mapBackedProvider (dead code path). Minor: credref.Reset()
test-only helper + t.Cleanup pattern documented; Task 2 wording committed
to bufconn-is-canonical with rationale.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Important: clarify CredInput.Source population path-routing — both the
standalone-module and IaC-provider paths read config['credentials']['type']
from the raw YAML config (CloudCredentials.Extra never crosses the plugin
boundary). Task 13's marker is consumed only by in-core paths PR 4 deletes.

Two cycle-2 Minor findings (test-skeleton file reference + git add -A
convention vs feedback memory) accepted as documentation-precision-only;
the implementer/reviewer pipeline will catch the test-skeleton wording at
implementation time, and the git status verify-step in the plan's commit
blocks mitigates the scope-bleed risk the workspace memory addresses.

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

This PR adds a locked implementation plan plus an accepted ADR describing how to extend sdk.ServeIaCPlugin so IaC plugins can also serve module + step factories by delegating those RPCs to the existing grpc_server.go implementation.

Changes:

  • Added a scope-locked implementation plan for “Plugin Modules on IaC” (5 PRs / 19 tasks).
  • Added a design document capturing the architecture and tradeoffs for the SDK extension.
  • Added ADR 0038 documenting the decision to extend the IaC serve bridge (Approach A).

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
docs/plans/2026-05-15-plugin-modules-on-iac.md.scope-lock Adds the scope-lock hash for the new plan.
docs/plans/2026-05-15-plugin-modules-on-iac.md Adds the implementation plan/task breakdown for SDK + plugin + core-deletion work.
docs/plans/2026-05-15-plugin-modules-on-iac-design.md Adds the design doc for bridging module/step RPCs through the IaC serve path.
decisions/0038-plugin-modules-on-iac-serve-bridge.md Adds ADR 0038 capturing the chosen approach and scope limits.
Comments suppressed due to low confidence (2)

docs/plans/2026-05-15-plugin-modules-on-iac-design.md:117

  • The IaCServeOptions comment says “no adapter shim sits between the IaC bridge and the existing handle-state / lifecycle code”, but later in this same design the implementation explicitly introduces a mapBackedProvider adapter/shim (~30 LOC). Please reconcile this wording so the document is internally consistent (e.g., acknowledge the thin adapter while emphasizing there’s no parallel factory shape or lifecycle reimplementation).
    // The map's value type is sdk.ModuleProvider — the SAME interface
    // grpc_server.go's legacy sdk.Serve path already consumes — so no
    // adapter shim sits between the IaC bridge and the existing handle-
    // state / lifecycle code. Plugin authors wrap their factory functions
    // in a thin sdk.ModuleProvider struct (the same wrapper non-IaC
    // plugins already use); the SDK does not introduce a parallel
    // factory-map shape.

docs/plans/2026-05-15-plugin-modules-on-iac-design.md:128

  • This design describes adding an embedded *moduleStepDelegate, but the later “Implementation mechanism” section (and the implementation plan) describe delegating directly to *grpcServer created by newGRPCServer(mapBackedProvider). Consider renaming/removing moduleStepDelegate here to match the intended concrete delegate type so implementers don’t look for a non-existent abstraction.
`iacPluginServiceBridge` gains an embedded `*moduleStepDelegate` (a small wrapper around `grpc_server.go`'s existing PluginService Module/Step implementation). When the delegate is wired, the bridge's `GetModuleTypes` / `CreateModule` / `InitModule` / `StartModule` / `StopModule` / `DestroyModule` / `GetStepTypes` / `CreateStep` / `ExecuteStep` / `DestroyStep` methods forward to it; when it is nil (zero-value `IaCServeOptions`), they fall through to `pb.UnimplementedPluginServiceServer`.

# Plugin Modules on IaC — extending `ServeIaCPlugin` to also serve module + step factories

**Date:** 2026-05-15
**Status:** Design — pre adversarial-design-review
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in 07c0e05 (status line updated to reflect cycle-2 PASS-with-acceptance + locked timestamp).


## Decision

**Adopt Approach A.** Add `Modules map[string]sdk.ModuleProvider` + `Steps map[string]sdk.StepProvider` to `IaCServeOptions`. `ServeIaCPlugin` constructs a "hybrid" `pb.PluginServiceServer` whose `GetContractRegistry`/`GetManifest` come from the existing IaC bridge logic, and whose `GetModuleTypes`/`CreateModule`/`InitModule`/`StartModule`/`StopModule`/`DestroyModule`/`GetStepTypes`/`CreateStep`/`ExecuteStep`/`DestroyStep` come from the **existing** `plugin/external/sdk/grpc_server.go` PluginService implementation, parameterized over the supplied provider maps. The map value types are the same `sdk.ModuleProvider` / `sdk.StepProvider` interfaces non-IaC plugins already implement — no parallel factory shape, no adapter shim between the bridge and the existing handle-state code. Single registered `pb.PluginServiceServer`; no double-registration; no proto change; one entrypoint. Backwards compatible (zero-value options = current behavior). Approach (B) rejected — adds a third entrypoint and partially undoes the cutover's UX consolidation. Approach (C) rejected — re-creates the registration-omission bug class the cutover deleted.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in 07c0e05 (ADR Decision section now explicitly names the thin mapBackedProvider adapter as a shim, while preserving the key win: single source of truth via grpc_server.go's existing impl).


```go
func TestIaCBridge_ModulesAndSteps_Delegate(t *testing.T) {
// Construct a mapBackedProvider via NewIaCServeOptions
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Acknowledged — cosmetic comment in a Task-1 code skeleton. The snippet itself constructs IaCServeOptions{...} directly (which is what implementer-1 did at 9756c29), zero functional impact. Plan is scope-locked; lock hook blocks plan edits. Filing as docs-precision follow-up; not blocking.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 15, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 15, 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:304195: parsing iteration count: invalid syntax
baseline-bench.txt:622667: parsing iteration count: invalid syntax
baseline-bench.txt:931977: parsing iteration count: invalid syntax
baseline-bench.txt:1272190: parsing iteration count: invalid syntax
baseline-bench.txt:1603766: parsing iteration count: invalid syntax
benchmark-results.txt:276: parsing iteration count: invalid syntax
benchmark-results.txt:329251: parsing iteration count: invalid syntax
benchmark-results.txt:670829: parsing iteration count: invalid syntax
benchmark-results.txt:1012959: parsing iteration count: invalid syntax
benchmark-results.txt:1361605: parsing iteration count: invalid syntax
benchmark-results.txt:1626935: 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               5.189m ± 81%
ComponentLoad-4                     3.516m ±  8%
ComponentExecute-4                  1.841µ ±  0%
PoolContention/workers-1-4          1.013µ ±  0%
PoolContention/workers-2-4          1.009µ ±  1%
PoolContention/workers-4-4          1.006µ ±  0%
PoolContention/workers-8-4          1.014µ ±  1%
PoolContention/workers-16-4         1.020µ ±  2%
ComponentLifecycle-4                3.544m ±  0%
SourceValidation-4                  2.096µ ±  1%
RegistryConcurrent-4                748.5n ±  4%
LoaderLoadFromString-4              3.588m ±  1%
geomean                             17.29µ

                            │ 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                  7.829m ± 61%
ComponentLoad-4                        3.478m ± 13%
ComponentExecute-4                     1.891µ ±  1%
PoolContention/workers-1-4             1.201µ ±  1%
PoolContention/workers-2-4             1.206µ ±  2%
PoolContention/workers-4-4             1.204µ ±  2%
PoolContention/workers-8-4             1.202µ ±  1%
PoolContention/workers-16-4            1.223µ ±  2%
ComponentLifecycle-4                   3.596m ±  1%
SourceValidation-4                     2.311µ ±  1%
RegistryConcurrent-4                   985.1n ±  4%
LoaderLoadFromString-4                 3.651m ±  2%
geomean                                19.94µ

                            │ 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                  296.1n ± 0%
CircuitBreakerExecution_Success-4          22.70n ± 1%
CircuitBreakerExecution_Failure-4          70.99n ± 0%
geomean                                    78.13n

                                  │ 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                     457.8n ± 3%
CircuitBreakerExecution_Success-4             59.74n ± 0%
CircuitBreakerExecution_Failure-4             65.31n ± 0%
geomean                                       121.3n

                                  │ 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       │
IaCStateBackend_InProcess-4              288.7n ± 25%
IaCStateBackend_GRPC-4                   9.713m ±  1%
JQTransform_Simple-4                     641.7n ± 28%
JQTransform_ObjectConstruction-4         1.397µ ±  1%
JQTransform_ArraySelect-4                3.363µ ±  0%
JQTransform_Complex-4                    40.96µ ±  0%
JQTransform_Throughput-4                 1.700µ ±  0%
SSEPublishDelivery-4                     64.70n ±  1%
geomean                                  3.738µ

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

                                 │ baseline-bench.txt │
                                 │     allocs/op      │
IaCStateBackend_InProcess-4              2.000 ± 0%
IaCStateBackend_GRPC-4                  6.859k ± 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                 345.1n ±  4%
IaCStateBackend_GRPC-4                      9.536m ± 32%
JQTransform_Simple-4                        727.3n ± 30%
JQTransform_ObjectConstruction-4            1.549µ ±  1%
JQTransform_ArraySelect-4                   3.275µ ±  2%
JQTransform_Complex-4                       36.45µ ±  1%
JQTransform_Throughput-4                    1.851µ ±  1%
SSEPublishDelivery-4                        76.47n ±  8%
geomean                                     3.977µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
IaCStateBackend_InProcess-4                416.0 ±  0%
IaCStateBackend_GRPC-4                   5.663Mi ± 12%
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.871k ± 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 9V74 80-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                    1.084µ ± 2%
SchemaValidation_AllFields-4                 1.668µ ± 4%
SchemaValidation_FormatValidation-4          1.581µ ± 1%
SchemaValidation_ManySchemas-4               1.629µ ± 2%
geomean                                      1.469µ

                                    │ 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.040µ ± 2%
SchemaValidation_AllFields-4                    1.549µ ± 2%
SchemaValidation_FormatValidation-4             1.497µ ± 2%
SchemaValidation_ManySchemas-4                  1.497µ ± 5%
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.060µ ± 40%
EventStoreAppend_SQLite-4                  1.082m ±  8%
GetTimeline_InMemory/events-10-4           12.57µ ±  2%
GetTimeline_InMemory/events-50-4           70.91µ ±  4%
GetTimeline_InMemory/events-100-4          111.8µ ± 26%
GetTimeline_InMemory/events-500-4          570.7µ ±  1%
GetTimeline_InMemory/events-1000-4         1.160m ±  1%
GetTimeline_SQLite/events-10-4             84.94µ ±  2%
GetTimeline_SQLite/events-50-4             222.9µ ±  2%
GetTimeline_SQLite/events-100-4            386.5µ ±  2%
GetTimeline_SQLite/events-500-4            1.692m ±  2%
GetTimeline_SQLite/events-1000-4           3.283m ±  7%
geomean                                    195.2µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                 774.0 ± 11%
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.23Ki

                                   │ 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.122µ ±  3%
EventStoreAppend_SQLite-4                     1.008m ±  5%
GetTimeline_InMemory/events-10-4              13.82µ ±  3%
GetTimeline_InMemory/events-50-4              75.98µ ±  3%
GetTimeline_InMemory/events-100-4             115.8µ ± 11%
GetTimeline_InMemory/events-500-4             591.8µ ±  0%
GetTimeline_InMemory/events-1000-4            1.202m ±  1%
GetTimeline_SQLite/events-10-4                81.53µ ±  1%
GetTimeline_SQLite/events-50-4                233.0µ ±  2%
GetTimeline_SQLite/events-100-4               418.2µ ±  2%
GetTimeline_SQLite/events-500-4               1.884m ±  0%
GetTimeline_SQLite/events-1000-4              3.691m ±  3%
geomean                                       204.7µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                    745.0 ± 16%
EventStoreAppend_SQLite-4                    1.984Ki ±  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.02Ki

                                   │ 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 39ae8c0 into main May 15, 2026
22 checks passed
@intel352 intel352 deleted the feat/plugin-modules-on-iac branch May 15, 2026 06:52
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