Skip to content

ci(iac/admin): vendored infra.proto staleness gate (#21)#808

Merged
intel352 merged 3 commits into
mainfrom
feat/infra-admin-proto-staleness-2026-05-31T1836
Jun 1, 2026
Merged

ci(iac/admin): vendored infra.proto staleness gate (#21)#808
intel352 merged 3 commits into
mainfrom
feat/infra-admin-proto-staleness-2026-05-31T1836

Conversation

@intel352
Copy link
Copy Markdown
Contributor

What

PR-2 of the infra-admin v1.1 program (#21 from the v1 deferred-followup queue). Adds a CI gate that fails when workflow's vendored iac/admin/testdata/infra.proto descriptor drifts from upstream workflow-plugin-infra — closing the cross-repo proto-vendor staleness gap the v1 catalog parity test depends on.

Changes

  • .github/workflows/proto-vendor-staleness.yml — CI job that runs the staleness check.
  • scripts/check-vendored-proto.sh — exits non-zero when the vendored proto's message set drifts; reuses the v1 catalog_proto_parity_test surface + Makefile refresh target.

Verification

bash scripts/check-vendored-proto.sh → exit 0 (in-sync). actionlint clean. Independent of PR-1 (workflow#807) — touches only CI + the vendored proto check. Rollback: revert the workflow file (no runtime impact).

🤖 Generated with Claude Code

intel352 and others added 3 commits May 31, 2026 18:38
Adds scripts/check-vendored-proto.sh and .github/workflows/proto-vendor-staleness.yml
to catch upstream drift in iac/admin/testdata/infra.proto.

How the script works:
1. Reads '// Source version: <tag>' from the vendored file header
2. Fetches the upstream proto from GoCodeAlone/workflow-plugin-infra@<tag>
   via the GitHub raw API (no local checkout required)
3. Extracts the *Config message name sets from both files
4. Diffs them; exit 1 + operator-readable error if any message was added
   or removed (with 'make vendor-infra-proto' refresh instructions)

Verified locally:
  bash scripts/check-vendored-proto.sh  → exit 0 (in-sync)
  (mutate proto) && bash ...            → exit 1 (drift detected)
  actionlint proto-vendor-staleness.yml → exit 0 (no YAML issues)

The CI job runs on push/PR to main when the proto or script changes,
plus a weekly cron to catch upstream drift even when the local file
is not touched.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… parity test

Per spec-reviewer cosmetic suggestion: explain that *Config message
scope is intentional — matches catalog_proto_parity_test.go surface.

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

\+ is a GNU BRE extension unsupported by BSD sed; -E with + works on
both macOS and Linux. CI (ubuntu-latest) was correct either way;
this fixes local dev experience on macOS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 31, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:307: parsing iteration count: invalid syntax
baseline-bench.txt:275054: parsing iteration count: invalid syntax
baseline-bench.txt:576537: parsing iteration count: invalid syntax
baseline-bench.txt:912391: parsing iteration count: invalid syntax
baseline-bench.txt:1241210: parsing iteration count: invalid syntax
baseline-bench.txt:1550667: parsing iteration count: invalid syntax
benchmark-results.txt:307: parsing iteration count: invalid syntax
benchmark-results.txt:342740: parsing iteration count: invalid syntax
benchmark-results.txt:639276: parsing iteration count: invalid syntax
benchmark-results.txt:959023: parsing iteration count: invalid syntax
benchmark-results.txt:1269251: parsing iteration count: invalid syntax
benchmark-results.txt:1588455: 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               9.437m ± 63%   9.718m ± 68%       ~ (p=0.818 n=6)
ComponentLoad-4                     3.638m ± 10%   3.487m ±  0%  -4.15% (p=0.002 n=6)
ComponentExecute-4                  1.852µ ±  2%   1.825µ ±  2%  -1.43% (p=0.026 n=6)
PoolContention/workers-1-4          1.034µ ±  2%   1.019µ ±  3%       ~ (p=0.145 n=6)
PoolContention/workers-2-4          1.056µ ±  2%   1.006µ ±  0%  -4.69% (p=0.002 n=6)
PoolContention/workers-4-4          1.045µ ±  5%   1.007µ ±  1%  -3.64% (p=0.002 n=6)
PoolContention/workers-8-4          1.022µ ±  1%   1.010µ ±  2%  -1.27% (p=0.037 n=6)
PoolContention/workers-16-4         1.046µ ±  2%   1.008µ ±  1%  -3.68% (p=0.002 n=6)
ComponentLifecycle-4                3.608m ±  1%   3.582m ±  1%  -0.71% (p=0.026 n=6)
SourceValidation-4                  2.143µ ±  1%   2.207µ ±  1%  +2.96% (p=0.002 n=6)
RegistryConcurrent-4                779.1n ±  3%   802.2n ±  3%  +2.97% (p=0.026 n=6)
LoaderLoadFromString-4              3.682m ±  1%   3.647m ±  1%  -0.97% (p=0.004 n=6)
geomean                             18.60µ         18.40µ        -1.13%

                            │ baseline-bench.txt │        benchmark-results.txt         │
                            │        B/op        │     B/op      vs base                │
InterpreterCreation-4               2.027Mi ± 0%   2.027Mi ± 0%       ~ (p=0.970 n=6)
ComponentLoad-4                     2.180Mi ± 0%   2.180Mi ± 0%       ~ (p=0.909 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.699 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.561 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                  301.6n ± 5%   298.6n ± 2%       ~ (p=0.093 n=6)
CircuitBreakerExecution_Success-4          22.65n ± 0%   22.68n ± 1%  +0.11% (p=0.002 n=6)
CircuitBreakerExecution_Failure-4          70.91n ± 1%   70.95n ± 0%       ~ (p=0.180 n=6)
geomean                                    78.54n        78.32n       -0.29%

                                  │ 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              301.8n ± 26%   328.3n ± 16%       ~ (p=1.000 n=6)
IaCStateBackend_GRPC-4                   10.32m ± 19%   10.15m ±  1%  -1.60% (p=0.004 n=6)
JQTransform_Simple-4                     679.5n ± 29%   661.6n ± 33%       ~ (p=0.394 n=6)
JQTransform_ObjectConstruction-4         1.476µ ±  2%   1.429µ ±  3%  -3.12% (p=0.022 n=6)
JQTransform_ArraySelect-4                3.589µ ±  2%   3.373µ ±  1%  -6.03% (p=0.002 n=6)
JQTransform_Complex-4                    42.82µ ±  0%   41.60µ ±  1%  -2.86% (p=0.002 n=6)
JQTransform_Throughput-4                 1.802µ ±  6%   1.730µ ±  3%  -3.97% (p=0.004 n=6)
SSEPublishDelivery-4                     64.69n ±  1%   65.25n ±  4%       ~ (p=0.132 n=6)
geomean                                  3.921µ         3.866µ        -1.40%

                                 │ 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.852Mi ± 7%     5.811Mi ± 4%       ~ (p=0.699 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.09%               ²
¹ 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.862k ± 0%     6.856k ± 0%       ~ (p=0.197 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.078µ ± 14%   1.083µ ±  5%       ~ (p=0.937 n=6)
SchemaValidation_AllFields-4                1.640µ ±  2%   1.631µ ± 17%       ~ (p=0.619 n=6)
SchemaValidation_FormatValidation-4         1.576µ ±  1%   1.575µ ±  2%       ~ (p=0.701 n=6)
SchemaValidation_ManySchemas-4              1.603µ ±  2%   1.592µ ±  2%       ~ (p=0.394 n=6)
geomean                                     1.454µ         1.451µ        -0.21%

                                    │ 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.093µ ± 18%   1.058µ ±  6%       ~ (p=0.699 n=6)
EventStoreAppend_SQLite-4                  1.070m ±  8%   1.040m ±  2%  -2.75% (p=0.004 n=6)
GetTimeline_InMemory/events-10-4           13.18µ ±  5%   13.14µ ±  5%       ~ (p=0.937 n=6)
GetTimeline_InMemory/events-50-4           72.41µ ±  2%   72.57µ ±  4%       ~ (p=0.485 n=6)
GetTimeline_InMemory/events-100-4          109.9µ ± 35%   140.1µ ± 21%       ~ (p=0.132 n=6)
GetTimeline_InMemory/events-500-4          561.4µ ±  1%   565.3µ ±  1%  +0.69% (p=0.015 n=6)
GetTimeline_InMemory/events-1000-4         1.136m ±  1%   1.148m ±  2%       ~ (p=0.240 n=6)
GetTimeline_SQLite/events-10-4             86.70µ ±  2%   85.07µ ±  1%  -1.88% (p=0.002 n=6)
GetTimeline_SQLite/events-50-4             224.0µ ±  1%   220.8µ ±  1%  -1.45% (p=0.002 n=6)
GetTimeline_SQLite/events-100-4            388.7µ ±  2%   383.1µ ±  1%  -1.46% (p=0.002 n=6)
GetTimeline_SQLite/events-500-4            1.701m ±  3%   1.672m ±  0%  -1.69% (p=0.002 n=6)
GetTimeline_SQLite/events-1000-4           3.281m ±  0%   3.242m ±  0%  -1.18% (p=0.002 n=6)
geomean                                    196.4µ         198.4µ        +1.01%

                                   │ baseline-bench.txt │        benchmark-results.txt         │
                                   │        B/op        │     B/op      vs base                │
EventStoreAppend_InMemory-4                  774.0 ± 6%     767.5 ± 9%       ~ (p=0.597 n=6)
EventStoreAppend_SQLite-4                  1.984Ki ± 2%   1.984Ki ± 2%       ~ (p=1.000 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=1.000 n=6)
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%   944.3Ki ± 0%       ~ (p=0.394 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.013 n=6)
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%   1.639Mi ± 0%       ~ (p=1.000 n=6)
geomean                                    67.23Ki        67.18Ki       -0.07%
¹ 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 May 31, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@intel352 intel352 merged commit 9ce2cce into main Jun 1, 2026
23 checks passed
@intel352 intel352 deleted the feat/infra-admin-proto-staleness-2026-05-31T1836 branch June 1, 2026 04: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.

1 participant