{"record":{"id":"86ad08ab61ca5106","repo":"JuliusBrussee/caveman","slug":"registry-output-has-no-capabilities","errorCode":null,"errorMessage":"registry output has no capabilities","messagePattern":"registry output has no capabilities","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/agent/src/cli.ts","lineNumber":1117,"sourceCode":"    const invocation = portableInvocation(command, [\"registry\"], { env });\n    const { stdout } = await execFileAsync(invocation.command, [...invocation.args], {\n      encoding: \"utf8\",\n      env,\n      maxBuffer: 2 << 20,\n      timeout: 10_000,\n    });\n    const parsed = JSON.parse(stdout) as {\n      registry_sha256?: unknown;\n      capabilities?: Array<{\n        transform_id?: unknown;\n        eligible_segment_kinds?: unknown;\n      }>;\n    };\n    if (typeof parsed.registry_sha256 !== \"string\" || !/^[0-9a-f]{64}$/.test(parsed.registry_sha256)) {\n      throw new Error(\"registry output has no valid registry_sha256\");\n    }\n    if (!Array.isArray(parsed.capabilities) || parsed.capabilities.length === 0) {\n      throw new Error(\"registry output has no capabilities\");\n    }\n    const capabilities = parsed.capabilities.map((capability): TransformCapability => {\n      if (typeof capability.transform_id !== \"string\" ||\n          !Array.isArray(capability.eligible_segment_kinds) ||\n          capability.eligible_segment_kinds.some((kind) => typeof kind !== \"string\")) {\n        throw new Error(\"registry output has invalid capability\");\n      }\n      return {\n        transformID: capability.transform_id,\n        segmentKinds: capability.eligible_segment_kinds as TransformCapability[\"segmentKinds\"],\n      };\n    });\n    return { sha256: parsed.registry_sha256, capabilities };\n  } catch (error) {\n    throw new Error(\n      `cave_transform_registry_unavailable: run caveman setup or set CAVEMAN_ENGINE_BIN (${error instanceof Error ? error.message : String(error)})`,\n    );\n  }","sourceCodeStart":1099,"sourceCodeEnd":1135,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/packages/agent/src/cli.ts#L1099-L1135","documentation":"Thrown while parsing the engine transform-registry output: after `registry_sha256` validates, the CLI requires `capabilities` to be a non-empty array. An empty or missing capabilities list means the engine reports no transforms at all, so candidate-plan generation has nothing to route through and the build refuses to proceed on that answer.","triggerScenarios":"The engine binary answers with `{ \"registry_sha256\": \"...\" }` and no `capabilities` key, or `capabilities: []`. Typical causes: an engine installed without its transform pack, a registry file that was emptied/corrupted locally, or an engine version that predates the capabilities field.","commonSituations":"Fresh engine install missing transform assets; an interrupted `caveman setup` leaving a zero-entry registry; version mismatch where an old engine speaks a smaller output schema.","solutions":["Run `caveman setup` to (re)install the engine and its transform registry.","Check the engine's registry command output manually to confirm `capabilities` is present and non-empty.","Align the engine binary and framework versions (`caveman doctor`); set `CAVEMAN_ENGINE_BIN` to the matching binary if multiple are installed."],"exampleFix":"# before: engine registry empty\ncaveman-engine registry  # -> {\"registry_sha256\":\"...\",\"capabilities\":[]}\n\n# after\ncaveman setup             # reinstall transform pack\ncaveman-engine registry  # -> {\"registry_sha256\":\"...\",\"capabilities\":[{\"transform_id\":\"...\",...}]}","handlingStrategy":"validation","validationCode":"function registryHasCapabilities(parsed: unknown): boolean {\n  return Array.isArray((parsed as { capabilities?: unknown }).capabilities) &&\n    ((parsed as { capabilities: unknown[] }).capabilities.length > 0);\n}","typeGuard":"function isNonEmptyCapabilityArray(v: unknown): v is Array<Record<string, unknown>> {\n  return Array.isArray(v) && v.length > 0 && v.every((e) => typeof e === \"object\" && e !== null);\n}","tryCatchPattern":"try {\n  await build(args);\n} catch (error) {\n  if (error instanceof Error && error.message.startsWith(\"cave_transform_registry_unavailable\")) {\n    // empty capabilities: reinstall engine via caveman setup\n  } else throw error;\n}","preventionTips":["Verify the engine registry non-empty after every engine install/upgrade.","Pin engine and framework versions together in setup scripts.","Treat an interrupted `caveman setup` as a corrupt install: rerun it."],"tags":["engine","registry","external-process","setup"],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}