Skip to content

feat(secrets,iac): fail-safe secret reachability gate (infra-admin P2 PR4/12)#843

Merged
intel352 merged 5 commits into
mainfrom
feat/infra-p2-reachability
Jun 2, 2026
Merged

feat(secrets,iac): fail-safe secret reachability gate (infra-admin P2 PR4/12)#843
intel352 merged 5 commits into
mainfrom
feat/infra-p2-reachability

Conversation

@intel352
Copy link
Copy Markdown
Contributor

@intel352 intel352 commented Jun 2, 2026

PR4/12 — fail-safe secret reachability gate (infra-admin Phase 2)

Locked plan Tasks 7–8; ADR 0017. A pre-flight that blocks a direct apply (→409) when a referenced secret can't be reached from the chosen exec-env. Additive — no consumer until the apply route wires it (scenario PR11).

Changes

  • secrets.Reachability(ctx, p Provider, execEnv) Result — fail-safe f(backend × exec-env). Concrete-type classification: host-local (env/file/keychain) reachable ONLY for local exec-envs (""/local/local-docker); for a REMOTE exec-env they fail-safe to unreachable — the engine can't vouch for the remote agent's own secrets (ADR 0017 agent-side resolution; conservative until the agent-probe hardening lands). *GitHubSecretsProvider → short-circuit unreachable (write-only) BEFORE any CheckAccess. Remote vault/aws → reachable iff AccessChecker.CheckAccess(ctx) nil, else fail-safe; no-AccessChecker + remote → fail-safe unreachable. Never fails open.
  • step.iac_secret_reachability — resolves the configured secrets provider, collects distinct secret:// refs from specs' config (recurses maps, []any, []string), returns {secrets:[{ref,reachable,reason}], all_reachable}. Accepts static specs or specs_from (context). Provider-level verdict reported per ref (single CheckAccess).

Review notes (resolved)

  • Critical: Reachability now threads the caller's ctx into CheckAccess (was context.Background(), which could hang the pre-flight ~60s ignoring the route deadline).
  • Fail-open hole closed: host-local backends no longer reported reachable for remote exec-envs.
  • Recursion now covers []string; added a collectSecretRefs table test (flat/map/slice/slice-of-maps/[]string/double-nested) + ctx-propagation + mutual-exclusion + specs_from tests.

Verified: go build ./... exit 0; secrets+module+plugins/all (incl. TestDocumentationCoverage) pass; golangci-lint --new-from-rev 0 issues.

🤖 Generated with Claude Code

intel352 and others added 3 commits June 2, 2026 18:31
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… recursion coverage (review)

PR4 review fixes:
- CRITICAL: Reachability now takes ctx and passes it into AccessChecker.CheckAccess
  so a slow/unreachable vault/aws probe is bounded by the route/pipeline deadline
  instead of hanging the pre-flight. step.iac_secret_reachability propagates its
  Execute ctx.
- IMPORTANT: host-local backends (env/file/keychain) are now reachable ONLY for a
  local exec-env. For a remote exec-env they are fail-safe unreachable (ADR 0017:
  the remote agent resolves its own secrets; engine-host env/file/keychain are not
  verifiable on a remote runner). Closes a fail-open hole.
- IMPORTANT: collectFromValue now also recurses typed []string (programmatically-
  built specs), with a dedicated TestCollectSecretRefs covering flat/map/[]any-of-
  strings/[]any-of-maps/[]string/double-nesting + dedup.
- MINORS: assert CheckAccess called (VaultWithAccess) and called exactly once
  (MultipleRefs, proving provider-level verdict); add specs_from + specs/specs_from
  mutual-exclusion tests; DOCUMENTATION row notes provider-level verdict.

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:50
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 a fail-safe “secret reachability” pre-flight capability intended to conservatively block IaC applies when the configured secrets backend cannot be verified from the chosen execution environment (especially for remote exec-envs per ADR 0017). This introduces a new secrets.Reachability API plus a step.iac_secret_reachability pipeline step and wires the step into the platform plugin’s step registry/docs.

Changes:

  • Introduces secrets.Reachability(ctx, provider, execEnv) Result with conservative host-local vs remote exec-env classification and AccessChecker probing.
  • Adds step.iac_secret_reachability to collect secret:// references from IaC specs (static or specs_from) and report per-ref reachability with a single provider-level probe.
  • Registers the new step type in the platform plugin and documents it in DOCUMENTATION.md.

Reviewed changes

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

Show a summary per file
File Description
secrets/reachability.go New reachability classification/probing logic for secrets providers.
secrets/reachability_test.go Unit tests for reachability behavior across provider categories and ctx propagation.
module/pipeline_step_iac_secret_reachability.go New pipeline step to collect secret refs from specs and report reachability.
module/pipeline_step_iac_secret_reachability_test.go External tests for step behavior (provider resolution, output shape, single probe).
module/pipeline_step_iac_secret_reachability_internal_test.go Internal tests for secret-ref collection recursion/dedup/sorting.
plugins/platform/plugin.go Registers step.iac_secret_reachability in StepTypes and StepFactories.
DOCUMENTATION.md Documents the new step in the step catalog table.

