Skip to content

feat(sandbox,module): SandboxRunner abstraction + exec_env factory (infra-admin P3a PR6/12)#846

Merged
intel352 merged 4 commits into
mainfrom
feat/infra-p3a-sandboxrunner
Jun 3, 2026
Merged

feat(sandbox,module): SandboxRunner abstraction + exec_env factory (infra-admin P3a PR6/12)#846
intel352 merged 4 commits into
mainfrom
feat/infra-p3a-sandboxrunner

Conversation

@intel352

@intel352 intel352 commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

PR6/12 — SandboxRunner abstraction + exec_env factory (infra-admin Phase 3a)

Locked plan Tasks 11–12; ADR 0018. Abstracts sandbox execution so step.sandbox_exec can run on alternative backends (remote-runner PR7/8, Argo PR9) without changing its {exit_code, stdout, stderr} contract. Ships only the abstraction + the default local-docker backend; remote/ephemeral resolve in later PRs.

Changes

  • sandbox.SandboxRunner interface (Exec+Close — the methods step.sandbox_exec actually uses); *DockerSandbox satisfies it; NewLocalDockerRunner(cfg).
  • sandbox.BuildSandboxConfig(profile, image) — the strict/standard/permissive→SandboxConfig mapping extracted from the step (now the SINGLE shared mapping the remote agent will reuse for its profile clamp in PR8). Step still applies its own overrides after.
  • module.resolveSandboxRunner(app, exec_env, cfg) factory (in module to avoid a sandbox→module cycle): ""/local-docker→local; remote/ephemeral/unknown→clear error (deferred to PR7/8/9).
  • step.sandbox_exec gains an optional exec_env config, validated at factory time (only local-docker wired now). Behavior byte-identical when absent.

