## Scanning


## scan.scan()


Scans transcripts under `roots` for feedback, incrementally.


Usage

``` python
scan.scan(
    store,
    roots,
    *,
    findings_dirs=(),
    full=False,
)
```


Each transcript is parsed only when new or modified since the last scan (unless `full`), parsing runs concurrently across files, and every candidate is inserted idempotently. A transcript that fails to parse -- for example one Claude Code is still appending to -- is silently skipped by the parser and left unrecorded, so the next scan retries it. After the transcript pass, every `issues.jsonl` findings file under `findings_dirs` is anchored to the closest session under `roots` and its findings are recorded through the same idempotent insert.


#### Parameters


`store: `<a href="storage.html#cc_steer.store.FeedbackStore" class="gdls-link gdls-code"><code>FeedbackStore</code></a>  
The store to read mtimes from and write candidates to.

`roots: Sequence[Path]`  
The directories to search recursively for transcripts.

`findings_dirs: Sequence[Path] = ()`    
The directories to search recursively for `issues.jsonl` superset findings files.

`full: bool = ``False`  
When set, re-scan every transcript and findings file, ignoring recorded mtimes.


#### Returns


`The: `<a href="scanning.html#cc_steer.scan.ScanReport" class="gdls-link gdls-code"><code>ScanReport</code></a>  
class:[ScanReport](scanning.md#cc_steer.scan.ScanReport) for this pass.


## scan.ScanReport


The outcome of one scan pass.


Usage

``` python
scan.ScanReport(scanned, inserted)
```


#### Attributes


`scanned: int`  
The number of transcripts and findings files parsed and recorded.

`inserted: int`  
The number of newly inserted feedback events.
