Skip to content

Migrate workflow-plugin-migrations to strict gRPC proto contracts - #13

Merged
intel352 merged 12 commits into
mainfrom
copilot/migrate-workflow-plugin-migrations
May 3, 2026
Merged

intel352 merged 12 commits into
mainfrom
copilot/migrate-workflow-plugin-migrations

Conversation

Copilot AI commented May 1, 2026 •

Copy link
Copy Markdown
Contributor

The plugin had no contract descriptors for any of its 2 module types or 4 step types, causing wfctl audit plugins to report missing_module_contract_descriptor and missing_step_contract_descriptor for all advertised types.

Changes

internal/contracts.go (new)

  • dynamic.FieldContract per module type (database.migrations, database.migration_driver) — typed required/optional config fields and service method inputs/outputs
  • dynamic.FieldContract per step type (all 4) — typed required/optional config inputs and typed outputs
  • PluginModuleSchemas() → []sdk.ModuleSchemaData for editor/wfctl tooling
  • PluginStepSchemas() → []*schema.StepSchema for the step schema registry
  • Field descriptions corrected: driver_ref clarified as a literal driver name (module-ref lookup not yet implemented); history_table noted as reserved for future driver support with no current runtime effect
  • Exported proto name constants (ProtoMigrationsModuleConfig, ProtoMigrationDriverConfig, ProtoMigrateUpInput/Output, etc.) as the canonical single source of truth for strict-contract descriptor message names

internal/plugin.go

  • MigrationsPlugin now satisfies sdk.SchemaProvider (ModuleSchemas())
  • ModuleContracts() map[string]*dynamic.FieldContract and StepContracts() exposed for engine validation and audit tooling

plugin.json

  • Added stepSchemas array — consumed by schema.LoadPluginStepSchemasFromDir and wfctl LSP/editor. Each entry declares config fields with types, labels, required flags, select options, and defaults, plus typed outputs
  • Added downloads array covering Linux/macOS/Windows for amd64 and arm64 using correct hyphen-separated filenames matching goreleaser's name_template (e.g. workflow-plugin-migrations-linux-amd64.tar.gz)
  • Restored cliCommands subcommand list and flags_passthrough metadata for all migrate subcommands
  • Updated version to 0.3.6 to match the latest release tag

plugin.contracts.json (new)

Strict contract descriptors in the canonical wfctl v0.20.1 format:

{
  "version": "1",
  "contracts": [
    {"kind": "module", "type": "database.migrations",       "mode": "strict", "config": "workflow.plugins.migrations.MigrationsModuleConfig"},
    {"kind": "module", "type": "database.migration_driver", "mode": "strict", "config": "workflow.plugins.migrations.MigrationDriverConfig"},
    {"kind": "step",   "type": "step.migrate_up",           "mode": "strict", "input": "workflow.plugins.migrations.MigrateUpInput",     "output": "workflow.plugins.migrations.MigrateUpOutput"},
    {"kind": "step",   "type": "step.migrate_down",         "mode": "strict", "input": "workflow.plugins.migrations.MigrateDownInput",   "output": "workflow.plugins.migrations.MigrateDownOutput"},
    {"kind": "step",   "type": "step.migrate_status",       "mode": "strict", "input": "workflow.plugins.migrations.MigrateStatusInput", "output": "workflow.plugins.migrations.MigrateStatusOutput"},
    {"kind": "step",   "type": "step.migrate_to",           "mode": "strict", "input": "workflow.plugins.migrations.MigrateToInput",     "output": "workflow.plugins.migrations.MigrateToOutput"}
  ]
}

plugin.atlas.json (new)

Atlas-specific plugin manifest with correct workflow-plugin-atlas-migrate download URLs, no stepSchemas (the atlas binary exposes no step types), and module-only capabilities.

plugin.atlas.contracts.json (new)

Module-only strict contract descriptors for workflow-plugin-atlas-migrate, covering database.migrations and database.migration_driver without step entries the binary cannot satisfy.