Comment thread module/pipeline_step_iac_secret_reachability.go
Comment thread secrets/reachability.go
Comment thread secrets/reachability_test.go
Comment thread secrets/reachability_test.go Outdated
@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:300411: parsing iteration count: invalid syntax
baseline-bench.txt:595264: parsing iteration count: invalid syntax
baseline-bench.txt:907466: parsing iteration count: invalid syntax
baseline-bench.txt:1252698: parsing iteration count: invalid syntax
baseline-bench.txt:1510354: parsing iteration count: invalid syntax
benchmark-results.txt:302: parsing iteration count: invalid syntax
benchmark-results.txt:332070: parsing iteration count: invalid syntax
benchmark-results.txt:624454: parsing iteration count: invalid syntax
benchmark-results.txt:897605: parsing iteration count: invalid syntax
benchmark-results.txt:1183140: parsing iteration count: invalid syntax
benchmark-results.txt:1482880: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ baseline-bench.txt │       benchmark-results.txt        │
                            │       sec/op       │    sec/op     vs base              │
InterpreterCreation-4               9.113m ± 65%   7.135m ± 56%       ~ (p=0.699 n=6)
ComponentLoad-4                     3.663m ±  5%   3.640m ± 10%       ~ (p=1.000 n=6)
ComponentExecute-4                  1.956µ ±  1%   1.959µ ±  1%       ~ (p=0.561 n=6)
PoolContention/workers-1-4          1.126µ ±  2%   1.114µ ±  3%       ~ (p=0.351 n=6)
PoolContention/workers-2-4          1.129µ ±  2%   1.095µ ±  2%  -2.97% (p=0.009 n=6)
PoolContention/workers-4-4          1.101µ ±  2%   1.101µ ±  1%       ~ (p=1.000 n=6)
PoolContention/workers-8-4          1.101µ ±  1%   1.102µ ±  4%       ~ (p=0.483 n=6)
PoolContention/workers-16-4         1.107µ ±  1%   1.117µ ±  1%       ~ (p=0.193 n=6)
ComponentLifecycle-4                3.654m ±  1%   3.721m ±  1%  +1.82% (p=0.002 n=6)
SourceValidation-4                  2.320µ ±  0%   2.467µ ±  1%  +6.36% (p=0.002 n=6)
RegistryConcurrent-4                831.5n ±  4%   841.6n ±  3%       ~ (p=0.132 n=6)
LoaderLoadFromString-4              3.608m ±  1%   3.714m ±  1%  +2.94% (p=0.002 n=6)
geomean                             19.39µ         19.14µ        -1.32%

                            │ baseline-bench.txt │        benchmark-results.txt         │
                            │        B/op        │     B/op      vs base                │
