# lawref.values

*module*

Типизированные значения и term-вычисление (WP-06; [§18](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/05-part-v-lexis-and-basic-syntax.ru.md#18-числа), [§48](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#48-отсутствие-implicit-conversions)–[§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money), [§57](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#57-equality)–[§58](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#58-arithmetic)).

Точный Decimal (stdlib, float запрещён [§18](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/05-part-v-lexis-and-basic-syntax.ru.md#18-числа)); Quantity с v1-алгеброй размерностей
([§49](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#49-dimensional-checking): сложение/сравнение — только одинаковые единицы, умножение/деление на
скаляр; канонические конверсии единиц — вместе с unit-package WP-31+);
Money<C> ([§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money): межвалютная арифметика запрещена — CURRENCY_MISMATCH, T022;
округление никогда не подразумевается); Date/Instant не сравниваются между
собой ([§57](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#57-equality), [§2.15](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/01-part-i-audit.ru.md#215-legal_time-date-было-слишком-узким) — T024). Отсутствие implicit conversions — [§48](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#48-отсутствие-implicit-conversions).

Значение результата рендерится каноническим LiteralTerm-объектом (kind value,
Decimal — canonical non-exponent string [§18](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/05-part-v-lexis-and-basic-syntax.ru.md#18-числа)/[§208](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#208-canonical-serialization)).

## lawref.values.AGGREGATE_OPS

*attribute* · *module attribute*

```python
AGGREGATE_OPS = ('sum', 'count', 'min', 'max', 'average')
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L2077-L2077)

## lawref.values.BOOLEAN

*attribute* · *module attribute*

```python
BOOLEAN = 'urn:law:std#Boolean'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L36-L36)

## lawref.values.BOUNDS

*attribute* · *module attribute*

```python
BOUNDS = 'urn:law:std#Bounds'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L50-L50)

## lawref.values.CALENDAR_PERIOD_ONLY_UNITS

*attribute* · *module attribute*

```python
CALENDAR_PERIOD_ONLY_UNITS = ('calendar_month', 'calendar_year', 'calendar_week')
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L818-L818)

## lawref.values.CALENDAR_PERIOD_UNITS

*attribute* · *module attribute*

```python
CALENDAR_PERIOD_UNITS = ('calendar_day', 'calendar_month', 'calendar_year', 'calendar_week')
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L817-L817)

## lawref.values.DATE

*attribute* · *module attribute*

```python
DATE = 'urn:law:std#Date'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L39-L39)

## lawref.values.DAY_UNITS

*attribute* · *module attribute*

```python
DAY_UNITS = ('business_day', 'calendar_day')
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L811-L811)

## lawref.values.DEADLINE_UNITS

*attribute* · *module attribute*

```python
DEADLINE_UNITS = ('business_day', 'calendar_day', 'calendar_month', 'calendar_year', 'calendar_week')
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L803-L804)

## lawref.values.DECIMAL

*attribute* · *module attribute*

```python
DECIMAL = 'urn:law:std#Decimal'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L37-L37)

## lawref.values.DIV_ROUND_MAX_PRECISION

*attribute* · *module attribute*

```python
DIV_ROUND_MAX_PRECISION = 34
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1258-L1258)

## lawref.values.INSTANT

*attribute* · *module attribute*

```python
INSTANT = 'urn:law:std#Instant'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L40-L40)

## lawref.values.INTEGER

*attribute* · *module attribute*

```python
INTEGER = 'urn:law:std#Integer'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L41-L41)

## lawref.values.MAGNITUDE

*attribute* · *module attribute*

```python
MAGNITUDE = 'urn:law:std#Magnitude'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L49-L49)

## lawref.values.MONEY

*attribute* · *module attribute*

```python
MONEY = 'urn:law:std#Money'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L43-L43)

## lawref.values.NATURAL

*attribute* · *module attribute*

```python
NATURAL = 'urn:law:std#Natural'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L42-L42)

## lawref.values.POW_EXP_LIMIT

*attribute* · *module attribute*

```python
POW_EXP_LIMIT = 4096
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L779-L779)

## lawref.values.POW_VALUE_MAX

*attribute* · *module attribute*

```python
POW_VALUE_MAX = 2 ** 63 - 1
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L785-L785)

## lawref.values.POW_VALUE_MIN

*attribute* · *module attribute*

```python
POW_VALUE_MIN = -2 ** 63
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L784-L784)

