{
  "batch": "Full Codebase Sweep",
  "batch_index": 6,
  "assessments": {
    "cross_module_architecture": 74.0,
    "error_consistency": 68.0,
    "abstraction_fitness": 62.0,
    "test_strategy": 55.0,
    "design_coherence": 64.0
  },
  "dimension_notes": {
    "cross_module_architecture": {
      "evidence": [
        "`cmd/root.go` relies on blank import `_ \"github.com/yourorg/devour/internal/scraper/external\"` to activate runtime registration side effects.",
        "`internal/scraper/external/register.go` mutates global scraper registry in `init()` for all language scrapers.",
        "`internal/scraper/registry_simple.go` uses global mutable registry (`globalRegistry`) shared process-wide, increasing hidden coupling and order sensitivity."
      ],
      "impact_scope": "subsystem",
      "fix_scope": "architectural_change",
      "confidence": "high"
    },
    "error_consistency": {
      "evidence": [
        "`cmd/root.go` and `cmd/scorecard.go` terminate with `os.Exit`, while most command flows return wrapped errors.",
        "`internal/quality/plugins/go/plugin.go` panics during plugin registration (`panic(fmt.Sprintf(...))`) instead of surfacing an error contract.",
        "`cleanup_unused.go` uses `log.Fatal` and mixed logging/exit style unlike the rest of the codebase's `fmt.Errorf(...%w...)` propagation."
      ],
      "impact_scope": "codebase",
      "fix_scope": "multi_file_refactor",
      "confidence": "high"
    },
    "abstraction_fitness": {
      "evidence": [
        "Language-specific scraper implementations (`internal/scraper/external/godocs.go`, `internal/scraper/external/rustdocs.go`, `internal/scraper/external/reactdocs.go`, and peers) repeat near-identical HTTP fetch/hash/error scaffolding with only parser/document mapping differences.",
        "`internal/scraper/external/types.go` is a thin alias layer over `internal/scraper` types and does not enforce additional policy or invariants.",
        "High repeated constructor/scrape boilerplate across external scrapers indicates abstraction cost is paid repeatedly without shared leverage."
      ],
      "impact_scope": "subsystem",
      "fix_scope": "architectural_change",
      "confidence": "high",
      "sub_axes": {
        "abstraction_leverage": 58.0,
        "indirection_cost": 72.0,
        "interface_honesty": 70.0
      }
    },
    "test_strategy": {
      "evidence": [
        "Critical runtime surfaces have no direct tests: `internal/server/server.go`, `pkg/client/client.go`, `internal/vector/store.go`, `internal/search/engine.go`, `internal/indexer/indexer.go`.",
        "`pkg/client/client.go` has TODO stubs returning `nil, nil` for `Query` and `Status`, but there are no tests asserting failure behavior or contract correctness.",
        "`internal/server/server.go` Start methods are TODO/no-op `nil` returns and remain unvalidated by tests, creating false-green behavior for unimplemented paths."
      ],
      "impact_scope": "codebase",
      "fix_scope": "multi_file_refactor",
      "confidence": "high"
    },
    "design_coherence": {
      "evidence": [
        "`cmd/quality.go` (695 LOC) mixes CLI wiring, scan orchestration, status persistence, scoring output, resolution updates, fixer execution, and review import/export in one file.",
        "`cmd/scrape.go` (444 LOC) combines source parsing, source-type inference, profile heuristics, scrape orchestration, persistence, and source-state hashing.",
        "These large command files show recurring multi-responsibility patterns rather than cohesive command/use-case units."
      ],
      "impact_scope": "module",
      "fix_scope": "multi_file_refactor",
      "confidence": "high"
    }
  },
  "findings": [
    {
      "dimension": "cross_module_architecture",
      "identifier": "init_side_effect_registration_coupling",
      "summary": "Scraper registration depends on import-time side effects and global mutable registry state.",
      "related_files": [
        "cmd/root.go",
        "internal/scraper/external/register.go",
        "internal/scraper/registry_simple.go"
      ],
      "evidence": [
        "Blank import in root command triggers registration implicitly rather than explicit bootstrap wiring.",
        "Registration happens in `init()` and mutates shared global registry."
      ],
      "suggestion": "Replace import-time registration with explicit bootstrap registration (e.g., `RegisterExternalScrapers()` called from startup), and pass registry instances through constructors to remove hidden global coupling.",
      "confidence": "high",
      "impact_scope": "subsystem",
      "fix_scope": "architectural_change"
    },
    {
      "dimension": "error_consistency",
      "identifier": "mixed_process_termination_and_error_propagation",
      "summary": "Error handling mixes panic/log.Fatal/os.Exit with returned errors across adjacent layers.",
      "related_files": [
        "cmd/root.go",
        "cmd/scorecard.go",
        "internal/quality/plugins/go/plugin.go",
        "cleanup_unused.go"
      ],
      "evidence": [
        "`Execute()` exits process directly; scorecard helper exits inside utility flow; plugin registration panics on failure.",
        "Most other command paths return wrapped errors, creating inconsistent failure semantics."
      ],
      "suggestion": "Standardize on returning errors from library/command internals and only perform process exit in one top-level entrypoint; replace panic/log.Fatal in shared code with typed/wrapped errors.",
      "confidence": "high",
      "impact_scope": "codebase",
      "fix_scope": "multi_file_refactor"
    },
    {
      "dimension": "abstraction_fitness",
      "identifier": "external_scraper_boilerplate_without_shared_base",
      "summary": "External scraper implementations duplicate fetch/hash/error/document plumbing instead of sharing a base abstraction.",
      "related_files": [
        "internal/scraper/external/godocs.go",
        "internal/scraper/external/rustdocs.go",
        "internal/scraper/external/reactdocs.go",
        "internal/scraper/external/nuxtdocs.go",
        "internal/scraper/external/cloudflaredocs.go",
        "internal/scraper/external/types.go"
      ],
      "evidence": [
        "Each scraper repeats `fetchPage`, status code checks, hash generation, and near-identical scrape control flow.",
        "Alias-only types file adds indirection without behavior."
      ],
      "suggestion": "Introduce a shared external-scraper base/helper for HTTP fetch, retries, hashing, and common error mapping; keep only parser-specific extraction and document shaping in each language scraper.",
      "confidence": "high",
      "impact_scope": "subsystem",
      "fix_scope": "architectural_change"
    },
    {
      "dimension": "test_strategy",
      "identifier": "untested_unimplemented_runtime_paths",
      "summary": "Core runtime paths are both under-tested and partially stubbed, leaving high-risk behavior unvalidated.",
      "related_files": [
        "internal/server/server.go",
        "pkg/client/client.go",
        "internal/vector/store.go",
        "internal/search/engine.go",
        "internal/indexer/indexer.go"
      ],
      "evidence": [
        "Server/client/store contain TODO or not-implemented branches without direct tests.",
        "No direct test files exist for several core modules that govern querying, indexing, and serving."
      ],
      "suggestion": "Add table-driven tests for client/server/store/indexer contracts first (error behavior and non-nil results), then implement missing paths behind those tests; prioritize integration tests that exercise scrape->index->query flow.",
      "confidence": "high",
      "impact_scope": "codebase",
      "fix_scope": "multi_file_refactor"
    },
    {
      "dimension": "design_coherence",
      "identifier": "command_files_mix_multiple_responsibilities",
      "summary": "Large CLI command files blend orchestration, domain logic, persistence, and formatting concerns.",
      "related_files": [
        "cmd/quality.go",
        "cmd/scrape.go",
        "cmd/ask.go"
      ],
      "evidence": [
        "`cmd/quality.go` combines scan setup, scoring/status persistence, resolve/fix/review workflows.",
        "`cmd/scrape.go` combines config parsing, source detection/profiling, scrape execution, indexing, and source-state updates.",
        "`cmd/ask.go` includes query derivation, source URL heuristics, ranking, summarization, and output formatting in one command module."
      ],
      "suggestion": "Split command files into focused packages (transport/CLI binding vs service layer vs persistence helpers) and keep Cobra handlers as thin adapters invoking composable use-case functions.",
      "confidence": "high",
      "impact_scope": "module",
      "fix_scope": "multi_file_refactor"
    }
  ]
}