{"record":{"id":"615b591f3b1de4ec","repo":"nodejs/node","slug":"config-file-not-found-at-s","errorCode":null,"errorMessage":"config file not found at %s","messagePattern":"config file not found at (.+?)","errorType":"exception","errorClass":"MBErr","httpStatus":null,"severity":"error","filePath":"deps/v8/tools/mb/mb.py","lineNumber":560,"sourceCode":"\n  def ReadIOSBotConfig(self):\n    if not self.args.builder_group or not self.args.builder:\n      return {}\n    path = self.PathJoin(self.chromium_src_dir, 'ios', 'build', 'bots',\n                         self.args.builder_group, self.args.builder + '.json')\n    if not self.Exists(path):\n      return {}\n\n    contents = json.loads(self.ReadFile(path))\n    gn_args = ' '.join(contents.get('gn_args', []))\n\n    vals = self.DefaultVals()\n    vals['gn_args'] = gn_args\n    return vals\n\n  def ReadConfigFile(self):\n    if not self.Exists(self.args.config_file):\n      raise MBErr('config file not found at %s' % self.args.config_file)\n\n    try:\n      contents = ast.literal_eval(self.ReadFile(self.args.config_file))\n    except SyntaxError as e:\n      raise MBErr('Failed to parse config file \"%s\": %s' %\n                 (self.args.config_file, e)) from e\n\n    self.configs = contents['configs']\n    self.luci_tryservers = contents.get('luci_tryservers', {})\n    self.builder_groups = contents['builder_groups']\n    self.mixins = contents['mixins']\n\n  def ReadIsolateMap(self):\n    if not self.args.isolate_map_files:\n      self.args.isolate_map_files = [self.default_isolate_map]\n\n    for f in self.args.isolate_map_files:\n      if not self.Exists(f):","sourceCodeStart":542,"sourceCodeEnd":578,"githubUrl":"https://github.com/nodejs/node/blob/1b2de5e052fc0fb95fd7fb6846dcec4ade598e9e/deps/v8/tools/mb/mb.py#L542-L578","documentation":"ReadConfigFile() first checks that the mb_config.pyl path exists via self.Exists(); if not, it raises MBErr('config file not found at %s'). This fires before any parsing, so it is purely a missing-file error for the main MB config (default infra/mb/mb_config.pyl unless -f overrides).","triggerScenarios":"Running any mb.py subcommand when the -f config file path (or the default infra/mb/mb_config.pyl) does not exist on disk. The Exists() guard short-circuits to MBErr.","commonSituations":"First run before mb_config.pyl is generated; -f pointing at a typo'd or moved path; shallow checkout that excluded infra/; running mb outside the source tree so the relative default path doesn't resolve.","solutions":["Confirm the path: `ls <path>` for the value passed via -f (or infra/mb/mb_config.pyl by default).","Run mb.py from the source root so the default relative path resolves, or pass an absolute -f path.","Restore/regenerate mb_config.pyl via gclient sync if it's missing from the checkout."],"exampleFix":"// before\n  mb.py gen -f /wrong/mb_config.pyl ...\n// after\n  mb.py gen -f infra/mb/mb_config.pyl ...   // or absolute correct path","handlingStrategy":"validation","validationCode":"import os\ncfg = args.config_file or os.path.join(src_root, 'infra', 'mb', 'mb_config.pyl')\nif not os.path.isfile(cfg):\n    sys.exit(f'mb config file not found at {cfg}; run from src root or pass -f')","typeGuard":"null","tryCatchPattern":"null","preventionTips":["Run mb.py from the source root so the default relative config path resolves.","Pass an absolute -f path in scripts to avoid cwd-dependent resolution.","Ensure `gclient sync` has populated infra/mb/mb_config.pyl before first use."],"tags":["mb","config","missing-file","v8-build"],"backgroundTag":null,"analyzedSha":"1b2de5e052fc0fb95fd7fb6846dcec4ade598e9e","analyzedAt":"2026-08-13T00:53:24.642Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}