release: 0.1.31

## Bump

- [ ] Patch
- [x] Minor
- [ ] Major

## Changelog

### Added

- SHACL-AF rule engine: `sh:rule` / `sh:SPARQLRule` inference rules execute automatically alongside quality shapes in a single `pyshacl.validate(advanced=True)` pass. Rules CONSTRUCT `dqs:RuleEngineResult` subjects that are materialised into a new `RuleEngineResult` CDF Records container.
- `RuleEngineResult` container with properties `ruleSetId`, `ruleSetVersion`, `ruleId`, `runId`, `resultType`, `focusNode`, `focusNodeInstance` (DirectRelation), `resultValue`, `resultPayload` (JSON), `causedBy` (DirectRelation list), `dataDomainExternalId`, `producedAt`.
- Auto-detection of inference shapes: `shacl_classifier.py` inspects the TTL graph at runtime; no config changes required.
- `dqs:dependsOn` chained inference rules: deploy-time validator blocks malformed chains (missing dependency, wrong `sh:order`, cross-shape, cycle, duplicate rule ID). Runtime lineage captured via `causedBy` DirectRelation list on each record.
- `RecordsSettings.rule_engine_container` and `rule_engine_stream_id` optional settings.
- All four validation handlers (instance, instance-sync-cursor, partitioned, timeseries) automatically post inferences when the SHACL graph contains `sh:rule` triples.