Review notes (resolved)

  • Schema drift (Critical): the editor golden serializes ModuleSchemaRegistry (module_schema.go), which has its own step.sandbox_exec config block — exec_env was added there too (was only in step_schema_builtins.go; golden regenerated).
  • exec_env options reduced to [local-docker] in both schema sources (don't advertise remote/ephemeral until wired).
  • Factory-time exec_env validation (fail-early, mirrors security_profile).

Verified: go build ./... exit 0; full go test ./... exit 0 (149 ok); golangci-lint v2.12.0 --new-from-rev 0 issues. Behavior-preserving extraction confirmed (BuildSandboxConfig byte-matches the original switch; overrides retained).

🤖 Generated with Claude Code

intel352 and others added 3 commits June 2, 2026 21:03
…ildSandboxConfig

Introduces the SandboxRunner interface (Exec + Close) satisfied by *DockerSandbox with
a compile-time assertion. Adds NewLocalDockerRunner as the default backend constructor.
Extracts the security-profile→SandboxConfig mapping into sandbox.BuildSandboxConfig so
remote runners (PR7/PR8) can reuse the same profile clamping logic. step.sandbox_exec
now delegates its buildSandboxConfig() to BuildSandboxConfig, keeping behaviour identical.

Refs ADR-0018 (Task 11).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tep.sandbox_exec

Adds an optional exec_env config field to step.sandbox_exec. The new resolveSandboxRunner
factory dispatches "" / "local-docker" to NewLocalDockerRunner (current behaviour,
byte-identical result contract) and returns a clear error for "remote" / "ephemeral" /
unknown values (deferred to PR7/PR8/PR9). step.Execute now calls the factory instead
of sandbox.NewDockerSandbox directly. Adds exec_env to the StepSchema config fields.

Refs ADR-0018 (Task 12).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…on (review)

- module_schema.go step.sandbox_exec gains exec_env ConfigField (the editor
  golden serializes ModuleSchemaRegistry, not step_schema_builtins — exec_env
  was invisible to the editor; golden regenerated).
- exec_env options reduced to [local-docker] in both schema sources (remote/
  ephemeral error until PR7/8/9 wire them — don't advertise unusable options).
- step factory validates exec_env at construction (fail-early like
  security_profile); unknown value → config error. Test added.
- execenv_factory: comment that the reserved app param is for PR7/8/9 wiring.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 3, 2026 01:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Introduces an execution-backend abstraction for step.sandbox_exec so the step can switch between different sandbox backends (future remote/ephemeral runners) while preserving the existing {exit_code, stdout, stderr} output contract.

Changes:

  • Added sandbox.SandboxRunner interface plus a NewLocalDockerRunner constructor that wraps the existing local Docker sandbox.
  • Extracted security_profileSandboxConfig mapping into sandbox.BuildSandboxConfig(...) and updated step.sandbox_exec to use it.
  • Added an exec_env config option (schema + step parsing) and a module.resolveSandboxRunner(...) factory that currently wires only local-docker.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
schema/testdata/editor-schemas.golden.json Updates editor schema golden to include exec_env for step.sandbox_exec.
schema/step_schema_builtins.go Adds exec_env field to the builtin step schema with local-docker option/default.
schema/module_schema.go Adds exec_env field to the module schema for step.sandbox_exec.
sandbox/runner.go Introduces SandboxRunner interface + local-docker runner constructor.
sandbox/runner_test.go Adds tests around the new runner constructor/interface assertion.
sandbox/profile.go Adds BuildSandboxConfig shared mapping from profile → config.
sandbox/profile_test.go Adds unit tests covering strict/standard/permissive/unknown profile mapping behavior.
module/pipeline_step_sandbox_exec.go Threads exec_env through step.sandbox_exec and resolves runner via factory; delegates profile mapping to sandbox.BuildSandboxConfig.
module/execenv_factory.go Adds resolveSandboxRunner factory (local-docker now; remote/ephemeral deferred).
module/execenv_factory_test.go Adds tests for exec_env routing + step factory validation.

Comment thread sandbox/runner_test.go
Comment thread module/execenv_factory_test.go
Comment thread module/execenv_factory_test.go
Comment thread module/execenv_factory_test.go
Comment thread module/execenv_factory.go Outdated
Comment thread schema/module_schema.go Outdated
@codecov

codecov Bot commented Jun 3, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.43590% with 1 line in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
module/pipeline_step_sandbox_exec.go 87.50% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

⏱ 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:560427: parsing iteration count: invalid syntax
baseline-bench.txt:850627: parsing iteration count: invalid syntax
baseline-bench.txt:1183640: parsing iteration count: invalid syntax
baseline-bench.txt:1515450: parsing iteration count: invalid syntax
baseline-bench.txt:1841539: parsing iteration count: invalid syntax
benchmark-results.txt:302: parsing iteration count: invalid syntax
benchmark-results.txt:317490: parsing iteration count: invalid syntax
benchmark-results.txt:656986: parsing iteration count: invalid syntax
benchmark-results.txt:925148: parsing iteration count: invalid syntax
benchmark-results.txt:1224849: parsing iteration count: invalid syntax
benchmark-results.txt:1530610: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                  9.607m ± 66%
ComponentLoad-4                        3.714m ±  3%
ComponentExecute-4                     1.965µ ±  5%
PoolContention/workers-1-4             1.131µ ±  5%
PoolContention/workers-2-4             1.108µ ±  2%
PoolContention/workers-4-4             1.099µ ±  5%
PoolContention/workers-8-4             1.091µ ±  1%
PoolContention/workers-16-4            1.097µ ±  1%
ComponentLifecycle-4                   3.661m ±  1%
SourceValidation-4                     2.353µ ±  0%
RegistryConcurrent-4                   816.2n ±  3%
LoaderLoadFromString-4                 3.654m ±  1%
geomean                                19.47µ

                            │ 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

cpu: AMD EPYC 9V74 80-Core Processor                
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4               8.515m ± 65%
ComponentLoad-4                     3.505m ± 10%
ComponentExecute-4                  1.816µ ±  1%
PoolContention/workers-1-4          1.026µ ±  5%
PoolContention/workers-2-4          1.018µ ±  2%
PoolContention/workers-4-4          1.021µ ±  1%
PoolContention/workers-8-4          1.022µ ±  7%
PoolContention/workers-16-4         1.023µ ±  2%
ComponentLifecycle-4                3.541m ±  1%
SourceValidation-4                  2.104µ ±  2%
RegistryConcurrent-4                752.3n ±  2%
LoaderLoadFromString-4              3.575m ±  1%
geomean                             18.07µ

                            │ 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

pkg: github.com/GoCodeAlone/workflow/middleware
cpu: AMD EPYC 7763 64-Core Processor                
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                    288.2n ± 11%
CircuitBreakerExecution_Success-4            21.57n ±  1%
CircuitBreakerExecution_Failure-4            66.05n ±  2%
geomean                                      74.32n

                                  │ 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

cpu: AMD EPYC 9V74 80-Core Processor                
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                  302.7n ± 4%
CircuitBreakerExecution_Success-4          22.66n ± 0%
CircuitBreakerExecution_Failure-4          70.98n ± 0%
geomean                                    78.66n

                                  │ 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

pkg: github.com/GoCodeAlone/workflow/module
cpu: AMD EPYC 7763 64-Core Processor                
                                 │ benchmark-results.txt │
                                 │        sec/op         │
IaCStateBackend_InProcess-4                 314.2n ± 37%
IaCStateBackend_GRPC-4                      9.577m ±  1%
JQTransform_Simple-4                        711.1n ± 33%
JQTransform_ObjectConstruction-4            1.568µ ±  1%
JQTransform_ArraySelect-4                   3.559µ ±  1%
JQTransform_Complex-4                       40.67µ ±  1%
JQTransform_Throughput-4                    1.917µ ±  7%
SSEPublishDelivery-4                        64.44n ±  1%
geomean                                     3.956µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
IaCStateBackend_InProcess-4                 416.0 ± 0%
IaCStateBackend_GRPC-4                    5.881Mi ± 9%
JQTransform_Simple-4                      1.273Ki ± 0%
JQTransform_ObjectConstruction-4          1.773Ki ± 0%
JQTransform_ArraySelect-4                 2.625Ki ± 0%
JQTransform_Complex-4                     16.31Ki ± 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.837k ± 0%
JQTransform_Simple-4                        10.00 ± 0%
JQTransform_ObjectConstruction-4            15.00 ± 0%
JQTransform_ArraySelect-4                   30.00 ± 0%
JQTransform_Complex-4                       328.0 ± 0%
JQTransform_Throughput-4                    17.00 ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                 │ baseline-bench.txt │
                                 │       sec/op       │
IaCStateBackend_InProcess-4              297.8n ± 41%
IaCStateBackend_GRPC-4                   10.19m ±  1%
JQTransform_Simple-4                     677.8n ± 32%
JQTransform_ObjectConstruction-4         1.482µ ±  1%
JQTransform_ArraySelect-4                3.564µ ±  1%
JQTransform_Complex-4                    43.02µ ±  2%
JQTransform_Throughput-4                 1.837µ ±  4%
SSEPublishDelivery-4                     63.85n ±  1%
geomean                                  3.911µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
IaCStateBackend_InProcess-4              416.0 ± 0%
IaCStateBackend_GRPC-4                 5.815Mi ± 9%
JQTransform_Simple-4                   1.273Ki ± 0%
JQTransform_ObjectConstruction-4       1.773Ki ± 0%
JQTransform_ArraySelect-4              2.625Ki ± 0%
JQTransform_Complex-4                  16.31Ki ± 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.864k ± 0%
JQTransform_Simple-4                     10.00 ± 0%
JQTransform_ObjectConstruction-4         15.00 ± 0%
JQTransform_ArraySelect-4                30.00 ± 0%
JQTransform_Complex-4                    328.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                
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                       1.099µ ± 2%
SchemaValidation_AllFields-4                    1.660µ ± 2%
SchemaValidation_FormatValidation-4             1.599µ ± 4%
SchemaValidation_ManySchemas-4                  1.835µ ± 1%
geomean                                         1.521µ

                                    │ 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

cpu: AMD EPYC 9V74 80-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                    1.082µ ± 2%
SchemaValidation_AllFields-4                 1.647µ ± 3%
SchemaValidation_FormatValidation-4          1.593µ ± 4%
SchemaValidation_ManySchemas-4               1.582µ ± 3%
geomean                                      1.456µ

                                    │ 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

pkg: github.com/GoCodeAlone/workflow/store
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.244µ ± 12%
EventStoreAppend_SQLite-4                     1.519m ± 37%
GetTimeline_InMemory/events-10-4              14.86µ ±  1%
GetTimeline_InMemory/events-50-4              81.94µ ±  2%
GetTimeline_InMemory/events-100-4             148.9µ ± 19%
GetTimeline_InMemory/events-500-4             673.2µ ±  7%
GetTimeline_InMemory/events-1000-4            1.366m ±  4%
GetTimeline_SQLite/events-10-4                73.37µ ±  1%
GetTimeline_SQLite/events-50-4                219.6µ ±  2%
GetTimeline_SQLite/events-100-4               397.3µ ±  0%
GetTimeline_SQLite/events-500-4               1.815m ±  2%
GetTimeline_SQLite/events-1000-4              3.606m ±  1%
geomean                                       220.5µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     835.5 ± 9%
EventStoreAppend_SQLite-4                     1.983Ki ± 0%
GetTimeline_InMemory/events-10-4              7.953Ki ± 0%
GetTimeline_InMemory/events-50-4              46.62Ki ± 0%
GetTimeline_InMemory/events-100-4             94.48Ki ± 0%
GetTimeline_InMemory/events-500-4             472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4            944.3Ki ± 0%
GetTimeline_SQLite/events-10-4                16.74Ki ± 0%
GetTimeline_SQLite/events-50-4                87.14Ki ± 0%
GetTimeline_SQLite/events-100-4               175.4Ki ± 0%
GetTimeline_SQLite/events-500-4               846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4              1.639Mi ± 0%
geomean                                       67.66Ki

                                   │ 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

cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.034µ ± 25%
EventStoreAppend_SQLite-4                  1.019m ±  4%
GetTimeline_InMemory/events-10-4           13.88µ ±  7%
GetTimeline_InMemory/events-50-4           77.94µ ±  2%
GetTimeline_InMemory/events-100-4          159.8µ ±  3%
GetTimeline_InMemory/events-500-4          804.9µ ±  3%
GetTimeline_InMemory/events-1000-4         1.254m ± 14%
GetTimeline_SQLite/events-10-4             61.19µ ±  1%
GetTimeline_SQLite/events-50-4             203.2µ ±  1%
GetTimeline_SQLite/events-100-4            375.5µ ±  3%
GetTimeline_SQLite/events-500-4            1.724m ±  1%
GetTimeline_SQLite/events-1000-4           3.424m ±  1%
geomean                                    203.6µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  749.5 ± 5%
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.05Ki

                                   │ 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

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

…nt (Copilot round-2)

- runner/factory tests skip (not fail) when the Docker client env is
  unavailable — runner creation depends on DOCKER_HOST/TLS, not an exec_env
  regression (matches sandbox/docker_test.go tolerance).
- module_schema.go exec_env gains DefaultValue: local-docker (golden regen) so
  the editor schema advertises the default.
- resolveSandboxRunner comment clarified: it errors at runner-resolution
  (runtime); the step factory is the construction-time guard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@intel352 intel352 merged commit 9909752 into main Jun 3, 2026
22 checks passed
@intel352 intel352 deleted the feat/infra-p3a-sandboxrunner branch June 3, 2026 01:42
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