Skip to content

docs: evaluate wfctl-driven workflow ci#820

Merged
intel352 merged 1 commit into
mainfrom
docs/616-wfctl-ci-evaluation
Jun 1, 2026
Merged

docs: evaluate wfctl-driven workflow ci#820
intel352 merged 1 commit into
mainfrom
docs/616-wfctl-ci-evaluation

Conversation

@intel352
Copy link
Copy Markdown
Contributor

@intel352 intel352 commented Jun 1, 2026

Summary

  • evaluates replacing the Workflow repo GitHub Actions with setup-wfctl plus wfctl commands
  • recommends keeping hand-authored Actions as the scheduler/security boundary for now
  • identifies focused follow-ups for release, repo checks, cross-plugin checks, and setup-wfctl adoption
  • records that first-party CI renderers should stay core-owned per ADR 0045 rather than moving into provider plugins now

Closes #616.

Verification

  • git diff --check
  • Documentation-only change; no Go tests run.

Copilot AI review requested due to automatic review settings June 1, 2026 15:47
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 new plan/evaluation document capturing the outcome of issue #616: whether to replace this repository’s hand-authored GitHub Actions CI with setup-wfctl + wfctl-driven pipelines, and what gaps remain before a full migration would be safe.

Changes:

  • Documented an evaluation recommending keeping GitHub Actions as the scheduler/security boundary for the Workflow repo CI for now.
  • Cataloged current Workflow repo CI responsibilities vs. current wfctl ci capabilities, and identified concrete follow-up work items (release modeling, repo checks, cross-plugin checks, setup-wfctl adoption audit).
  • Recorded the renderer ownership boundary (per ADR 0045): core-owned CI renderers, plugins consume core generation rather than owning renderers.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 1, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:308: parsing iteration count: invalid syntax
baseline-bench.txt:300933: parsing iteration count: invalid syntax
baseline-bench.txt:587044: parsing iteration count: invalid syntax
baseline-bench.txt:901679: parsing iteration count: invalid syntax
baseline-bench.txt:1208079: parsing iteration count: invalid syntax
baseline-bench.txt:1504225: parsing iteration count: invalid syntax
benchmark-results.txt:308: parsing iteration count: invalid syntax
benchmark-results.txt:339453: parsing iteration count: invalid syntax
benchmark-results.txt:633898: parsing iteration count: invalid syntax
benchmark-results.txt:951302: parsing iteration count: invalid syntax
benchmark-results.txt:1273929: parsing iteration count: invalid syntax
benchmark-results.txt:1588588: 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              10.981m ± 51%   9.683m ± 65%  -11.82% (p=0.041 n=6)
ComponentLoad-4                     3.672m ±  1%   3.592m ± 10%        ~ (p=0.093 n=6)
ComponentExecute-4                  1.998µ ±  2%   1.964µ ±  1%        ~ (p=0.093 n=6)
PoolContention/workers-1-4          1.084µ ±  4%   1.098µ ±  2%        ~ (p=0.619 n=6)
PoolContention/workers-2-4          1.085µ ±  1%   1.080µ ±  3%        ~ (p=0.461 n=6)
PoolContention/workers-4-4          1.091µ ±  2%   1.086µ ±  1%        ~ (p=0.366 n=6)
PoolContention/workers-8-4          1.094µ ±  1%   1.086µ ±  0%   -0.78% (p=0.009 n=6)
PoolContention/workers-16-4         1.100µ ±  4%   1.090µ ±  1%        ~ (p=0.100 n=6)
ComponentLifecycle-4                3.649m ±  8%   3.627m ±  1%        ~ (p=0.093 n=6)
SourceValidation-4                  2.333µ ±  1%   2.345µ ±  1%        ~ (p=0.372 n=6)
RegistryConcurrent-4                819.0n ±  4%   799.2n ±  4%        ~ (p=0.180 n=6)
LoaderLoadFromString-4              3.642m ±  0%   3.642m ±  2%        ~ (p=0.818 n=6)
geomean                             19.57µ         19.24µ         -1.69%

                            │ baseline-bench.txt │        benchmark-results.txt         │
                            │        B/op        │     B/op      vs base                │
