github/copilot-sdk · error
reading runtime assets
Error message
reading runtime assets: %w
What it means
installRuntimeAssets slurps the entire runtime archive from config.RuntimeAssets via io.ReadAll. Any read failure is wrapped as "reading runtime assets". This is the first integrity step before hash verification and extraction.
Solutions
- Verify RuntimeAssets points to a valid, open reader (e.g. bytes.NewReader or embed.FS Open)
- If sourced over the network, retry the download before install
- Confirm the embedded runtime asset exists in the build (go:embed pattern matches)
- Wrap the source in a buffered reader built from a complete local copy
Example fix
// before
cfg.RuntimeAssets = closedReader // read failed
// after
f, err := assets.Open("runtime.tar.gz")
if err != nil { return err }
defer f.Close()
cfg.RuntimeAssets = f Defensive patterns
Strategy: try-catch
Validate before calling
if cfg.RuntimeAssets == nil { return errors.New("RuntimeAssets reader not set") }
if c, ok := cfg.RuntimeAssets.(io.Closer); ok { /* ensure not already closed */ _ = c } Type guard
func hasRuntimeAssets(cfg embeddedcli.Config) bool {
return cfg.RuntimeAssets != nil && cfg.RuntimeAssetsHash != nil
} Try / catch
err := embeddedcli.InstallRuntime(ctx, cfg, dir)
if err != nil && strings.Contains(err.Error(), "reading runtime assets") {
return retryWithFreshReader(ctx) // rebuild the reader and retry once
} Prevention
- Always pass a fresh, open reader for RuntimeAssets
- Load assets fully into memory before install if sourced over the network
- Confirm embedded assets exist at build time (go:embed errors) before shipping
When it happens
Trigger: io.ReadAll(config.RuntimeAssets) errors: the embedded asset reader is nil-backed/closed, a network/HTTP body reader was interrupted, or an fs.File/bytes source hit an I/O error.
Common situations: Embedding an asset via a flaky network fetch at startup; passing an already-closed reader as RuntimeAssets; interrupted download of runtime archives.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Communication error with Copilot CLI
- failed to close output file
- failed to close tarball file
- failed to extract license: copy error
- failed to read checksums
AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09).
Data as JSON: /api/errors/8d95c040e57b1d34.
Report an issue: GitHub.
Appendix: source
Thrown at go/internal/embeddedcli/embeddedcli.go:372
return path, nil
}
func validateOptionalHash(reader io.Reader, hash []byte, name string) {
if reader != nil && len(hash) != sha256.Size {
panic(fmt.Sprintf("%s must be a SHA-256 hash (%d bytes), got %d bytes", name, sha256.Size, len(hash)))
}
}
func installRuntimeAssets(installDir string) error {
if config.RuntimeAssets == nil || runtimeAssetsInstalled {
return nil
}
archiveBytes, err := io.ReadAll(config.RuntimeAssets)
if closer, ok := config.RuntimeAssets.(io.Closer); ok {
closer.Close()
}
if err != nil {
return fmt.Errorf("reading runtime assets: %w", err)
}
actual := sha256.Sum256(archiveBytes)
if !bytes.Equal(actual[:], config.RuntimeAssetsHash) {
return fmt.Errorf("runtime assets hash mismatch")
}
gzipReader, err := gzip.NewReader(bytes.NewReader(archiveBytes))
if err != nil {
return fmt.Errorf("opening runtime assets: %w", err)
}
defer gzipReader.Close()
tarReader := tar.NewReader(gzipReader)
for {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
return fmt.Errorf("reading runtime assets: %w", err)View on GitHub (pinned to cd8cf15dc3)