InterpreterCreation-4               2.027Mi ± 0%   2.027Mi ± 0%       ~ (p=0.909 n=6)
ComponentLoad-4                     2.180Mi ± 0%   2.180Mi ± 0%       ~ (p=0.937 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%  +0.00% (p=0.045 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%       ~ (p=0.331 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                  286.4n ± 0%   287.6n ± 5%  +0.40% (p=0.041 n=6)
CircuitBreakerExecution_Success-4          21.53n ± 1%   21.53n ± 0%       ~ (p=0.970 n=6)
CircuitBreakerExecution_Failure-4          66.06n ± 0%   66.20n ± 1%       ~ (p=0.193 n=6)
geomean                                    74.12n        74.28n       +0.20%

                                  │ 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              309.2n ± 39%   309.1n ±  9%       ~ (p=0.727 n=6)
IaCStateBackend_GRPC-4                   9.538m ±  3%   9.585m ± 12%       ~ (p=0.589 n=6)
JQTransform_Simple-4                     645.7n ± 39%   666.3n ± 38%       ~ (p=0.240 n=6)
JQTransform_ObjectConstruction-4         1.494µ ±  0%   1.526µ ±  2%  +2.11% (p=0.002 n=6)
JQTransform_ArraySelect-4                3.417µ ±  1%   3.476µ ±  1%  +1.73% (p=0.002 n=6)
JQTransform_Complex-4                    39.22µ ±  1%   39.35µ ±  1%       ~ (p=0.485 n=6)
JQTransform_Throughput-4                 1.831µ ±  0%   1.867µ ±  1%  +1.97% (p=0.002 n=6)
SSEPublishDelivery-4                     64.25n ±  0%   64.55n ±  1%       ~ (p=0.169 n=6)
geomean                                  3.815µ         3.863µ        +1.28%

                                 │ 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.856Mi ± 9%     5.881Mi ± 12%       ~ (p=0.937 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.05%               ²
¹ 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.830k ± 0%     6.835k ± 0%       ~ (p=0.368 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.01%               ²
¹ 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.093µ ± 3%   1.103µ ±  2%       ~ (p=0.589 n=6)
SchemaValidation_AllFields-4                 1.640µ ± 2%   1.696µ ± 17%  +3.41% (p=0.013 n=6)
SchemaValidation_FormatValidation-4          1.597µ ± 2%   1.590µ ±  1%       ~ (p=0.513 n=6)
SchemaValidation_ManySchemas-4               1.837µ ± 4%   1.819µ ±  2%       ~ (p=0.818 n=6)
geomean                                      1.514µ        1.525µ        +0.71%

                                    │ 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.183µ ± 17%   1.263µ ± 14%        ~ (p=0.394 n=6)
EventStoreAppend_SQLite-4                  1.279m ±  3%   1.627m ±  8%  +27.24% (p=0.002 n=6)
GetTimeline_InMemory/events-10-4           15.03µ ±  3%   14.27µ ±  3%   -5.05% (p=0.004 n=6)
GetTimeline_InMemory/events-50-4           84.25µ ±  3%   79.50µ ± 21%   -5.64% (p=0.002 n=6)
GetTimeline_InMemory/events-100-4          170.0µ ± 22%   124.3µ ±  0%  -26.86% (p=0.002 n=6)
GetTimeline_InMemory/events-500-4          678.5µ ±  1%   638.6µ ±  1%   -5.87% (p=0.002 n=6)
GetTimeline_InMemory/events-1000-4         1.387m ±  1%   1.302m ±  0%   -6.14% (p=0.002 n=6)
GetTimeline_SQLite/events-10-4             75.43µ ±  1%   72.10µ ±  0%   -4.41% (p=0.002 n=6)
GetTimeline_SQLite/events-50-4             226.3µ ±  1%   216.8µ ±  1%   -4.19% (p=0.002 n=6)
GetTimeline_SQLite/events-100-4            410.0µ ±  1%   392.5µ ±  0%   -4.25% (p=0.002 n=6)
GetTimeline_SQLite/events-500-4            1.869m ±  1%   1.789m ±  2%   -4.27% (p=0.002 n=6)
GetTimeline_SQLite/events-1000-4           3.681m ±  1%   3.536m ±  1%   -3.95% (p=0.002 n=6)
geomean                                    222.5µ         214.3µ         -3.72%

                                   │ baseline-bench.txt │         benchmark-results.txt         │
                                   │        B/op        │     B/op       vs base                │
EventStoreAppend_InMemory-4                  790.5 ± 6%     833.5 ± 10%       ~ (p=0.143 n=6)
EventStoreAppend_SQLite-4                  1.983Ki ± 3%   1.983Ki ±  3%       ~ (p=0.892 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%       ~ (p=0.273 n=6)
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%   944.3Ki ±  0%       ~ (p=0.636 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%  -0.00% (p=0.011 n=6)
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%   1.639Mi ±  0%       ~ (p=0.675 n=6)
geomean                                    67.35Ki        67.64Ki        +0.44%
¹ 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.

@codecov
Copy link
Copy Markdown

codecov Bot commented Jun 2, 2026

Codecov Report

❌ Patch coverage is 88.48485% with 19 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
module/pipeline_step_iac_secret_reachability.go 85.71% 8 Missing and 6 partials ⚠️
plugins/platform/plugin.go 25.00% 3 Missing ⚠️
secrets/reachability.go 95.74% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

intel352 and others added 2 commits June 2, 2026 19:07
…il-safe (review/CI)

- CI consistency gate: register step.iac_secret_reachability in coreModuleTypes
  (schema/schema.go) + ModuleSchema registry (module_schema.go) + StepSchema
  builtins (step_schema_builtins.go) + regenerate editor golden. (TestRegistryConsistency
  + TestCoreStepTypesHaveSchemas + TestModuleSchemaRegistry_* require this for
  every built-in step type.)
- Copilot: Reachability rejects nil/typed-nil providers (fail-safe, was a
  potential panic/fail-open) via isNilProvider (reflect).
- Copilot: step's specs_from resolving to empty/missing now ERRORS instead of
  silently returning all_reachable=true (was a fail-open gate bypass), matching
  iac_provider_plan/apply.
- Copilot: corrected two inaccurate test comments.
- Tests: TestReachability_NilProvider + TestSecretReachabilityStep_SpecsFromEmpty_Errors.

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

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@intel352 intel352 merged commit f494d2d into main Jun 2, 2026
20 of 21 checks passed
@intel352 intel352 deleted the feat/infra-p2-reachability branch June 2, 2026 23:17
intel352 added a commit that referenced this pull request Jun 2, 2026
…v2.12.0) (#844)

golangci-lint v2.12.0 (CI) govet flags 'Constant reflect.Ptr should be
inlined' for the deprecated reflect.Ptr alias added in #843. Use the
canonical reflect.Pointer. (Local golangci v2.11.4 did not flag this —
version gap; main CI Lint went red on the #843 merge.)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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