InterpreterCreation-4               2.027Mi ± 0%   2.027Mi ± 0%       ~ (p=0.732 n=6)
ComponentLoad-4                     2.180Mi ± 0%   2.180Mi ± 0%       ~ (p=0.920 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.558 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.455 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                  288.3n ± 4%   286.8n ± 4%       ~ (p=0.221 n=6)
CircuitBreakerExecution_Success-4          21.51n ± 1%   21.54n ± 1%       ~ (p=0.621 n=6)
CircuitBreakerExecution_Failure-4          65.91n ± 0%   66.14n ± 1%  +0.35% (p=0.004 n=6)
geomean                                    74.21n        74.19n       -0.02%

                                  │ 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              348.9n ± 16%   310.1n ±  0%  -11.13% (p=0.002 n=6)
IaCStateBackend_GRPC-4                   9.546m ±  4%   9.959m ±  9%        ~ (p=0.310 n=6)
JQTransform_Simple-4                     724.6n ± 30%   702.2n ± 29%        ~ (p=0.589 n=6)
JQTransform_ObjectConstruction-4         1.496µ ±  1%   1.488µ ±  1%   -0.53% (p=0.028 n=6)
JQTransform_ArraySelect-4                3.547µ ±  5%   3.429µ ± 13%        ~ (p=0.937 n=6)
JQTransform_Complex-4                    39.00µ ±  2%   39.45µ ±  2%        ~ (p=0.485 n=6)
JQTransform_Throughput-4                 1.792µ ±  1%   1.815µ ±  1%   +1.28% (p=0.015 n=6)
SSEPublishDelivery-4                     64.41n ±  2%   64.72n ±  0%        ~ (p=0.556 n=6)
geomean                                  3.936µ         3.879µ         -1.45%

                                 │ 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.890Mi ± 5%     5.932Mi ± 10%       ~ (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.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.847k ± 0%     6.841k ± 0%       ~ (p=0.240 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.108µ ± 20%   1.103µ ± 2%       ~ (p=0.485 n=6)
SchemaValidation_AllFields-4                1.646µ ±  2%   1.656µ ± 1%       ~ (p=0.288 n=6)
SchemaValidation_FormatValidation-4         1.581µ ±  2%   1.576µ ± 2%       ~ (p=0.667 n=6)
SchemaValidation_ManySchemas-4              1.828µ ±  3%   1.816µ ± 3%       ~ (p=0.485 n=6)
geomean                                     1.515µ         1.512µ       -0.22%

                                    │ 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.084µ ± 44%   1.125µ ± 23%        ~ (p=0.310 n=6)
EventStoreAppend_SQLite-4                  1.298m ±  4%   1.454m ±  2%  +12.01% (p=0.002 n=6)
GetTimeline_InMemory/events-10-4           15.04µ ±  2%   15.27µ ±  3%        ~ (p=0.240 n=6)
GetTimeline_InMemory/events-50-4           86.68µ ±  1%   86.15µ ±  3%        ~ (p=0.615 n=6)
GetTimeline_InMemory/events-100-4          154.9µ ± 15%   172.7µ ± 23%        ~ (p=0.589 n=6)
GetTimeline_InMemory/events-500-4          685.6µ ±  2%   682.4µ ±  2%        ~ (p=0.485 n=6)
GetTimeline_InMemory/events-1000-4         1.367m ±  1%   1.391m ±  1%   +1.72% (p=0.009 n=6)
GetTimeline_SQLite/events-10-4             112.4µ ±  1%   112.7µ ±  1%        ~ (p=1.000 n=6)
GetTimeline_SQLite/events-50-4             271.0µ ±  2%   266.4µ ±  1%        ~ (p=0.065 n=6)
GetTimeline_SQLite/events-100-4            447.7µ ±  1%   448.9µ ±  1%        ~ (p=0.093 n=6)
GetTimeline_SQLite/events-500-4            1.919m ±  1%   1.910m ±  1%   -0.51% (p=0.041 n=6)
GetTimeline_SQLite/events-1000-4           3.775m ±  3%   3.712m ±  1%        ~ (p=0.240 n=6)
geomean                                    233.5µ         238.4µ         +2.07%

                                   │ baseline-bench.txt │         benchmark-results.txt         │
                                   │        B/op        │     B/op       vs base                │
EventStoreAppend_InMemory-4                 751.0 ± 13%     785.5 ± 11%       ~ (p=0.372 n=6)
EventStoreAppend_SQLite-4                 1.985Ki ±  1%   1.982Ki ±  1%       ~ (p=0.177 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.448 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=1.000 n=6)
geomean                                   67.06Ki         67.31Ki        +0.36%
¹ 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 1, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@intel352 intel352 merged commit 84c43c2 into main Jun 1, 2026
23 checks passed
@intel352 intel352 deleted the docs/616-wfctl-ci-evaluation branch June 1, 2026 16:00
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.

Evaluate replacing Workflow repo CI with wfctl-driven jobs

2 participants