{"record":{"id":"19ba167adcd97492","repo":"GoogleChrome/lighthouse","slug":"pluginname-has-an-invalid-group-description","errorCode":null,"errorMessage":"${pluginName} has an invalid group description.","messagePattern":"(.+?) has an invalid group description\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"core/config/config-plugin.js","lineNumber":208,"sourceCode":"      throw new Error(`${pluginName} groups json is not defined as an object.`);\n    }\n\n    const groups = Object.entries(groupsJson);\n\n    /** @type {Record<string, LH.Config.GroupJson>} */\n    const parsedGroupsJson = {};\n    groups.forEach(([groupId, groupJson]) => {\n      if (!isObjectOfUnknownProperties(groupJson)) {\n        throw new Error(`${pluginName} has a group not defined as an object.`);\n      }\n      const {title, description, ...invalidRest} = groupJson;\n      assertNoExcessProperties(invalidRest, pluginName, 'group');\n\n      if (!i18n.isStringOrIcuMessage(title)) {\n        throw new Error(`${pluginName} has an invalid group title.`);\n      }\n      if (!i18n.isStringOrIcuMessage(description) && description !== undefined) {\n        throw new Error(`${pluginName} has an invalid group description.`);\n      }\n      parsedGroupsJson[`${pluginName}-${groupId}`] = {\n        title,\n        description,\n      };\n    });\n    return parsedGroupsJson;\n  }\n\n  /**\n   * Extracts and validates a config from the provided plugin input, throwing\n   * if it deviates from the expected object shape.\n   * @param {unknown} pluginJson\n   * @param {string} pluginName\n   * @return {LH.Config}\n   */\n  static parsePlugin(pluginJson, pluginName) {\n    // Clone to prevent modifications of original and to deactivate any live properties.","sourceCodeStart":190,"sourceCodeEnd":226,"githubUrl":"https://github.com/GoogleChrome/lighthouse/blob/9515cd4e58ebed69f78742d932b501c2cab8ad8f/core/config/config-plugin.js#L190-L226","documentation":"Thrown by ConfigPlugin._parseGroups when a group's optional 'description' is present but is not a string or ICU message. description may be omitted (undefined), but any other non-string type (number, object, array, boolean) fails i18n.isStringOrIcuMessage.","triggerScenarios":"groups: {groupA: {title:'A', description: 42}} or description: false. Not undefined and not a string/IcuMessage, so config-plugin.js:208 throws.","commonSituations":"Setting description to a boolean or object. Leftover placeholder values. Confusing description with a structured object.","solutions":["Set description to a string: {title:'A', description: 'What this group covers.'}","Omit description if not needed."],"exampleFix":"// before\ngroups: {a: {title:'A', description: true}}\n// after\ngroups: {a: {title:'A', description: 'Group A audits.'}}","handlingStrategy":"validation","validationCode":"const i18n = require('lighthouse/core/lib/i18n/i18n.js');\nfor (const [id, g] of Object.entries(plugin.groups || {})) {\n  if (g.description !== undefined && !i18n.isStringOrIcuMessage(g.description)) {\n    throw new TypeError(`group '${id}' description must be a string`);\n  }\n}","typeGuard":"function groupDescriptionOk(g) { return g.description === undefined || typeof g.description === 'string'; }","tryCatchPattern":"try { await ConfigPlugin.parsePlugin(plugin, name); }\ncatch (e) { if (/invalid group description/.test(e.message)) console.error('group.description must be a string'); throw e; }","preventionTips":["Keep group.description a string or omit it.","Never use booleans/objects for description."],"tags":["config","lighthouse","plugin","validation","groups","i18n"],"backgroundTag":null,"analyzedSha":"9515cd4e58ebed69f78742d932b501c2cab8ad8f","analyzedAt":"2026-08-13T06:28:10.346Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}