RepoPilotOpen in app →

hashicorp/go-plugin

Golang plugin system over RPC.

Healthy

Healthy across the board

weakest axis
Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 4d ago
  • 39+ active contributors
  • Distributed ownership (top contributor 15% of recent commits)
Show all 6 evidence items →
  • MPL-2.0 licensed
  • CI configured
  • Tests present

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/hashicorp/go-plugin)](https://repopilot.app/r/hashicorp/go-plugin)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/hashicorp/go-plugin on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: hashicorp/go-plugin

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/hashicorp/go-plugin shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

GO — Healthy across the board

  • Last commit 4d ago
  • 39+ active contributors
  • Distributed ownership (top contributor 15% of recent commits)
  • MPL-2.0 licensed
  • CI configured
  • Tests present

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live hashicorp/go-plugin repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/hashicorp/go-plugin.

What it runs against: a local clone of hashicorp/go-plugin — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in hashicorp/go-plugin | Confirms the artifact applies here, not a fork | | 2 | License is still MPL-2.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 34 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>hashicorp/go-plugin</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of hashicorp/go-plugin. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/hashicorp/go-plugin.git
#   cd go-plugin
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of hashicorp/go-plugin and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "hashicorp/go-plugin(\\.git)?\\b" \\
  && ok "origin remote is hashicorp/go-plugin" \\
  || miss "origin remote is not hashicorp/go-plugin (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MPL-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MPL-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is MPL-2.0" \\
  || miss "license drift — was MPL-2.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "client.go" \\
  && ok "client.go" \\
  || miss "missing critical file: client.go"
test -f "grpc_broker.go" \\
  && ok "grpc_broker.go" \\
  || miss "missing critical file: grpc_broker.go"
test -f "grpc_server.go" \\
  && ok "grpc_server.go" \\
  || miss "missing critical file: grpc_server.go"
test -f "internal/cmdrunner/cmd_runner.go" \\
  && ok "internal/cmdrunner/cmd_runner.go" \\
  || miss "missing critical file: internal/cmdrunner/cmd_runner.go"
test -f "grpc_client.go" \\
  && ok "grpc_client.go" \\
  || miss "missing critical file: grpc_client.go"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 34 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~4d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/hashicorp/go-plugin"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

go-plugin is a Go plugin system that allows host applications to load and communicate with plugins via RPC (currently net/rpc and gRPC). Plugins implement Go interfaces as if they were in-process, but execute in separate subprocesses; the system automatically handles serialization, logging, and bidirectional communication through a MuxBroker. It powers HashiCorp's production tooling (Terraform, Vault, Nomad, Packer) across millions of machines. Monorepo structure: client.go, discover.go, and error.go form the core RPC client library; examples/ contains three distinct plugin patterns (basic net/rpc in examples/basic, gRPC in examples/grpc, bidirectional in examples/bidirectional). Plugins run as separate processes; communication is brokered via MuxBroker for complex types. docs/ provides architecture details and non-Go plugin guidance.

👥Who it's for

Go developers building extensible applications (like Terraform providers, Vault auth methods, or Nomad schedulers) who need to safely load third-party code without crashing the host process, and plugin authors who want to write extensions in Go or other languages via gRPC without learning RPC plumbing.

🌱Maturity & risk

Highly mature and production-hardened: used by HashiCorp's flagship products for 4+ years across millions of machines. The codebase is well-structured with comprehensive test coverage (client_test.go, client_posix_test.go, client_unix_test.go, error_test.go), active CI via .github/workflows/test.yaml, and clear documentation in docs/. Verdict: production-ready.

Low-risk core but platform-dependent: heavy POSIX/Unix specificity (client_posix_test.go, client_unix_test.go) means Windows support may lag. Dependency footprint is intentionally minimal (grpc, protobuf for gRPC plugins only). Main risk is the single-owner HashiCorp control and protocol compatibility breaks (mitigated by protocol versioning in constants.go). No visible deprecation warnings or abandoned sections.

Active areas of work

The repo is actively maintained with recent dependabot.yml setup (.github/dependabot.yml) and protobuf/gRPC tooling (buf.yaml, buf.gen.yaml). Examples have been modernized to gRPC patterns (examples/grpc and examples/bidirectional with proto definitions). The codebase appears stable rather than rapidly evolving—focus is on reliability and cross-language support.

🚀Get running

git clone https://github.com/hashicorp/go-plugin.git && cd go-plugin && go mod download && go test ./... to run the test suite. Review examples/basic/main.go for the simplest net/rpc pattern or examples/grpc for modern gRPC plugins.

Daily commands: No single 'server' to start. To use: (1) implement a plugin by satisfying an interface in plugin code, (2) in host code, call plugin.Client(ctx, cmd) pointing to plugin binary and HandshakeConfig, (3) call Dispense() to get the interface. Examples: cd examples/basic && go run main.go or cd examples/grpc && go run main.go for gRPC example.

🗺️Map of the codebase

  • client.go — Core client implementation that manages plugin lifecycle, negotiation, and RPC communication—essential entry point for plugin consumers.
  • grpc_broker.go — Implements the gRPC broker for inter-process communication; critical for understanding how plugins communicate bidirectionally.
  • grpc_server.go — Server-side gRPC implementation that handles incoming plugin connections and service registration—foundation of plugin hosting.
  • internal/cmdrunner/cmd_runner.go — Manages plugin process execution, lifecycle, and I/O—essential for understanding how plugins are spawned and monitored.
  • grpc_client.go — Client-side gRPC implementation for communicating with remote plugin services—core RPC transport layer.
  • constants.go — Defines protocol versions, magic bytes, and handshake constants that govern plugin negotiation and compatibility.
  • go.mod — Declares core dependencies (gRPC, protobuf) that define the plugin system's communication substrate.

🛠️How to make changes

Add Support for a New Plugin Interface Type

  1. Define the Go interface (or proto service) in a shared package that both host and plugin link to. (examples/basic/shared/greeter_interface.go or examples/grpc/shared/interface.go)
  2. Register the interface implementation in a proto-generated or net/rpc-based service handler. (grpc_server.go (for gRPC) or examples/basic/plugin/greeter_impl.go (for net/rpc))
  3. In the plugin process main, call plugin.Serve with a map of interface → implementation. (examples/basic/plugin/greeter_impl.go or examples/grpc/plugin-go-grpc/main.go)
  4. In the host, after Client.Client() handshake, cast the raw interface to your plugin type and call methods. (examples/basic/main.go or examples/grpc/main.go)

Implement Bidirectional (Plugin → Host) Callbacks

  1. Define proto services for both directions (host service, plugin service) in the same .proto file. (examples/bidirectional/proto/kv.proto)
  2. Implement the host-side service handler in a gRPC server that plugin can call back into. (examples/bidirectional/shared/grpc.go (hostImpl block))
  3. Pass host service reference to plugin via grpc_broker so plugin can register callbacks. (grpc_broker.go (Dial method for plugin-initiated dialback))
  4. In plugin implementation, create a client stub to the host service using the broker connection. (examples/bidirectional/plugin-go-grpc/main.go)

Support a Non-Go Language Plugin (e.g., Python)

  1. Define the plugin service interface in a .proto file (language-agnostic). (examples/grpc/proto/kv.proto)
  2. Generate proto stubs in the target language (Python, Rust, etc.) using buf or protoc. (examples/grpc/plugin-python/proto/kv_pb2.py and kv_pb2_grpc.py)
  3. Implement the gRPC service in the target language (listening on a loopback address provided by host). (examples/grpc/plugin-python/plugin.py)
  4. In the host, configure Client with ProtocolVersion for gRPC and VersionedPlugins mapping. (examples/grpc/main.go (Plugins map with gRPC protocol))

Handle Plugin Process Reattachment (Crash Recovery)

  1. Persist plugin reattach config (PID, port, etc.) to disk after initial startup. (internal/cmdrunner/cmd_reattach.go and client.go (ReattachConfig struct))
  2. On restart, create a new Client with Config.Reattach set to the saved config. (client.go (NewClient with Reattach field in Config))
  3. The client will reconnect to the existing plugin process instead of spawning a new one. (internal/cmdrunner/cmd_runner.go (reattachConfig handling))

🔧Why these technologies

  • gRPC + Protocol Buffers — Language-agnostic RPC and serialization; enables plugins in Go, Python, Rust, etc. Efficient binary encoding and schema evolution.
  • stdio-based Transport — Simplest, most portable inter-process communication; avoids port conflicts and ephemeral port allocation issues.
  • Go Interfaces — Natural API for Go developers; plugins feel like local code despite being out-of-process.
  • Platform-Specific Process Management (POSIX/Windows) — Reliable process lifecycle, signal handling, and job control across OS boundaries.

⚖️Trade-offs already made

  • Only supports local (loopback) RPC, not network plugins

    • Why: Simplifies security model, reduces latency assumptions, focuses on co-located reliability.
    • Consequence: Plugins must run on the same machine; no distributed plugin deployments.
  • Separate plugin process vs. in-process DLL/module loading

    • Why: Isolation prevents plugin crashes from crashing the host; cleaner lifecycle management.
    • Consequence: Higher IPC overhead (~1-10ms per call); requires serialization/deserialization.
  • Mandatory handshake and version negotiation

    • Why: Prevents silent compatibility failures; enables safe rolling updates.
    • Consequence: Extra startup latency; plugins must implement handshake protocol correctly.
  • gRPC as primary transport, net/rpc as legacy fallback

    • Why: gRPC supports bidirectional streaming and non-Go plugins; net/rpc simpler for Go-only legacy systems.
    • Consequence: Complexity in maintaining two protocol paths; examples split between legacy and modern.

🚫Non-goals (don't propose these)

  • Does not support plugins over real networks—only local IPC
  • Does not provide built-in authentication/authorization between host and plugin
  • Does not manage plugin versioning or dependency resolution—that is the host application's responsibility
  • Does not provide hot-reload without process restart
  • Does not handle plugin distribution or marketplace features

🪤Traps & gotchas

(1) Plugins must be separate executable binaries—they cannot be .so files or embedded; subprocess overhead is inherent. (2) HandshakeConfig must match between host and plugin binary exactly; mismatch causes silent exit (check stderr). (3) RPC serialization: complex types (interfaces, io.Reader) require explicit MuxBroker.Dial() calls in gob encoding; protobuf avoids this but requires code generation. (4) Windows vs. POSIX differences: client_posix_test.go and client_unix_test.go suggest signal handling and process termination differ; test your plugin on target OS. (5) Protocol versioning in constants.go must be incremented for breaking changes or old plugins will silently fail negotiation.

🏗️Architecture

💡Concepts to learn

  • Plugin Handshaking — go-plugin uses a synchronous handshake protocol (HandshakeConfig with magic string and version) before RPC setup to ensure plugin and host are compatible; understanding this prevents silent mismatches
  • MuxBroker (multiplexing broker) — Enables complex types (interfaces, io.Reader/Writer) over RPC by creating additional dynamic connections; critical for bidirectional communication and passing opaque interfaces
  • Protocol Versioning — Allows breaking changes to plugin interfaces without old plugins silently failing; version numbers in constants.go control negotiation and force plugin upgrades when needed
  • Subprocess management over RPC — go-plugin spawns plugins as separate processes (not shared libraries) and handles lifecycle (start, wait for ready, teardown on error) transparently; isolation prevents plugin crashes from killing host
  • gob encoding (Go Object Binary format) — Default net/rpc transport uses gob for serialization; required for complex Go types but Go-specific (not cross-language); gRPC plugins sidestep this with protobuf
  • Log mirroring / structured logging integration — Plugin stdout/stderr and hclog output automatically forwarded to host with plugin-name prefix; requires understanding of log sink hookup to avoid missing plugin diagnostics
  • gRPC protocol negotiation — Modern go-plugin plugins use gRPC with .proto schema definitions (buf.yaml, buf.gen.yaml); enables cross-language plugins and avoids gob serialization limits
  • hashicorp/go-hclog — Structured logging library automatically integrated into go-plugin for forwarding plugin logs to host with context; used for the Built-in Logging feature
  • hashicorp/terraform-plugin-sdk — High-level plugin framework built on top of go-plugin for Terraform provider authors; wraps go-plugin RPC with HCL config and resource management
  • grpc/grpc-go — Optional transport layer for cross-language plugins; go-plugin examples/grpc demonstrates gRPC integration as modern alternative to net/rpc
  • protocolbuffers/protobuf — Schema definition for gRPC-based plugins; buf.yaml and examples/*/proto show code generation workflow for plugin serialization
  • hashicorp/vault — Major production user of go-plugin for auth methods, secret engines, and database plugins; reference implementation of bidirectional plugin architecture

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add cross-language plugin integration tests for gRPC

The repo has Python gRPC plugin examples (examples/grpc/plugin-python) but no automated tests verifying Go host ↔ Python plugin communication works correctly. This is critical since the README emphasizes multi-language support and these examples could regress silently. Adding integration tests would validate the gRPC protocol contract across language boundaries.

  • [ ] Create .github/workflows/test-cross-language.yaml to run Python plugin tests alongside Go tests
  • [ ] Add test script in examples/grpc to spawn the Python plugin and verify key operations (Get, Set, Delete) work
  • [ ] Document Python test dependencies and setup in examples/grpc/plugin-python/README.md
  • [ ] Verify tests run on Linux and macOS (Windows may need separate handling)

Add comprehensive unit tests for error.go edge cases

error.go and error_test.go exist but testing error marshaling/unmarshaling across RPC boundaries is critical for reliability. The repo is used by major HashiCorp products and error handling robustness directly affects plugin stability. Current test coverage appears minimal based on the single test file.

  • [ ] Expand error_test.go with tests for: wrapped errors, nil errors, custom error types, errors with special characters, very large error messages
  • [ ] Add tests verifying error serialization/deserialization through the RPC layer (both net/rpc and gRPC paths)
  • [ ] Test error handling in client.go and server.go with various failure scenarios
  • [ ] Add benchmarks for error creation and serialization given the frequency of error handling

Add Windows-specific plugin lifecycle tests to client_posix_test.go and expand coverage

The repo has client_posix_test.go and client_unix_test.go but no client_windows_test.go despite Windows being a supported platform. Given that plugins involve process management (kill signals, cleanup), Windows-specific behavior around process termination and RPC cleanup differs significantly from Unix. This gap could hide platform-specific bugs.

  • [ ] Create client_windows_test.go with Windows-specific process termination tests (e.g., graceful shutdown vs. force kill)
  • [ ] Test plugin process cleanup when parent process dies unexpectedly on Windows
  • [ ] Add tests for Windows-specific networking edge cases in RPC communication
  • [ ] Update .github/workflows/test.yaml to run Windows tests (e.g., windows-latest runner) alongside existing POSIX tests

🌿Good first issues

  • Add comprehensive integration tests for Windows plugin lifecycle in a windows_test.go file (currently only POSIX tests exist in client_posix_test.go and client_unix_test.go); this would catch Windows-specific signal handling and subprocess teardown bugs.
  • Expand docs/guide-plugin-write-non-go.md with a concrete example for Python or Ruby plugins using gRPC (examples exist for Go in examples/grpc but non-Go guide is thin; add a full plugin implementation in another language with build instructions).
  • Add protocol version negotiation error test to error_test.go: currently error handling is tested but no explicit test for HandshakeConfig version mismatch scenario and the user-facing error message quality.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 155dcdd — cmdrunner: release process handle in _pidAlive to avoid pidfd leak (#378) (texasich)
  • 96d18ee — [chore] : Bump actions/upload-artifact in the actions group (#376) (dependabot[bot])
  • a0c251c — [chore] : Bump actions/setup-go from 6.3.0 to 6.4.0 in the actions group (#375) (dependabot[bot])
  • 6a56553 — [chore] : Bump the actions group with 2 updates (#373) (dependabot[bot])
  • abeb978 — Bump protobuf from 4.25.8 to 5.29.6 in /examples/grpc/plugin-python (#372) (dependabot[bot])
  • a4c9002 — examples: Add gRPC streaming example (#339) (radeksimko)
  • 0ac49e2 — [chore] : Bump actions/checkout from 6.0.1 to 6.0.2 in the actions group (#370) (dependabot[bot])
  • d662936 — logging: lower priority of configuring messages (#311) (xnox)
  • c57bf64 — [chore] : Bump actions/setup-go from 6.1.0 to 6.2.0 in the actions group (#369) (dependabot[bot])
  • a33e454 — chore: add plugin selection and fix encoding in gRPC example (#368) (kartheek-hc)

🔒Security observations

The go-plugin codebase is a mature, battle-tested system used by major HashiCorp projects. However, the Python dependencies contain outdated versions of critical components (gRPC 1.59.0 and protobuf 5.29.6) with known vulnerabilities. The core design limitation restricting usage to local networks suggests the RPC layer may lack security controls for untrusted networks. The system would benefit from: 1) Immediate dependency updates, 2) Enhanced security documentation, 3) Plugin validation mechanisms, and 4) Security hardening for potential network exposure. No hardcoded secrets or injection vulnerabilities were identified in the visible codebase structure.

  • High · Outdated gRPC Dependency with Known Vulnerabilities — Dependencies/Package file (grpcio==1.59.0, grpcio-health-checking==1.59.0). The Python dependencies specify grpcio==1.59.0 and grpcio-health-checking==1.59.0. Version 1.59.0 was released in late 2023 and contains known security vulnerabilities. Multiple CVEs have been published for gRPC versions in this range, including issues related to buffer overflows and denial of service conditions in protobuf processing. Fix: Update grpcio and grpcio-health-checking to the latest stable version (currently 1.62.0 or newer). Review the official gRPC security advisories and protobuf releases for patch details.
  • High · Outdated Protobuf Dependency — Dependencies/Package file (protobuf==5.29.6). The protobuf==5.29.6 dependency is not the latest stable version. Protobuf has had multiple security releases addressing deserialization vulnerabilities and resource exhaustion issues. Using an outdated version exposes the plugin system to potential attacks through malformed protobuf messages. Fix: Update protobuf to the latest stable version (5.30.x or newer). Ensure compatibility with all gRPC components when upgrading.
  • Medium · RPC System Design Over Local Network Only — README.md and core RPC implementation (client.go, grpc_broker.go). The README states the plugin system is 'currently only designed to work over a local [reliable] network' and that 'Plugins over a real network are not supported and will lead to unexpected behavior.' This suggests the RPC implementation may lack security controls necessary for untrusted networks, such as authentication, encryption, and authorization mechanisms. Fix: Review RPC implementation for: 1) Lack of TLS/encryption for inter-process communication, 2) Missing authentication between host and plugin, 3) Absence of rate limiting or resource controls. Add appropriate security controls if the system is ever exposed beyond local networks.
  • Medium · Plugin Execution Context Concerns — client.go, discover.go, and plugin discovery/loading mechanisms. The plugin system allows execution of external plugins over RPC. Without careful review of the plugin loading and execution mechanisms, this could lead to arbitrary code execution if plugins are loaded from untrusted sources or if plugin binaries are not properly validated. Fix: Ensure plugins are only loaded from trusted, well-defined locations. Implement signature verification for plugin binaries. Document and enforce security requirements for plugin developers. Review the discover.go implementation for path traversal vulnerabilities.
  • Low · Missing Security Headers in Documentation — docs/, examples/. The documentation and examples do not explicitly address security considerations for plugin development and usage, such as input validation, secure communication, and threat modeling. Fix: Add comprehensive security documentation covering: 1) Plugin development security best practices, 2) Host-to-plugin communication security, 3) Input validation requirements, 4) Examples of secure plugin implementations.
  • Low · Python Example Plugin Dependency Management — examples/grpc/plugin-python/requirements.txt. The Python plugin example (examples/grpc/plugin-python/requirements.txt) pins outdated versions and uses old gRPC/protobuf versions, potentially introducing the same vulnerabilities discussed above if this example code is used as a template for production plugins. Fix: Update the example to use current, secure versions of gRPC and protobuf. Remove hard version pins and use version ranges that allow security updates (e.g., grpcio>=1.62.0,<2.0).

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · hashicorp/go-plugin — RepoPilot