The vague "[json.exception.type_error.302] type must be string, but is null" is absolutely unhelpful in the way Hydra currently handles it on evaluation.
This is handling unexpected errors only; the following commit will handle the specific instance of the previously mentioned error.
D4G756UKRXYU6QEKD6TGN2VAL7PDJMLBMQALHKDPZU3I6U5KVTYQC if (myArgs.dryRun) {for (std::string jobName2 : *named) {auto job2 = state->jobs.find(jobName2);if (job2 == state->jobs.end())throw Error("aggregate job '%s' references non-existent job '%s'", jobName, jobName2);std::string drvPath2 = (*job2)["drvPath"];job["constituents"].push_back(drvPath2);}} else {auto drvPath = store->parseStorePath((std::string) job["drvPath"]);auto drv = store->readDerivation(drvPath);
try {if (myArgs.dryRun) {for (std::string jobName2 : *named) {lastTriedJobName = jobName2;auto job2 = state->jobs.find(jobName2);if (job2 == state->jobs.end())throw Error("aggregate job '%s' references non-existent job '%s'", jobName, jobName2);std::string drvPath2 = (*job2)["drvPath"];job["constituents"].push_back(drvPath2);}} else {auto drvPath = store->parseStorePath((std::string) job["drvPath"]);auto drv = store->readDerivation(drvPath);
for (std::string jobName2 : *named) {auto job2 = state->jobs.find(jobName2);if (job2 == state->jobs.end())throw Error("aggregate job '%s' references non-existent job '%s'", jobName, jobName2);auto drvPath2 = store->parseStorePath((std::string) (*job2)["drvPath"]);auto drv2 = store->readDerivation(drvPath2);job["constituents"].push_back(store->printStorePath(drvPath2));drv.inputDrvs[drvPath2] = {drv2.outputs.begin()->first};}
for (std::string jobName2 : *named) {lastTriedJobName = jobName2;auto job2 = state->jobs.find(jobName2);if (job2 == state->jobs.end())throw Error("aggregate job '%s' references non-existent job '%s'", jobName, jobName2);auto drvPath2 = store->parseStorePath((std::string) (*job2)["drvPath"]);auto drv2 = store->readDerivation(drvPath2);job["constituents"].push_back(store->printStorePath(drvPath2));drv.inputDrvs[drvPath2] = {drv2.outputs.begin()->first};}
std::string drvName(drvPath.name());assert(hasSuffix(drvName, drvExtension));drvName.resize(drvName.size() - drvExtension.size());auto h = std::get<Hash>(hashDerivationModulo(*store, drv, true));auto outPath = store->makeOutputPath("out", h, drvName);drv.env["out"] = store->printStorePath(outPath);drv.outputs.insert_or_assign("out", DerivationOutput { .output = DerivationOutputInputAddressed { .path = outPath } });auto newDrvPath = store->printStorePath(writeDerivation(*store, drv));
std::string drvName(drvPath.name());assert(hasSuffix(drvName, drvExtension));drvName.resize(drvName.size() - drvExtension.size());auto h = std::get<Hash>(hashDerivationModulo(*store, drv, true));auto outPath = store->makeOutputPath("out", h, drvName);drv.env["out"] = store->printStorePath(outPath);drv.outputs.insert_or_assign("out", DerivationOutput { .output = DerivationOutputInputAddressed { .path = outPath } });auto newDrvPath = store->printStorePath(writeDerivation(*store, drv));debug("rewrote aggregate derivation %s -> %s", store->printStorePath(drvPath), newDrvPath);
debug("rewrote aggregate derivation %s -> %s", store->printStorePath(drvPath), newDrvPath);
job["drvPath"] = newDrvPath;job["outputs"]["out"] = store->printStorePath(outPath);}} catch (std::exception & e) {// Print more information to help debugging.printError("Unexpected error in hydra-eval-jobs when handling job '%s', when producing aggregate job '%s':", lastTriedJobName, jobName);