{"record":{"id":"6291a1495e6dc260","repo":"alibaba/open-code-review","slug":"read-default-rule-file-q-w","errorCode":null,"errorMessage":"read default rule file %q: %w","messagePattern":"read default rule file %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"internal/config/rules/system_rules.go","lineNumber":104,"sourceCode":"\treturn nil\n}\n\n//go:embed system_rules.json rule_docs/*\nvar rulesFS embed.FS\n\n// LoadDefault parses the embedded system_rules.json and resolves rule file references.\nfunc LoadDefault() (*SystemRule, error) {\n\tdata, err := rulesFS.ReadFile(\"system_rules.json\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"read embedded system_rules.json: %w\", err)\n\t}\n\tvar rule SystemRule\n\tif err := json.Unmarshal(data, &rule); err != nil {\n\t\treturn nil, fmt.Errorf(\"unmarshal default system rules: %w\", err)\n\t}\n\tcontent, err := rulesFS.ReadFile(\"rule_docs/\" + rule.DefaultRule)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"read default rule file %q: %w\", rule.DefaultRule, err)\n\t}\n\trule.DefaultRule = strings.TrimRight(string(content), \"\\n\")\n\tfor i := range rule.PathRules {\n\t\tcontent, err := rulesFS.ReadFile(\"rule_docs/\" + rule.PathRules[i].Rule)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"read rule file %q for pattern %q: %w\", rule.PathRules[i].Rule, rule.PathRules[i].Pattern, err)\n\t\t}\n\t\trule.PathRules[i].Rule = strings.TrimRight(string(content), \"\\n\")\n\t}\n\treturn &rule, nil\n}\n\n// loadObjCRule reads the embedded Objective-C rule doc used by the \".m\"\n// content sniff. It is not referenced from system_rules.json's path_rule_map,\n// so it is loaded explicitly rather than through the PathRules loop.\nfunc loadObjCRule() (string, error) {\n\tcontent, err := rulesFS.ReadFile(\"rule_docs/objc.md\")\n\tif err != nil {","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/alibaba/open-code-review/blob/5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f/internal/config/rules/system_rules.go#L86-L122","documentation":"After parsing system_rules.json, LoadDefault reads rule_docs/<default_rule> from the embedded FS to inline the default rule text. This error wraps that ReadFile failure: the file named by default_rule is not present under rule_docs/.","triggerScenarios":"default_rule in system_rules.json names a file that doesn't exist in rule_docs/ — wrong filename, missing extension, or the doc was deleted/renamed without updating system_rules.json.","commonSituations":"Renaming a rule doc (e.g. general.md → default.md) without updating default_rule; typo like 'Default.md' vs 'default.md' (embed FS is case-sensitive); the doc was never committed.","solutions":["Compare default_rule in system_rules.json against files in internal/config/rules/rule_docs/ and fix the name (exact, case-sensitive match)","If the doc is genuinely missing, restore it (git checkout) or add it under rule_docs/","Remember the //go:embed rule_docs/* pattern requires the file to exist in the package directory"],"exampleFix":"// before (system_rules.json)\n{\"default_rule\": \"genral.md\"}\n// after\n{\"default_rule\": \"general.md\"}","handlingStrategy":"validation","validationCode":"var probe struct{ DefaultRule string `json:\"default_rule\"` }\nif err := json.Unmarshal(systemRulesJSON, &probe); err != nil { return err }\nif _, err := fs.Stat(docsFS, \"rule_docs/\"+probe.DefaultRule); err != nil {\n\treturn fmt.Errorf(\"default_rule %q not found in rule_docs/: %v\", probe.DefaultRule, err)\n}","typeGuard":null,"tryCatchPattern":"rule, err := rules.LoadDefault()\nif err != nil {\n\tif strings.Contains(err.Error(), \"read default rule file\") {\n\t\tlog.Fatalf(\"default_rule points to a missing doc: %v — fix system_rules.json or restore the file\", err)\n\t}\n\treturn err\n}","preventionTips":["Keep default_rule in sync whenever renaming files under rule_docs/","Match filenames exactly and case-sensitively (embed FS is case-sensitive)","Add a CI check that every filename referenced by system_rules.json exists in rule_docs/"],"tags":["embed","config","missing-file"],"backgroundTag":"embedded-asset-missing","analyzedSha":"5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f","analyzedAt":"2026-09-02T02:08:09.116Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}