[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-github-error-messages":3,"mdc--pdt2zg-key":37,"related-org-github-error-messages":1466,"related-repo-github-error-messages":1647},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"error-messages","apply error message style guidelines","Error Message Style Guide for Validation Errors",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"github","GitHub","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fgithub.png",[12,14,17,20,23],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Writing","writing",{"name":18,"slug":19,"type":13},"Documentation","documentation",{"name":21,"slug":22,"type":13},"UX Copy","ux-copy",{"name":24,"slug":25,"type":13},"Design","design",8,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fgh-aw-threat-detection","2026-05-07T05:48:45.283097",null,3,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"GitHub Agentic Workflows Threat Detection","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fgh-aw-threat-detection\u002Ftree\u002FHEAD\u002Fskills\u002Ferror-messages","---\nname: error-messages\ndescription: Error Message Style Guide for Validation Errors\n---\n\n\n# Error Message Style Guide\n\nThis guide establishes the standard format for validation error messages in the gh-aw codebase. All validation errors should be clear, actionable, and include examples.\n\n## Error Message Template\n\n```\n[what's wrong]. [what's expected]. [example of correct usage]\n```\n\nEach error message should answer three questions:\n1. **What's wrong?** - Clearly state the validation error\n2. **What's expected?** - Explain the valid format or values\n3. **How to fix it?** - Provide a concrete example of correct usage\n\n## Good Examples\n\nThese examples follow the template and provide actionable guidance:\n\n### Time Delta Validation (from time_delta.go)\n```go\nreturn nil, fmt.Errorf(\"invalid time delta format: +%s. Expected format like +25h, +3d, +1w, +1mo, +1d12h30m\", deltaStr)\n```\n✅ **Why it's good:**\n- Clearly identifies the invalid input\n- Lists multiple valid format examples\n- Shows combined formats (+1d12h30m)\n\n### Type Validation with Example\n```go\nreturn \"\", fmt.Errorf(\"manual-approval value must be a string, got %T. Example: manual-approval: \\\"production\\\"\", val)\n```\n✅ **Why it's good:**\n- Shows actual type received (%T)\n- Provides concrete YAML example\n- Uses proper YAML syntax with quotes\n\n### Enum Validation with Options\n```go\nreturn fmt.Errorf(\"invalid engine: %s. Valid engines are: copilot, claude, codex, custom. Example: engine: copilot\", engineID)\n```\n✅ **Why it's good:**\n- Lists all valid options\n- Provides simplest example\n- Uses consistent formatting\n\n### MCP Configuration\n```go\nreturn fmt.Errorf(\"tool '%s' mcp configuration must specify either 'command' or 'container'. Example:\\ntools:\\n  %s:\\n    command: \\\"npx @my\u002Ftool\\\"\", toolName, toolName)\n```\n✅ **Why it's good:**\n- Explains mutual exclusivity\n- Shows realistic tool name\n- Formats multi-line YAML example\n\n## Bad Examples\n\nThese examples lack clarity or actionable guidance:\n\n### Too Vague\n```go\nreturn fmt.Errorf(\"invalid format\")\n```\n❌ **Problems:**\n- Doesn't specify what format is invalid\n- Doesn't explain expected format\n- No example provided\n\n### Missing Example\n```go\nreturn fmt.Errorf(\"manual-approval value must be a string\")\n```\n❌ **Problems:**\n- States requirement but no example\n- User doesn't know proper YAML syntax\n- Could be clearer about type received\n\n### Incomplete Information\n```go\nreturn fmt.Errorf(\"invalid engine: %s\", engineID)\n```\n❌ **Problems:**\n- Doesn't list valid options\n- No guidance on fixing the error\n- User must search documentation\n\n## When to Include Examples\n\nAlways include examples for:\n\n1. **Format\u002FSyntax Errors** - Show the correct syntax\n   ```go\n   fmt.Errorf(\"invalid date format. Expected: YYYY-MM-DD HH:MM:SS. Example: 2024-01-15 14:30:00\")\n   ```\n\n2. **Enum\u002FChoice Fields** - List all valid options\n   ```go\n   fmt.Errorf(\"invalid permission level: %s. Valid levels: read, write, none. Example: permissions:\\n  contents: read\", level)\n   ```\n\n3. **Type Mismatches** - Show expected type and example\n   ```go\n   fmt.Errorf(\"timeout-minutes must be an integer, got %T. Example: timeout-minutes: 10\", value)\n   ```\n\n4. **Complex Configurations** - Provide complete valid example\n   ```go\n   fmt.Errorf(\"invalid MCP server config. Example:\\nmcp-servers:\\n  my-server:\\n    command: \\\"node\\\"\\n    args: [\\\"server.js\\\"]\")\n   ```\n\n## When Examples May Be Optional\n\nExamples can be omitted when:\n\n1. **Error is from wrapped error** - When wrapping another error with context\n   ```go\n   return fmt.Errorf(\"failed to parse configuration: %w\", err)\n   ```\n\n2. **Error is self-explanatory with clear context**\n   ```go\n   return fmt.Errorf(\"duplicate unit '%s' in time delta: +%s\", unit, deltaStr)\n   ```\n\n3. **Error points to specific documentation**\n   ```go\n   return fmt.Errorf(\"unsupported feature. See https:\u002F\u002Fdocs.example.com\u002Ffeatures\")\n   ```\n\n## Formatting Guidelines\n\n### Use Type Verbs for Dynamic Content\n- `%s` - strings\n- `%d` - integers  \n- `%T` - type of value\n- `%v` - general value\n- `%w` - wrapped errors\n\n### Multi-line Examples\nFor YAML configuration examples spanning multiple lines:\n```go\nfmt.Errorf(\"invalid config. Example:\\ntools:\\n  github:\\n    mode: \\\"remote\\\"\")\n```\n\n### Quoting in Examples\nUse proper YAML syntax in examples:\n```go\n\u002F\u002F Good - shows quotes when needed\nfmt.Errorf(\"Example: name: \\\"my-workflow\\\"\")\n\n\u002F\u002F Good - shows no quotes for simple values\nfmt.Errorf(\"Example: timeout-minutes: 10\")\n```\n\n### Consistent Terminology\nUse the same field names as in YAML:\n```go\n\u002F\u002F Good - matches YAML field name\nfmt.Errorf(\"timeout-minutes must be positive\")\n\n\u002F\u002F Bad - uses different name\nfmt.Errorf(\"timeout must be positive\")\n```\n\n## Error Message Testing\n\nAll improved error messages should have corresponding tests:\n\n```go\nfunc TestErrorMessageQuality(t *testing.T) {\n    err := validateSomething(invalidInput)\n    require.Error(t, err)\n    \n    \u002F\u002F Error should explain what's wrong\n    assert.Contains(t, err.Error(), \"invalid\")\n    \n    \u002F\u002F Error should include expected format or values\n    assert.Contains(t, err.Error(), \"Expected\")\n    \n    \u002F\u002F Error should include example\n    assert.Contains(t, err.Error(), \"Example:\")\n}\n```\n\n## Migration Strategy\n\nWhen improving existing error messages:\n\n1. **Identify the error** - Find validation error that lacks clarity\n2. **Analyze context** - Understand what's being validated\n3. **Apply template** - Add what's wrong + expected + example\n4. **Add tests** - Verify error message content\n5. **Update comments** - Document the validation logic\n\n## Examples by Category\n\n### Format Validation\n```go\n\u002F\u002F Time deltas\nfmt.Errorf(\"invalid time delta format: +%s. Expected format like +25h, +3d, +1w, +1mo, +1d12h30m\", input)\n\n\u002F\u002F Dates\nfmt.Errorf(\"invalid date format: %s. Expected: YYYY-MM-DD or relative like -1w. Example: 2024-01-15 or -7d\", input)\n\n\u002F\u002F URLs\nfmt.Errorf(\"invalid URL format: %s. Expected: https:\u002F\u002F URL. Example: https:\u002F\u002Fapi.example.com\", input)\n```\n\n### Type Validation\n```go\n\u002F\u002F Boolean expected\nfmt.Errorf(\"read-only must be a boolean, got %T. Example: read-only: true\", value)\n\n\u002F\u002F String expected\nfmt.Errorf(\"workflow name must be a string, got %T. Example: name: \\\"my-workflow\\\"\", value)\n\n\u002F\u002F Object expected\nfmt.Errorf(\"permissions must be an object, got %T. Example: permissions:\\n  contents: read\", value)\n```\n\n### Choice\u002FEnum Validation\n```go\n\u002F\u002F Engine selection\nfmt.Errorf(\"invalid engine: %s. Valid engines: copilot, claude, codex, custom. Example: engine: copilot\", id)\n\n\u002F\u002F Permission levels\nfmt.Errorf(\"invalid permission level: %s. Valid levels: read, write, none. Example: contents: read\", level)\n\n\u002F\u002F Tool modes\nfmt.Errorf(\"invalid mode: %s. Valid modes: local, remote. Example: mode: \\\"remote\\\"\", mode)\n```\n\n### Configuration Validation\n```go\n\u002F\u002F Missing required field\nfmt.Errorf(\"tool '%s' missing required 'command' field. Example:\\ntools:\\n  %s:\\n    command: \\\"node server.js\\\"\", name, name)\n\n\u002F\u002F Mutually exclusive fields\nfmt.Errorf(\"cannot specify both 'command' and 'container'. Choose one. Example: command: \\\"node server.js\\\"\")\n\n\u002F\u002F Invalid combination\nfmt.Errorf(\"http MCP servers cannot use 'container' field. Example:\\ntools:\\n  my-http:\\n    type: http\\n    url: \\\"https:\u002F\u002Fapi.example.com\\\"\")\n```\n\n## References\n\n- **Excellent example to follow**: `pkg\u002Fworkflow\u002Ftime_delta.go`\n- **Pattern inspiration**: Go standard library error messages\n- **Testing examples**: `pkg\u002Fworkflow\u002F*_test.go`\n\n## Tools\n\nWhen writing error messages, consider:\n- The user's perspective (what do they need to fix it?)\n- The context (where in the workflow is the error?)\n- The documentation (should we reference specific docs?)\n- The complexity (is multi-line example needed?)\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,51,57,64,77,82,118,124,129,136,155,165,184,190,204,212,230,236,250,258,276,282,296,304,322,328,333,339,353,363,381,387,401,409,427,433,447,455,473,479,484,583,589,594,665,671,677,735,741,746,760,766,771,822,828,833,879,885,890,1006,1012,1017,1070,1076,1082,1151,1157,1226,1232,1301,1307,1376,1382,1426,1432,1437,1460],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"error-message-style-guide",[48],{"type":49,"value":50},"text","Error Message Style Guide",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"This guide establishes the standard format for validation error messages in the gh-aw codebase. All validation errors should be clear, actionable, and include examples.",{"type":43,"tag":58,"props":59,"children":61},"h2",{"id":60},"error-message-template",[62],{"type":49,"value":63},"Error Message Template",{"type":43,"tag":65,"props":66,"children":70},"pre",{"className":67,"code":69,"language":49},[68],"language-text","[what's wrong]. [what's expected]. [example of correct usage]\n",[71],{"type":43,"tag":72,"props":73,"children":75},"code",{"__ignoreMap":74},"",[76],{"type":49,"value":69},{"type":43,"tag":52,"props":78,"children":79},{},[80],{"type":49,"value":81},"Each error message should answer three questions:",{"type":43,"tag":83,"props":84,"children":85},"ol",{},[86,98,108],{"type":43,"tag":87,"props":88,"children":89},"li",{},[90,96],{"type":43,"tag":91,"props":92,"children":93},"strong",{},[94],{"type":49,"value":95},"What's wrong?",{"type":49,"value":97}," - Clearly state the validation error",{"type":43,"tag":87,"props":99,"children":100},{},[101,106],{"type":43,"tag":91,"props":102,"children":103},{},[104],{"type":49,"value":105},"What's expected?",{"type":49,"value":107}," - Explain the valid format or values",{"type":43,"tag":87,"props":109,"children":110},{},[111,116],{"type":43,"tag":91,"props":112,"children":113},{},[114],{"type":49,"value":115},"How to fix it?",{"type":49,"value":117}," - Provide a concrete example of correct usage",{"type":43,"tag":58,"props":119,"children":121},{"id":120},"good-examples",[122],{"type":49,"value":123},"Good Examples",{"type":43,"tag":52,"props":125,"children":126},{},[127],{"type":49,"value":128},"These examples follow the template and provide actionable guidance:",{"type":43,"tag":130,"props":131,"children":133},"h3",{"id":132},"time-delta-validation-from-time_deltago",[134],{"type":49,"value":135},"Time Delta Validation (from time_delta.go)",{"type":43,"tag":65,"props":137,"children":141},{"className":138,"code":139,"language":140,"meta":74,"style":74},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","return nil, fmt.Errorf(\"invalid time delta format: +%s. Expected format like +25h, +3d, +1w, +1mo, +1d12h30m\", deltaStr)\n","go",[142],{"type":43,"tag":72,"props":143,"children":144},{"__ignoreMap":74},[145],{"type":43,"tag":146,"props":147,"children":150},"span",{"class":148,"line":149},"line",1,[151],{"type":43,"tag":146,"props":152,"children":153},{},[154],{"type":49,"value":139},{"type":43,"tag":52,"props":156,"children":157},{},[158,160],{"type":49,"value":159},"✅ ",{"type":43,"tag":91,"props":161,"children":162},{},[163],{"type":49,"value":164},"Why it's good:",{"type":43,"tag":166,"props":167,"children":168},"ul",{},[169,174,179],{"type":43,"tag":87,"props":170,"children":171},{},[172],{"type":49,"value":173},"Clearly identifies the invalid input",{"type":43,"tag":87,"props":175,"children":176},{},[177],{"type":49,"value":178},"Lists multiple valid format examples",{"type":43,"tag":87,"props":180,"children":181},{},[182],{"type":49,"value":183},"Shows combined formats (+1d12h30m)",{"type":43,"tag":130,"props":185,"children":187},{"id":186},"type-validation-with-example",[188],{"type":49,"value":189},"Type Validation with Example",{"type":43,"tag":65,"props":191,"children":193},{"className":138,"code":192,"language":140,"meta":74,"style":74},"return \"\", fmt.Errorf(\"manual-approval value must be a string, got %T. Example: manual-approval: \\\"production\\\"\", val)\n",[194],{"type":43,"tag":72,"props":195,"children":196},{"__ignoreMap":74},[197],{"type":43,"tag":146,"props":198,"children":199},{"class":148,"line":149},[200],{"type":43,"tag":146,"props":201,"children":202},{},[203],{"type":49,"value":192},{"type":43,"tag":52,"props":205,"children":206},{},[207,208],{"type":49,"value":159},{"type":43,"tag":91,"props":209,"children":210},{},[211],{"type":49,"value":164},{"type":43,"tag":166,"props":213,"children":214},{},[215,220,225],{"type":43,"tag":87,"props":216,"children":217},{},[218],{"type":49,"value":219},"Shows actual type received (%T)",{"type":43,"tag":87,"props":221,"children":222},{},[223],{"type":49,"value":224},"Provides concrete YAML example",{"type":43,"tag":87,"props":226,"children":227},{},[228],{"type":49,"value":229},"Uses proper YAML syntax with quotes",{"type":43,"tag":130,"props":231,"children":233},{"id":232},"enum-validation-with-options",[234],{"type":49,"value":235},"Enum Validation with Options",{"type":43,"tag":65,"props":237,"children":239},{"className":138,"code":238,"language":140,"meta":74,"style":74},"return fmt.Errorf(\"invalid engine: %s. Valid engines are: copilot, claude, codex, custom. Example: engine: copilot\", engineID)\n",[240],{"type":43,"tag":72,"props":241,"children":242},{"__ignoreMap":74},[243],{"type":43,"tag":146,"props":244,"children":245},{"class":148,"line":149},[246],{"type":43,"tag":146,"props":247,"children":248},{},[249],{"type":49,"value":238},{"type":43,"tag":52,"props":251,"children":252},{},[253,254],{"type":49,"value":159},{"type":43,"tag":91,"props":255,"children":256},{},[257],{"type":49,"value":164},{"type":43,"tag":166,"props":259,"children":260},{},[261,266,271],{"type":43,"tag":87,"props":262,"children":263},{},[264],{"type":49,"value":265},"Lists all valid options",{"type":43,"tag":87,"props":267,"children":268},{},[269],{"type":49,"value":270},"Provides simplest example",{"type":43,"tag":87,"props":272,"children":273},{},[274],{"type":49,"value":275},"Uses consistent formatting",{"type":43,"tag":130,"props":277,"children":279},{"id":278},"mcp-configuration",[280],{"type":49,"value":281},"MCP Configuration",{"type":43,"tag":65,"props":283,"children":285},{"className":138,"code":284,"language":140,"meta":74,"style":74},"return fmt.Errorf(\"tool '%s' mcp configuration must specify either 'command' or 'container'. Example:\\ntools:\\n  %s:\\n    command: \\\"npx @my\u002Ftool\\\"\", toolName, toolName)\n",[286],{"type":43,"tag":72,"props":287,"children":288},{"__ignoreMap":74},[289],{"type":43,"tag":146,"props":290,"children":291},{"class":148,"line":149},[292],{"type":43,"tag":146,"props":293,"children":294},{},[295],{"type":49,"value":284},{"type":43,"tag":52,"props":297,"children":298},{},[299,300],{"type":49,"value":159},{"type":43,"tag":91,"props":301,"children":302},{},[303],{"type":49,"value":164},{"type":43,"tag":166,"props":305,"children":306},{},[307,312,317],{"type":43,"tag":87,"props":308,"children":309},{},[310],{"type":49,"value":311},"Explains mutual exclusivity",{"type":43,"tag":87,"props":313,"children":314},{},[315],{"type":49,"value":316},"Shows realistic tool name",{"type":43,"tag":87,"props":318,"children":319},{},[320],{"type":49,"value":321},"Formats multi-line YAML example",{"type":43,"tag":58,"props":323,"children":325},{"id":324},"bad-examples",[326],{"type":49,"value":327},"Bad Examples",{"type":43,"tag":52,"props":329,"children":330},{},[331],{"type":49,"value":332},"These examples lack clarity or actionable guidance:",{"type":43,"tag":130,"props":334,"children":336},{"id":335},"too-vague",[337],{"type":49,"value":338},"Too Vague",{"type":43,"tag":65,"props":340,"children":342},{"className":138,"code":341,"language":140,"meta":74,"style":74},"return fmt.Errorf(\"invalid format\")\n",[343],{"type":43,"tag":72,"props":344,"children":345},{"__ignoreMap":74},[346],{"type":43,"tag":146,"props":347,"children":348},{"class":148,"line":149},[349],{"type":43,"tag":146,"props":350,"children":351},{},[352],{"type":49,"value":341},{"type":43,"tag":52,"props":354,"children":355},{},[356,358],{"type":49,"value":357},"❌ ",{"type":43,"tag":91,"props":359,"children":360},{},[361],{"type":49,"value":362},"Problems:",{"type":43,"tag":166,"props":364,"children":365},{},[366,371,376],{"type":43,"tag":87,"props":367,"children":368},{},[369],{"type":49,"value":370},"Doesn't specify what format is invalid",{"type":43,"tag":87,"props":372,"children":373},{},[374],{"type":49,"value":375},"Doesn't explain expected format",{"type":43,"tag":87,"props":377,"children":378},{},[379],{"type":49,"value":380},"No example provided",{"type":43,"tag":130,"props":382,"children":384},{"id":383},"missing-example",[385],{"type":49,"value":386},"Missing Example",{"type":43,"tag":65,"props":388,"children":390},{"className":138,"code":389,"language":140,"meta":74,"style":74},"return fmt.Errorf(\"manual-approval value must be a string\")\n",[391],{"type":43,"tag":72,"props":392,"children":393},{"__ignoreMap":74},[394],{"type":43,"tag":146,"props":395,"children":396},{"class":148,"line":149},[397],{"type":43,"tag":146,"props":398,"children":399},{},[400],{"type":49,"value":389},{"type":43,"tag":52,"props":402,"children":403},{},[404,405],{"type":49,"value":357},{"type":43,"tag":91,"props":406,"children":407},{},[408],{"type":49,"value":362},{"type":43,"tag":166,"props":410,"children":411},{},[412,417,422],{"type":43,"tag":87,"props":413,"children":414},{},[415],{"type":49,"value":416},"States requirement but no example",{"type":43,"tag":87,"props":418,"children":419},{},[420],{"type":49,"value":421},"User doesn't know proper YAML syntax",{"type":43,"tag":87,"props":423,"children":424},{},[425],{"type":49,"value":426},"Could be clearer about type received",{"type":43,"tag":130,"props":428,"children":430},{"id":429},"incomplete-information",[431],{"type":49,"value":432},"Incomplete Information",{"type":43,"tag":65,"props":434,"children":436},{"className":138,"code":435,"language":140,"meta":74,"style":74},"return fmt.Errorf(\"invalid engine: %s\", engineID)\n",[437],{"type":43,"tag":72,"props":438,"children":439},{"__ignoreMap":74},[440],{"type":43,"tag":146,"props":441,"children":442},{"class":148,"line":149},[443],{"type":43,"tag":146,"props":444,"children":445},{},[446],{"type":49,"value":435},{"type":43,"tag":52,"props":448,"children":449},{},[450,451],{"type":49,"value":357},{"type":43,"tag":91,"props":452,"children":453},{},[454],{"type":49,"value":362},{"type":43,"tag":166,"props":456,"children":457},{},[458,463,468],{"type":43,"tag":87,"props":459,"children":460},{},[461],{"type":49,"value":462},"Doesn't list valid options",{"type":43,"tag":87,"props":464,"children":465},{},[466],{"type":49,"value":467},"No guidance on fixing the error",{"type":43,"tag":87,"props":469,"children":470},{},[471],{"type":49,"value":472},"User must search documentation",{"type":43,"tag":58,"props":474,"children":476},{"id":475},"when-to-include-examples",[477],{"type":49,"value":478},"When to Include Examples",{"type":43,"tag":52,"props":480,"children":481},{},[482],{"type":49,"value":483},"Always include examples for:",{"type":43,"tag":83,"props":485,"children":486},{},[487,511,535,559],{"type":43,"tag":87,"props":488,"children":489},{},[490,495,497],{"type":43,"tag":91,"props":491,"children":492},{},[493],{"type":49,"value":494},"Format\u002FSyntax Errors",{"type":49,"value":496}," - Show the correct syntax",{"type":43,"tag":65,"props":498,"children":500},{"className":138,"code":499,"language":140,"meta":74,"style":74},"fmt.Errorf(\"invalid date format. Expected: YYYY-MM-DD HH:MM:SS. Example: 2024-01-15 14:30:00\")\n",[501],{"type":43,"tag":72,"props":502,"children":503},{"__ignoreMap":74},[504],{"type":43,"tag":146,"props":505,"children":506},{"class":148,"line":149},[507],{"type":43,"tag":146,"props":508,"children":509},{},[510],{"type":49,"value":499},{"type":43,"tag":87,"props":512,"children":513},{},[514,519,521],{"type":43,"tag":91,"props":515,"children":516},{},[517],{"type":49,"value":518},"Enum\u002FChoice Fields",{"type":49,"value":520}," - List all valid options",{"type":43,"tag":65,"props":522,"children":524},{"className":138,"code":523,"language":140,"meta":74,"style":74},"fmt.Errorf(\"invalid permission level: %s. Valid levels: read, write, none. Example: permissions:\\n  contents: read\", level)\n",[525],{"type":43,"tag":72,"props":526,"children":527},{"__ignoreMap":74},[528],{"type":43,"tag":146,"props":529,"children":530},{"class":148,"line":149},[531],{"type":43,"tag":146,"props":532,"children":533},{},[534],{"type":49,"value":523},{"type":43,"tag":87,"props":536,"children":537},{},[538,543,545],{"type":43,"tag":91,"props":539,"children":540},{},[541],{"type":49,"value":542},"Type Mismatches",{"type":49,"value":544}," - Show expected type and example",{"type":43,"tag":65,"props":546,"children":548},{"className":138,"code":547,"language":140,"meta":74,"style":74},"fmt.Errorf(\"timeout-minutes must be an integer, got %T. Example: timeout-minutes: 10\", value)\n",[549],{"type":43,"tag":72,"props":550,"children":551},{"__ignoreMap":74},[552],{"type":43,"tag":146,"props":553,"children":554},{"class":148,"line":149},[555],{"type":43,"tag":146,"props":556,"children":557},{},[558],{"type":49,"value":547},{"type":43,"tag":87,"props":560,"children":561},{},[562,567,569],{"type":43,"tag":91,"props":563,"children":564},{},[565],{"type":49,"value":566},"Complex Configurations",{"type":49,"value":568}," - Provide complete valid example",{"type":43,"tag":65,"props":570,"children":572},{"className":138,"code":571,"language":140,"meta":74,"style":74},"fmt.Errorf(\"invalid MCP server config. Example:\\nmcp-servers:\\n  my-server:\\n    command: \\\"node\\\"\\n    args: [\\\"server.js\\\"]\")\n",[573],{"type":43,"tag":72,"props":574,"children":575},{"__ignoreMap":74},[576],{"type":43,"tag":146,"props":577,"children":578},{"class":148,"line":149},[579],{"type":43,"tag":146,"props":580,"children":581},{},[582],{"type":49,"value":571},{"type":43,"tag":58,"props":584,"children":586},{"id":585},"when-examples-may-be-optional",[587],{"type":49,"value":588},"When Examples May Be Optional",{"type":43,"tag":52,"props":590,"children":591},{},[592],{"type":49,"value":593},"Examples can be omitted when:",{"type":43,"tag":83,"props":595,"children":596},{},[597,621,643],{"type":43,"tag":87,"props":598,"children":599},{},[600,605,607],{"type":43,"tag":91,"props":601,"children":602},{},[603],{"type":49,"value":604},"Error is from wrapped error",{"type":49,"value":606}," - When wrapping another error with context",{"type":43,"tag":65,"props":608,"children":610},{"className":138,"code":609,"language":140,"meta":74,"style":74},"return fmt.Errorf(\"failed to parse configuration: %w\", err)\n",[611],{"type":43,"tag":72,"props":612,"children":613},{"__ignoreMap":74},[614],{"type":43,"tag":146,"props":615,"children":616},{"class":148,"line":149},[617],{"type":43,"tag":146,"props":618,"children":619},{},[620],{"type":49,"value":609},{"type":43,"tag":87,"props":622,"children":623},{},[624,629],{"type":43,"tag":91,"props":625,"children":626},{},[627],{"type":49,"value":628},"Error is self-explanatory with clear context",{"type":43,"tag":65,"props":630,"children":632},{"className":138,"code":631,"language":140,"meta":74,"style":74},"return fmt.Errorf(\"duplicate unit '%s' in time delta: +%s\", unit, deltaStr)\n",[633],{"type":43,"tag":72,"props":634,"children":635},{"__ignoreMap":74},[636],{"type":43,"tag":146,"props":637,"children":638},{"class":148,"line":149},[639],{"type":43,"tag":146,"props":640,"children":641},{},[642],{"type":49,"value":631},{"type":43,"tag":87,"props":644,"children":645},{},[646,651],{"type":43,"tag":91,"props":647,"children":648},{},[649],{"type":49,"value":650},"Error points to specific documentation",{"type":43,"tag":65,"props":652,"children":654},{"className":138,"code":653,"language":140,"meta":74,"style":74},"return fmt.Errorf(\"unsupported feature. See https:\u002F\u002Fdocs.example.com\u002Ffeatures\")\n",[655],{"type":43,"tag":72,"props":656,"children":657},{"__ignoreMap":74},[658],{"type":43,"tag":146,"props":659,"children":660},{"class":148,"line":149},[661],{"type":43,"tag":146,"props":662,"children":663},{},[664],{"type":49,"value":653},{"type":43,"tag":58,"props":666,"children":668},{"id":667},"formatting-guidelines",[669],{"type":49,"value":670},"Formatting Guidelines",{"type":43,"tag":130,"props":672,"children":674},{"id":673},"use-type-verbs-for-dynamic-content",[675],{"type":49,"value":676},"Use Type Verbs for Dynamic Content",{"type":43,"tag":166,"props":678,"children":679},{},[680,691,702,713,724],{"type":43,"tag":87,"props":681,"children":682},{},[683,689],{"type":43,"tag":72,"props":684,"children":686},{"className":685},[],[687],{"type":49,"value":688},"%s",{"type":49,"value":690}," - strings",{"type":43,"tag":87,"props":692,"children":693},{},[694,700],{"type":43,"tag":72,"props":695,"children":697},{"className":696},[],[698],{"type":49,"value":699},"%d",{"type":49,"value":701}," - integers",{"type":43,"tag":87,"props":703,"children":704},{},[705,711],{"type":43,"tag":72,"props":706,"children":708},{"className":707},[],[709],{"type":49,"value":710},"%T",{"type":49,"value":712}," - type of value",{"type":43,"tag":87,"props":714,"children":715},{},[716,722],{"type":43,"tag":72,"props":717,"children":719},{"className":718},[],[720],{"type":49,"value":721},"%v",{"type":49,"value":723}," - general value",{"type":43,"tag":87,"props":725,"children":726},{},[727,733],{"type":43,"tag":72,"props":728,"children":730},{"className":729},[],[731],{"type":49,"value":732},"%w",{"type":49,"value":734}," - wrapped errors",{"type":43,"tag":130,"props":736,"children":738},{"id":737},"multi-line-examples",[739],{"type":49,"value":740},"Multi-line Examples",{"type":43,"tag":52,"props":742,"children":743},{},[744],{"type":49,"value":745},"For YAML configuration examples spanning multiple lines:",{"type":43,"tag":65,"props":747,"children":749},{"className":138,"code":748,"language":140,"meta":74,"style":74},"fmt.Errorf(\"invalid config. Example:\\ntools:\\n  github:\\n    mode: \\\"remote\\\"\")\n",[750],{"type":43,"tag":72,"props":751,"children":752},{"__ignoreMap":74},[753],{"type":43,"tag":146,"props":754,"children":755},{"class":148,"line":149},[756],{"type":43,"tag":146,"props":757,"children":758},{},[759],{"type":49,"value":748},{"type":43,"tag":130,"props":761,"children":763},{"id":762},"quoting-in-examples",[764],{"type":49,"value":765},"Quoting in Examples",{"type":43,"tag":52,"props":767,"children":768},{},[769],{"type":49,"value":770},"Use proper YAML syntax in examples:",{"type":43,"tag":65,"props":772,"children":774},{"className":138,"code":773,"language":140,"meta":74,"style":74},"\u002F\u002F Good - shows quotes when needed\nfmt.Errorf(\"Example: name: \\\"my-workflow\\\"\")\n\n\u002F\u002F Good - shows no quotes for simple values\nfmt.Errorf(\"Example: timeout-minutes: 10\")\n",[775],{"type":43,"tag":72,"props":776,"children":777},{"__ignoreMap":74},[778,786,795,804,813],{"type":43,"tag":146,"props":779,"children":780},{"class":148,"line":149},[781],{"type":43,"tag":146,"props":782,"children":783},{},[784],{"type":49,"value":785},"\u002F\u002F Good - shows quotes when needed\n",{"type":43,"tag":146,"props":787,"children":789},{"class":148,"line":788},2,[790],{"type":43,"tag":146,"props":791,"children":792},{},[793],{"type":49,"value":794},"fmt.Errorf(\"Example: name: \\\"my-workflow\\\"\")\n",{"type":43,"tag":146,"props":796,"children":797},{"class":148,"line":30},[798],{"type":43,"tag":146,"props":799,"children":801},{"emptyLinePlaceholder":800},true,[802],{"type":49,"value":803},"\n",{"type":43,"tag":146,"props":805,"children":807},{"class":148,"line":806},4,[808],{"type":43,"tag":146,"props":809,"children":810},{},[811],{"type":49,"value":812},"\u002F\u002F Good - shows no quotes for simple values\n",{"type":43,"tag":146,"props":814,"children":816},{"class":148,"line":815},5,[817],{"type":43,"tag":146,"props":818,"children":819},{},[820],{"type":49,"value":821},"fmt.Errorf(\"Example: timeout-minutes: 10\")\n",{"type":43,"tag":130,"props":823,"children":825},{"id":824},"consistent-terminology",[826],{"type":49,"value":827},"Consistent Terminology",{"type":43,"tag":52,"props":829,"children":830},{},[831],{"type":49,"value":832},"Use the same field names as in YAML:",{"type":43,"tag":65,"props":834,"children":836},{"className":138,"code":835,"language":140,"meta":74,"style":74},"\u002F\u002F Good - matches YAML field name\nfmt.Errorf(\"timeout-minutes must be positive\")\n\n\u002F\u002F Bad - uses different name\nfmt.Errorf(\"timeout must be positive\")\n",[837],{"type":43,"tag":72,"props":838,"children":839},{"__ignoreMap":74},[840,848,856,863,871],{"type":43,"tag":146,"props":841,"children":842},{"class":148,"line":149},[843],{"type":43,"tag":146,"props":844,"children":845},{},[846],{"type":49,"value":847},"\u002F\u002F Good - matches YAML field name\n",{"type":43,"tag":146,"props":849,"children":850},{"class":148,"line":788},[851],{"type":43,"tag":146,"props":852,"children":853},{},[854],{"type":49,"value":855},"fmt.Errorf(\"timeout-minutes must be positive\")\n",{"type":43,"tag":146,"props":857,"children":858},{"class":148,"line":30},[859],{"type":43,"tag":146,"props":860,"children":861},{"emptyLinePlaceholder":800},[862],{"type":49,"value":803},{"type":43,"tag":146,"props":864,"children":865},{"class":148,"line":806},[866],{"type":43,"tag":146,"props":867,"children":868},{},[869],{"type":49,"value":870},"\u002F\u002F Bad - uses different name\n",{"type":43,"tag":146,"props":872,"children":873},{"class":148,"line":815},[874],{"type":43,"tag":146,"props":875,"children":876},{},[877],{"type":49,"value":878},"fmt.Errorf(\"timeout must be positive\")\n",{"type":43,"tag":58,"props":880,"children":882},{"id":881},"error-message-testing",[883],{"type":49,"value":884},"Error Message Testing",{"type":43,"tag":52,"props":886,"children":887},{},[888],{"type":49,"value":889},"All improved error messages should have corresponding tests:",{"type":43,"tag":65,"props":891,"children":893},{"className":138,"code":892,"language":140,"meta":74,"style":74},"func TestErrorMessageQuality(t *testing.T) {\n    err := validateSomething(invalidInput)\n    require.Error(t, err)\n    \n    \u002F\u002F Error should explain what's wrong\n    assert.Contains(t, err.Error(), \"invalid\")\n    \n    \u002F\u002F Error should include expected format or values\n    assert.Contains(t, err.Error(), \"Expected\")\n    \n    \u002F\u002F Error should include example\n    assert.Contains(t, err.Error(), \"Example:\")\n}\n",[894],{"type":43,"tag":72,"props":895,"children":896},{"__ignoreMap":74},[897,905,913,921,929,937,946,954,962,971,979,988,997],{"type":43,"tag":146,"props":898,"children":899},{"class":148,"line":149},[900],{"type":43,"tag":146,"props":901,"children":902},{},[903],{"type":49,"value":904},"func TestErrorMessageQuality(t *testing.T) {\n",{"type":43,"tag":146,"props":906,"children":907},{"class":148,"line":788},[908],{"type":43,"tag":146,"props":909,"children":910},{},[911],{"type":49,"value":912},"    err := validateSomething(invalidInput)\n",{"type":43,"tag":146,"props":914,"children":915},{"class":148,"line":30},[916],{"type":43,"tag":146,"props":917,"children":918},{},[919],{"type":49,"value":920},"    require.Error(t, err)\n",{"type":43,"tag":146,"props":922,"children":923},{"class":148,"line":806},[924],{"type":43,"tag":146,"props":925,"children":926},{},[927],{"type":49,"value":928},"    \n",{"type":43,"tag":146,"props":930,"children":931},{"class":148,"line":815},[932],{"type":43,"tag":146,"props":933,"children":934},{},[935],{"type":49,"value":936},"    \u002F\u002F Error should explain what's wrong\n",{"type":43,"tag":146,"props":938,"children":940},{"class":148,"line":939},6,[941],{"type":43,"tag":146,"props":942,"children":943},{},[944],{"type":49,"value":945},"    assert.Contains(t, err.Error(), \"invalid\")\n",{"type":43,"tag":146,"props":947,"children":949},{"class":148,"line":948},7,[950],{"type":43,"tag":146,"props":951,"children":952},{},[953],{"type":49,"value":928},{"type":43,"tag":146,"props":955,"children":956},{"class":148,"line":26},[957],{"type":43,"tag":146,"props":958,"children":959},{},[960],{"type":49,"value":961},"    \u002F\u002F Error should include expected format or values\n",{"type":43,"tag":146,"props":963,"children":965},{"class":148,"line":964},9,[966],{"type":43,"tag":146,"props":967,"children":968},{},[969],{"type":49,"value":970},"    assert.Contains(t, err.Error(), \"Expected\")\n",{"type":43,"tag":146,"props":972,"children":974},{"class":148,"line":973},10,[975],{"type":43,"tag":146,"props":976,"children":977},{},[978],{"type":49,"value":928},{"type":43,"tag":146,"props":980,"children":982},{"class":148,"line":981},11,[983],{"type":43,"tag":146,"props":984,"children":985},{},[986],{"type":49,"value":987},"    \u002F\u002F Error should include example\n",{"type":43,"tag":146,"props":989,"children":991},{"class":148,"line":990},12,[992],{"type":43,"tag":146,"props":993,"children":994},{},[995],{"type":49,"value":996},"    assert.Contains(t, err.Error(), \"Example:\")\n",{"type":43,"tag":146,"props":998,"children":1000},{"class":148,"line":999},13,[1001],{"type":43,"tag":146,"props":1002,"children":1003},{},[1004],{"type":49,"value":1005},"}\n",{"type":43,"tag":58,"props":1007,"children":1009},{"id":1008},"migration-strategy",[1010],{"type":49,"value":1011},"Migration Strategy",{"type":43,"tag":52,"props":1013,"children":1014},{},[1015],{"type":49,"value":1016},"When improving existing error messages:",{"type":43,"tag":83,"props":1018,"children":1019},{},[1020,1030,1040,1050,1060],{"type":43,"tag":87,"props":1021,"children":1022},{},[1023,1028],{"type":43,"tag":91,"props":1024,"children":1025},{},[1026],{"type":49,"value":1027},"Identify the error",{"type":49,"value":1029}," - Find validation error that lacks clarity",{"type":43,"tag":87,"props":1031,"children":1032},{},[1033,1038],{"type":43,"tag":91,"props":1034,"children":1035},{},[1036],{"type":49,"value":1037},"Analyze context",{"type":49,"value":1039}," - Understand what's being validated",{"type":43,"tag":87,"props":1041,"children":1042},{},[1043,1048],{"type":43,"tag":91,"props":1044,"children":1045},{},[1046],{"type":49,"value":1047},"Apply template",{"type":49,"value":1049}," - Add what's wrong + expected + example",{"type":43,"tag":87,"props":1051,"children":1052},{},[1053,1058],{"type":43,"tag":91,"props":1054,"children":1055},{},[1056],{"type":49,"value":1057},"Add tests",{"type":49,"value":1059}," - Verify error message content",{"type":43,"tag":87,"props":1061,"children":1062},{},[1063,1068],{"type":43,"tag":91,"props":1064,"children":1065},{},[1066],{"type":49,"value":1067},"Update comments",{"type":49,"value":1069}," - Document the validation logic",{"type":43,"tag":58,"props":1071,"children":1073},{"id":1072},"examples-by-category",[1074],{"type":49,"value":1075},"Examples by Category",{"type":43,"tag":130,"props":1077,"children":1079},{"id":1078},"format-validation",[1080],{"type":49,"value":1081},"Format Validation",{"type":43,"tag":65,"props":1083,"children":1085},{"className":138,"code":1084,"language":140,"meta":74,"style":74},"\u002F\u002F Time deltas\nfmt.Errorf(\"invalid time delta format: +%s. Expected format like +25h, +3d, +1w, +1mo, +1d12h30m\", input)\n\n\u002F\u002F Dates\nfmt.Errorf(\"invalid date format: %s. Expected: YYYY-MM-DD or relative like -1w. Example: 2024-01-15 or -7d\", input)\n\n\u002F\u002F URLs\nfmt.Errorf(\"invalid URL format: %s. Expected: https:\u002F\u002F URL. Example: https:\u002F\u002Fapi.example.com\", input)\n",[1086],{"type":43,"tag":72,"props":1087,"children":1088},{"__ignoreMap":74},[1089,1097,1105,1112,1120,1128,1135,1143],{"type":43,"tag":146,"props":1090,"children":1091},{"class":148,"line":149},[1092],{"type":43,"tag":146,"props":1093,"children":1094},{},[1095],{"type":49,"value":1096},"\u002F\u002F Time deltas\n",{"type":43,"tag":146,"props":1098,"children":1099},{"class":148,"line":788},[1100],{"type":43,"tag":146,"props":1101,"children":1102},{},[1103],{"type":49,"value":1104},"fmt.Errorf(\"invalid time delta format: +%s. Expected format like +25h, +3d, +1w, +1mo, +1d12h30m\", input)\n",{"type":43,"tag":146,"props":1106,"children":1107},{"class":148,"line":30},[1108],{"type":43,"tag":146,"props":1109,"children":1110},{"emptyLinePlaceholder":800},[1111],{"type":49,"value":803},{"type":43,"tag":146,"props":1113,"children":1114},{"class":148,"line":806},[1115],{"type":43,"tag":146,"props":1116,"children":1117},{},[1118],{"type":49,"value":1119},"\u002F\u002F Dates\n",{"type":43,"tag":146,"props":1121,"children":1122},{"class":148,"line":815},[1123],{"type":43,"tag":146,"props":1124,"children":1125},{},[1126],{"type":49,"value":1127},"fmt.Errorf(\"invalid date format: %s. Expected: YYYY-MM-DD or relative like -1w. Example: 2024-01-15 or -7d\", input)\n",{"type":43,"tag":146,"props":1129,"children":1130},{"class":148,"line":939},[1131],{"type":43,"tag":146,"props":1132,"children":1133},{"emptyLinePlaceholder":800},[1134],{"type":49,"value":803},{"type":43,"tag":146,"props":1136,"children":1137},{"class":148,"line":948},[1138],{"type":43,"tag":146,"props":1139,"children":1140},{},[1141],{"type":49,"value":1142},"\u002F\u002F URLs\n",{"type":43,"tag":146,"props":1144,"children":1145},{"class":148,"line":26},[1146],{"type":43,"tag":146,"props":1147,"children":1148},{},[1149],{"type":49,"value":1150},"fmt.Errorf(\"invalid URL format: %s. Expected: https:\u002F\u002F URL. Example: https:\u002F\u002Fapi.example.com\", input)\n",{"type":43,"tag":130,"props":1152,"children":1154},{"id":1153},"type-validation",[1155],{"type":49,"value":1156},"Type Validation",{"type":43,"tag":65,"props":1158,"children":1160},{"className":138,"code":1159,"language":140,"meta":74,"style":74},"\u002F\u002F Boolean expected\nfmt.Errorf(\"read-only must be a boolean, got %T. Example: read-only: true\", value)\n\n\u002F\u002F String expected\nfmt.Errorf(\"workflow name must be a string, got %T. Example: name: \\\"my-workflow\\\"\", value)\n\n\u002F\u002F Object expected\nfmt.Errorf(\"permissions must be an object, got %T. Example: permissions:\\n  contents: read\", value)\n",[1161],{"type":43,"tag":72,"props":1162,"children":1163},{"__ignoreMap":74},[1164,1172,1180,1187,1195,1203,1210,1218],{"type":43,"tag":146,"props":1165,"children":1166},{"class":148,"line":149},[1167],{"type":43,"tag":146,"props":1168,"children":1169},{},[1170],{"type":49,"value":1171},"\u002F\u002F Boolean expected\n",{"type":43,"tag":146,"props":1173,"children":1174},{"class":148,"line":788},[1175],{"type":43,"tag":146,"props":1176,"children":1177},{},[1178],{"type":49,"value":1179},"fmt.Errorf(\"read-only must be a boolean, got %T. Example: read-only: true\", value)\n",{"type":43,"tag":146,"props":1181,"children":1182},{"class":148,"line":30},[1183],{"type":43,"tag":146,"props":1184,"children":1185},{"emptyLinePlaceholder":800},[1186],{"type":49,"value":803},{"type":43,"tag":146,"props":1188,"children":1189},{"class":148,"line":806},[1190],{"type":43,"tag":146,"props":1191,"children":1192},{},[1193],{"type":49,"value":1194},"\u002F\u002F String expected\n",{"type":43,"tag":146,"props":1196,"children":1197},{"class":148,"line":815},[1198],{"type":43,"tag":146,"props":1199,"children":1200},{},[1201],{"type":49,"value":1202},"fmt.Errorf(\"workflow name must be a string, got %T. Example: name: \\\"my-workflow\\\"\", value)\n",{"type":43,"tag":146,"props":1204,"children":1205},{"class":148,"line":939},[1206],{"type":43,"tag":146,"props":1207,"children":1208},{"emptyLinePlaceholder":800},[1209],{"type":49,"value":803},{"type":43,"tag":146,"props":1211,"children":1212},{"class":148,"line":948},[1213],{"type":43,"tag":146,"props":1214,"children":1215},{},[1216],{"type":49,"value":1217},"\u002F\u002F Object expected\n",{"type":43,"tag":146,"props":1219,"children":1220},{"class":148,"line":26},[1221],{"type":43,"tag":146,"props":1222,"children":1223},{},[1224],{"type":49,"value":1225},"fmt.Errorf(\"permissions must be an object, got %T. Example: permissions:\\n  contents: read\", value)\n",{"type":43,"tag":130,"props":1227,"children":1229},{"id":1228},"choiceenum-validation",[1230],{"type":49,"value":1231},"Choice\u002FEnum Validation",{"type":43,"tag":65,"props":1233,"children":1235},{"className":138,"code":1234,"language":140,"meta":74,"style":74},"\u002F\u002F Engine selection\nfmt.Errorf(\"invalid engine: %s. Valid engines: copilot, claude, codex, custom. Example: engine: copilot\", id)\n\n\u002F\u002F Permission levels\nfmt.Errorf(\"invalid permission level: %s. Valid levels: read, write, none. Example: contents: read\", level)\n\n\u002F\u002F Tool modes\nfmt.Errorf(\"invalid mode: %s. Valid modes: local, remote. Example: mode: \\\"remote\\\"\", mode)\n",[1236],{"type":43,"tag":72,"props":1237,"children":1238},{"__ignoreMap":74},[1239,1247,1255,1262,1270,1278,1285,1293],{"type":43,"tag":146,"props":1240,"children":1241},{"class":148,"line":149},[1242],{"type":43,"tag":146,"props":1243,"children":1244},{},[1245],{"type":49,"value":1246},"\u002F\u002F Engine selection\n",{"type":43,"tag":146,"props":1248,"children":1249},{"class":148,"line":788},[1250],{"type":43,"tag":146,"props":1251,"children":1252},{},[1253],{"type":49,"value":1254},"fmt.Errorf(\"invalid engine: %s. Valid engines: copilot, claude, codex, custom. Example: engine: copilot\", id)\n",{"type":43,"tag":146,"props":1256,"children":1257},{"class":148,"line":30},[1258],{"type":43,"tag":146,"props":1259,"children":1260},{"emptyLinePlaceholder":800},[1261],{"type":49,"value":803},{"type":43,"tag":146,"props":1263,"children":1264},{"class":148,"line":806},[1265],{"type":43,"tag":146,"props":1266,"children":1267},{},[1268],{"type":49,"value":1269},"\u002F\u002F Permission levels\n",{"type":43,"tag":146,"props":1271,"children":1272},{"class":148,"line":815},[1273],{"type":43,"tag":146,"props":1274,"children":1275},{},[1276],{"type":49,"value":1277},"fmt.Errorf(\"invalid permission level: %s. Valid levels: read, write, none. Example: contents: read\", level)\n",{"type":43,"tag":146,"props":1279,"children":1280},{"class":148,"line":939},[1281],{"type":43,"tag":146,"props":1282,"children":1283},{"emptyLinePlaceholder":800},[1284],{"type":49,"value":803},{"type":43,"tag":146,"props":1286,"children":1287},{"class":148,"line":948},[1288],{"type":43,"tag":146,"props":1289,"children":1290},{},[1291],{"type":49,"value":1292},"\u002F\u002F Tool modes\n",{"type":43,"tag":146,"props":1294,"children":1295},{"class":148,"line":26},[1296],{"type":43,"tag":146,"props":1297,"children":1298},{},[1299],{"type":49,"value":1300},"fmt.Errorf(\"invalid mode: %s. Valid modes: local, remote. Example: mode: \\\"remote\\\"\", mode)\n",{"type":43,"tag":130,"props":1302,"children":1304},{"id":1303},"configuration-validation",[1305],{"type":49,"value":1306},"Configuration Validation",{"type":43,"tag":65,"props":1308,"children":1310},{"className":138,"code":1309,"language":140,"meta":74,"style":74},"\u002F\u002F Missing required field\nfmt.Errorf(\"tool '%s' missing required 'command' field. Example:\\ntools:\\n  %s:\\n    command: \\\"node server.js\\\"\", name, name)\n\n\u002F\u002F Mutually exclusive fields\nfmt.Errorf(\"cannot specify both 'command' and 'container'. Choose one. Example: command: \\\"node server.js\\\"\")\n\n\u002F\u002F Invalid combination\nfmt.Errorf(\"http MCP servers cannot use 'container' field. Example:\\ntools:\\n  my-http:\\n    type: http\\n    url: \\\"https:\u002F\u002Fapi.example.com\\\"\")\n",[1311],{"type":43,"tag":72,"props":1312,"children":1313},{"__ignoreMap":74},[1314,1322,1330,1337,1345,1353,1360,1368],{"type":43,"tag":146,"props":1315,"children":1316},{"class":148,"line":149},[1317],{"type":43,"tag":146,"props":1318,"children":1319},{},[1320],{"type":49,"value":1321},"\u002F\u002F Missing required field\n",{"type":43,"tag":146,"props":1323,"children":1324},{"class":148,"line":788},[1325],{"type":43,"tag":146,"props":1326,"children":1327},{},[1328],{"type":49,"value":1329},"fmt.Errorf(\"tool '%s' missing required 'command' field. Example:\\ntools:\\n  %s:\\n    command: \\\"node server.js\\\"\", name, name)\n",{"type":43,"tag":146,"props":1331,"children":1332},{"class":148,"line":30},[1333],{"type":43,"tag":146,"props":1334,"children":1335},{"emptyLinePlaceholder":800},[1336],{"type":49,"value":803},{"type":43,"tag":146,"props":1338,"children":1339},{"class":148,"line":806},[1340],{"type":43,"tag":146,"props":1341,"children":1342},{},[1343],{"type":49,"value":1344},"\u002F\u002F Mutually exclusive fields\n",{"type":43,"tag":146,"props":1346,"children":1347},{"class":148,"line":815},[1348],{"type":43,"tag":146,"props":1349,"children":1350},{},[1351],{"type":49,"value":1352},"fmt.Errorf(\"cannot specify both 'command' and 'container'. Choose one. Example: command: \\\"node server.js\\\"\")\n",{"type":43,"tag":146,"props":1354,"children":1355},{"class":148,"line":939},[1356],{"type":43,"tag":146,"props":1357,"children":1358},{"emptyLinePlaceholder":800},[1359],{"type":49,"value":803},{"type":43,"tag":146,"props":1361,"children":1362},{"class":148,"line":948},[1363],{"type":43,"tag":146,"props":1364,"children":1365},{},[1366],{"type":49,"value":1367},"\u002F\u002F Invalid combination\n",{"type":43,"tag":146,"props":1369,"children":1370},{"class":148,"line":26},[1371],{"type":43,"tag":146,"props":1372,"children":1373},{},[1374],{"type":49,"value":1375},"fmt.Errorf(\"http MCP servers cannot use 'container' field. Example:\\ntools:\\n  my-http:\\n    type: http\\n    url: \\\"https:\u002F\u002Fapi.example.com\\\"\")\n",{"type":43,"tag":58,"props":1377,"children":1379},{"id":1378},"references",[1380],{"type":49,"value":1381},"References",{"type":43,"tag":166,"props":1383,"children":1384},{},[1385,1401,1411],{"type":43,"tag":87,"props":1386,"children":1387},{},[1388,1393,1395],{"type":43,"tag":91,"props":1389,"children":1390},{},[1391],{"type":49,"value":1392},"Excellent example to follow",{"type":49,"value":1394},": ",{"type":43,"tag":72,"props":1396,"children":1398},{"className":1397},[],[1399],{"type":49,"value":1400},"pkg\u002Fworkflow\u002Ftime_delta.go",{"type":43,"tag":87,"props":1402,"children":1403},{},[1404,1409],{"type":43,"tag":91,"props":1405,"children":1406},{},[1407],{"type":49,"value":1408},"Pattern inspiration",{"type":49,"value":1410},": Go standard library error messages",{"type":43,"tag":87,"props":1412,"children":1413},{},[1414,1419,1420],{"type":43,"tag":91,"props":1415,"children":1416},{},[1417],{"type":49,"value":1418},"Testing examples",{"type":49,"value":1394},{"type":43,"tag":72,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":49,"value":1425},"pkg\u002Fworkflow\u002F*_test.go",{"type":43,"tag":58,"props":1427,"children":1429},{"id":1428},"tools",[1430],{"type":49,"value":1431},"Tools",{"type":43,"tag":52,"props":1433,"children":1434},{},[1435],{"type":49,"value":1436},"When writing error messages, consider:",{"type":43,"tag":166,"props":1438,"children":1439},{},[1440,1445,1450,1455],{"type":43,"tag":87,"props":1441,"children":1442},{},[1443],{"type":49,"value":1444},"The user's perspective (what do they need to fix it?)",{"type":43,"tag":87,"props":1446,"children":1447},{},[1448],{"type":49,"value":1449},"The context (where in the workflow is the error?)",{"type":43,"tag":87,"props":1451,"children":1452},{},[1453],{"type":49,"value":1454},"The documentation (should we reference specific docs?)",{"type":43,"tag":87,"props":1456,"children":1457},{},[1458],{"type":49,"value":1459},"The complexity (is multi-line example needed?)",{"type":43,"tag":1461,"props":1462,"children":1463},"style",{},[1464],{"type":49,"value":1465},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1467,"total":1646},[1468,1492,1510,1526,1540,1556,1570,1582,1594,1606,1622,1634],{"slug":1469,"name":1469,"fn":1470,"description":1471,"org":1472,"tags":1473,"stars":1489,"repoUrl":1490,"updatedAt":1491},"qdrant-horizontal-scaling","guide Qdrant horizontal scaling decisions","Diagnoses and guides Qdrant horizontal scaling decisions. Use when someone asks 'vertical or horizontal?', 'how many nodes?', 'how many shards?', 'how to add nodes', 'resharding', 'data doesn't fit', or 'need more capacity'. Also use when data growth outpaces current deployment.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1474,1477,1480,1483,1486],{"name":1475,"slug":1476,"type":13},"AI Infrastructure","ai-infrastructure",{"name":1478,"slug":1479,"type":13},"Architecture","architecture",{"name":1481,"slug":1482,"type":13},"Capacity Planning","capacity-planning",{"name":1484,"slug":1485,"type":13},"Database","database",{"name":1487,"slug":1488,"type":13},"Qdrant","qdrant",36978,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot","2026-04-18T04:46:16.349561",{"slug":1493,"name":1493,"fn":1494,"description":1495,"org":1496,"tags":1497,"stars":1489,"repoUrl":1490,"updatedAt":1509},"qdrant-indexing-performance-optimization","optimize Qdrant indexing performance","Diagnoses and fixes slow Qdrant indexing and data ingestion. Use when someone reports 'uploads are slow', 'indexing takes forever', 'optimizer is stuck', 'HNSW build time too long', or 'data uploaded but search is bad'. Also use when optimizer status shows errors, segments won't merge, or indexing threshold questions arise.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1498,1501,1502,1505,1508],{"name":1499,"slug":1500,"type":13},"Data Engineering","data-engineering",{"name":1484,"slug":1485,"type":13},{"name":1503,"slug":1504,"type":13},"ETL","etl",{"name":1506,"slug":1507,"type":13},"Performance","performance",{"name":1487,"slug":1488,"type":13},"2026-04-18T04:46:02.766357",{"slug":1511,"name":1511,"fn":1512,"description":1513,"org":1514,"tags":1515,"stars":1489,"repoUrl":1490,"updatedAt":1525},"qdrant-memory-usage-optimization","optimize Qdrant memory usage","Diagnoses and reduces Qdrant memory usage. Use when someone reports 'memory too high', 'RAM keeps growing', 'node crashed', 'out of memory', 'memory leak', or asks 'why is memory usage so high?', 'how to reduce RAM?'. Also use when memory doesn't match calculations, quantization didn't help, or nodes crash during recovery.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1516,1519,1520,1523,1524],{"name":1517,"slug":1518,"type":13},"Cost Optimization","cost-optimization",{"name":1484,"slug":1485,"type":13},{"name":1521,"slug":1522,"type":13},"Observability","observability",{"name":1506,"slug":1507,"type":13},{"name":1487,"slug":1488,"type":13},"2026-04-18T04:46:01.525023",{"slug":1527,"name":1527,"fn":1528,"description":1529,"org":1530,"tags":1531,"stars":1489,"repoUrl":1490,"updatedAt":1539},"qdrant-minimize-latency","minimize Qdrant query latency","Guides Qdrant query latency optimization. Use when someone asks 'search is slow', 'how to reduce latency', 'p99 is too high', 'tail latency', 'single query too slow', 'how to make search faster', or 'latency spikes'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1532,1533,1534,1535,1536],{"name":1478,"slug":1479,"type":13},{"name":1484,"slug":1485,"type":13},{"name":1506,"slug":1507,"type":13},{"name":1487,"slug":1488,"type":13},{"name":1537,"slug":1538,"type":13},"Search","search","2026-04-18T04:46:10.126667",{"slug":1541,"name":1541,"fn":1542,"description":1543,"org":1544,"tags":1545,"stars":1489,"repoUrl":1490,"updatedAt":1555},"qdrant-monitoring-debugging","debug Qdrant production issues with metrics","Diagnoses Qdrant production issues using metrics and observability tools. Use when someone reports 'optimizer stuck', 'indexing too slow', 'memory too high', 'OOM crash', 'queries are slow', 'latency spike', or 'search was fast now it's slow'. Also use when performance degrades without obvious config changes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1546,1549,1552,1553,1554],{"name":1547,"slug":1548,"type":13},"Debugging","debugging",{"name":1550,"slug":1551,"type":13},"Monitoring","monitoring",{"name":1521,"slug":1522,"type":13},{"name":1506,"slug":1507,"type":13},{"name":1487,"slug":1488,"type":13},"2026-04-18T04:46:06.450784",{"slug":1557,"name":1557,"fn":1558,"description":1559,"org":1560,"tags":1561,"stars":1489,"repoUrl":1490,"updatedAt":1569},"qdrant-monitoring-setup","set up Qdrant monitoring and alerting","Guides Qdrant monitoring setup including Prometheus scraping, health probes, Hybrid Cloud metrics, alerting, and log centralization. Use when someone asks 'how to set up monitoring', 'Prometheus config', 'Grafana dashboard', 'health check endpoints', 'how to scrape Hybrid Cloud', 'what alerts to set', 'how to centralize logs', or 'audit logging'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1562,1563,1564,1565,1566],{"name":1475,"slug":1476,"type":13},{"name":1550,"slug":1551,"type":13},{"name":1521,"slug":1522,"type":13},{"name":1487,"slug":1488,"type":13},{"name":1567,"slug":1568,"type":13},"SRE","sre","2026-04-18T04:46:05.217192",{"slug":1571,"name":1571,"fn":1572,"description":1573,"org":1574,"tags":1575,"stars":1489,"repoUrl":1490,"updatedAt":1581},"qdrant-scaling-data-volume","scale Qdrant data volume","Guides Qdrant data volume scaling decisions. Use when someone asks 'data doesn't fit on one node', 'too much data', 'need more storage', 'vertical or horizontal scaling', 'tenant scaling', 'time window rotation', or 'data growth exceeds capacity'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1576,1577,1578,1579,1580],{"name":1475,"slug":1476,"type":13},{"name":1478,"slug":1479,"type":13},{"name":1481,"slug":1482,"type":13},{"name":1484,"slug":1485,"type":13},{"name":1487,"slug":1488,"type":13},"2026-04-18T04:46:07.684464",{"slug":1583,"name":1583,"fn":1584,"description":1585,"org":1586,"tags":1587,"stars":1489,"repoUrl":1490,"updatedAt":1593},"qdrant-scaling-qps","scale Qdrant query throughput","Guides Qdrant query throughput (QPS) scaling. Use when someone asks 'how to increase QPS', 'need more throughput', 'queries per second too low', 'batch search', 'read replicas', or 'how to handle more concurrent queries'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1588,1589,1590,1591,1592],{"name":1475,"slug":1476,"type":13},{"name":1478,"slug":1479,"type":13},{"name":1484,"slug":1485,"type":13},{"name":1506,"slug":1507,"type":13},{"name":1487,"slug":1488,"type":13},"2026-04-18T04:46:08.905219",{"slug":1595,"name":1595,"fn":1596,"description":1597,"org":1598,"tags":1599,"stars":1489,"repoUrl":1490,"updatedAt":1605},"qdrant-scaling-query-volume","scale Qdrant query volume and pagination","Guides Qdrant query volume scaling. Use when someone asks 'query returns too many results', 'scroll performance', 'large limit values', 'paginating search results', 'fetching many vectors', or 'high cardinality results'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1600,1601,1602,1603,1604],{"name":1478,"slug":1479,"type":13},{"name":1484,"slug":1485,"type":13},{"name":1506,"slug":1507,"type":13},{"name":1487,"slug":1488,"type":13},{"name":1537,"slug":1538,"type":13},"2026-04-18T04:46:11.371326",{"slug":1607,"name":1607,"fn":1608,"description":1609,"org":1610,"tags":1611,"stars":1489,"repoUrl":1490,"updatedAt":1621},"qdrant-search-quality-diagnosis","diagnose Qdrant search quality issues","Diagnoses Qdrant search quality issues. Use when someone reports 'results are bad', 'wrong results', 'not relevant results', 'missing matches', 'recall is low', 'approximate search worse than exact', 'which embedding model', or 'quality dropped after quantization'. Also use when search quality degrades without obvious changes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1612,1615,1618,1619,1620],{"name":1613,"slug":1614,"type":13},"Analytics","analytics",{"name":1616,"slug":1617,"type":13},"Data Quality","data-quality",{"name":1547,"slug":1548,"type":13},{"name":1487,"slug":1488,"type":13},{"name":1537,"slug":1538,"type":13},"2026-04-18T04:46:17.579894",{"slug":1623,"name":1623,"fn":1624,"description":1625,"org":1626,"tags":1627,"stars":1489,"repoUrl":1490,"updatedAt":1633},"qdrant-search-speed-optimization","optimize Qdrant search speed","Diagnoses and fixes slow Qdrant search. Use when someone reports 'search is slow', 'high latency', 'queries take too long', 'low QPS', 'throughput too low', 'filtered search is slow', or 'search was fast but now it's slow'. Also use when search performance degrades after config changes or data growth.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1628,1629,1630,1631,1632],{"name":1613,"slug":1614,"type":13},{"name":1484,"slug":1485,"type":13},{"name":1506,"slug":1507,"type":13},{"name":1487,"slug":1488,"type":13},{"name":1537,"slug":1538,"type":13},"2026-04-18T04:46:03.987332",{"slug":1635,"name":1635,"fn":1636,"description":1637,"org":1638,"tags":1639,"stars":1489,"repoUrl":1490,"updatedAt":1645},"qdrant-search-strategies","select optimal Qdrant search strategies","Guides Qdrant search strategy selection. Use when someone asks 'should I use hybrid search?', 'BM25 or sparse vectors?', 'how to rerank?', 'results are not relevant', 'I don't get needed results from my dataset but they're there', 'retrieval quality is not good enough', 'results too similar', 'need diversity', 'MMR', 'relevance feedback', 'recommendation API', 'discovery API', 'ColBERT reranking', or 'missing keyword matches'",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1640,1641,1642,1643,1644],{"name":1475,"slug":1476,"type":13},{"name":1613,"slug":1614,"type":13},{"name":1478,"slug":1479,"type":13},{"name":1487,"slug":1488,"type":13},{"name":1537,"slug":1538,"type":13},"2026-04-18T04:46:18.812306",45,{"items":1648,"total":788},[1649,1662],{"slug":1650,"name":1650,"fn":1651,"description":1652,"org":1653,"tags":1654,"stars":26,"repoUrl":27,"updatedAt":1661},"console-rendering","use Go console rendering system","Instructions for using the struct tag-based console rendering system in Go",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1655,1658,1659],{"name":1656,"slug":1657,"type":13},"CLI","cli",{"name":9,"slug":8,"type":13},{"name":1660,"slug":140,"type":13},"Go","2026-05-07T05:48:46.51738",{"slug":4,"name":4,"fn":5,"description":6,"org":1663,"tags":1664,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1665,1666,1667,1668,1669],{"name":24,"slug":25,"type":13},{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13}]