{"record":{"id":"1cf93f8912c6a311","repo":"alibaba/open-code-review","slug":"resolver-does-not-support-detail-inspection","errorCode":null,"errorMessage":"resolver does not support detail inspection","messagePattern":"resolver does not support detail inspection","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/opencodereview/rules_cmd.go","lineNumber":58,"sourceCode":"\taddRepoFlag(rulesCheckCmd, &rulesCheckRepoDir)\n\trulesCheckCmd.Flags().StringVar(&rulesCheckRulePath, \"rule\", \"\", \"path to a custom rule JSON file\")\n\trulesCmd.AddCommand(rulesCheckCmd)\n}\n\nfunc runRulesCheck(filePath string) error {\n\tresolvedRepo, err := resolveRepoDir(rulesCheckRepoDir)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tresolver, _, err := rules.NewResolver(resolvedRepo, rulesCheckRulePath, rules.ResolverOptions{})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"load rules: %w\", err)\n\t}\n\n\tdr, ok := resolver.(rules.DetailResolver)\n\tif !ok {\n\t\treturn fmt.Errorf(\"resolver does not support detail inspection\")\n\t}\n\n\tdetail := dr.ResolveDetail(filePath)\n\n\tsourceLabel := map[string]string{\n\t\t\"custom\":  \"Custom (--rule)\",\n\t\t\"project\": \"Project (.opencodereview/rule.json)\",\n\t\t\"global\":  \"Global (~/.opencodereview/rule.json)\",\n\t\t\"system\":  \"System built-in\",\n\t}\n\n\tfmt.Printf(\"File: %s\\n\", filePath)\n\tfmt.Printf(\"Source: %s\\n\", sourceLabel[detail.Source])\n\tfmt.Printf(\"Pattern: %s\\n\", detail.Pattern)\n\tif detail.SniffedAs != \"\" {\n\t\tfmt.Printf(\"Note:    rule selected by file content (%s), not by path alone\\n\", detail.SniffedAs)\n\t}\n\tfmt.Println(\"Rule:\")","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/alibaba/open-code-review/blob/5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f/cmd/opencodereview/rules_cmd.go#L40-L76","documentation":"After loading, runRulesCheck asserts the resolver implements the rules.DetailResolver interface needed to report which rule matched a path and why. If the concrete resolver lacks detail inspection, this error is thrown. It indicates a build/config combination where the resolver implementation cannot answer the `rules check` query.","triggerScenarios":"`ocr rules check` when rules.NewResolver returns a resolver type that does not implement DetailResolver — e.g. an older/alternative resolver built by a mismatched build or stubbed GitRunner/test configuration.","commonSituations":"Mixed-version binary after an incomplete build; a custom resolver registered by configuration or code that predates the DetailResolver interface.","solutions":["Rebuild the CLI from a clean checkout (`make build`) so resolver and command versions match.","Upgrade to a release where the default resolver implements DetailResolver.","If embedding the rules package, make your resolver implement the DetailResolver interface (ResolveDetail method)."],"exampleFix":"// before\ntype myResolver struct{}            // no ResolveDetail\n// after\ntype myResolver struct{}\nfunc (r *myResolver) ResolveDetail(path string) rules.Detail { /* ... */ }","handlingStrategy":"type-guard","validationCode":"resolver, _, err := rules.NewResolver(repo, rulePath, rules.ResolverOptions{})\nif err != nil { return err }\nif _, ok := resolver.(rules.DetailResolver); !ok {\n    return errors.New(\"this build's resolver cannot show rule details; upgrade ocr\")\n}","typeGuard":"dr, ok := resolver.(rules.DetailResolver)\nif !ok {\n    return fmt.Errorf(\"resolver does not support detail inspection\")\n}\n// dr is now narrowed to rules.DetailResolver","tryCatchPattern":"if err := runRulesCheck(path); err != nil {\n    if strings.Contains(err.Error(), \"detail inspection\") {\n        // fall back to plain rule resolution without detail output\n    }\n    return err\n}","preventionTips":["Rebuild from a clean checkout after pulling changes.","Keep custom resolver implementations in sync with the rules package API.","Pin a release version of ocr rather than mixing build artifacts."],"tags":["rules","interface","internal"],"backgroundTag":"resolver-missing-interface","analyzedSha":"5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f","analyzedAt":"2026-09-02T02:08:09.116Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}