## lawref.values.QUANTITY

*attribute* · *module attribute*

```python
QUANTITY = 'urn:law:std#Quantity'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L44-L44)

## lawref.values.RATIONAL

*attribute* · *module attribute*

```python
RATIONAL = 'urn:law:std#Rational'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L45-L45)

## lawref.values.ROUNDING_MODES

*attribute* · *module attribute*

```python
ROUNDING_MODES = {'HALF_UP': 'ROUND_HALF_UP', 'HALF_EVEN': 'ROUND_HALF_EVEN', 'HALF_DOWN': 'ROUND_HALF_DOWN', 'UP': 'ROUND_UP', 'DOWN': 'ROUND_DOWN', 'CEILING': 'ROUND_CEILING', 'FLOOR': 'ROUND_FLOOR'}
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L757-L765)

## lawref.values.SCALAR_TYPE_NAMES

*attribute* · *module attribute*

```python
SCALAR_TYPE_NAMES = frozenset(_TYPE_KINDS)
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1494-L1494)

## lawref.values.TEXT

*attribute* · *module attribute*

```python
TEXT = 'urn:law:std#Text'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L38-L38)

## lawref.values.Typed

*class* · *dataclass*

```python
class Typed
```

Типизированное значение: kind ∈ {decimal, money, quantity, date, instant,
boolean, text}; для money tag = валюта ([§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money)), для quantity tag = unit-символ
([§49](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#49-dimensional-checking), v1: символ представляет размерность до unit-package).

kind == "enum" ([§38](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#38-enums)/[§57](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#57-equality), errata E-0067): value — StableId члена
`{namespace}#{Член}` ([§24](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/06-part-vi-package-and-module-system.ru.md#24-visibility)), tag — StableId объявившего перечисления.
Равенство [§57](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#57-equality) сравнивает qualified identity; порядок не определён.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L53-L65)

### lawref.values.Typed.kind

*attribute* · *instance attribute*

```python
kind: str
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L63-L63)

### lawref.values.Typed.tag

*attribute* · *class attribute* · *instance attribute*

```python
tag: str | None = None
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L65-L65)

### lawref.values.Typed.value

*attribute* · *instance attribute*

```python
value: Any
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L64-L64)

## lawref.values.ValueError_

*class*

```python
class ValueError_(Exception)
```

Bases: `Exception`

Ошибка term-вычисления; code — машинный код для issue.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L27-L33)

### lawref.values.ValueError_.code

*attribute* · *instance attribute*

```python
code = code
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L32-L32)

### lawref.values.ValueError_.message

*attribute* · *instance attribute*

