Skip to content

feat: distinguish legacy-host-load from typed-IaC conformance evidence#648

Merged
intel352 merged 3 commits into
mainfrom
copilot/fix-registry-compatibility-issues
May 13, 2026
Merged

feat: distinguish legacy-host-load from typed-IaC conformance evidence#648
intel352 merged 3 commits into
mainfrom
copilot/fix-registry-compatibility-issues

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 13, 2026

A plugin can pass legacy host-load smoke checks and still fail wfctl plugin conformance --mode typed-iac. These evidence types are not interchangeable — legacy evidence must not satisfy typed-IaC registry readiness for manifests advertising iacProvider capability.

Changes

New evidence mode constant (plugin_compat_model.go)

  • Adds PluginCompatibilityModeLegacyHostLoad = "legacy-host-load" as an explicit named mode
  • ValidateCompatibilityEvidence now accepts legacy-host-load (storable/named) alongside typed-iac; unknown modes still rejected
  • typed-iac remains the only mode that satisfies IaC registry readiness

IaC manifest enforcement at index-update time (registry_compatibility.go)

  • Adds manifestAdvertisesIaCProvider(*RegistryManifest) bool — checks capabilities.iacProvider.name != ""
  • updateRegistryCompatibilityIndex rejects legacy-host-load evidence for any manifest with iacProvider capability with an actionable error:
    plugin "workflow-plugin-aws" advertises iacProvider capability: only typed-iac conformance
    evidence satisfies IaC registry readiness; evidence "ev.json" has mode=legacy-host-load
    (advisory/legacy only). Run: wfctl plugin conformance --mode typed-iac --artifact <archive>
    
  • Non-IaC manifests continue to accept legacy-host-load evidence without restriction

Resolver guard documented (plugin_compat_resolver.go)

  • findCompatibilityEvidence already filtered to typed-iac only; comment now documents this as intentional enforcement, not incidental filtering

Docs (docs/WFCTL.md)

  • Adds conformance modes comparison table clarifying which modes satisfy IaC readiness and which are advisory-only

Copilot AI requested review from Copilot and removed request for Copilot May 13, 2026 05:56
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 13, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:264: parsing iteration count: invalid syntax
baseline-bench.txt:291409: parsing iteration count: invalid syntax
baseline-bench.txt:558851: parsing iteration count: invalid syntax
baseline-bench.txt:1096044: parsing iteration count: invalid syntax
baseline-bench.txt:1386271: parsing iteration count: invalid syntax
baseline-bench.txt:1660442: parsing iteration count: invalid syntax
benchmark-results.txt:264: parsing iteration count: invalid syntax
benchmark-results.txt:297349: parsing iteration count: invalid syntax
benchmark-results.txt:615413: parsing iteration count: invalid syntax
benchmark-results.txt:938550: parsing iteration count: invalid syntax
benchmark-results.txt:1247233: parsing iteration count: invalid syntax
benchmark-results.txt:1532825: 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               7.657m ± 59%   9.036m ± 63%       ~ (p=0.589 n=6)
ComponentLoad-4                     3.575m ±  0%   3.581m ±  8%       ~ (p=0.310 n=6)
ComponentExecute-4                  1.924µ ±  1%   1.927µ ±  0%       ~ (p=0.513 n=6)
PoolContention/workers-1-4          1.089µ ±  1%   1.102µ ±  2%  +1.24% (p=0.041 n=6)
PoolContention/workers-2-4          1.074µ ±  4%   1.101µ ±  1%       ~ (p=0.069 n=6)
PoolContention/workers-4-4          1.081µ ±  1%   1.113µ ±  2%  +3.01% (p=0.004 n=6)
PoolContention/workers-8-4          1.083µ ±  2%   1.107µ ±  2%  +2.22% (p=0.004 n=6)
PoolContention/workers-16-4         1.092µ ±  1%   1.123µ ±  1%  +2.89% (p=0.002 n=6)
ComponentLifecycle-4                3.644m ±  1%   3.831m ±  4%  +5.12% (p=0.002 n=6)
SourceValidation-4                  2.317µ ±  2%   2.369µ ±  1%  +2.24% (p=0.006 n=6)
RegistryConcurrent-4                807.9n ±  3%   825.7n ±  3%       ~ (p=0.093 n=6)
LoaderLoadFromString-4              3.659m ±  1%   3.766m ±  2%  +2.93% (p=0.002 n=6)
geomean                             18.81µ         19.46µ        +3.46%

                            │ baseline-bench.txt │        benchmark-results.txt         │
                            │        B/op        │     B/op      vs base                │