internal/plugin_test.go

  • TestPlugin_SchemaProvider, TestPlugin_ModuleContracts, TestPlugin_StepContracts, TestPlugin_StepSchemas, TestPlugin_ContractCoverage — contract and schema coverage
  • TestPlugin_PluginJSONStepSchemasDrift — full structural comparison of plugin.json stepSchemas against PluginStepSchemas() (not just type names)
  • TestPlugin_ContractsJSONDrift — asserts plugin.contracts.json matches expected descriptors derived from ModuleContracts()/StepContracts() plus the exported proto name constants; a proto name change must flow through contracts.go → JSON → the test flags any mismatch
  • TestPlugin_AtlasContractsJSONDrift — same check for plugin.atlas.contracts.json (module-only)
  • TestPlugin_DownloadsMatchGoReleaserMainArchiveMatrix — asserts plugin.json downloads cover every OS/arch in the goreleaser build matrix
  • TestPlugin_GoReleaserManifestRewriteUpdatesDownloadURLs — executes the goreleaser sed hook against a temp copy and verifies URLs are rewritten with the snapshot version prefix
  • TestPlugin_GoReleaserArchivesPackageCorrectManifestsAndContracts — asserts the goreleaser config packages the correct manifest and contracts file per archive (main uses plugin.json/plugin.contracts.json; atlas uses plugin.atlas.json/plugin.atlas.contracts.json and must not include the main files)

.github/workflows/ci.yml

strict-contracts job runs on every PR and push to main:

  1. Validates source plugin.json with wfctl plugin validate --strict-contracts
  2. Builds both plugin binaries (workflow-plugin-migrations, workflow-plugin-atlas-migrate)
  3. Assembles synthetic release tarballs that include the compiled binary, manifest, contracts file, and LICENSE — mirroring the structure of actual GoReleaser archives
  4. Extracts each tarball and asserts presence of the binary, plugin.json, plugin.contracts.json, rewritten download URLs, then validates with wfctl plugin validate --strict-contracts

.goreleaser.yaml

  • Main plugin archive packages plugin.json, plugin.contracts.json, and LICENSE
  • Atlas archive packages plugin.atlas.json → plugin.json and plugin.atlas.contracts.json → plugin.contracts.json so each binary ships its own correct manifest and contracts
  • before.hooks sed rewrites both plugin.json and plugin.atlas.json version and download URLs on release (preserving the v tag prefix)

Validation

  • go test ./... — all 19 tests pass ✅
  • go vet ./... — clean ✅
  • go mod tidy — no changes to go.mod or go.sum ✅
  • go build ./... — clean ✅
  • plugin.json and plugin.atlas.json parse correctly with all expected fields ✅
  • plugin.contracts.json and plugin.atlas.contracts.json parse as wfctl v0.20.1 strict-contract descriptor files ✅
  • All drift tests pass, confirming JSON files stay in sync with Go definitions ✅
  • CodeQL security scan: 0 alerts ✅

Copilot AI requested review from Copilot and removed request for Copilot May 1, 2026 06:12
@intel352
intel352 marked this pull request as ready for review May 1, 2026 06:24
Copilot AI review requested due to automatic review settings May 1, 2026 06:24

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot wasn't able to review any files in this pull request.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@intel352

intel352 commented May 1, 2026

Copy link
Copy Markdown
Contributor

@copilot This PR currently has 0 changed files, so the assigned task is not implemented yet. Please continue the original issue task using Claude Sonnet 4.6: make the required Workflow strict-contract or downstream dependency updates, push actual code/config/doc changes to this PR branch, run the requested validation, and update the PR body with the validation results. Do not leave this as an empty PR.

@intel352

intel352 commented May 1, 2026

Copy link
Copy Markdown
Contributor

@copilot Add this as part of the PR scope: include or update a GitHub Actions PR check that validates strict Workflow plugin contracts. The check should fail when plugin.json is missing and should run the current Workflow CLI strict validation, for example:

