-`domains.xlsx`, `domains.xls`, `domains.csv`, or `domains.json`
-`schema.xlsx` or `schema.xls`
-`guidance/`
Domain guidance lookup uses exact domain directory names. If a domain is named `过度负债`, put files under:
```text
guidance/过度负债/
```
Put shared policy files under:
```text
guidance/_all/
```
## State Mutation
`DomainStorage.save_domains()` replaces `data/domains.json`. This is intentional for a folder-driven run.
`SchemaStorage.save()` replaces `data/schema.json` and starts background schema description generation. Rule generation can still use parsed schema modules immediately.
Guidance file uploads append file records to current domains.
## Completion
Rule generation is asynchronous. Poll `RuleGenerationService.get_status(task_id)` until `status` is `done` or `failed`.
Treat `failed` as a completed task state but return nonzero from CLI unless `--allow-failed` is added in the future.