InterpreterCreation-4               2.027Mi ± 0%   2.027Mi ± 0%       ~ (p=0.485 n=6)
ComponentLoad-4                     2.180Mi ± 0%   2.180Mi ± 0%       ~ (p=0.846 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.907 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.366 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.7n ± 5%   293.1n ± 4%       ~ (p=0.485 n=6)
CircuitBreakerExecution_Success-4          21.38n ± 1%   21.43n ± 0%       ~ (p=0.186 n=6)
CircuitBreakerExecution_Failure-4          66.81n ± 0%   66.45n ± 0%  -0.55% (p=0.002 n=6)
geomean                                    74.26n        74.73n       +0.63%

                                  │ 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              │
JQTransform_Simple-4                     869.8n ± 27%   985.5n ± 15%       ~ (p=0.132 n=6)
JQTransform_ObjectConstruction-4         1.434µ ±  2%   1.443µ ±  2%       ~ (p=0.121 n=6)
JQTransform_ArraySelect-4                3.325µ ±  2%   3.429µ ±  0%  +3.16% (p=0.002 n=6)
JQTransform_Complex-4                    38.52µ ±  1%   38.11µ ±  4%       ~ (p=0.132 n=6)
JQTransform_Throughput-4                 1.760µ ±  1%   1.768µ ±  1%       ~ (p=0.063 n=6)
SSEPublishDelivery-4                     62.74n ±  1%   62.97n ±  4%       ~ (p=0.368 n=6)
geomean                                  1.613µ         1.657µ        +2.69%

                                 │ baseline-bench.txt │        benchmark-results.txt         │
                                 │        B/op        │     B/op      vs base                │
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.22Ki ± 0%     16.22Ki ± 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.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │       benchmark-results.txt        │
                                 │     allocs/op      │ allocs/op   vs base                │
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                    324.0 ± 0%     324.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.00%               ²
¹ 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.105µ ±  2%   1.101µ ±  2%       ~ (p=0.981 n=6)
SchemaValidation_AllFields-4                1.666µ ± 25%   1.659µ ± 20%       ~ (p=0.558 n=6)
SchemaValidation_FormatValidation-4         1.587µ ±  1%   1.595µ ±  3%       ~ (p=0.732 n=6)
SchemaValidation_ManySchemas-4              1.836µ ±  1%   1.806µ ±  7%       ~ (p=0.394 n=6)
geomean                                     1.521µ         1.514µ        -0.46%

                                    │ 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.218µ ± 14%   1.205µ ± 29%        ~ (p=0.729 n=6)
EventStoreAppend_SQLite-4                  1.259m ±  5%   1.444m ±  4%  +14.70% (p=0.002 n=6)
GetTimeline_InMemory/events-10-4           13.48µ ±  3%   14.98µ ±  4%  +11.14% (p=0.002 n=6)
GetTimeline_InMemory/events-50-4           76.33µ ±  1%   84.91µ ± 11%  +11.24% (p=0.043 n=6)
GetTimeline_InMemory/events-100-4          121.9µ ± 27%   131.8µ ±  1%        ~ (p=0.394 n=6)
GetTimeline_InMemory/events-500-4          624.7µ ±  0%   684.7µ ±  2%   +9.60% (p=0.002 n=6)
GetTimeline_InMemory/events-1000-4         1.271m ±  1%   1.410m ±  1%  +10.93% (p=0.002 n=6)
GetTimeline_SQLite/events-10-4             106.9µ ±  1%   112.5µ ±  1%   +5.27% (p=0.002 n=6)
GetTimeline_SQLite/events-50-4             247.6µ ±  1%   267.5µ ±  2%   +8.01% (p=0.002 n=6)
GetTimeline_SQLite/events-100-4            416.4µ ±  1%   453.1µ ±  2%   +8.81% (p=0.002 n=6)
GetTimeline_SQLite/events-500-4            1.769m ±  1%   1.929m ±  2%   +9.03% (p=0.002 n=6)
GetTimeline_SQLite/events-1000-4           3.460m ±  1%   3.803m ±  8%   +9.91% (p=0.002 n=6)
geomean                                    216.0µ         234.9µ         +8.75%

                                   │ baseline-bench.txt │        benchmark-results.txt         │
                                   │        B/op        │     B/op      vs base                │
EventStoreAppend_InMemory-4                  812.0 ± 5%     832.5 ± 9%       ~ (p=0.965 n=6)
EventStoreAppend_SQLite-4                  1.985Ki ± 2%   1.986Ki ± 2%       ~ (p=0.853 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.080 n=6)
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%   944.3Ki ± 0%  -0.00% (p=0.006 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=0.054 n=6)
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%   1.639Mi ± 0%  -0.00% (p=0.013 n=6)
geomean                                    67.50Ki        67.64Ki       +0.21%
¹ 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 13, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

- Add PluginCompatibilityModeLegacyHostLoad = "legacy-host-load" constant
  with documentation that it is advisory-only and never satisfies IaC
  registry readiness
- Update ValidateCompatibilityEvidence to accept legacy-host-load mode
  (valid to store/name) while keeping typed-iac as the only mode
  satisfying IaC compatibility decisions
- Add manifestAdvertisesIaCProvider helper to registry_compatibility.go
- Enforce in updateRegistryCompatibilityIndex: IaC provider manifests
  (capabilities.iacProvider.name != "") must supply typed-iac evidence;
  legacy-host-load is rejected with an actionable error
- Update findCompatibilityEvidence comment to document that typed-iac-only
  filtering is intentional (legacy-host-load never matches)
- Add tests: legacy-host-load valid in model, rejected for IaC manifests,
  ignored by resolver even with RequiredFromEngine set
- Update docs/WFCTL.md to document both conformance modes

Agent-Logs-Url: https://github.com/GoCodeAlone/workflow/sessions/27f85922-fcfd-4094-87aa-ca4e3fd211a8

Co-authored-by: intel352 <77607+intel352@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 13, 2026 06:15
Copilot AI changed the title [WIP] Fix registry compatibility to distinguish legacy host-load from typed-IaC feat: distinguish legacy-host-load from typed-IaC conformance evidence May 13, 2026
Copilot AI requested a review from intel352 May 13, 2026 06:17
@intel352 intel352 marked this pull request as ready for review May 13, 2026 22:14
Copilot AI review requested due to automatic review settings May 13, 2026 22:14
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

This PR refines how plugin compatibility evidence is interpreted in wfctl by explicitly distinguishing advisory legacy host-load evidence from strict typed-IaC conformance evidence, and enforcing that typed-IaC evidence is required for registry readiness when a manifest advertises an iacProvider capability.

Changes:

  • Introduces a new compatibility evidence mode constant legacy-host-load and updates evidence validation to accept it as a storable, named mode (while keeping typed-iac as the only IaC-readiness mode).
  • Enforces at registry index update time that manifests advertising iacProvider cannot be indexed with non-typed-iac evidence, with an actionable error message.
  • Adds/updates tests and documentation to clarify behavior, plus small formatting cleanups in a couple of Go test/struct definitions.

Reviewed changes

Copilot reviewed 8 out of 9 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
plugin/external/sdk/iacserver_test.go Go formatting tweak for an embedded gRPC stub type used in a registration/no-panic test.
docs/WFCTL.md Documents conformance modes and clarifies typed-IaC readiness requirements.
cmd/wfctl/registry_compatibility.go Rejects non-typed IaC evidence for IaC provider manifests; adds manifestAdvertisesIaCProvider helper.
cmd/wfctl/registry_compatibility_test.go Adds coverage for IaC vs non-IaC manifest enforcement and helper manifest writer.
cmd/wfctl/plugin_compat_resolver.go Documents intentional exclusion of legacy evidence from IaC readiness decisions.
cmd/wfctl/plugin_compat_resolver_test.go Adds test confirming legacy evidence never satisfies required IaC evidence.
cmd/wfctl/plugin_compat_model.go Adds legacy-host-load mode constant and updates evidence mode validation logic.
cmd/wfctl/plugin_compat_model_test.go Adds tests ensuring legacy-host-load is accepted and unknown modes are rejected.
cmd/wfctl/deploy_providers.go Minor struct field alignment/formatting change.

Comment thread docs/WFCTL.md Outdated
Comment on lines +559 to +572
| `--mode` | `typed-iac` | Conformance mode. `typed-iac` checks strict typed IaC plugin launch/contract compatibility and is the only mode that satisfies typed-IaC registry readiness for manifests advertising `iacProvider` capability. |
| `--artifact` | _(none)_ | Release artifact tar.gz to test instead of a local plugin directory |
| `--build-package` | `.` | Go package to build when testing a source directory, for example `./cmd/plugin` |
| `--engine-version` | build version or `WFCTL_ENGINE_VERSION` | Workflow engine version recorded in evidence |
| `--format` | `text` | Output format: `text` or `json` |
| `--output` | _(none)_ | Write JSON evidence to a file |
| `--timeout` | `30s` | Plugin launch/check timeout |

**Conformance modes and compatibility evidence:**

| Mode | Description | Satisfies IaC readiness? |
|------|-------------|--------------------------|
| `typed-iac` | Verifies the plugin binary completes the Workflow go-plugin handshake and registers `pb.IaCProviderRequired` and typed services. | **Yes** — required for manifests with `iacProvider` capability in first-party registries. |
| `legacy-host-load` | Advisory-only smoke evidence for legacy `sdk.Serve` module plugins that can load and expose metadata/contracts but have not migrated to `sdk.ServeIaCPlugin`. | **No** — never satisfies typed-IaC registry readiness; rejected at index-update time for IaC provider manifests. |
@intel352
Copy link
Copy Markdown
Contributor

@copilot apply changes based on the comments in this thread

…-mode flag

The docs table previously listed legacy-host-load in a "Conformance modes"
section that could be misread as a valid --mode flag for wfctl plugin
conformance. The CLI hard-rejects any mode other than typed-iac.

Rename the section to "Compatibility evidence modes" and explicitly state:
- wfctl plugin conformance only generates typed-iac evidence
- legacy-host-load is an evidence/index mode from legacy tooling; it
  cannot be passed as --mode to the conformance command
- The How-produced column now makes the source of each evidence mode clear

Agent-Logs-Url: https://github.com/GoCodeAlone/workflow/sessions/27e4f5c0-448f-4c10-aff6-10dc8c66a108

Co-authored-by: intel352 <77607+intel352@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 13, 2026

@copilot apply changes based on the comments in this thread

Fixed in eb0b4b4. The docs section was renamed from "Conformance modes" to "Compatibility evidence modes" with an explicit note that wfctl plugin conformance only generates typed-iac evidence and legacy-host-load is an evidence/index mode from legacy tooling that cannot be passed as --mode to the conformance command. Added a "How produced" column to the table to make the source of each mode unambiguous.

@intel352 intel352 merged commit 002e9f8 into main May 13, 2026
25 checks passed
@intel352 intel352 deleted the copilot/fix-registry-compatibility-issues branch May 13, 2026 23:31
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.

Registry compatibility must distinguish legacy host-load from typed-IaC conformance

3 participants