Skip to content

feat(iac): dynamic-input mode on step.iac_provider_plan/apply (infra-admin P2 PR3/12)#842

Merged
intel352 merged 4 commits into
mainfrom
feat/infra-p2-dynamic-input
Jun 2, 2026
Merged

feat(iac): dynamic-input mode on step.iac_provider_plan/apply (infra-admin P2 PR3/12)#842
intel352 merged 4 commits into
mainfrom
feat/infra-p2-dynamic-input

Conversation

@intel352
Copy link
Copy Markdown
Contributor

@intel352 intel352 commented Jun 2, 2026

PR3/12 — dynamic-input mode on step.iac_provider_plan/apply (the Phase 2 headline fix)

Locked plan Tasks 5–6. Makes the infra-admin SPA's plan→apply actually work with operator-edited specs. Today both steps read specs/desired_hash from STATIC step config in their factory closures and Execute(ctx, _ *PipelineContext) ignores the context — so a POST body can never reach them (the shipped scenario 92 hardcoded them; the SPA dynamic path was a static demo).

Changes

  • step.iac_provider_plan gains optional specs_from; step.iac_provider_apply gains optional specs_from + desired_hash_from — dotted context paths (e.g. steps.parse-request.body.specs) resolved at Execute via the engine's existing resolveBodyFrom + iac/specparse.ParseResourceSpecs. Execute(ctx, _)Execute(ctx, pc).
  • Mutually exclusive with the static fields (factory error if both). Backward-compatible: the wfctl/CI static path is byte-identical when the _from fields are unset.
  • The two-phase recompute-hash guard is retained (TOCTOU/drift check — recompute from live provider.Status(), reject mismatch). It is NOT tamper protection (the client supplies both specs+hash); access control is subject-RBAC at the route, per ADR 0016.
  • secret:// refs survive verbatim (no resolver on the dynamic path; hash uses the existing no-op env handling).
  • Schema (schema/step_schema_builtins.go): the new fields registered so wfctl validate knows them; desired_hash relaxed from unconditionally-required (now one-of desired_hash/desired_hash_from, matching the factory).

