{ "batch": "Full Codebase Sweep", "batch_index": 6, "assessments": { "cross_module_architecture": 72.0, "error_consistency": 70.0, "abstraction_fitness": 68.0, "test_strategy": 64.0, "design_coherence": 69.0 }, "dimension_notes": { "cross_module_architecture": { "evidence": [ "cmd/serve.go calls command handlers directly (runSync, scrapeOne) and mutates command-level globals (scrapeFormat/scrapeOutput/scrapeAllowEmpty and syncForce/syncRebuild/syncSource) before invoking them, coupling RPC transport to CLI flag state.", "Source-type detection logic exists in both internal/scraper/scraper.go:92 (DetectSourceType) and cmd/scrape.go:314 (detectSourceType), creating boundary drift for core classification behavior." ], "impact_scope": "subsystem", "fix_scope": "architectural_change", "confidence": "high" }, "error_consistency": { "evidence": [ "cmd/serve.go suppresses parse and subsystem errors via `_ = json.Unmarshal(...)` and `state, _ := projectstate.LoadSourceState(...)` / `idxStats, _ := engine.EnsureIndexed(...)`, while sibling paths return wrapped errors.", "Startup failure behavior differs across modules: cmd/root.go exits process with os.Exit(1), while internal/quality/plugins/go/plugin.go init() panics on registration failure." ], "impact_scope": "subsystem", "fix_scope": "multi_file_refactor", "confidence": "high" }, "abstraction_fitness": { "evidence": [ "Most external scraper implementations repeat near-identical transport/change-detection scaffolding (`fetchPage`, `DetectChanges`, `generateHash`) across files such as internal/scraper/external/reactdocs.go, tsdocs.go, godocs.go, rustdocs.go, and cloudflaredocs.go.", "This repeated wrapper structure adds maintenance indirection without policy variance (same HTTP GET + user-agent + status check + body read flow)." ], "impact_scope": "subsystem", "fix_scope": "architectural_change", "confidence": "high", "sub_axes": { "abstraction_leverage": 61.0, "indirection_cost": 43.0, "interface_honesty": 74.0 } }, "test_strategy": { "evidence": [ "High-impact command flows lack direct tests: cmd/serve.go, cmd/sync.go, cmd/query.go, cmd/push.go, cmd/verify.go have no file-level tests while they orchestrate indexing/scraping/status behavior.", "Most external scrapers are untested at integration unit level (e.g., internal/scraper/external/{godocs,rustdocs,reactdocs,cloudflaredocs,nuxtdocs,...}.go) even though they include custom parsing-to-document mapping and network error handling." ], "impact_scope": "codebase", "fix_scope": "multi_file_refactor", "confidence": "high" }, "design_coherence": { "evidence": [ "cmd/serve.go:71-210 centralizes multiple unrelated workflows (query/status/scrape/ask/sync) in one switch, with request parsing, domain orchestration, and response formatting mixed in a single function.", "The same function also performs cross-command mutable state choreography (temporarily overriding scrape/sync globals), combining transport logic with command execution mechanics." ], "impact_scope": "module", "fix_scope": "multi_file_refactor", "confidence": "high" } }, "findings": [ { "dimension": "cross_module_architecture", "identifier": "rpc_cli_global_state_coupling", "summary": "RPC handlers mutate CLI global flags to execute workflows across command boundaries.", "related_files": [ "cmd/serve.go", "cmd/scrape.go", "cmd/sync.go" ], "evidence": [ "cmd/serve.go sets scrapeFormat/scrapeOutput/scrapeAllowEmpty before calling scrapeOne and restores afterward.", "cmd/serve.go sets syncForce/syncRebuild/syncSource before calling runSync and restores afterward." ], "suggestion": "Extract scrape/sync/query use-cases into stateless service functions (input structs + return structs), call them from both Cobra commands and RPC handlers, and remove shared mutable command globals from runtime execution paths.", "confidence": "high", "impact_scope": "subsystem", "fix_scope": "architectural_change" }, { "dimension": "error_consistency", "identifier": "silent_error_drops_in_rpc_paths", "summary": "Several RPC paths ignore parse/index/state errors, producing inconsistent failure contracts.", "related_files": [ "cmd/serve.go", "internal/search/engine.go", "internal/projectstate/state.go" ], "evidence": [ "cmd/serve.go ignores JSON unmarshal errors for devour_query/devour_sync (`_ = json.Unmarshal(...)`).", "cmd/serve.go ignores errors from LoadSourceState and EnsureIndexed, yet reads fields from returned values.", "Other command paths generally propagate wrapped errors with `%w`." ], "suggestion": "Treat request decode, source-state load, and index-check failures uniformly: return explicit wrapped errors from each branch and avoid underscore-discarded errors in RPC handlers.", "confidence": "high", "impact_scope": "subsystem", "fix_scope": "single_edit" }, { "dimension": "abstraction_fitness", "identifier": "external_scraper_transport_duplication", "summary": "External scrapers duplicate the same HTTP fetch/hash/change-detection boilerplate.", "related_files": [ "internal/scraper/external/reactdocs.go", "internal/scraper/external/tsdocs.go", "internal/scraper/external/godocs.go", "internal/scraper/external/rustdocs.go", "internal/scraper/external/cloudflaredocs.go" ], "evidence": [ "Each scraper reimplements equivalent `fetchPage` with identical request/header/response-body flow.", "Each scraper reimplements nearly identical `DetectChanges` and `generateHash` logic." ], "suggestion": "Introduce a shared base helper (e.g., `fetchPage`, `contentHash`, `detectChanges`) in internal/scraper/external/types.go or a dedicated internal transport module, then keep per-scraper files focused on parser-to-document mapping.", "confidence": "high", "impact_scope": "subsystem", "fix_scope": "multi_file_refactor" }, { "dimension": "test_strategy", "identifier": "missing_tests_on_orchestration_and_adapters", "summary": "Critical orchestration commands and most external adapters have no direct tests.", "related_files": [ "cmd/serve.go", "cmd/sync.go", "cmd/query.go", "internal/scraper/external/godocs.go", "internal/scraper/external/reactdocs.go" ], "evidence": [ "No *_test.go peers for cmd/serve.go, cmd/sync.go, cmd/query.go despite high-risk orchestration behavior.", "Only one external scraper has direct tests while many adapter implementations contain custom mapping and error-path logic." ], "suggestion": "Add table-driven tests for RPC method branches and error propagation in cmd/serve.go, plus httptest-based adapter contract tests covering fetch failures, parser errors, and document mapping for each external scraper family.", "confidence": "high", "impact_scope": "codebase", "fix_scope": "multi_file_refactor" }, { "dimension": "design_coherence", "identifier": "serve_handler_multi_responsibility_switch", "summary": "Single handler function mixes transport, parsing, orchestration, and mutable state management.", "related_files": [ "cmd/serve.go", "cmd/scrape.go", "cmd/sync.go", "cmd/query.go" ], "evidence": [ "handleServeMethod contains method routing plus per-method request schemas, domain calls, and response shaping in one body.", "The function coordinates temporary mutation of command globals to reuse CLI code paths." ], "suggestion": "Split each RPC method into dedicated handler functions (e.g., handleQueryRPC, handleScrapeRPC, handleSyncRPC) that depend on explicit service interfaces instead of command globals.", "confidence": "high", "impact_scope": "module", "fix_scope": "multi_file_refactor" } ] }