c79ea22702
dict-relationships-v2 epic, Phase 1 prep commit. Готовит почву для
параллельных Phase 1 (read-side lineage) + Phase 3 (cascade engine) lanes.
Изменения:
- Новый enum `OnCloseAction { BLOCK, WARN, CASCADE }` с lenient parser
(case-insensitive, null/blank → BLOCK, unknown → IllegalArgumentException).
- `ParsedRef` record расширен полем `onClose` (default BLOCK).
Convenience ctor `ParsedRef(dict, field)` сохранён для backward-compat
с текущими тестами и call sites.
- `parseRef(spec, propSchema)` overload читает `x-references-on-close`
sibling field. Старый `parseRef(spec)` оставлен и делегирует с propSchema=null.
- ReferenceValidator.validate() теперь передаёт propSchema в parser.
Runtime semantics не меняются — onClose читается, но не используется.
Cascade engine (Phase 3) подхватит поле когда CascadeCloseService появится.
Tests:
- ReferenceValidatorTest: +6 tests для onClose parsing
(default BLOCK, explicit BLOCK/WARN/CASCADE case-insensitive,
trim, invalid value → throw, non-string → throw).
- OnCloseActionTest: 4 dedicated unit tests для enum.fromString().
- BulkRecordServiceTest (10) + DictionaryRecordServiceTest (11) проходят
без изменений → close flow regression-safe.
mvn -pl ordinis-rest-api -am test: 69/69 PASS (3.857s).
Backward-compat: bundle v1.2.1 (без x-references-on-close) → onClose=BLOCK
→ identical поведение к v1. Контракт сохранён.