{"record":{"id":"cc0ba849f57bdec8","repo":"multica-ai/multica","slug":"invalid-hermes-profile-name-q","errorCode":null,"errorMessage":"invalid hermes profile name %q","messagePattern":"invalid hermes profile name %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/internal/daemon/execenv/hermes_home.go","lineNumber":350,"sourceCode":"// normalize_profile_name + validate_profile_name + get_profile_dir. It returns\n// the home dir, whether that home must already exist (true for a named profile),\n// or an error for an empty/malformed/reserved name (which Hermes sys.exit(1)s on).\nfunc hermesProfileDir(root, name string) (home string, mustExist bool, err error) {\n\tstripped := strings.TrimSpace(name)\n\tif stripped == \"\" {\n\t\treturn \"\", false, fmt.Errorf(\"hermes profile name cannot be empty\")\n\t}\n\tvar canon string\n\tif strings.EqualFold(stripped, \"default\") {\n\t\tcanon = \"default\"\n\t} else {\n\t\tcanon = strings.ToLower(stripped)\n\t}\n\tif canon == \"default\" {\n\t\treturn root, false, nil // the default profile IS the root home\n\t}\n\tif !hermesProfileNameRe.MatchString(canon) {\n\t\treturn \"\", false, fmt.Errorf(\"invalid hermes profile name %q\", canon)\n\t}\n\tif _, reserved := hermesReservedProfileNames[canon]; reserved {\n\t\treturn \"\", false, fmt.Errorf(\"hermes profile name %q is reserved\", canon)\n\t}\n\treturn filepath.Join(root, \"profiles\", canon), true, nil\n}\n\n// prepareHermesHome builds the per-task HERMES_HOME compatibility overlay\n// described above. The daemon exports the given path as HERMES_HOME on the\n// hermes subprocess so the CLI discovers the bound skills natively.\n//\n// Callers gate this on the agent having skills bound; it is a full rebuild each\n// time (mirror reconciled, config re-derived, bound skills rewritten) so a Reuse\n// after a skill/config change lands cleanly. It fails CLOSED: if the mirror, the\n// derived config, or the bound skills can't be established the whole overlay is\n// unusable, so the error propagates and the caller must not start Hermes against\n// a half-built home.\n// sourceHome is the shared home to seed from (resolved by the daemon via","sourceCodeStart":332,"sourceCodeEnd":368,"githubUrl":"https://github.com/multica-ai/multica/blob/2c0912b6ec764b373d44eeea1e80f0d9f11ab417/server/internal/daemon/execenv/hermes_home.go#L332-L368","documentation":"Error \"invalid hermes profile name %q\" thrown in multica-ai/multica.","triggerScenarios":"Thrown at server/internal/daemon/execenv/hermes_home.go:350 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use a valid hermes profile name (no unsafe characters)."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"2c0912b6ec764b373d44eeea1e80f0d9f11ab417","analyzedAt":"2026-08-15T13:25:18.241Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}