Review notes (resolved)

  • Safety: the empty-specs guard uses len(specs) == 0 (not == nil) — ParseResourceSpecs([]any{}) returns a non-nil empty slice, so an empty list would otherwise slip through to an apply-over-zero-specs (destructive on some providers).
  • Dynamic tests use the canonical steps.parse-request.body.specs wiring (mirroring step.request_parse's output), not a fictional plan-step specs key.
  • Table-driven failure-path tests: missing context path, non-list scalar, empty list, non-string hash, missing hash — all error cleanly (no nil-proceed, no panic).

Verified: go build ./... exit 0; module+schema+plugins/all tests pass (incl. static-path, hash-guard, secret-ref, failure paths); golangci-lint --new-from-rev 0 issues.

🤖 Generated with Claude Code

intel352 and others added 3 commits June 2, 2026 17:43
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…iac_provider_apply

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…(review)

Addresses PR3 code review:
- Empty-specs footgun: dynamic specs_from path now rejects zero specs via
  len(specs)==0 (ParseResourceSpecs returns a non-nil empty slice for []any{},
  which the prior nil check let through → apply over zero specs = destroy-all).
  Applied to both step.iac_provider_plan and step.iac_provider_apply; static
  path unchanged.
- Test fidelity: rewrote the apply dynamic tests to use the canonical
  request_parse wiring (steps.parse-request.body.specs and
  steps.parse-request.body.desired_hash) instead of injecting a specs key the
  plan step never emits.
- Failure paths: added table-driven Execute-error tests on both steps for
  missing path, non-list scalar specs, empty []any specs, and (apply) a
  non-string desired_hash (guarded cast, no panic).
- Schema: declared specs_from on plan and specs_from + desired_hash_from on
  apply in schema/step_schema_builtins.go; relaxed apply desired_hash from
  Required since desired_hash_from is now a valid alternative source.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 2, 2026 22:02
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

Adds dynamic-input support to the built-in IaC provider plan/apply steps so they can resolve operator-edited specs and hashes from the pipeline context at execution time (rather than only from static step config), enabling the infra-admin SPA plan→apply flow while keeping the existing hash-guard behavior.

Changes:

  • Extend step.iac_provider_plan with specs_from, and step.iac_provider_apply with specs_from + desired_hash_from, resolved via dotted context paths at Execute time.
  • Enforce mutual exclusivity between static (specs / desired_hash) and dynamic (*_from) inputs in step factories.
  • Add dynamic-input test coverage for success and failure paths (missing path, wrong types, empty specs, missing/invalid hash, hash mismatch, secret:// preservation).

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
schema/step_schema_builtins.go Registers specs_from / desired_hash_from fields for builtin IaC plan/apply steps.
module/pipeline_step_iac_provider_plan.go Adds context-resolved specs_from support and updates Execute to use PipelineContext.
module/pipeline_step_iac_provider_plan_test.go Adds tests for specs_from success, exclusivity error, and failure modes.
module/pipeline_step_iac_provider_apply.go Adds context-resolved specs_from + desired_hash_from support and retains the hash-guard.
module/pipeline_step_iac_provider_apply_test.go Adds dynamic-input tests including failure modes, hash mismatch, and secret ref preservation.

Comment thread module/pipeline_step_iac_provider_apply.go
@codecov
Copy link
Copy Markdown

codecov Bot commented Jun 2, 2026

Codecov Report

❌ Patch coverage is 89.87342% with 8 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
module/pipeline_step_iac_provider_apply.go 86.66% 3 Missing and 3 partials ⚠️
module/pipeline_step_iac_provider_plan.go 92.85% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 2, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:302: parsing iteration count: invalid syntax
baseline-bench.txt:310977: parsing iteration count: invalid syntax
baseline-bench.txt:657364: parsing iteration count: invalid syntax
baseline-bench.txt:990782: parsing iteration count: invalid syntax
baseline-bench.txt:1317222: parsing iteration count: invalid syntax
baseline-bench.txt:1644244: parsing iteration count: invalid syntax
benchmark-results.txt:302: parsing iteration count: invalid syntax
benchmark-results.txt:536307: parsing iteration count: invalid syntax
benchmark-results.txt:874141: parsing iteration count: invalid syntax
benchmark-results.txt:1158791: parsing iteration count: invalid syntax
benchmark-results.txt:1486317: parsing iteration count: invalid syntax
benchmark-results.txt:1820518: 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 │       benchmark-results.txt        │
                            │       sec/op       │    sec/op     vs base              │
InterpreterCreation-4               6.753m ± 64%   7.281m ± 59%       ~ (p=0.699 n=6)
ComponentLoad-4                     3.500m ± 10%   3.468m ±  0%  -0.91% (p=0.041 n=6)
ComponentExecute-4                  1.830µ ±  1%   1.822µ ±  1%       ~ (p=0.102 n=6)
PoolContention/workers-1-4          1.041µ ±  4%   1.007µ ±  0%  -3.27% (p=0.002 n=6)
PoolContention/workers-2-4          1.048µ ±  5%   1.014µ ±  1%       ~ (p=0.061 n=6)
PoolContention/workers-4-4          1.012µ ±  3%   1.009µ ±  0%       ~ (p=0.177 n=6)
PoolContention/workers-8-4          1.022µ ±  8%   1.013µ ±  2%       ~ (p=0.258 n=6)
PoolContention/workers-16-4         1.025µ ±  2%   1.013µ ±  1%  -1.12% (p=0.037 n=6)
ComponentLifecycle-4                3.525m ±  1%   3.561m ±  1%  +1.02% (p=0.026 n=6)
SourceValidation-4                  2.095µ ±  2%   2.184µ ±  9%  +4.25% (p=0.002 n=6)
RegistryConcurrent-4                758.6n ±  5%   763.4n ±  7%       ~ (p=0.589 n=6)
LoaderLoadFromString-4              3.566m ±  2%   3.584m ±  1%       ~ (p=0.394 n=6)
geomean                             17.78µ         17.83µ        +0.29%

                            │ baseline-bench.txt │        benchmark-results.txt         │
                            │        B/op        │     B/op      vs base                │
InterpreterCreation-4               2.027Mi ± 0%   2.027Mi ± 0%       ~ (p=0.981 n=6)
ComponentLoad-4                     2.180Mi ± 0%   2.180Mi ± 0%       ~ (p=0.729 n=6)
ComponentExecute-4                  1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-1-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-2-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-4-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-8-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-16-4         1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
ComponentLifecycle-4                2.183Mi ± 0%   2.183Mi ± 0%       ~ (p=0.968 n=6)
SourceValidation-4                  1.984Ki ± 0%   1.984Ki ± 0%       ~ (p=1.000 n=6) ¹
RegistryConcurrent-4                1.133Ki ± 0%   1.133Ki ± 0%       ~ (p=1.000 n=6) ¹
LoaderLoadFromString-4              2.182Mi ± 0%   2.182Mi ± 0%  +0.00% (p=0.017 n=6)
geomean                             15.25Ki        15.25Ki       +0.00%
¹ all samples are equal

                            │ baseline-bench.txt │        benchmark-results.txt        │
                            │     allocs/op      │  allocs/op   vs base                │
InterpreterCreation-4                15.68k ± 0%   15.68k ± 0%       ~ (p=1.000 n=6)
ComponentLoad-4                      18.02k ± 0%   18.02k ± 0%       ~ (p=1.000 n=6)
ComponentExecute-4                    25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-1-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-2-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-4-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-8-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-16-4           25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
ComponentLifecycle-4                 18.07k ± 0%   18.07k ± 0%       ~ (p=1.000 n=6) ¹
SourceValidation-4                    32.00 ± 0%    32.00 ± 0%       ~ (p=1.000 n=6) ¹
RegistryConcurrent-4                  2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
LoaderLoadFromString-4               18.06k ± 0%   18.06k ± 0%       ~ (p=1.000 n=6) ¹
geomean                               183.3         183.3       +0.00%
¹ all samples are equal

pkg: github.com/GoCodeAlone/workflow/middleware
                                  │ baseline-bench.txt │       benchmark-results.txt       │
                                  │       sec/op       │   sec/op     vs base              │
CircuitBreakerDetection-4                  297.8n ± 3%   296.5n ± 6%       ~ (p=0.058 n=6)
CircuitBreakerExecution_Success-4          22.65n ± 0%   22.67n ± 0%       ~ (p=0.292 n=6)
CircuitBreakerExecution_Failure-4          70.88n ± 0%   70.96n ± 0%       ~ (p=0.266 n=6)
geomean                                    78.19n        78.13n       -0.08%

                                  │ baseline-bench.txt │       benchmark-results.txt        │
                                  │        B/op        │    B/op     vs base                │
CircuitBreakerDetection-4                 144.0 ± 0%     144.0 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Success-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Failure-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                              ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │       benchmark-results.txt        │
                                  │     allocs/op      │ allocs/op   vs base                │
CircuitBreakerDetection-4                 1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Success-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Failure-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                              ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
                                 │ baseline-bench.txt │       benchmark-results.txt        │
                                 │       sec/op       │    sec/op     vs base              │
IaCStateBackend_InProcess-4              297.4n ± 38%   308.5n ± 33%       ~ (p=0.818 n=6)
IaCStateBackend_GRPC-4                   10.22m ±  1%   10.12m ±  1%       ~ (p=0.132 n=6)
JQTransform_Simple-4                     637.2n ± 39%   624.8n ± 36%       ~ (p=0.180 n=6)
JQTransform_ObjectConstruction-4         1.480µ ±  1%   1.411µ ±  3%  -4.66% (p=0.002 n=6)
JQTransform_ArraySelect-4                3.520µ ±  1%   3.441µ ±  0%  -2.23% (p=0.002 n=6)
JQTransform_Complex-4                    42.03µ ±  3%   41.81µ ±  1%  -0.52% (p=0.041 n=6)
JQTransform_Throughput-4                 1.814µ ±  1%   1.762µ ±  2%  -2.87% (p=0.004 n=6)
SSEPublishDelivery-4                     63.79n ±  0%   65.66n ±  2%  +2.92% (p=0.002 n=6)
geomean                                  3.858µ         3.825µ        -0.85%

                                 │ baseline-bench.txt │         benchmark-results.txt         │
                                 │        B/op        │     B/op       vs base                │
IaCStateBackend_InProcess-4             416.0 ±  0%       416.0 ±  0%       ~ (p=1.000 n=6) ¹
IaCStateBackend_GRPC-4                5.930Mi ± 13%     5.794Mi ± 12%       ~ (p=0.589 n=6)
JQTransform_Simple-4                  1.273Ki ±  0%     1.273Ki ±  0%       ~ (p=1.000 n=6) ¹
JQTransform_ObjectConstruction-4      1.773Ki ±  0%     1.773Ki ±  0%       ~ (p=1.000 n=6) ¹
JQTransform_ArraySelect-4             2.625Ki ±  0%     2.625Ki ±  0%       ~ (p=1.000 n=6) ¹
JQTransform_Complex-4                 16.31Ki ±  0%     16.31Ki ±  0%       ~ (p=1.000 n=6) ¹
JQTransform_Throughput-4              1.984Ki ±  0%     1.984Ki ±  0%       ~ (p=1.000 n=6) ¹
SSEPublishDelivery-4                    0.000 ±  0%       0.000 ±  0%       ~ (p=1.000 n=6) ¹
geomean                                             ²                  -0.29%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │        benchmark-results.txt        │
                                 │     allocs/op      │  allocs/op   vs base                │
IaCStateBackend_InProcess-4              2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=6) ¹
IaCStateBackend_GRPC-4                  6.870k ± 0%     6.856k ± 0%       ~ (p=0.145 n=6)
JQTransform_Simple-4                     10.00 ± 0%      10.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ObjectConstruction-4         15.00 ± 0%      15.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ArraySelect-4                30.00 ± 0%      30.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Complex-4                    328.0 ± 0%      328.0 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Throughput-4                 17.00 ± 0%      17.00 ± 0%       ~ (p=1.000 n=6) ¹
SSEPublishDelivery-4                     0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                             ²                -0.03%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
                                    │ baseline-bench.txt │       benchmark-results.txt       │
                                    │       sec/op       │   sec/op     vs base              │
SchemaValidation_Simple-4                    1.087µ ± 2%   1.084µ ± 2%       ~ (p=1.000 n=6)
SchemaValidation_AllFields-4                 1.630µ ± 6%   1.638µ ± 8%       ~ (p=0.310 n=6)
SchemaValidation_FormatValidation-4          1.580µ ± 2%   1.570µ ± 2%       ~ (p=0.818 n=6)
SchemaValidation_ManySchemas-4               1.600µ ± 1%   1.606µ ± 1%       ~ (p=0.255 n=6)
geomean                                      1.455µ        1.454µ       -0.00%

                                    │ baseline-bench.txt │       benchmark-results.txt        │
                                    │        B/op        │    B/op     vs base                │
SchemaValidation_Simple-4                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_AllFields-4                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_FormatValidation-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_ManySchemas-4              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │       benchmark-results.txt        │
                                    │     allocs/op      │ allocs/op   vs base                │
SchemaValidation_Simple-4                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_AllFields-4                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_FormatValidation-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_ManySchemas-4              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
                                   │ baseline-bench.txt │        benchmark-results.txt        │
                                   │       sec/op       │    sec/op     vs base               │
EventStoreAppend_InMemory-4                1.189µ ± 13%   1.056µ ± 15%        ~ (p=0.065 n=6)
EventStoreAppend_SQLite-4                  1.069m ± 11%   1.012m ±  2%   -5.26% (p=0.002 n=6)
GetTimeline_InMemory/events-10-4           14.13µ ±  3%   14.34µ ±  4%        ~ (p=0.394 n=6)
GetTimeline_InMemory/events-50-4           78.32µ ±  4%   79.25µ ±  2%        ~ (p=0.310 n=6)
GetTimeline_InMemory/events-100-4          154.4µ ± 23%   156.9µ ±  8%        ~ (p=0.485 n=6)
GetTimeline_InMemory/events-500-4          607.3µ ±  1%   812.7µ ±  3%  +33.82% (p=0.002 n=6)
GetTimeline_InMemory/events-1000-4         1.229m ±  1%   1.669m ± 24%  +35.78% (p=0.002 n=6)
GetTimeline_SQLite/events-10-4             61.07µ ±  3%   62.07µ ±  3%        ~ (p=0.065 n=6)
GetTimeline_SQLite/events-50-4             200.6µ ±  0%   206.8µ ±  8%   +3.05% (p=0.002 n=6)
GetTimeline_SQLite/events-100-4            373.8µ ±  2%   378.2µ ±  0%        ~ (p=0.065 n=6)
GetTimeline_SQLite/events-500-4            1.713m ±  1%   1.730m ±  1%   +0.99% (p=0.009 n=6)
GetTimeline_SQLite/events-1000-4           3.388m ±  1%   3.420m ±  1%   +0.94% (p=0.002 n=6)
geomean                                    200.8µ         210.2µ         +4.65%

                                   │ baseline-bench.txt │         benchmark-results.txt         │
                                   │        B/op        │     B/op       vs base                │
EventStoreAppend_InMemory-4                  823.0 ± 9%     756.5 ± 14%       ~ (p=0.190 n=6)
EventStoreAppend_SQLite-4                  1.983Ki ± 2%   1.985Ki ±  2%       ~ (p=0.565 n=6)
GetTimeline_InMemory/events-10-4           7.953Ki ± 0%   7.953Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-50-4           46.62Ki ± 0%   46.62Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-100-4          94.48Ki ± 0%   94.48Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-500-4          472.8Ki ± 0%   472.8Ki ±  0%  +0.00% (p=0.009 n=6)
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%   944.3Ki ±  0%  +0.00% (p=0.004 n=6)
GetTimeline_SQLite/events-10-4             16.74Ki ± 0%   16.74Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-50-4             87.14Ki ± 0%   87.14Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-100-4            175.4Ki ± 0%   175.4Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-500-4            846.1Ki ± 0%   846.1Ki ±  0%       ~ (p=1.000 n=6)
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%   1.639Mi ±  0%       ~ (p=0.489 n=6)
geomean                                    67.57Ki        67.10Ki        -0.69%
¹ all samples are equal

                                   │ baseline-bench.txt │        benchmark-results.txt        │
                                   │     allocs/op      │  allocs/op   vs base                │
EventStoreAppend_InMemory-4                  7.000 ± 0%    7.000 ± 0%       ~ (p=1.000 n=6) ¹
EventStoreAppend_SQLite-4                    53.00 ± 0%    53.00 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-10-4             125.0 ± 0%    125.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-50-4             653.0 ± 0%    653.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-100-4           1.306k ± 0%   1.306k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-500-4           6.514k ± 0%   6.514k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-1000-4          13.02k ± 0%   13.02k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-10-4               382.0 ± 0%    382.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-50-4              1.852k ± 0%   1.852k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-100-4             3.681k ± 0%   3.681k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-500-4             18.54k ± 0%   18.54k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-1000-4            37.29k ± 0%   37.29k ± 0%       ~ (p=1.000 n=6) ¹
geomean                                     1.162k        1.162k       +0.00%
¹ all samples are equal

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

… (Copilot)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@intel352 intel352 merged commit 2ccb28d into main Jun 2, 2026
22 checks passed
@intel352 intel352 deleted the feat/infra-p2-dynamic-input branch June 2, 2026 22:27
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