```python
message = message
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L33-L33)

## lawref.values.add_business_days_value

*function*

```python
def add_business_days_value(after: Typed, count: Typed, after_time: Typed | None, env: Any, where: str = 'add_business_days') -> Typed
```

[§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) `add_business_days(after, count, calendar, policy)` термом.

Календарь [§85](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#85-calendar-snapshot) и DeadlinePolicy [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) приходят окружением (`env`), а не
аргументами: в нормативном примере [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) это `context.calendar` и
`context.deadline_policy`. Позиционная форма с единицей на счётчике —
та же конвенция, что у `round` [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money): v1-парсер именованных аргументов не
имеет, а `count = 10 business_day` [§84.3](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#843-businessperiod) записывается Quantity-литералом,
и единица счёта остаётся видимой в тексте нормы.

До этой функции срок можно было только СПРОСИТЬ (calendar_op-запрос над
литеральной датой) — вывести его правилом было нечем, и процедурные сроки
приходилось вводить фактами, то есть считать вне CLIR.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1041-L1098)

## lawref.values.add_calendar_period_value

*function*

```python
def add_calendar_period_value(after: Typed, count: Typed, env: Any, where: str = 'add_calendar_period') -> Typed
```

[§84.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#842-calendarperiod)/[§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) `add_calendar_period(after, count, policy)` — errata E-0029.

Календарный шаг: месяцы и годы считаются ПО ДАТАМ, и снимок [§85](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#85-calendar-snapshot) этому
вычислению не нужен ни разу. До E-0029 та же операция жила на
`add_business_days`, и требование календаря было условным — зависящим от
`policy.roll`. Условность не читалась ни в норме, ни в статике, и
реализации на ней молча разошлись: оракул выводил дату, движок ронял
`MISSING_CALENDAR` при чистом `lawc check`. Здесь пути к календарю нет
вовсе, поэтому разойтись по нему нельзя.

Из policy читаются `start_count` и `month_end`; `roll` обязан быть
`no_roll`, `include_end` — `true`. Иное сочетание ОТВЕРГАЕТСЯ, а не
толкуется: перенос на рабочий день вернул бы снимок через политику.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1101-L1153)

## lawref.values.add_duration_value

*function*

```python
def add_duration_value(after: Typed, duration: Typed, where: str = 'add_duration') -> Typed
```

[§84.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#841-duration): физическая Duration после Instant; ответ каноничен в UTC.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1015-L1038)

## lawref.values.add_legal_term_value

*function*

```python
def add_legal_term_value(after: Typed, count: Typed, env: Any, where: str = 'add_legal_term') -> Typed
```

[§86.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#861-именованный-срок-с-особыми-случаями-term): runtime-unit dispatch для duration-binder сахара `term`.

Единица выбирает одну из двух уже нормативных операций; функция не
преобразует единицы и не вводит календарных умолчаний.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1156-L1170)

## lawref.values.aggregate

*function*

```python
def aggregate(op: str, items: list[Typed], options: dict | None = None, where: str = 'aggregate', element_type: str | None = None) -> Typed
```

Агрегаты [§59](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#59-aggregates) над материализованной коллекцией. Пустая коллекция без
явной политики options.empty — EMPTY_AGGREGATE ([§59](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#59-aggregates)); политика чужого
вида — TYPE_ERROR (errata E-0195).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L2108-L2169)

## lawref.values.aggregate_element_type

*function*

```python
def aggregate_element_type(term: dict) -> str | None
```

[§52.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#521-finite-relation-comprehensions)/[§59](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#59-aggregates) (errata E-0195): вид элемента коллекции по ОБЪЯВЛЕННОМУ типу
проекции comprehension.

Это единственный носитель вида, который не зависит от того, пуста
коллекция или нет: `ComprehensionTerm.variable` объявлен схемой
обязательным, и его `type.name` стоит в узле независимо от числа решений
generator-а. Отсюда исполнение знает вид элемента ПУСТОЙ коллекции и
вправе сверить с ним вид политики.

`None` — вида нет: вход не comprehension (достижимо рукописным CLIR) либо
у проекции не объявлен тип. Молчание здесь есть «утверждать нечего», а не
«совместимо со всем».

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L2084-L2105)

## lawref.values.binary

*function*

```python
def binary(op: str, left: Typed, right: Typed) -> Typed
```

BinaryTerm-операции [§58](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#58-arithmetic) (+ - * / mod) и сравнения [§57](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#57-equality) (lt/le/gt/ge/eq/ne).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L522-L752)

## lawref.values.call

*function*

```python
def call(function: str, args: list[Typed], where: str = 'call', env: Any = None, call_stack: tuple[str, ...] = ()) -> Typed
```

CallTerm: std-функции [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money)/[§58](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#58-arithmetic)/[§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) над вычисленными аргументами.

`env` — окружение evaluation (`calendar.TermEnv`): нужно только тем
функциям, у которых [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) берёт часть входа из контекста. Чистые функции
([§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money) round, [§58](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#58-arithmetic) min/max/abs) его игнорируют.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1872-L2074)

## lawref.values.convert_value

*function*

```python
def convert_value(value: Typed, num: Typed, den: Typed, unit: Typed, where: str = 'convert') -> Typed
```

[§49](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#49-dimensional-checking) (errata E-0072): перевод единицы ЯВНОЙ формой — точный фактор парой целых.

Рамка 1 DECISION-0068: неявной конверсии не существует, и этот терм — ровно
объявленная ею явная форма (образцы — `div_round` E-0036 и exchange-snapshot
[§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money)). Реестра факторов НЕТ намеренно: фактор точен и вечен (18/5 —
определение, не курс) и живёт аргументами при норме-владельце; реестр
понадобится не раньше валютоподобных факторов с датой (замер
phys.zadachnik, audit [§3.2](https://github.com/arxohq/law/blob/master/spec/AUDIT.ru.md)). Сверить тег цели с фактором не с чем —
пришивка остаётся авторской и сторожится тестами акта; названо там же.

Вид результата — ПО ЗНАЧЕНИЮ, как у пары Decimal/Decimal [§58](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#58-arithmetic): 10-гладкое
частное — Quantity целевого тега, иначе точный Rational ЧИСЛОМ значения в
целевой единице. Второй случай снимает границу 10-гладкости эталонной
записи: перевод «1 км/ч = 5/18 м/с» до терма был невыразим вовсе —
Decimal * Rational есть TYPE_ERROR ([§48](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#48-отсутствие-implicit-conversions), вектор T163), и не-10-гладкое
число не пришивалось.

Money отвергается ПОИМЁННО: конверсия валют — территория [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money)
(exchange rate + snapshot), и молчаливое соседство двух конверсий с
разными гарантиями было бы дырой того же класса, что закрыла E-0068.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1332-L1376)

## lawref.values.days_between_value

*function*

```python
def days_between_value(start: Typed, end: Typed, where: str = 'days_between') -> Typed
```

[§84.4](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#844-измерение-длительности) (errata E-0015): число календарных дней от `start` до `end`.

Отрицательное при обратном порядке — это измерение, а не расстояние:
«просрочка отрицательна» и «платёж раньше срока» суть одно и то же, и
прятать знак значило бы решать за норму.

Возвращает счёт (`Integer`), а не носитель единицы: дневная ставка имеет
размерность 1/день, а обратных единиц в v1 нет ([§49](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#49-dimensional-checking) — умножение только на
скаляр). Единица видна в имени функции.

Календарь [§85](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#85-calendar-snapshot) НЕ нужен: календарные дни считаются независимо от рабочего
календаря. Рабочие дни — `add_business_days` [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy), и подменять одно другим
нельзя (у них разные ответы на одном и том же интервале).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L821-L850)

## lawref.values.div_round_value

*function*

```python
def div_round_value(dividend: Typed, divisor: Typed, precision: Typed, mode: Typed, where: str = 'div_round') -> Typed
```

[§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money)/[§58](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#58-arithmetic) (errata E-0036): частное, округлённое ЯВНОЙ политикой.

[§58](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#58-arithmetic) обещает у `Money / Decimal` и `Quantity / Decimal`, что при неточном
делении округление законно «только явной policy [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money)/[§18](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/05-part-v-lexis-and-basic-syntax.ru.md#18-числа)», — но применить
её было не к чему: `round` берёт уже вычисленное значение, а вычислить
частное `/` не даёт (`INEXACT_DIVISION`). У пары `Decimal / Decimal` дыра
зеркальна: `/` возвращает `Rational` (E-0005/E-0020), а `round` [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money)
определён на Decimal/Money/Quantity и `Rational` не берёт.

Поэтому деление и округление здесь — ОДНА операция над ТОЧНЫМ частным, а
не композиция двух: композиция невыразима с обеих сторон.

Округление применяется ВСЕГДА, а не только при неточном частном. Иначе
точность результата зависела бы от значения, а не от нормы, — ровно тот
дефект, который E-0020 нашла у `Decimal / Decimal`, где от значения
зависел ВИД. На представимом частном ответ совпадает с `/`, если
объявленная точность его вмещает.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1261-L1329)

## lawref.values.eval_data_condition

*function*

```python
def eval_data_condition(formula: dict, where: str, env: Any, variables: dict[str, Typed]) -> bool
```

Значение чистого data-условия [§56](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#56-conditional-expression) под связанными переменными.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1574-L1577)

## lawref.values.eval_term

*function*

```python
def eval_term(term: dict, where: str = 'term', env: Any = None, variables: dict[str, Typed] | None = None, call_stack: tuple[str, ...] = (), branch_path: list[str] | None = None) -> Typed
```

Вычисление чистого CLIR data-терма.

Поддерживает Literal/Var/Binary/Call/If/Let/Match. ``FunctionDecl`` не
имеет особой семантики: его body рекурсивно проходит этот же evaluator.

`env` — окружение evaluation ([§85](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#85-calendar-snapshot) снапшот + [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) policy) для функций, чей
вход не исчерпывается аргументами; без него календарные термы отказывают,
а не подставляют умолчание ([§5.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/02-part-ii-goals-and-scope.ru.md#51-no-hidden-defaults) no hidden defaults).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L2172-L2303)

## lawref.values.from_literal_term

*function*

```python
def from_literal_term(term: dict, where: str = 'term') -> Typed
```

LiteralTerm (kind value) → Typed. Тип определяется TypeRef.name + unit/currency.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L167-L261)

## lawref.values.hours_between_value

*function*

```python
def hours_between_value(start: Typed, end: Typed, where: str = 'hours_between') -> Typed
```

[§84.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#841-duration) (errata E-0028): число ПОЛНЫХ часов от `start` до `end`.

Асимметрия с [§84.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#842-calendarperiod), ради которой это отдельная errata, а не расширение
E-0026. Календарный месяц ИЗМЕРИТЬ нельзя: «сколько месяцев между 31
января и 1 марта» не имеет ответа без конвенции округления, и потому
E-0026 добавила только ШАГ. Час — `Duration` [§84.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#841-duration), физическая
длительность в секундах; между двумя мгновениями она однозначна, и
измерение определено без всякой политики. Поэтому здесь добавляется
ИЗМЕРЕНИЕ, зеркально `days_between` (E-0015), а шага по часам нет.

Аргументы — Instant, а не Date: [§2.15](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/01-part-i-audit.ru.md#215-legal_time-date-было-слишком-узким) запрещает смешивать их без
timezone/boundary policy, а «не ранее чем через сорок восемь часов»
(Конституция РК ст. 60.7) считается от МГНОВЕНИЯ, а не от даты.

Часовой пояс не нужен и не спрашивается: разность двух мгновений от него
не зависит. Политика [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) для неоднозначного local time относится к
ПОСТРОЕНИЮ мгновения из локального времени — это забота дела, а не терма.

Отрицательное при обратном порядке — по той же причине, что у
`days_between`: это измерение, а не расстояние, и прятать знак значило бы
решать за норму. Дробная часть отбрасывается к нулю: «прошло сорок восемь
часов» истинно с началом сорок девятого, а не с сорок восьмым и одной
секундой.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L924-L949)

## lawref.values.is_data_condition

*function*

```python
def is_data_condition(formula: Any) -> bool
```

[§56](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#56-conditional-expression): условие `IfTerm` — ЧИСТОЕ Boolean-выражение данных.

Status-тест [§65](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/10-part-x-propositions-and-four-valued-support.ru.md#65-status-tests) (`established(P)` и прочие) сюда не входит: его значение
берётся из ОПОРЫ, а не из данных, а вычислителю термов store недоступен.
Различение нужно затем, чтобы выбор ветви не притворялся сделанным там,
где он не сделан.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1557-L1571)

## lawref.values.minutes_between_value

*function*

```python
def minutes_between_value(start: Typed, end: Typed, where: str = 'minutes_between') -> Typed
```

[§84.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#841-duration) (errata E-0058): число ПОЛНЫХ минут от `start` до `end`.

Тот же класс, что `hours_between` (E-0028), и то же обоснование дословно:
[§84.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#841-duration) есть физическая длительность В СЕКУНДАХ, между двумя мгновениями
она однозначна, и измерение определено без всякой политики. Асимметрия с
[§84.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#842-calendarperiod) (календарный месяц ИЗМЕРИТЬ нельзя) здесь та же и по той же
причине.

Почему часа было мало. `hours_between` отбрасывает дробную часть к нулю,
поэтому норма с порогом МЕНЬШЕ часа им не выражается вовсе: «не позднее
чем за 45 минут до опубликованного времени вылета» (ст. 3 п. 2 (a)
Регламента (ЕС) № 261/2004 — условие применимости всего акта) даёт
`hours_between = 0` и при 45 минутах, и при одной минуте, и при нуле.
Величину приходилось объявлять фактом дела с числом В ИМЕНИ предиката —
ровно тот признак недоделки, который E-0015, E-0026 и E-0028 закрывали
для дней, месяцев и часов.

Разбор, отказы и знак — общие с `hours_between` (одна процедура, не
копия): Instant, а не Date; смешение мгновений со смещением и без —
отказ, а не догадка о поясе; отрицательное при обратном порядке, потому
что это измерение, а не расстояние.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L988-L1012)

## lawref.values.month_bound_value

*function*

```python
def month_bound_value(day: Typed, end: bool, where: str = 'month_end_of') -> Typed
```

[§84.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#842-calendarperiod) (errata E-0084): первое (`end=False`) либо последнее число месяца
даты `day`.

Границы, а не измерение и не шаг: у месяца нет однозначной длины в днях
([§84.4](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#844-измерение-длительности) отказывает измерению в месяцах), но есть однозначные границы, и
потому ни политика [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy), ни снимок [§85](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#85-calendar-snapshot) здесь не читаются. Норма «не позднее
N-го числа следующего месяца» становится
`add_business_days(month_end_of(event), N calendar_day)` при
`start_count = next_day` — до errata тот же срок требовал в одном деле
календарной и дневной единицы, а `policy.month_end` обязателен у первых и
запрещён у вторых (E-0029).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L853-L883)

## lawref.values.raw_json

*function*

```python
def raw_json(raw: Any) -> str
```

Сырое поле литерала в тексте issue — КАНОНОМ [§208](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#208-canonical-serialization), не `repr` хоста.

Errata E-0197 (класс E-0076): `repr` печатал `None`, `True`, `'abc'`,
`{'a': 1}` — ни одной из этих записей в `.lawir.json`, который читает
автор, не существует, а Rust печатал ту же величину средствами serde.
Канон [§208](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#208-canonical-serialization) — единственная форма, в которой значение ВИДНО в документе,
и она одна у обеих реализаций.

Воронка ТОТАЛЬНА (errata E-0202): форматирование сообщения не имеет права
само отказать. JSON-float и целое вне i64 сюда ДОХОДЯТ — `_json_int`
зовёт `raw_json` раньше, чем документ уходит в канон, — и до E-0202
`CanonError` вылетал отсюда с корневым путём `$` вместо пути поля,
подменяя собой отказ канона движка. Такое число печатается компактным
JSON без канонической проверки (то же, что `Value::to_string` движка);
сам отказ [§208](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#208-canonical-serialization) предъявляет канон документа, а не этот текст.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L68-L91)

## lawref.values.round_fraction

*function*

```python
def round_fraction(value: Fraction, scale: int, mode: str) -> Decimal
```

Публичный псевдоним `_round_fraction` для [§64.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/10-part-x-propositions-and-four-valued-support.ru.md#642-отношение-округления-над-сертифицированными-границами-errata-e-0136) (errata E-0136).

Ячейка округления обязана считаться ТЕМ ЖЕ кодом, что `round` [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money): второе
определение режима разошлось бы с первым на точной половине, и отношение
округления утверждало бы не то, что округляет норма.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1460-L1466)

## lawref.values.round_value

*function*

```python
def round_value(value: Typed, precision: Typed, mode: Typed, where: str = 'round') -> Typed
```

[§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money) `round(value, precision, mode)`: единственный законный способ получить
неточный денежный результат. Округление никогда не подразумевается — политика
приходит аргументами, а не дефолтом движка.

Surface-форма [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money) записана именованными аргументами
(`round(value, precision = 2, mode = HALF_UP)`); v1-парсер именованных
аргументов не имеет, поэтому позиционная форма с mode-строкой — та же
конвенция, что options.rounding у `average` [§59](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#59-aggregates).

[§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money) (errata E-0110): `round` над `Integer` — тождество: дробной части у
целого нет, `precision` её не порождает, конверсии в `Decimal` [§48](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#48-отсутствие-implicit-conversions) не
возникает. `precision` и `mode` при этом проверяются так же, как у
прочих видов — политика обязана быть законной, даже когда ей нечего
решать. До errata здесь был TYPE_ERROR, и норма, округлявшая
целочисленный параметр A3 «по аналогии» с денежным, молча не срабатывала.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1173-L1222)

## lawref.values.select_match_arm

*function*

```python
def select_match_arm(subject: Typed, arms: list, where: str, env: Any, variables: dict[str, Typed])
```

[§55.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#551-match-expression): первая совпавшая arm и её связывания, либо None.

Порядок arm входит в semantic hash: перебор идёт сверху вниз и
останавливается на первом совпадении. Значения ОСТАЛЬНЫХ arm не
вычисляются — как и невыбранная ветвь [§56](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#56-conditional-expression).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1541-L1554)

## lawref.values.text_length_value

*function*

```python
def text_length_value(text: Typed, where: str = 'text_length') -> Typed
```

[§257](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/34-part-xxxiii-standard-library.ru.md#257-lawstddata) (errata E-0166): число кодовых точек (Unicode scalar values) текста
после NFC [§13](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/05-part-v-lexis-and-basic-syntax.ru.md#13-кодировка-и-нормализация) — `Integer` ≥ 0. Единица — кодовая точка, не байт и не
графемный кластер: «кириллица» — 9, `q` + U+0303 — 2, «й» в NFC — 1.
Документы канона [§208](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#208-canonical-serialization) уже несут NFC, поэтому нормализации здесь нет;
`len` строки Python и есть счёт кодовых точек. Снимок [§85](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#85-calendar-snapshot), политика [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) и
локаль не читаются — терм чист.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L911-L921)

## lawref.values.to_literal_term

*function*

```python
def to_literal_term(value: Typed) -> dict
```

Typed → literal-терм [§53](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/09-part-ix-values-terms-expressions.ru.md#53-термы) (обратное к `from_literal_term`).

Имена типов — `urn:law:std#` [§257](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/34-part-xxxiii-standard-library.ru.md#257-lawstddata); числовые значения канонизируются
`_canonical_decimal` [§18](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/05-part-v-lexis-and-basic-syntax.ru.md#18-числа)/[§208](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/28-part-xxvii-canonical-legal-ir.ru.md#208-canonical-serialization), чтобы одно и то же значение давало одни байты.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L276-L335)

## lawref.values.weekday_value

*function*

```python
def weekday_value(day: Typed, where: str = 'weekday_of') -> Typed
```

[§84.2](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#842-calendarperiod) (errata E-0091): день недели даты `day` — `Integer` от 1
(понедельник) до 7 (воскресенье), нумерация ISO 8601.

Свойство самой шкалы `Date` (пролептический григорианский календарь,
[§2.15](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/01-part-i-audit.ru.md#215-legal_time-date-было-слишком-узким)), а не снимка [§85](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#85-calendar-snapshot): календарь [§85](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#85-calendar-snapshot) знает, какие дни рабочие, но день
недели у даты один и тот же при любом календаре, поэтому ни снимок, ни
политика [§86](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/12-part-xii-events-actions-temporal-model.ru.md#86-deadline-policy) не читаются. До errata «the third Monday in January»
(5 U.S.C. §6103(a)) и «holiday that occurs on a Saturday» (§6103(b)(1))
не выводились: даты объявлялись фактами дела и сверялись глазами.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L886-L908)

## lawref.values.with_unit_value

*function*

```python
def with_unit_value(value: Typed, unit: Typed, where: str = 'with_unit') -> Typed
```

[§49](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#49-dimensional-checking) (errata E-0074): пришивка «число → величина» ЯВНОЙ формой.

Закрывает вторую молчаливую дыру замера phys.zadachnik (audit [§2.2](https://github.com/arxohq/law/blob/master/spec/AUDIT.ru.md#22-неполная-модель-результата), Н4):
обратный ход эталонной записи — умножение числа на эталон-константу —
законный скаляр [§49](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#49-dimensional-checking), и эталон НЕ ТОЙ единицы пришивался молча (правило
выводило путь «300 секунд» со статусом TRUE_ONLY без единой диагностики).
Явная форма убирает эталоны ВЫХОДА вовсе: тег цели — литерал на месте
пришивки, а не имя константы, и класс опечатки «не тот эталон» исчезает.

Проверяемость — три отказа, которых у скалярного идиома не было:
величина с единицей отвергается ПОИМЁННО (перетег — только `convert`
E-0072, повторная пришивка невозможна), Money отвергается к [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money), а
неточная дробь — RUNTIME_ERROR по канону INEXACT_DIVISION (округление —
только явной политикой [§50](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#50-money)/[§18](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/05-part-v-lexis-and-basic-syntax.ru.md#18-числа)). Опечатка в самом литерале юнита остаётся
авторской и сторожится тестами акта ([§267](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/36-part-xxxiv-conformance-tests.ru.md#267-test-syntax)) — названо честно, вслед за
заявкой audit [§3.2](https://github.com/arxohq/law/blob/master/spec/AUDIT.ru.md).

Побочно снята вторая половина границы «Rational не пришивается»
(первую — переводы — сняла E-0072): 10-гладкая точная дробь становится
Quantity канонической десятичной записью.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/values.py#L1379-L1427)
