[
  {
    "id": "clippy::arc_with_non_send_sync",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P1",
    "help": "Use Rc for single-threaded sharing, or make the inner value Send and Sync before sharing it across threads."
  },
  {
    "id": "clippy::await_holding_lock",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P1",
    "help": "Drop the guard before the await point, or use a lock designed to be held across await."
  },
  {
    "id": "clippy::await_holding_refcell_ref",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P1",
    "help": "Copy the borrowed value and drop the borrow before the await point."
  },
  {
    "id": "clippy::dbg_macro",
    "category": "maintainability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Remove dbg! or replace it with intentional logging."
  },
  {
    "id": "clippy::exit",
    "category": "reliability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Return an error to the caller and let the entry point decide the exit status."
  },
  {
    "id": "clippy::expect_used",
    "category": "reliability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Propagate the error with ? or handle the missing value explicitly instead of panicking."
  },
  {
    "id": "clippy::format_collect",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Write into one String with write! or push_str instead of allocating one String per item."
  },
  {
    "id": "clippy::indexing_slicing",
    "category": "reliability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Use get or get_mut and handle the absent element instead of indexing, which panics out of bounds."
  },
  {
    "id": "clippy::large_types_passed_by_value",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Pass the large value by reference to avoid copying it at every call."
  },
  {
    "id": "clippy::manual_memcpy",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Use copy_from_slice or clone_from_slice instead of copying element by element."
  },
  {
    "id": "clippy::mem_forget",
    "category": "reliability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Avoid leaking a value with drop semantics; use an explicit ownership or lifetime strategy."
  },
  {
    "id": "clippy::missing_safety_doc",
    "category": "maintainability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Document in a `# Safety` section the invariants the caller must uphold before calling."
  },
  {
    "id": "clippy::mut_mutex_lock",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Use get_mut when the mutex is already exclusively borrowed; locking it again can deadlock."
  },
  {
    "id": "clippy::non_send_fields_in_send_ty",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P1",
    "help": "Remove the unsafe Send implementation or ensure every field is safe to send between threads."
  },
  {
    "id": "clippy::panic",
    "category": "reliability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Return an error instead of aborting the process on an input the caller can recover from."
  },
  {
    "id": "clippy::panic_in_result_fn",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "A function that already returns Result should report the failure as Err instead of panicking."
  },
  {
    "id": "clippy::permissions_set_readonly_false",
    "category": "security",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P1",
    "help": "Set explicit Unix permission bits instead of clearing readonly on Unix."
  },
  {
    "id": "clippy::print_stderr",
    "category": "maintainability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Write to a caller-provided writer or a logger instead of hard-wiring stderr."
  },
  {
    "id": "clippy::print_stdout",
    "category": "maintainability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Write to a caller-provided writer or a logger instead of hard-wiring stdout."
  },
  {
    "id": "clippy::ptr_arg",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Take &[T] or &str so callers can pass any borrowed slice without owning one first."
  },
  {
    "id": "clippy::rc_buffer",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Share the slice itself with Rc<str> or Rc<[T]> instead of wrapping an owned buffer."
  },
  {
    "id": "clippy::rc_mutex",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Use RefCell inside Rc for single-threaded sharing, or Arc<Mutex<T>> when the value really crosses threads."
  },
  {
    "id": "clippy::redundant_allocation",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Remove the inner allocation; one pointer indirection is enough."
  },
  {
    "id": "clippy::stable_sort_primitive",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Use sort_unstable on primitives; stability carries no meaning and costs an allocation."
  },
  {
    "id": "clippy::string_slice",
    "category": "reliability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Use get on the string range and handle the absent slice; byte indexing panics inside a UTF-8 character."
  },
  {
    "id": "clippy::suspicious_command_arg_space",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Pass each process argument separately instead of embedding spaces in one argument."
  },
  {
    "id": "clippy::todo",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Replace todo! with the intended implementation or remove the reachable placeholder."
  },
  {
    "id": "clippy::too_many_arguments",
    "category": "maintainability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Group the related parameters into a struct so the signature names what it takes."
  },
  {
    "id": "clippy::type_complexity",
    "category": "maintainability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Name the nested type with a type alias or a dedicated struct so signatures say what they carry."
  },
  {
    "id": "clippy::unimplemented",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P1",
    "help": "Implement this code path or remove the reachable placeholder."
  },
  {
    "id": "clippy::unnecessary_to_owned",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Pass the borrowed value directly; the callee never needs the owned copy."
  },
  {
    "id": "clippy::unreachable",
    "category": "correctness",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Make the remaining case explicit or return an error; an unreachable! that is reached aborts the process."
  },
  {
    "id": "clippy::unused_async",
    "category": "maintainability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Remove the async marker, or await the work the function was meant to drive."
  },
  {
    "id": "clippy::unwrap_used",
    "category": "reliability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Propagate the error with ? or provide a default instead of panicking on the absent value."
  },
  {
    "id": "clippy::useless_vec",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Use an array or a slice literal; this value never needs a heap allocation."
  },
  {
    "id": "clippy::vec_init_then_push",
    "category": "performance",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P3",
    "help": "Build the vector with the vec! literal so it is allocated once at its final size."
  },
  {
    "id": "clippy::zombie_processes",
    "category": "reliability",
    "producer": "clippy",
    "default_level": "warn",
    "tier": "P2",
    "help": "Wait on the child process or otherwise reap it before the handle is dropped."
  },
  {
    "id": "rust_doctor::cargo::duplicate_major_versions",
    "category": "dependencies",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P2",
    "help": "Align the requirements so one major version of the crate is resolved; duplicates ship twice and their types do not interoperate."
  },
  {
    "id": "rust_doctor::cargo::missing_lockfile",
    "category": "dependencies",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P2",
    "help": "Commit Cargo.lock next to the manifest so every build of this binary resolves the same dependency versions."
  },
  {
    "id": "rust_doctor::cargo::path_dependency_outside_workspace",
    "category": "dependencies",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P1",
    "help": "Vendor the crate inside the workspace or publish it; a path leaving the workspace only resolves on the author's machine."
  },
  {
    "id": "rust_doctor::cargo::permissive_lint_table",
    "category": "reliability",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P2",
    "help": "Remove the allow entry from [lints] and fix what it silences; a manifest-level allow hides the rule from every scan of this workspace."
  },
  {
    "id": "rust_doctor::cargo::permissive_rustflags",
    "category": "reliability",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P2",
    "help": "Remove the flag from .cargo/config.toml and fix what it silences; the closed list judged here is --cap-lints allow, -A warnings and -C overflow-checks=off, each of which disables a check for every build of this workspace."
  },
  {
    "id": "rust_doctor::cargo::release_debug_symbols",
    "category": "reliability",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P3",
    "help": "Set strip = \"symbols\" or remove debug from [profile.release]: full debug info ships absolute build paths inside the binary. Only [profile.release] itself is judged; profiles inheriting from it are not resolved."
  },
  {
    "id": "rust_doctor::cargo::test_only_dependency",
    "category": "dependencies",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P2",
    "help": "Move the entry to [dev-dependencies]: only the test suite references it, and every consumer of the library compiles it anyway."
  },
  {
    "id": "rust_doctor::cargo::unbounded_registry_dependency",
    "category": "reliability",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P3",
    "help": "Replace the unbounded version requirement with the minimum compatible version intended by the project."
  },
  {
    "id": "rust_doctor::cargo::unchecked_release_overflow",
    "category": "reliability",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P3",
    "help": "Set overflow-checks = true under [profile.release] so integer overflow panics instead of wrapping silently; the measured cost is a few percent on integer-heavy code, which is the tradeoff this finding asks you to decide."
  },
  {
    "id": "rust_doctor::cargo::unpinned_git_dependency",
    "category": "security",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P1",
    "help": "Set rev to the full 40-character commit SHA intended by the project."
  },
  {
    "id": "rust_doctor::cargo::unused_dependency",
    "category": "dependencies",
    "producer": "cargo-health",
    "default_level": "warn",
    "tier": "P2",
    "help": "Remove the entry no source references, or switch this rule off with --rule or rust-doctor.toml for a crate needed for linking alone; references made only through macro expansion or doctests are not seen."
  },
  {
    "id": "rust_doctor::repo::hardcoded_credential",
    "category": "security",
    "producer": "repo",
    "default_level": "warn",
    "tier": "P1",
    "help": "Remove the credential from the source and rotate it; the closed list judged here is AKIA, ghp_, github_pat_, sk-, xoxb- and BEGIN PRIVATE KEY blocks, and the matched value is never republished by the report."
  },
  {
    "id": "rust_doctor::repo::tracked_secret_file",
    "category": "security",
    "producer": "repo",
    "default_level": "warn",
    "tier": "P1",
    "help": "Remove the file from version control with git rm --cached, rotate what it contains, and add its name to .gitignore so it stays out; the report names the path and never its contents."
  },
  {
    "id": "rust_doctor::repo::unignored_build_output",
    "category": "maintainability",
    "producer": "repo",
    "default_level": "warn",
    "tier": "P3",
    "help": "Add the target directory to .gitignore so build artifacts stay out of the repository; the directory judged is Cargo's, including a custom target-dir set in .cargo/config.toml, and any ignore source git honors counts."
  },
  {
    "id": "rust_doctor::source::disabled_tls_verification",
    "category": "security",
    "producer": "source-kernel",
    "default_level": "warn",
    "tier": "P0",
    "help": "Keep TLS verification enabled and configure the required trust roots or server name instead."
  },
  {
    "id": "rust_doctor::source::dynamic_shell_command",
    "category": "security",
    "producer": "source-kernel",
    "default_level": "warn",
    "tier": "P0",
    "help": "Avoid the shell and pass values as separate Command arguments; otherwise apply shell-specific escaping at the trust boundary."
  },
  {
    "id": "rust_doctor::structure::complex_function",
    "category": "maintainability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P3",
    "help": "Split the branching into smaller functions, or flatten it with early returns, so one reading holds the whole path."
  },
  {
    "id": "rust_doctor::structure::crate_level_allow",
    "category": "reliability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P2",
    "help": "Scope the allow to the item that needs it; a file-wide or module-wide exemption, reasoned or not, also silences every future finding in its reach."
  },
  {
    "id": "rust_doctor::structure::duplicate_function_body",
    "category": "maintainability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P3",
    "help": "Keep one definition and call it from the other sites, or make what differs between them a parameter."
  },
  {
    "id": "rust_doctor::structure::near_duplicate_function_body",
    "category": "maintainability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P3",
    "help": "Factor the shared shape into one function and pass what differs, or keep both and record why they must stay apart."
  },
  {
    "id": "rust_doctor::structure::orphan_module_file",
    "category": "maintainability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P3",
    "help": "Declare the file with a mod declaration, or delete it: Cargo compiles no file the module tree does not reach."
  },
  {
    "id": "rust_doctor::structure::oversized_unit",
    "category": "maintainability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P3",
    "help": "Split the file, function, impl block or module along its responsibilities before growth makes the split harder."
  },
  {
    "id": "rust_doctor::structure::stacked_allow_attribute",
    "category": "maintainability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P3",
    "help": "Keep the one exemption the item actually needs and fix what the others hide; attributes produced by cfg_attr are not counted here."
  },
  {
    "id": "rust_doctor::structure::unreasoned_allow_attribute",
    "category": "maintainability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P3",
    "help": "Fix what the lint reports, or keep the allow and state why with reason = \"...\" so the exemption survives review."
  },
  {
    "id": "rust_doctor::structure::unreferenced_feature",
    "category": "maintainability",
    "producer": "structure",
    "default_level": "warn",
    "tier": "P3",
    "help": "Delete the feature nothing reads, or declare the one a cfg already gates; switch this rule off for a stub deliberately kept as published surface."
  }
]