name: wfctl strict contracts
on:
  pull_request:
  push:
    branches: [main, master]

jobs:
  wfctl-strict-contracts:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version-file: go.mod
      - name: Validate strict plugin contracts
        run: go run github.com/GoCodeAlone/workflow/cmd/wfctl@v0.20.1 plugin validate --file plugin.json --strict-contracts

Adjust branch filters and Go setup to match this repository. If the repo uses an existing CI workflow, add this as a job there instead of creating duplicate workflow clutter. Include the check result in the PR validation notes.

Copilot AI and others added 2 commits May 1, 2026 07:07
- Add internal/contracts.go with dynamic.FieldContract definitions for:
  - database.migrations (required: source_dir; optional: driver, driver_ref, dsn_env, history_table, timeout)
  - database.migration_driver (required: driver)
  - step.migrate_up, step.migrate_down, step.migrate_status, step.migrate_to
    (each with typed required/optional inputs and typed outputs)
- Implement sdk.SchemaProvider on MigrationsPlugin (ModuleSchemas method)
- Expose ModuleContracts() and StepContracts() on MigrationsPlugin
- Add PluginModuleSchemas() and PluginStepSchemas() package-level helpers
- Update plugin.json to include stepSchemas array for all 4 step types
  (parsed by LoadPluginStepSchemasFromDir and wfctl editor schema registry)
- Add plugin.contracts.json with per-type strict contract descriptors
  covering config required/optional fields, method inputs/outputs for modules,
  and config + outputs for steps
- Add tests: TestPlugin_SchemaProvider, TestPlugin_ModuleContracts,
  TestPlugin_StepContracts, TestPlugin_StepSchemas, TestPlugin_ContractCoverage

Agent-Logs-Url: https://github.com/GoCodeAlone/workflow-plugin-migrations/sessions/976b79d8-9651-4ac2-8a18-6ba7c021b72c

Co-authored-by: intel352 <77607+intel352@users.noreply.github.com>
…racts.json

- Fix DefaultValue for steps config field in PluginStepSchemas() from string \"1\" to integer 1
  (schema.ConfigFieldDef.DefaultValue is any; int is correct for FieldTypeNumber)
- Add type vocabulary note to plugin.contracts.json header clarifying that field types
  use the dynamic.FieldType vocabulary (int, bool, string, etc.) distinct from the
  schema.ConfigFieldType vocabulary (number, boolean, string, etc.) used in stepSchemas

Agent-Logs-Url: https://github.com/GoCodeAlone/workflow-plugin-migrations/sessions/976b79d8-9651-4ac2-8a18-6ba7c021b72c

Co-authored-by: intel352 <77607+intel352@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 1, 2026 07:10
Copilot AI changed the title [WIP] Migrate workflow-plugin-migrations to strict gRPC proto contracts Migrate workflow-plugin-migrations to strict gRPC proto contracts May 1, 2026
Copilot AI requested a review from intel352 May 1, 2026 07:11
…or wfctl v0.20.1

- Rewrite plugin.contracts.json to use the wfctl v0.20.1 canonical format:
  {"version":"1","contracts":[{"kind":...,"type":...,"mode":"strict","config/input/output":...}]}
  (previous format was a custom schema incompatible with wfctl audit/validate tooling)
- Add download entries to plugin.json (required for wfctl plugin validate --file
  when type=external; points to GitHub Releases for v0.3.6)
- Update plugin.json version from 0.0.0 to 0.3.6 to match latest git tag
- Add strict-contracts job to .github/workflows/ci.yml that runs:
    wfctl@v0.20.1 plugin validate --file plugin.json --strict-contracts
  on every PR and push to main, failing when plugin.json is missing strict
  contract descriptors for any advertised module or step type

Agent-Logs-Url: https://github.com/GoCodeAlone/workflow-plugin-migrations/sessions/0f543e07-5f59-4b54-ab5b-1a9f7bece49b

Co-authored-by: intel352 <77607+intel352@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 1, 2026 07:22

