Summary
DocRepoIngester.scan_and_process() processes files sequentially in a loop. Each file triggers one or more LLM calls via provider.extract_from_chunk(). Since LLM inference is network-bound I/O, files could be processed in parallel.
Fix
Use concurrent.futures.ThreadPoolExecutor in scan_and_process() to process files concurrently. Cap concurrency to avoid overwhelming the LLM server.
Acceptance Criteria
Discovered during /simplify review of #37.
Summary
DocRepoIngester.scan_and_process()processes files sequentially in a loop. Each file triggers one or more LLM calls viaprovider.extract_from_chunk(). Since LLM inference is network-bound I/O, files could be processed in parallel.Fix
Use
concurrent.futures.ThreadPoolExecutorinscan_and_process()to process files concurrently. Cap concurrency to avoid overwhelming the LLM server.Acceptance Criteria
scan_and_processprocesses files concurrentlyDiscovered during
/simplifyreview of #37.