conductor-oss/conductor · error · IllegalArgumentException
Failed to read skill package: {e.getMessage()}
Error message
Failed to read skill package: {e.getMessage()} What it means
Thrown by register() (via readPackage) when packageFile.getBytes() throws an IOException. This is an I/O failure reading the uploaded multipart file's bytes from its temporary storage, not a content error. The original IOException is attached as the cause.
Source
Thrown at agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/service/SkillRegistryService.java:420
throw new IllegalArgumentException("Skill manifest is required");
}
try {
return MAPPER.readValue(manifestJson, MAP_TYPE);
} catch (IOException e) {
throw new IllegalArgumentException("Invalid skill manifest JSON: " + e.getMessage(), e);
}
}
private byte[] readPackage(MultipartFile packageFile) {
try {
byte[] bytes = packageFile.getBytes();
if (bytes.length > maxPackageBytes) {
throw new IllegalArgumentException(
"Skill package exceeds max size of " + maxPackageBytes + " bytes");
}
return bytes;
} catch (IOException e) {
throw new IllegalArgumentException(
"Failed to read skill package: " + e.getMessage(), e);
}
}
@SuppressWarnings("unchecked")
private ParsedSkillPackage parseSkillPackage(byte[] bytes, Map<String, Object> manifest) {
List<SkillFileEntry> files = new ArrayList<>();
Map<String, byte[]> contentByPath = new TreeMap<>();
long totalUncompressedBytes = 0;
try (ZipInputStream zip = new ZipInputStream(new ByteArrayInputStream(bytes))) {
ZipEntry entry;
while ((entry = zip.getNextEntry()) != null) {
if (entry.isDirectory()) {
continue;
}
if (files.size() >= maxFileCount) {
throw new IllegalArgumentException(
"Skill package exceeds max file count of " + maxFileCount);View on GitHub (pinned to cf7c3e4a8a)
Solutions
- Check server disk space in the multipart temp location (spring.servlet.multipart.location).
- Increase client upload timeout and retry the upload.
- Inspect the caused-by IOException for the specific I/O error (No space left, file not found, etc.).
Example fix
// no code fix — operational recovery # ensure temp dir has space and retry the upload df -h /tmp POST /api/skills/register (retry)
Defensive patterns
Strategy: retry
Try / catch
try { skillRegistryService.register(manifest, pkg); }
catch (IllegalArgumentException e) {
if (e.getMessage().startsWith("Failed to read skill package")) {
// check temp-dir disk space, then retry the upload
} else throw e;
} Prevention
- Ensure the multipart temp directory has adequate free space and is writable.
- Use a stable client upload timeout to avoid partial temp files.
When it happens
Trigger: POST /api/skills/register where Spring's multipart temp file was deleted mid-request, the temp dir is full or unwritable, or the client disconnected during upload leaving a partial temp file.
Common situations: Low disk space in the multipart temp directory; a reverse proxy timing out and closing the connection; container ephemeral storage exhaustion; the temp file cleaned up by another process during a slow upload.
Related errors
- Failed to read skill file: {e.getMessage()}
- Skill manifest name '{manifestName}' does not match package
- Skill manifest is required
- Invalid skill manifest JSON: {e.getMessage()}
- Skill {name} version {version} already exists with a differe
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/aa2ab64e9d64bb3c.
Report an issue: GitHub.