Copilot AI commented May 1, 2026 •

Copy link
Copy Markdown
Contributor Author

@copilot This PR currently has 0 changed files, so the assigned task is not implemented yet. Please continue the original issue task using Claude Sonnet 4.6: make the required Workflow strict-contract...

The PR now contains 5 changed files across 4 commits:

  • internal/contracts.go — dynamic.FieldContract definitions for all 2 module types and 4 step types, plus PluginModuleSchemas() and PluginStepSchemas() helpers
  • internal/plugin.go — added sdk.SchemaProvider implementation (ModuleSchemas), ModuleContracts(), and StepContracts() methods
  • internal/plugin_test.go — 5 new tests covering contract coverage, schema provider, and descriptor completeness
  • plugin.json — added stepSchemas array, download entries, and fixed version to 0.3.6
  • plugin.contracts.json — strict contract descriptors in the canonical wfctl v0.20.1 format ({"version":"1","contracts":[...]}) covering all 2 module and 4 step types with "mode":"strict"
  • .github/workflows/ci.yml — new strict-contracts job

@copilot Add this as part of the PR scope: include or update a GitHub Actions PR check that validates strict Workflow plugin contracts. The check should fail when plugin.json is missing and should r...

Added a strict-contracts job to the existing .github/workflows/ci.yml (commit b82e20f). It runs on every PR and push to main alongside the existing test job:

strict-contracts:
  name: Validate strict plugin contracts
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v6
    - uses: actions/setup-go@v6
      with:
        go-version-file: go.mod
    - name: Validate strict plugin contracts
      run: go run github.com/GoCodeAlone/workflow/cmd/wfctl@v0.20.1 plugin validate --file plugin.json --strict-contracts

The check fails when plugin.json is missing or when any advertised module/step type lacks a "mode":"strict" contract descriptor in plugin.contracts.json. The plugin.json was also updated to include download entries (required by wfctl plugin validate for "type":"external" plugins) and the contract descriptors are in the format wfctl v0.20.1 expects.

Comment thread .github/workflows/ci.yml Fixed
Copilot AI requested review from Copilot and removed request for Copilot May 1, 2026 07:23
@intel352
intel352 requested a review from Copilot May 2, 2026 03:45

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

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


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/plugin_test.go
Comment thread plugin.json Outdated
Comment thread plugin.json Outdated
Comment thread plugin.contracts.json
Comment thread plugin.json Outdated
Comment thread internal/contracts.go Outdated
Comment thread internal/plugin_test.go
Copilot AI and others added 2 commits May 2, 2026 13:29
- contracts.go: correct driver_ref description (not a module-ref, literal name only)
- contracts.go: correct history_table description (reserved, no runtime effect yet)
- plugin.json: fix download URL format from underscores to hyphens to match
  goreleaser name_template (workflow-plugin-migrations-linux-amd64.tar.gz)
- .goreleaser.yaml: add plugin.contracts.json to both plugin archives so
  wfctl strict-contracts audits pass on installed plugins (not just source)
- .goreleaser.yaml: extend sed hook to also rewrite download URLs on release
  so version pinning doesn't go stale after each goreleaser run
- plugin_test.go: add TestPlugin_PluginJSONStepSchemasDrift - loads plugin.json
  and asserts stepSchemas types match PluginStepSchemas() (catches JSON drift)
- plugin_test.go: add TestPlugin_ContractsJSONDrift - loads plugin.contracts.json
  and asserts strict coverage for all advertised module and step types

Agent-Logs-Url: https://github.com/GoCodeAlone/workflow-plugin-migrations/sessions/e32fe1ee-e3c2-48eb-9bc1-57261f259b61

Co-authored-by: intel352 <77607+intel352@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 2, 2026 13:31

Copilot AI commented May 2, 2026

Copy link
Copy Markdown
Contributor Author

@copilot please continue this PR using Claude Sonnet 4.6 and address the remaining merge gates.

Current gate state I see:...

Addressed all 8 unresolved review threads in commit 11ec90f (+ d754a16 for a minor follow-up):

  1. contracts.go:43 (driver_ref) — Updated description to clarify it's a literal driver name, not a module reference; module-ref lookup is not yet implemented.
  2. contracts.go:50-53 (history_table) — Updated description to note it's reserved for future driver support and currently has no runtime effect.
  3. plugin.json:39-54 (wrong URL format) — Fixed download URLs from underscores (_linux_amd64) to hyphens (-linux-amd64) to match goreleaser's name_template.
  4. plugin.json:39-54 (version pinning) — Extended the goreleaser before.hooks sed to also rewrite download URL versions on each release (-e 's|/releases/download/v[0-9][^/]*/|/releases/download/{{ .Version }}/|g').
  5. plugin.contracts.json:1-3 (not packaged) — Added plugin.contracts.json to both plugin archive files: entries in .goreleaser.yaml so installed plugins include the strict contract descriptors.
  6. ci.yml:49-50 (only validates source) — The root cause (issue 5) is now fixed by packaging the contracts file with the release artifact; the CI job correctly validates the source manifest that gets packaged.
  7. plugin_test.go:183-186 (stepSchemas drift) — Added TestPlugin_PluginJSONStepSchemasDrift which loads plugin.json and asserts its stepSchemas types match PluginStepSchemas().
  8. plugin_test.go:210-223 (contracts.json drift) — Added TestPlugin_ContractsJSONDrift which reads plugin.contracts.json and asserts every advertised module/step type has a "mode":"strict" entry.

All 13 tests pass, go vet clean, CodeQL 0 alerts.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

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


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/plugin_test.go Outdated
Comment thread internal/plugin_test.go Outdated
Comment thread .goreleaser.yaml Outdated
Comment thread .goreleaser.yaml Outdated
Comment thread .github/workflows/ci.yml
Comment thread plugin.json Outdated
Comment thread plugin.json
Comment thread internal/contracts.go Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

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


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/plugin_test.go Outdated
Comment thread .goreleaser.yaml Outdated
Comment thread .goreleaser.yaml Outdated
Comment thread plugin.json
Comment thread plugin.json Outdated
Comment thread internal/contracts.go Outdated
Comment thread internal/contracts.go Outdated
Comment thread internal/plugin_test.go Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

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


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/plugin_test.go
Comment thread internal/contracts.go
Comment thread internal/plugin_test.go Outdated
Comment thread internal/plugin_test.go
Comment thread internal/contracts.go
Comment thread internal/plugin.go Outdated
Comment thread .github/workflows/ci.yml
Comment thread internal/plugin_test.go Outdated
Comment thread internal/plugin_test.go Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread plugin.json
Comment on lines +52 to +77
"url": "https://github.com/GoCodeAlone/workflow-plugin-migrations/releases/download/v0.3.6/workflow-plugin-migrations-linux-amd64.tar.gz"
},
{
"os": "linux",
"arch": "arm64",
"url": "https://github.com/GoCodeAlone/workflow-plugin-migrations/releases/download/v0.3.6/workflow-plugin-migrations-linux-arm64.tar.gz"
},
{
"os": "darwin",
"arch": "amd64",
"url": "https://github.com/GoCodeAlone/workflow-plugin-migrations/releases/download/v0.3.6/workflow-plugin-migrations-darwin-amd64.tar.gz"
},
{
"os": "darwin",
"arch": "arm64",
"url": "https://github.com/GoCodeAlone/workflow-plugin-migrations/releases/download/v0.3.6/workflow-plugin-migrations-darwin-arm64.tar.gz"
},
{
"os": "windows",
"arch": "amd64",
"url": "https://github.com/GoCodeAlone/workflow-plugin-migrations/releases/download/v0.3.6/workflow-plugin-migrations-windows-amd64.tar.gz"
},
{
"os": "windows",
"arch": "arm64",
"url": "https://github.com/GoCodeAlone/workflow-plugin-migrations/releases/download/v0.3.6/workflow-plugin-migrations-windows-arm64.tar.gz"
Comment thread plugin.json
Comment on lines +80 to +84
"stepSchemas": [
{
"type": "step.migrate_up",
"plugin": "workflow-plugin-migrations",
"description": "Applies all pending database migrations (up direction).",
Comment thread internal/plugin_test.go
Comment on lines +284 to +286
}
got := sortedContracts(file.Contracts)
want := sortedContracts(expectedContractDescriptors(t))
Comment thread .github/workflows/ci.yml
Comment on lines +82 to +84
test -f "$tmp/plugin.json"
test -f "$tmp/plugin.contracts.json"
grep -q '/releases/download/v0.3.6-SNAPSHOT-ci/' "$tmp/plugin.json"
Comment thread .github/workflows/ci.yml Outdated
Comment on lines +56 to +63
main_package="$(mktemp -d)"
cp plugin.json plugin.contracts.json LICENSE "$main_package"
sed -i.bak \
-e 's/"version": ".*"/"version": "0.3.6-SNAPSHOT-ci"/' \
-e 's|/releases/download/v[0-9][^/]*/|/releases/download/v0.3.6-SNAPSHOT-ci/|g' \
"$main_package/plugin.json"
rm -f "$main_package/plugin.json.bak"
tar -C "$main_package" -czf dist/workflow-plugin-migrations-linux-amd64.tar.gz plugin.json plugin.contracts.json LICENSE
@intel352

intel352 commented May 3, 2026

Copy link
Copy Markdown
Contributor

@copilot address all unresolved review comments

…n tarballs

- contracts.go: export proto name constants (ProtoMigrations*, ProtoMigrate*)
  so the drift test derives expected values from one canonical Go source rather
  than maintaining a duplicate list of hardcoded strings (thread 3)
- plugin_test.go: replace all hardcoded proto name strings in
  expectedContractDescriptors and moduleOnlyContractDescriptors with the new
  exported constants from contracts.go
- ci.yml: add "Build plugin binaries" step that compiles both binaries before
  packaging; include the compiled binary in each tarball so the artifact
  contains the actual executable as GoReleaser would produce (thread 5)
- ci.yml: assert binary presence (workflow-plugin-migrations /
  workflow-plugin-atlas-migrate) in the artifact validation step

Agent-Logs-Url: https://github.com/GoCodeAlone/workflow-plugin-migrations/sessions/83993d6a-5f89-40cd-99d9-36dd89b02e8c

Co-authored-by: intel352 <77607+intel352@users.noreply.github.com>

Copilot AI commented May 3, 2026

Copy link
Copy Markdown
Contributor Author

@copilot address all unresolved review comments

Addressed the remaining unresolved threads in commit 48036f7:

Thread 3 (plugin_test.go:284-286) — Added exported proto name constants (ProtoMigrationsModuleConfig, ProtoMigrationDriverConfig, ProtoMigrateUpInput/Output, etc.) to contracts.go as the canonical source. The drift test now derives expected values from those constants instead of a duplicate hardcoded list, so a proto name change must flow through contracts.go → plugin.contracts.json → the test will catch any mismatch.

Thread 5 (.github/workflows/ci.yml:56-63) — The CI strict-contracts job now has a dedicated "Build plugin binaries" step that compiles both workflow-plugin-migrations and workflow-plugin-atlas-migrate before packaging. Each synthetic tarball now includes the actual built executable, and the validation step asserts the binary is present in the extracted archive.

Threads 1, 2, 4 — Already resolved in commit be88997: the atlas archive uses plugin.atlas.json (not plugin.json) as its manifest (no step schemas, correct atlas download URLs), and plugin.atlas.contracts.json provides module-only strict contracts for the atlas binary.

All 19 tests pass, code review clean, CodeQL 0 alerts.

@intel352
intel352 merged commit 1f26c58 into main May 3, 2026
7 checks passed
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.

Migrate workflow-plugin-migrations to strict gRPC proto contracts

4 participants