Text Classification
cortiq
Laya
English
cmf
jev
decision-making
structured-output
tool-selection
semantic-routing
on-device
metal
vulkan
intent-classification
resonance-routing
Instructions to use infosave/cmf-decision with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- cortiq
How to use infosave/cmf-decision with cortiq:
# one Rust binary, no additional dependencies cargo install cortiq-cli # or a prebuilt binary from github.com/infosave2007/cmf/releases hf download infosave/cmf-decision --include "*.cmf" --local-dir . ls *.cmf # some repos ship more than one quantization
cortiq run FILE.cmf --prompt "What is the capital of France?"
cortiq serve FILE.cmf --port 8080 # OpenAI-compatible server
- Laya
How to use infosave/cmf-decision with Laya:
# No code snippets available yet for this library. # To use this model, check the repository files and the library's documentation. # Want to help? PRs adding snippets are welcome at: # https://github.com/huggingface/huggingface.js
- Notebooks
- Google Colab
- Kaggle
Cortiq Decision: professional model card, practical article and verified Patent 1 reference
Browse files- .gitattributes +2 -0
- ARTICLE_RU.md +67 -29
- PATENT_NOTE.md +59 -0
- README.md +280 -104
- RELEASE_NOTES.md +2 -0
- SHA256SUMS +8 -3
- evidence/release/editorial-code-smoke.json +18 -0
- evidence/release/editorial-python-tests.txt +5 -0
- figures/decision-mechanism-en.png +3 -0
- figures/decision-mechanism-ru.png +3 -0
.gitattributes
CHANGED
|
@@ -37,3 +37,5 @@ cortiq-banking77.cmf filter=lfs diff=lfs merge=lfs -text
|
|
| 37 |
training/seed.json filter=lfs diff=lfs merge=lfs -text
|
| 38 |
evidence/banking77/local-test-repeat.jsonl filter=lfs diff=lfs merge=lfs -text
|
| 39 |
cortiq-decision.cmf filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
| 37 |
training/seed.json filter=lfs diff=lfs merge=lfs -text
|
| 38 |
evidence/banking77/local-test-repeat.jsonl filter=lfs diff=lfs merge=lfs -text
|
| 39 |
cortiq-decision.cmf filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
figures/decision-mechanism-en.png filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
figures/decision-mechanism-ru.png filter=lfs diff=lfs merge=lfs -text
|
ARTICLE_RU.md
CHANGED
|
@@ -1,28 +1,44 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
-
|
| 4 |
|
| 5 |
-
|
| 6 |
|
| 7 |
-
|
| 8 |
|
| 9 |
-
|
| 10 |
|
| 11 |
-
|
| 12 |
|
| 13 |
-
|
| 14 |
-
|---|---|
|
| 15 |
-
| CMF отвечает на все 3080 тестовых обращений | **91,49% правильных ответов** |
|
| 16 |
-
| Jev на тех же обращениях | **до 85,65%** с консервативным зачётом двух спорных ответов |
|
| 17 |
-
| CMF отвечает только при достаточной уверенности | **98,69% правильных среди ответов**, отвечает на **74,16%** обращений |
|
| 18 |
|
| 19 |
-
В
|
| 20 |
|
| 21 |
-
|
| 22 |
|
| 23 |
-
|
| 24 |
|
| 25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
|
| 27 |
## 1. Запускаем готовую модель
|
| 28 |
|
|
@@ -31,12 +47,13 @@
|
|
| 31 |
```bash
|
| 32 |
python3.12 -m venv .venv
|
| 33 |
source .venv/bin/activate
|
| 34 |
-
pip install huggingface_hub
|
| 35 |
|
| 36 |
hf auth login
|
| 37 |
hf download infosave/cortiq-decision \
|
| 38 |
--local-dir cortiq-decision
|
| 39 |
cd cortiq-decision
|
|
|
|
| 40 |
|
| 41 |
cargo build --release --locked \
|
| 42 |
--manifest-path source/tools/cortiq-decision/Cargo.toml
|
|
@@ -55,7 +72,7 @@ export BIN="$PWD/source/tools/cortiq-decision/target/release/cortiq-decision"
|
|
| 55 |
|
| 56 |
Смысл ответа: выбран `change_pin`, источник — локальная CMF-модель. Готовый BANKING77-специалист проверен на английских обращениях; качество на других языках здесь не заявляется.
|
| 57 |
|
| 58 |
-
Теперь поднимем API:
|
| 59 |
|
| 60 |
```bash
|
| 61 |
python3 source/tools/cortiq-decision/serve_model.py cortiq-decision.cmf \
|
|
@@ -69,7 +86,7 @@ python3 source/tools/cortiq-decision/serve_model.py cortiq-decision.cmf \
|
|
| 69 |
|
| 70 |
У каждой обученной модели есть описание задачи: что выбирать и какие варианты допустимы. Его можно получить из API, не переписывая вручную все 77 категорий.
|
| 71 |
|
| 72 |
-
|
| 73 |
|
| 74 |
```python
|
| 75 |
import json
|
|
@@ -95,8 +112,9 @@ def decide(text):
|
|
| 95 |
with urlopen(request) as r:
|
| 96 |
return json.load(r)["answers"]["intent"]["choice"]
|
| 97 |
except HTTPError as e:
|
| 98 |
-
|
| 99 |
-
|
|
|
|
| 100 |
raise
|
| 101 |
|
| 102 |
print(decide("How do I change my PIN?")) # change_pin
|
|
@@ -104,7 +122,7 @@ print(decide("How do I change my PIN?")) # change_pin
|
|
| 104 |
|
| 105 |
Дальше обычная логика приложения: `change_pin` — показать инструкцию, `None` — отправить запрос оператору. **Выбор модели сам по себе не разрешает финансовую операцию и не исполняет команду.**
|
| 106 |
|
| 107 |
-
|
| 108 |
|
| 109 |
## 3. Создаём модель под свои категории
|
| 110 |
|
|
@@ -166,7 +184,7 @@ python3 source/tools/cortiq-decision/serve_model.py my-inbox-v1/model.cmf \
|
|
| 166 |
--state-dir ./state-inbox-v1 --port 8790
|
| 167 |
```
|
| 168 |
|
| 169 |
-
В клиенте меняется адрес на `http://127.0.0.1:8790`. Описание новой задачи он получит сам.
|
| 170 |
|
| 171 |
`--target-accuracy 0.95` задаёт цель калибровки. Можно попробовать `0.98`: обычно это означает меньше автоматических ответов и больше отказов. **Это не обещание 98% на любом будущем сообщении.**
|
| 172 |
|
|
@@ -190,20 +208,40 @@ python3 source/tools/cortiq-decision/serve_model.py my-inbox-v1/model.cmf \
|
|
| 190 |
}
|
| 191 |
```
|
| 192 |
|
| 193 |
-
Теперь знакомый запрос остаётся локальным, а неуверенный может уйти к Jev. **Такой запрос передаёт текст внешнему провайдеру.**
|
| 194 |
|
| 195 |
Оракул не переписывает веса автоматически. Практический цикл такой: собрать сложные случаи, независимо проверить разметку, пополнить свои данные, обучить `my-inbox-v2`, сравнить со старой версией и только потом заменить её. Использовать ответы чужой модели для обучения можно лишь при наличии соответствующих прав.
|
| 196 |
|
| 197 |
-
##
|
|
|
|
|
|
|
| 198 |
|
| 199 |
-
|
| 200 |
|
| 201 |
-
|
| 202 |
|
| 203 |
-
|
| 204 |
|
| 205 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 206 |
|
| 207 |
---
|
| 208 |
|
| 209 |
-
Модель и
|
|
|
|
|
|
|
|
|
| 1 |
+
# Роутеру не нужно писать: локальные решения в CMF
|
| 2 |
|
| 3 |
+
*Как выбирать действие примерно за 5 мс, обучать модель под свой процесс и добавлять навыки, не переписывая общее ядро.*
|
| 4 |
|
| 5 |
+
«Как изменить PIN-код?» — спрашивает клиент. Прежде чем написать ему ответ, приложение должно решить совсем другую задачу: какой обработчик вызвать. Здесь не нужен абзац рассуждений. Нужен `change_pin` — или честное «не уверен».
|
| 6 |
|
| 7 |
+
Вокруг моделей решений сейчас много интереса. [TypeSafe Jev](https://openrouter.ai/blog/insights/what-is-jev/) предлагает именно такой интерфейс: состояние и вопросы на входе, типизированные ответы вместо свободного текста. Меня интересовал следующий шаг: **можно ли держать повторяющиеся решения рядом с приложением, обучать их на своих данных и не вызывать облако каждый раз?**
|
| 8 |
|
| 9 |
+
Так появился **Cortiq Decision** — локальная модель и runtime для формата CMF. На 3080 тестовых обращениях BANKING77 она дала **91,49% правильных ответов**. При отказе от неуверенных случаев — **98,69% среди принятых ответов при покрытии 74,16%**. Ниже — механизм, сравнение с Jev и путь от скачанного файла до собственной модели.
|
| 10 |
|
| 11 |
+
## Вместо сети выбора — проверка восстановления
|
| 12 |
|
| 13 |
+
Представьте несколько специалистов, которым дали один и тот же чертёж. Мы не спрашиваем отдельного диспетчера, кто лучше справится. Каждый пробует восстановить чертёж; выбираем того, у кого получилось точнее.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
|
| 15 |
+
В нашей модели «чертёж» — **не исходный текст**, а его числовое представление. Один замороженный энкодер переводит сообщение в вектор из 384 чисел. У каждой категории есть своя небольшая модель восстановления. В готовом affine-варианте это центр и направления, выученные по примерам категории. Мы измеряем остаточную ошибку после реконструкции и выбираем категорию с наименьшей ошибкой. Затем отдельно проверяем, можно ли доверить ей автоматическое решение.
|
| 16 |
|
| 17 |
+

|
| 18 |
|
| 19 |
+
Это **маршрутизация по резонансу сигнала** из моей первой патентной заявки: **US application № 19/452,440, подана 19 января 2026 года**, *System and Method for Unsupervised Multi-Task Routing via Signal Reconstruction Resonance*. Речь о номере заявки, не о номере выданного патента. Её центральная идея — выбор по поведению самих топологий, без отдельно обучаемой сети, предсказывающей ID задачи. FCD-вариант с замороженным ядром разберём ниже; CMF-контейнер и API — инженерное окружение этого механизма, а не дополнительные положения первого патента.
|
| 20 |
|
| 21 |
+
Слово *unsupervised* в названии не означает, что категории появились без обучающих данных. При выполнении запроса мы не сообщаем роутеру правильную задачу; для обучения нашего банковского специалиста использовали размеченные примеры.
|
| 22 |
+
|
| 23 |
+
**Нет генерации ответа токен за токеном. Но нейросеть есть:** основную работу с текстом выполняет 12-слойный энкодер. Поэтому компактность нужно считать честно: около **3,70 MiB весов решений**, но примерно **469 MiB на весь самодостаточный CMF-файл** вместе с энкодером и токенизатором. Это не «модель на три мегабайта».
|
| 24 |
+
|
| 25 |
+
## Почему BANKING77, а не ещё один красивый пример
|
| 26 |
+
|
| 27 |
+
BANKING77 — не название нашей технологии. Это проверочная задача: 77 близких банковских намерений и фиксированный тест из 3080 обращений. Отличить проблему с картой от просьбы изменить PIN интереснее, чем разделить «погоду» и «программирование». Датасет опубликован [PolyAI](https://github.com/PolyAI-LDN/task-specific-datasets) вместе с работой [Casanueva et al., 2020](https://arxiv.org/abs/2003.04807).
|
| 28 |
+
|
| 29 |
+
Для сравнения я вызвал **настоящий TypeSafe Jev через OpenRouter**, версия в ответах — `typesafe/jev-1.13-20260917`. Не стороннюю модель с похожим названием на HF. Условия различаются: CMF обучен на **6996 размеченных примерах**, Jev получил описания категорий и **154 примера** в рубрике. Это сравнение своего обученного специалиста с готовым универсальным сервисом, а не доказательство превосходства архитектуры при равном обучении.
|
| 30 |
+
|
| 31 |
+
| Режим | Правильно | Точность | На какую долю запросов отвечает |
|
| 32 |
+
|---|---:|---:|---:|
|
| 33 |
+
| Cortiq Decision, обязательный выбор | 2818 / 3080 | **91,49%** | 100% |
|
| 34 |
+
| Jev, с двумя спорными случаями в его пользу | не более 2638 / 3080 | **не более 85,65%** | Сравнение по всем 3080 |
|
| 35 |
+
| Cortiq Decision, с правом отказаться | 2254 / 2284 | **98,69%** | **74,16%** |
|
| 36 |
+
|
| 37 |
+
Два результата Jev потерялись из-за слишком строгой проверки округлённых вероятностей в первом клиенте. В таблице оба засчитаны ему как правильные — поэтому это верхняя граница, а не восстановленная точная оценка. Подробности и исходные результаты сохранены в [методике сравнения](https://huggingface.co/infosave/cortiq-decision/blob/main/evidence/banking77/PROTOCOL.md).
|
| 38 |
+
|
| 39 |
+
Самое полезное здесь — не просто больший процент. **Из 3080 обращений модель приняла 2284 решения: 2254 правильных и 30 ошибочных. Ещё 796 оставила следующему этапу.** Порог был выбран на отдельной калибровочной выборке, не по ошибкам теста. Это настройка границы автоматизации, а не гарантия на любой будущий текст. Качество системы с оракулом на оставшихся 796 обращениях здесь не измерялось.
|
| 40 |
+
|
| 41 |
+
Медиана локальной обработки текста на Apple M4 составила **4,8 мс**, сетевого вызова Jev — **348 мс**. Это задержки двух вариантов использования. Из них нельзя делать вывод «наш алгоритм быстрее в 73 раза»: железо сервиса неизвестно, а сеть участвует только во втором пути.
|
| 42 |
|
| 43 |
## 1. Запускаем готовую модель
|
| 44 |
|
|
|
|
| 47 |
```bash
|
| 48 |
python3.12 -m venv .venv
|
| 49 |
source .venv/bin/activate
|
| 50 |
+
pip install huggingface_hub
|
| 51 |
|
| 52 |
hf auth login
|
| 53 |
hf download infosave/cortiq-decision \
|
| 54 |
--local-dir cortiq-decision
|
| 55 |
cd cortiq-decision
|
| 56 |
+
pip install -r requirements-training.txt
|
| 57 |
|
| 58 |
cargo build --release --locked \
|
| 59 |
--manifest-path source/tools/cortiq-decision/Cargo.toml
|
|
|
|
| 72 |
|
| 73 |
Смысл ответа: выбран `change_pin`, источник — локальная CMF-модель. Готовый BANKING77-специалист проверен на английских обращениях; качество на других языках здесь не заявляется.
|
| 74 |
|
| 75 |
+
Теперь поднимем API и оставим этот терминал работающим:
|
| 76 |
|
| 77 |
```bash
|
| 78 |
python3 source/tools/cortiq-decision/serve_model.py cortiq-decision.cmf \
|
|
|
|
| 86 |
|
| 87 |
У каждой обученной модели есть описание задачи: что выбирать и какие варианты допустимы. Его можно получить из API, не переписывая вручную все 77 категорий.
|
| 88 |
|
| 89 |
+
В другом терминале сохраните этот клиент как `client.py` и запустите `python3 client.py`:
|
| 90 |
|
| 91 |
```python
|
| 92 |
import json
|
|
|
|
| 112 |
with urlopen(request) as r:
|
| 113 |
return json.load(r)["answers"]["intent"]["choice"]
|
| 114 |
except HTTPError as e:
|
| 115 |
+
error = json.loads(e.read())
|
| 116 |
+
if e.code == 409 and error["error"]["code"] == "CMF_ABSTAIN":
|
| 117 |
+
return None # Неуверенность или ещё не обученная задача.
|
| 118 |
raise
|
| 119 |
|
| 120 |
print(decide("How do I change my PIN?")) # change_pin
|
|
|
|
| 122 |
|
| 123 |
Дальше обычная логика приложения: `change_pin` — показать инструкцию, `None` — отправить запрос оператору. **Выбор модели сам по себе не разрешает финансовую операцию и не исполняет команду.**
|
| 124 |
|
| 125 |
+
Это тот же принцип интерфейса, что у Jev: состояние плюс типизированные вопросы. Для этой версии опубликованы веса `choice`; наличие в протоколе `score` и `noul` не означает, что банковский специалист уже умеет отвечать на них. Но произвольный новый вопрос не станет освоенным навыком только потому, что мы записали его в JSON. Для своей задачи модель нужно обучить.
|
| 126 |
|
| 127 |
## 3. Создаём модель под свои категории
|
| 128 |
|
|
|
|
| 184 |
--state-dir ./state-inbox-v1 --port 8790
|
| 185 |
```
|
| 186 |
|
| 187 |
+
После обучения используйте для новой версии отдельный каталог состояния. В клиенте меняется адрес на `http://127.0.0.1:8790`. Описание новой задачи он получит сам.
|
| 188 |
|
| 189 |
`--target-accuracy 0.95` задаёт цель калибровки. Можно попробовать `0.98`: обычно это означает меньше автоматических ответов и больше отказов. **Это не обещание 98% на любом будущем сообщении.**
|
| 190 |
|
|
|
|
| 208 |
}
|
| 209 |
```
|
| 210 |
|
| 211 |
+
Теперь знакомый запрос остаётся локальным, а неуверенный может уйти к Jev. **Такой запрос передаёт текст внешнему провайдеру.** В комплектном launcher лимит оракула — $1 и 100 вызовов на каталог состояния; учёт переживает перезапуск. Источник ответа обозначается явно; облачный ответ не выдаётся за работу локальной модели.
|
| 212 |
|
| 213 |
Оракул не переписывает веса автоматически. Практический цикл такой: собрать сложные случаи, независимо проверить разметку, пополнить свои данные, обучить `my-inbox-v2`, сравнить со старой версией и только потом заменить её. Использовать ответы чужой модели для обучения можно лишь при наличии соответствующих прав.
|
| 214 |
|
| 215 |
+
## Новый навык: 1632 байта, но не магия
|
| 216 |
+
|
| 217 |
+
Вернёмся к первому патенту. В его FCD-варианте (*Frozen Core Decomposition*) общее ядро `U/S/V` обучается и замораживается. Задачу задаёт отдельный небольшой вектор, из которого вместе с ядром получается её преобразование. Новый навык не требует изменения старых векторов и общего ядра.
|
| 218 |
|
| 219 |
+
В отдельном локальном эксперименте я последовательно добавил два навыка: потерянная карта и изменение PIN. На одну новую задачу потребовались **24 числа вектора и 384 числа центра**: всего **408 float32, или 1632 байта параметров**. Это размер новых параметров, **не всей модели, не самостоятельного файла и не объёма памяти runtime**. Метаданные, энкодер и общее яд��о считаются отдельно.
|
| 220 |
|
| 221 |
+
Самый неожиданный результат оказался не в размере. **Можно не изменить ни одного старого веса — и всё равно ухудшить старые решения.** Новая топология способна начать выигрывать на чужих запросах. Заморозка защищает параметры, но не выбор победителя.
|
| 222 |
|
| 223 |
+
Поэтому мы проверяли не только неизменность ядра, но и поведение. После двух добавлений **все 43 старых контрольных решения сохранились**, как и правильные ответы первого нового навыка после появления второго. Для допуска новых топологий понадобились собственные пороги ошибки реконструкции.
|
| 224 |
|
| 225 |
+
Цена осторожности видна в независимом тесте: потерянная карта — **100% precision при 40% recall**, изменение PIN — **92,59% при 62,5%**. То есть принятые ответы достаточно точны, но значительная часть нужных случаев ещё не распознаётся. Это два проверенных добавления, не доказательство бесконечного обучения без забывания; ёмкость текущего ядра конечна.
|
| 226 |
+
|
| 227 |
+
**Не смешиваем две модели:** результат 91,49% и скачиваемый HF-файл относятся к affine-специалисту. FCD — отдельный эксперимент; его веса, полученные из рабочей базы роутера, в HF-пакет не включены. Команда `build_model.py` выше обучает affine-модель, а не FCD. [Отчёт FCD](https://huggingface.co/infosave/cortiq-decision/blob/main/evidence/release/fcd-incremental-acceptance.json) опубликован отдельно.
|
| 228 |
+
|
| 229 |
+
## GPU ускорил поток, но почти не ускорил один запрос
|
| 230 |
+
|
| 231 |
+
Ещё один полезный антиинтуитивный результат: «перенести на GPU» не равно «сократить ожидание пользователя».
|
| 232 |
+
|
| 233 |
+
В одинаковом интерфейсе с межпроцессным обменом медиана одиночного запроса составила **6,10 мс на CPU и 6,14 мс на Metal**. Зато энкодирование пакета из 128 текстов — **135 против 671 текста/с**, почти пятикратная разница. Это разные задачи: задержка одного обращения и пропускная способность очереди. Оба числа включают работу энкодера; пакетный замер не включает HTTP.
|
| 234 |
+
|
| 235 |
+
На всех 3080 тестовых примерах Metal сохранил победителей и решения порога относительно CPU. Отдельно проверен Vulkan-классификатор на NVIDIA, но перенос энкодера на Vulkan ещё не выполнен. Поэтому полного ускорения текста на Vulkan я не заявляю.
|
| 236 |
+
|
| 237 |
+
## Что стоит забрать из этого эксперимента
|
| 238 |
+
|
| 239 |
+
Не обязательно уменьшать большую генеративную модель ради каждого `if` в приложении. Иногда полезнее **отделить повторяющееся решение от написания ответа**: обучить небольшой специализированный компонент, откалибровать отказ и поставить его перед человеком или облачной моделью.
|
| 240 |
+
|
| 241 |
+
BANKING77 в этом релизе — отправная точка. Практический результат для читателя — возможность заменить его своими категориями, получить свой CMF и обслуживать известную задачу локально. А направление FCD — добавлять новые навыки малыми порциями, каждый раз проверяя не только веса, но и то, кому теперь достаются старые запросы.
|
| 242 |
|
| 243 |
---
|
| 244 |
|
| 245 |
+
**Материалы:** [модель и runtime на HF](https://huggingface.co/infosave/cortiq-decision) · [подробная методика и ограничения](https://huggingface.co/infosave/cortiq-decision/blob/main/ARTICLE_TECHNICAL_APPENDIX_RU.md) · [связь с первой патентной заявкой](https://huggingface.co/infosave/cortiq-decision/blob/main/PATENT_NOTE.md).
|
| 246 |
+
|
| 247 |
+
Релиз пока закрытый. Модель проверена как англоязычный банковский классификатор, не как финансовый советник, исполнитель операций или универсальная замена Jev. Многоязычный энкодер сам по себе не подтверждает качество на других языках.
|
PATENT_NOTE.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Resonance routing: Patent 1 and this implementation
|
| 2 |
+
|
| 3 |
+
**Inventor:** Oleg Urevich Kirichenko
|
| 4 |
+
**U.S. patent application:** 19/452,440
|
| 5 |
+
**Filing date:** 19 January 2026
|
| 6 |
+
**Title:** System and Method for Unsupervised Multi-Task Routing via Signal Reconstruction Resonance
|
| 7 |
+
|
| 8 |
+
The application number and filing date were checked against the inventor's USPTO
|
| 9 |
+
Updated Filing Receipt, mailed 26 March 2026. This note identifies an application;
|
| 10 |
+
it does not assert that a patent has been granted or report a current prosecution
|
| 11 |
+
status. Private filing correspondence and personal contact details are not distributed.
|
| 12 |
+
|
| 13 |
+
## The mechanism, in plain language
|
| 14 |
+
|
| 15 |
+
Process the same input representation through isolated task-specific topologies.
|
| 16 |
+
Measure how well each topology reconstructs that representation, then select the
|
| 17 |
+
one with the smallest reconstruction error. The routing decision comes from the
|
| 18 |
+
topologies' own transformations—not a separately trained task-ID classifier.
|
| 19 |
+
“Unsupervised routing” means no correct task identifier is supplied at inference;
|
| 20 |
+
it does not mean the released category models were trained without labels.
|
| 21 |
+
|
| 22 |
+
The reviewed Patent 1 specification describes two embodiments:
|
| 23 |
+
|
| 24 |
+
- **Dynamic Topology Graph:** task-specific attention masks and projection modules.
|
| 25 |
+
- **Frozen Core Decomposition:** shared frozen tensor core/factors and task vectors,
|
| 26 |
+
with Tucker-style contraction producing task-specific transformations.
|
| 27 |
+
|
| 28 |
+
The reviewed technical basis is the specification in the `Patent1_Signal_Resonance_Routing`
|
| 29 |
+
folder, including sections 4.1–4.3, Example 3 and all 13 claims—not the different
|
| 30 |
+
root-level draft bearing the same filename.
|
| 31 |
+
|
| 32 |
+
## What is implemented and what is not
|
| 33 |
+
|
| 34 |
+
| Component | Role in this release |
|
| 35 |
+
|---|---|
|
| 36 |
+
| Reconstruction-based selection | The released affine specialist uses per-category centers and learned reconstruction directions; no separate trained gate. |
|
| 37 |
+
| FCD, frozen U/S/V plus task vectors | A separate tested local model. Not the BANKING77 weights in this repository. |
|
| 38 |
+
| DTG attention-mask embodiment | Not implemented as the decision model in this release. |
|
| 39 |
+
| CMF, typed API, oracle, calibration and release controls | Engineering around the selection mechanism; not attributed wholesale to Patent 1. |
|
| 40 |
+
| Execution | This package returns a typed choice. The consuming application performs and authorizes the chosen action. |
|
| 41 |
+
|
| 42 |
+
The local FCD implementation explicitly centers embeddings. In dimensionally
|
| 43 |
+
consistent notation, U and V both have shape d×r, S has shape r×r×k, and each task
|
| 44 |
+
vector v_t has k components:
|
| 45 |
+
|
| 46 |
+
```text
|
| 47 |
+
A_t = sum_j S[:, :, j] * v_t[j]
|
| 48 |
+
x_hat_t = mu_t + U @ A_t @ V.T @ (x - mu_t)
|
| 49 |
+
E_t = mean((x - x_hat_t)^2)
|
| 50 |
+
```
|
| 51 |
+
|
| 52 |
+
Centering, support gates and the release acceptance procedure are implementation
|
| 53 |
+
details. A frozen core prevents changes to its parameters, not all possible routing
|
| 54 |
+
regressions: a newly added topology may win on an old input. The experiment therefore
|
| 55 |
+
checks old decisions as well as hashes. After two additions all 43 old controls
|
| 56 |
+
were unchanged; this is finite-test evidence, not a universal no-forgetting theorem.
|
| 57 |
+
|
| 58 |
+
This is a technical mapping, not an opinion on claim scope, validity, infringement
|
| 59 |
+
or patentability. Software and component licenses remain as described in LICENSES.md.
|
README.md
CHANGED
|
@@ -7,137 +7,313 @@ tags:
|
|
| 7 |
- cmf
|
| 8 |
- decision-model
|
| 9 |
- banking77
|
|
|
|
| 10 |
- selective-classification
|
| 11 |
-
- experimental
|
| 12 |
license: other
|
| 13 |
license_name: component-licenses
|
| 14 |
license_link: https://huggingface.co/infosave/cortiq-decision/blob/main/LICENSES.md
|
| 15 |
---
|
| 16 |
# Cortiq Decision
|
| 17 |
|
| 18 |
-
|
| 19 |
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
-
|
| 23 |
-
77 affine reconstruction models. No autoregressive text generation. This artifact
|
| 24 |
-
is **not** the experimental FCD model and is not an arbitrary-question Jev replica.
|
| 25 |
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
-
|
|
|
|
|
|
|
| 29 |
|
| 30 |
-
|
| 31 |
|
| 32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
pip install -r requirements-training.txt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
python3 source/tools/cortiq-decision/build_model.py \
|
| 35 |
--base cortiq-decision.cmf --binary "$BIN" \
|
| 36 |
--data examples.jsonl --task task.json --name my-inbox \
|
| 37 |
--target-accuracy 0.95 --output my-inbox-v1
|
| 38 |
```
|
| 39 |
|
| 40 |
-
The
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
-
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
-
|
| 50 |
-
|---|---:|---:|---:|
|
| 51 |
-
| CMF, forced choice | 2818 / 3080 | 91.4935% | 100% |
|
| 52 |
-
| TypeSafe Jev API, conservative credit of two client-validation incidents | 2638 / 3080 | 85.6494% | 100% |
|
| 53 |
-
| CMF, calibration-selected probability threshold 0.85 | 2254 / 2284 | 98.6865% | 74.1558% |
|
| 54 |
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
|
|
|
| 59 |
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
Jev server RAM/VRAM/energy are unknown. Detailed evidence and limitations accompany this release.
|
| 64 |
|
| 65 |
-
##
|
| 66 |
|
| 67 |
-
|
|
|
|
|
|
|
| 68 |
|
| 69 |
-
```
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
```
|
| 76 |
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
## Limits
|
| 113 |
-
|
| 114 |
-
English banking-intent benchmark only. No financial advice, transaction execution,
|
| 115 |
-
validated legal/medical decisions, general reasoning or demonstrated multilingual
|
| 116 |
-
classification quality. Near duplicates and public-test pretraining contamination
|
| 117 |
-
are not fully excluded. Do not deploy as a public unauthenticated service.
|
| 118 |
-
|
| 119 |
-
The separate private-production seed and its derived FCD weights, request history,
|
| 120 |
-
SQLite registry, keys, SSH/WireGuard configuration, and web assets are **not included**.
|
| 121 |
-
No Jev responses were used as training labels. See `LICENSES.md` and the accompanying
|
| 122 |
-
Russian article for the distinct FCD experiment and exact scopes of each result.
|
| 123 |
-
|
| 124 |
-
## Additional verified implementations
|
| 125 |
-
|
| 126 |
-
* F32 Metal encoder: 3,080/3,080 same winners and same .85 gate as CPU.
|
| 127 |
-
On the same DEV batch=128, 671 vs 135 texts/s; single-request worker p50
|
| 128 |
-
6.14 vs 6.10 ms (no median single-request win). RSS after single-workload:
|
| 129 |
-
0.89 vs 1.66 GiB; not peak memory. See runtime-{metal,cpu}.json.
|
| 130 |
-
* Linux / RTX PRO 4000 Blackwell / Vulkan scorer: all 3,080 winners and gates
|
| 131 |
-
agree, max reconstruction-error delta 1.43e-6. Batch=128 p50: 2.190 ms Vulkan
|
| 132 |
-
vs 114.625 ms CPU. This is scorer-only with precomputed embeddings, measured
|
| 133 |
-
under a pre-existing GPU job, not full-text speed or idle-card maximum.
|
| 134 |
-
* Included isolated source builds successfully; supplied CMF loads and infers
|
| 135 |
-
offline; HTTP package smoke succeeds and serves no web UI.
|
| 136 |
-
* The FCD experiment described in ARTICLE_RU.md is a different, local model:
|
| 137 |
-
its production-derived weights are deliberately not included in this repository.
|
| 138 |
-
|
| 139 |
-
The working notebook/workstation had unrelated background applications. All scopes,
|
| 140 |
-
client-validation incidents and limitations are retained in evidence, not removed
|
| 141 |
-
in favor of the headline metrics. Article: [Russian version](ARTICLE_RU.md).
|
| 142 |
-
|
| 143 |
-
Reproduce the full local test without paid API calls: `./reproduce.sh /path/to/new-output`. This evaluates the already-frozen model; it does not fit on test labels.
|
|
|
|
| 7 |
- cmf
|
| 8 |
- decision-model
|
| 9 |
- banking77
|
| 10 |
+
- intent-classification
|
| 11 |
- selective-classification
|
|
|
|
| 12 |
license: other
|
| 13 |
license_name: component-licenses
|
| 14 |
license_link: https://huggingface.co/infosave/cortiq-decision/blob/main/LICENSES.md
|
| 15 |
---
|
| 16 |
# Cortiq Decision
|
| 17 |
|
| 18 |
+
**Local decisions. Your labels. One CMF model file.**
|
| 19 |
|
| 20 |
+
Cortiq Decision turns text into a choice for your application—without generating a
|
| 21 |
+
response token by token. Run the included **77-class banking-intent specialist**,
|
| 22 |
+
or train a new specialist on your own categories using the same frozen encoder.
|
| 23 |
+
When the acceptance policy cannot support a decision, the API abstains.
|
| 24 |
|
| 25 |
+
[Quickstart](#quickstart) · [Train your model](#train-your-model) · [Evaluation](#evaluation) · [Русская статья](ARTICLE_RU.md)
|
|
|
|
|
|
|
| 26 |
|
| 27 |
+
| BANKING77, 3,080 test examples | Measured result |
|
| 28 |
+
|---|---:|
|
| 29 |
+
| Accuracy, answering every example | **91.49%** |
|
| 30 |
+
| Accuracy among accepted answers | **98.69% at 74.16% coverage** |
|
| 31 |
+
| Warm local text inference, CPU p50 | **4.78 ms** on Apple M4 |
|
| 32 |
+
| Self-contained model / decision weights only | **468.70 MiB / 3.70 MiB** |
|
| 33 |
|
| 34 |
+
The selective configuration made **2,254 correct decisions, 30 incorrect decisions,
|
| 35 |
+
and 796 abstentions**. These are held-out results, not a guarantee for new domains.
|
| 36 |
+
The latency is in-process text inference, not HTTP latency or a service SLA.
|
| 37 |
|
| 38 |
+
## What this release is
|
| 39 |
|
| 40 |
+
**Private research release · 25 September 2026 · author: Oleg Urevich Kirichenko**
|
| 41 |
+
|
| 42 |
+
The model combines a frozen multilingual MiniLM encoder with task-specific affine
|
| 43 |
+
reconstruction models. Each category attempts to reconstruct the same 384-dimensional
|
| 44 |
+
text embedding. The category with the smallest residual error wins; a separately
|
| 45 |
+
calibrated policy decides whether to accept it. There is **no separately trained
|
| 46 |
+
routing/gating network**, but the category models themselves use labeled data.
|
| 47 |
+
|
| 48 |
+

|
| 49 |
+
|
| 50 |
+
**Good fit:** repeated intent classification, support triage, and choosing a
|
| 51 |
+
predefined workflow or tool after training on representative examples.
|
| 52 |
+
**Not a fit:** writing answers, unseen arbitrary questions, financial advice, or
|
| 53 |
+
allowing consequential actions without your own authorization checks.
|
| 54 |
+
|
| 55 |
+
BANKING77 is the starter task—not the product name and not a universal capability.
|
| 56 |
+
This is an **affine model, not the separate experimental FCD model**. CMF uses the
|
| 57 |
+
supplied runtime; `transformers.from_pretrained()` does not load this format.
|
| 58 |
+
|
| 59 |
+
## Quickstart
|
| 60 |
+
|
| 61 |
+
Prerequisites: **Python 3.12, Rust/Cargo**, and an HF account with access to this
|
| 62 |
+
private repository. Apple Silicon CPU inference is the tested end-to-end platform.
|
| 63 |
+
|
| 64 |
+
```bash
|
| 65 |
+
python3.12 -m venv .venv
|
| 66 |
+
source .venv/bin/activate
|
| 67 |
+
pip install huggingface_hub
|
| 68 |
+
hf auth login
|
| 69 |
+
hf download infosave/cortiq-decision --local-dir cortiq-decision
|
| 70 |
+
cd cortiq-decision
|
| 71 |
pip install -r requirements-training.txt
|
| 72 |
+
|
| 73 |
+
cargo build --release --locked \
|
| 74 |
+
--manifest-path source/tools/cortiq-decision/Cargo.toml
|
| 75 |
+
export BIN="$PWD/source/tools/cortiq-decision/target/release/cortiq-decision"
|
| 76 |
+
|
| 77 |
+
"$BIN" infer cortiq-decision.cmf 'How do I change my PIN?' \
|
| 78 |
+
--policy policy.json
|
| 79 |
+
```
|
| 80 |
+
|
| 81 |
+
The accepted example selects `change_pin`. Initial installation/build downloads
|
| 82 |
+
dependencies; inference uses the encoder and tokenizer inside the CMF and needs no
|
| 83 |
+
model download, cloud key, or cloud call.
|
| 84 |
+
|
| 85 |
+
Start the API and leave this terminal running:
|
| 86 |
+
|
| 87 |
+
```bash
|
| 88 |
+
python3 source/tools/cortiq-decision/serve_model.py cortiq-decision.cmf \
|
| 89 |
+
--binary "$BIN" --policy policy.json \
|
| 90 |
+
--state-dir ./state-banking --port 8789
|
| 91 |
+
```
|
| 92 |
+
|
| 93 |
+
It binds to **127.0.0.1**. There is no website/dashboard at `/`. Do not expose this
|
| 94 |
+
research server publicly without authentication and deployment hardening.
|
| 95 |
+
|
| 96 |
+
### Call from your application
|
| 97 |
+
|
| 98 |
+
In another terminal, save this as `client.py` and run `python3 client.py`.
|
| 99 |
+
The client fetches the exact trained contract instead of inventing a new question.
|
| 100 |
+
|
| 101 |
+
```python
|
| 102 |
+
import json
|
| 103 |
+
from urllib.request import Request, urlopen
|
| 104 |
+
from urllib.error import HTTPError
|
| 105 |
+
|
| 106 |
+
BASE = "http://127.0.0.1:8789"
|
| 107 |
+
with urlopen(BASE + "/v1/models") as response:
|
| 108 |
+
task = json.load(response)["families"][0]["contract"]
|
| 109 |
+
question = {k: v for k, v in task.items() if k != "input_template"}
|
| 110 |
+
|
| 111 |
+
def decide(text):
|
| 112 |
+
payload = {"model": "cortiq/decision-v1", "state": text,
|
| 113 |
+
"questions": {"intent": question},
|
| 114 |
+
"cmf": {"allow_oracle": False}}
|
| 115 |
+
request = Request(BASE + "/api/alpha/decisions",
|
| 116 |
+
data=json.dumps(payload).encode(),
|
| 117 |
+
headers={"Content-Type": "application/json"})
|
| 118 |
+
try:
|
| 119 |
+
with urlopen(request) as response:
|
| 120 |
+
result = json.load(response)
|
| 121 |
+
return result["answers"]["intent"]["choice"]
|
| 122 |
+
except HTTPError as error:
|
| 123 |
+
body = json.loads(error.read())
|
| 124 |
+
if error.code == 409 and body["error"]["code"] == "CMF_ABSTAIN":
|
| 125 |
+
return None # Hand off; do not fabricate a local answer.
|
| 126 |
+
raise
|
| 127 |
+
|
| 128 |
+
print(decide("How do I change my PIN?")) # change_pin
|
| 129 |
+
```
|
| 130 |
+
|
| 131 |
+
The full response also contains option probabilities and per-question provenance at
|
| 132 |
+
`cmf.questions.intent.source`. `/v1/decisions` is an alias. An unsupported contract
|
| 133 |
+
or a below-policy prediction returns `409 / CMF_ABSTAIN` when no permitted oracle
|
| 134 |
+
can answer. New prose in `instructions` does **not** create a new local skill.
|
| 135 |
+
|
| 136 |
+
## Train your model
|
| 137 |
+
|
| 138 |
+
Provide a task contract in `task.json`:
|
| 139 |
+
|
| 140 |
+
```json
|
| 141 |
+
{
|
| 142 |
+
"type": "choice",
|
| 143 |
+
"instructions": "Choose the team that should handle this message.",
|
| 144 |
+
"criteria": {
|
| 145 |
+
"sales": "Buying, pricing, or a commercial proposal",
|
| 146 |
+
"support": "A problem with an existing product",
|
| 147 |
+
"spam": "Unsolicited or irrelevant advertising"
|
| 148 |
+
}
|
| 149 |
+
}
|
| 150 |
+
```
|
| 151 |
+
|
| 152 |
+
Provide real labeled examples in `examples.jsonl`, one per line:
|
| 153 |
+
|
| 154 |
+
```jsonl
|
| 155 |
+
{"text":"Can you quote 20 seats for our team?","label":"sales"}
|
| 156 |
+
{"text":"I cannot log in after the update.","label":"support"}
|
| 157 |
+
{"text":"Buy a million email addresses today!","label":"spam"}
|
| 158 |
+
```
|
| 159 |
+
|
| 160 |
+
These three lines illustrate the schema; **they are not enough to train or validate
|
| 161 |
+
a model**. The builder requires at least 20 unique examples per class as an input
|
| 162 |
+
minimum. Its calibration and acceptance checks generally need substantially more.
|
| 163 |
+
Group related/near-duplicate examples before preparing your data; exact deduplication
|
| 164 |
+
alone does not prevent leakage from paraphrases or repeated customer conversations.
|
| 165 |
+
|
| 166 |
+
```bash
|
| 167 |
python3 source/tools/cortiq-decision/build_model.py \
|
| 168 |
--base cortiq-decision.cmf --binary "$BIN" \
|
| 169 |
--data examples.jsonl --task task.json --name my-inbox \
|
| 170 |
--target-accuracy 0.95 --output my-inbox-v1
|
| 171 |
```
|
| 172 |
|
| 173 |
+
The builder reuses **only the encoder** from the base, not its banking categories.
|
| 174 |
+
It separates train/dev/calibration/test, trains an affine specialist, calibrates its
|
| 175 |
+
policy, exports a CMF and evaluates the frozen candidate on the held-out test.
|
| 176 |
+
No external API is called and no Jev labels are required.
|
| 177 |
|
| 178 |
+
| Output | Purpose |
|
| 179 |
+
|---|---|
|
| 180 |
+
| `model.cmf` | Your self-contained trained model |
|
| 181 |
+
| `policy.json` | Model-bound acceptance policy |
|
| 182 |
+
| `contract.json` | Your task and allowed answers |
|
| 183 |
+
| `acceptance.json` | Held-out quality, coverage and `deployment_recommended` |
|
| 184 |
|
| 185 |
+
**Read `acceptance.json` before deploying.** The launcher refuses a candidate marked
|
| 186 |
+
`deployment_recommended: false`. The target is a calibration objective, not a promise
|
| 187 |
+
of 95% accuracy everywhere. Keep the test out of tuning; collect new independent
|
| 188 |
+
validation data when iterating on your task.
|
| 189 |
|
| 190 |
+
For an accepted candidate:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
|
| 192 |
+
```bash
|
| 193 |
+
python3 source/tools/cortiq-decision/serve_model.py my-inbox-v1/model.cmf \
|
| 194 |
+
--binary "$BIN" --policy my-inbox-v1/policy.json \
|
| 195 |
+
--state-dir ./state-inbox-v1 --port 8790
|
| 196 |
+
```
|
| 197 |
|
| 198 |
+
Point the client at port 8790; it will fetch your new contract. Use a **new model
|
| 199 |
+
version and state directory** for an update. This simple builder handles text-based
|
| 200 |
+
choice tasks, not arbitrary zero-shot question answering.
|
|
|
|
| 201 |
|
| 202 |
+
## Optional Jev fallback
|
| 203 |
|
| 204 |
+
Local-only is the default request behavior. To enable fallback, restart the server
|
| 205 |
+
with `--oracle-key-prompt`, enter an OpenRouter key at the hidden prompt, and explicitly
|
| 206 |
+
set both permissions in a request:
|
| 207 |
|
| 208 |
+
```json
|
| 209 |
+
"cmf": {
|
| 210 |
+
"allow_oracle": true,
|
| 211 |
+
"approved_for_external": true,
|
| 212 |
+
"consent_store": false
|
| 213 |
+
}
|
| 214 |
+
```
|
| 215 |
+
|
| 216 |
+
This fragment replaces the `cmf` field in the request above. Unresolved questions
|
| 217 |
+
can then be sent to **`typesafe/jev-1.13` only**, through OpenRouter's Decisions API.
|
| 218 |
+
**The request state leaves your machine.** Cloud answers are marked `jev_oracle`;
|
| 219 |
+
they are not presented as local inference. The launcher has a $1 / 100-call oracle
|
| 220 |
+
limit per state directory, with durable accounting across restarts. Keys stay in
|
| 221 |
+
process memory. `consent_store` independently controls saving examples for review.
|
| 222 |
+
|
| 223 |
+
An oracle answer does not automatically become training truth. Review labels,
|
| 224 |
+
check data/model-output rights, train an isolated candidate, and validate before
|
| 225 |
+
replacement. The benchmark below did not train on Jev responses.
|
| 226 |
+
|
| 227 |
+
## Evaluation
|
| 228 |
+
|
| 229 |
+
Same **3,080 official BANKING77 test examples**, different supervision:
|
| 230 |
+
|
| 231 |
+
| System | Correct / evaluated | Accuracy |
|
| 232 |
+
|---|---:|---:|
|
| 233 |
+
| Cortiq Decision, forced choice | 2,818 / 3,080 | **91.49%** |
|
| 234 |
+
| TypeSafe Jev 1.13, conservative upper bound | at most 2,638 / 3,080 | **at most 85.65%** |
|
| 235 |
+
| Cortiq Decision, selective policy | 2,254 / 2,284 accepted | **98.69% at 74.16% coverage** |
|
| 236 |
+
|
| 237 |
+
**This is specialist vs hosted general service, not matched training.** CMF used
|
| 238 |
+
6,996 training labels; Jev received 154 training examples in its rubric. Jev's
|
| 239 |
+
original validated responses contained 2,636 correct answers. Two responses were
|
| 240 |
+
lost to the first client's probability-validation rule; both are credited as correct
|
| 241 |
+
in the upper bound. They were not replaced with favorable retries.
|
| 242 |
+
|
| 243 |
+
<details>
|
| 244 |
+
<summary><strong>Method, reproducibility and timing boundaries</strong></summary>
|
| 245 |
+
|
| 246 |
+
- Data: [PolyAI BANKING77](https://github.com/PolyAI-LDN/task-specific-datasets),
|
| 247 |
+
revision `57ec275d8078af65b7731c2a98be812d844a6d6b`, CC-BY-4.0;
|
| 248 |
+
[Casanueva et al., 2020](https://arxiv.org/abs/2003.04807).
|
| 249 |
+
- Removed seven normalized train/test overlaps and deduplicated train; resulting
|
| 250 |
+
split: 6,996 train / 1,498 dev / 1,498 calibration. Rank selected on dev;
|
| 251 |
+
temperature and acceptance threshold on separate 749-row calibration halves.
|
| 252 |
+
Final test labels did not fit these choices. Full-choice macro-F1: 91.4860%.
|
| 253 |
+
- Encoder: [Xenova multilingual MiniLM-L12-v2](https://huggingface.co/Xenova/paraphrase-multilingual-MiniLM-L12-v2),
|
| 254 |
+
revision `2c4055b12046f11709e9df2c122e59ffbdc2f900`, based on the
|
| 255 |
+
[Sentence Transformers model](https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2).
|
| 256 |
+
384 dimensions, mean pooling, maximum 512 tokens, original tokenizer and two F32
|
| 257 |
+
L2 normalizations. Longer inputs are truncated, not fully understood.
|
| 258 |
+
- A 0.85 **maximum-option-probability** gate accepts 2,284 examples, including 30
|
| 259 |
+
errors. It is not the API's normalized-Gini `confidence` field. No out-of-domain
|
| 260 |
+
safety guarantee is claimed. Hybrid quality after oracle fallback was not measured.
|
| 261 |
+
- Actual Jev response version: `typesafe/jev-1.13-20260917`, provider TypeSafe.
|
| 262 |
+
No independent HF replica was substituted.
|
| 263 |
+
- Warm CPU text inference p50: **4.776 ms**. Hosted Jev p50: **348.329 ms**, including
|
| 264 |
+
network. These are different execution paths, not a hardware-normalized speedup.
|
| 265 |
+
Jev's server memory, compute and energy are unknown.
|
| 266 |
+
- Metal F32 encoder: identical winners and 0.85-gate outcomes on all 3,080 cases.
|
| 267 |
+
Encoder batch 128: **671 vs 135 texts/s** (Metal vs CPU). Single-request worker
|
| 268 |
+
p50: **6.14 vs 6.10 ms**, including IPC, no HTTP—no single-request median win.
|
| 269 |
+
- Vulkan scorer on RTX PRO 4000 Blackwell: identical winners/gates on all 3,080
|
| 270 |
+
precomputed embeddings. This is **not a Vulkan text encoder**. Timings were
|
| 271 |
+
measured under an existing competing GPU workload.
|
| 272 |
+
- Optional Metal dependencies: `pip install -r requirements-metal.txt`, then use
|
| 273 |
+
the launcher with `--metal` on Apple Silicon. Derived caches stay outside CMF.
|
| 274 |
+
- [Protocol](evidence/banking77/PROTOCOL.md) · [comparison](evidence/banking77/comparison.json) ·
|
| 275 |
+
[client incidents](evidence/banking77/HARNESS_INCIDENTS.md) ·
|
| 276 |
+
[release equivalence](evidence/release/release-acceptance.json) ·
|
| 277 |
+
[CPU resources](evidence/release/runtime-cpu.json) · [Metal resources](evidence/release/runtime-metal.json).
|
| 278 |
+
|
| 279 |
+
Re-evaluate the frozen model locally, without a paid API call:
|
| 280 |
+
|
| 281 |
+
```bash
|
| 282 |
+
./reproduce.sh /path/to/new-output
|
| 283 |
```
|
| 284 |
|
| 285 |
+
File integrity is recorded in `SHA256SUMS`. The isolated runtime builds, the package
|
| 286 |
+
passes 35 Python tests, and the custom-model CLI was exercised through training,
|
| 287 |
+
export, independent holdout and HTTP serving. The latter used a **synthetic functional
|
| 288 |
+
fixture**, not an additional real-world quality benchmark.
|
| 289 |
+
|
| 290 |
+
</details>
|
| 291 |
+
|
| 292 |
+
## Research lineage: resonance routing and FCD
|
| 293 |
+
|
| 294 |
+
The routing design draws on **U.S. patent application 19/452,440**, filed
|
| 295 |
+
**19 January 2026**, *System and Method for Unsupervised Multi-Task Routing via Signal
|
| 296 |
+
Reconstruction Resonance*. This identifies an **application**, not a granted patent.
|
| 297 |
+
See the [technical and patent note](PATENT_NOTE.md).
|
| 298 |
+
|
| 299 |
+
In the separate FCD experiment, frozen `U/S/V` are shared and new tasks receive small
|
| 300 |
+
isolated parameter sets. Two sequential additions preserved all **43 old control
|
| 301 |
+
decisions**. Each new task used **1,632 bytes of numeric parameters**, excluding the
|
| 302 |
+
encoder, core and metadata. New-skill recall remains limited; this is not proof of
|
| 303 |
+
universal no-forgetting or unlimited growth. **Those production-derived FCD weights
|
| 304 |
+
are not included here, and the BANKING77 scores above do not belong to FCD.**
|
| 305 |
+
|
| 306 |
+
## Limitations and license
|
| 307 |
+
|
| 308 |
+
- Evaluated on English banking intents. A multilingual encoder is not evidence of
|
| 309 |
+
validated multilingual classification, general reasoning or unseen-task ability.
|
| 310 |
+
- Near duplicates and public-data pretraining contamination are not fully ruled out.
|
| 311 |
+
Confidence can be wrong, especially after domain shift.
|
| 312 |
+
- A returned category does not execute a tool or authorize an action. Keep access
|
| 313 |
+
control, transaction checks and consequential decisions outside the classifier.
|
| 314 |
+
- No production seed, private FCD weights, request history, credentials, state
|
| 315 |
+
database or web interface is bundled.
|
| 316 |
+
- Code, data and encoder have component-specific terms; see [LICENSES.md](LICENSES.md).
|
| 317 |
+
This card does not replace those licenses.
|
| 318 |
+
|
| 319 |
+
**Start with one bounded decision, representative labels and a meaningful refusal path.**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RELEASE_NOTES.md
CHANGED
|
@@ -10,3 +10,5 @@ functional fixture. These fixture metrics are not scientific quality claims.
|
|
| 10 |
The repository and main model filename were shortened to Cortiq Decision. The
|
| 11 |
included starter weights remain the BANKING77 specialist; branding does not make
|
| 12 |
them a universal zero-shot model. The prior commits remain available in HF history.
|
|
|
|
|
|
|
|
|
| 10 |
The repository and main model filename were shortened to Cortiq Decision. The
|
| 11 |
included starter weights remain the BANKING77 specialist; branding does not make
|
| 12 |
them a universal zero-shot model. The prior commits remain available in HF history.
|
| 13 |
+
|
| 14 |
+
The article and model card were rewritten around the actual workflow and reconstruction mechanism. Patent 1 is identified as application 19/452,440, not a grant. Both embedded Python clients were executed locally, including abstention. Diagram assets are static documentation only. Checksum generation excludes runtime bytecode/build caches consistently with upload filtering.
|
SHA256SUMS
CHANGED
|
@@ -1,8 +1,9 @@
|
|
| 1 |
-
|
| 2 |
4b30194ad9a38de02a937a3b00e4f27db8bc7cba5a981b0166262a4f4da9e3f1 ARTICLE_TECHNICAL_APPENDIX_RU.md
|
| 3 |
3bcff101bcd473a82cf9c5f6e342e57940e5b8f7aa6323c8602e6e793095a8de LICENSES.md
|
| 4 |
-
|
| 5 |
-
|
|
|
|
| 6 |
1d1708069621ea6f2f8c0bf8ee120a74dcdc8b3a8c3590c658de90e59a3317b1 contract.json
|
| 7 |
4cdaf9ec19054f17cd34d420a56f4c8bb0eed12c2429732e9baf902ef52303df cortiq-decision.cmf
|
| 8 |
ceeb47cab7a611169bedbe38b62441b0c58794a05295eeff751550b7640708a8 evidence/banking77/HARNESS_INCIDENTS.md
|
|
@@ -23,6 +24,8 @@ b6add684980296431b2c66492655d7d7fb5599e0b52329fe36c5d9d3d81df09a evidence/banki
|
|
| 23 |
2acd7929f2308170163e0ee72ef63873bdbeadbbcaca6dac2cfa4a6366c2fb5f evidence/release/build-cpu.txt
|
| 24 |
637dbb075d3f157a5902d7ceb00ebc6b5bcf65335c38cde485b3ba7b4cec58dc evidence/release/build-model-cli-fixture.txt
|
| 25 |
f1b6afa213c7eee891dce27267b16ddd6fcf878056108dfaa9516f916a9555f0 evidence/release/clippy.txt
|
|
|
|
|
|
|
| 26 |
ae9ef4a2695c27618f08ea72925dec58abc0789b476f657d7310652e25ce698a evidence/release/fcd-incremental-acceptance.json
|
| 27 |
ae9ef4a2695c27618f08ea72925dec58abc0789b476f657d7310652e25ce698a evidence/release/fcd-incremental-console.txt
|
| 28 |
4e2ee635fd044eb0d68b1fb75fea954d77e82e2c05d68c2b7089ed3d0707ea1c evidence/release/fcd-incremental-protocol.json
|
|
@@ -56,6 +59,8 @@ eb51be7c3acf817fdca4f86b7a901e540c7b375d6307e757e6b89d41a27aeabc evidence/relea
|
|
| 56 |
9448fca2db97cbd2f6e5a6b1a13c225cff511f959b3b4e20babeaef0201d8995 evidence/release/vulkan-linux-tests.txt
|
| 57 |
3a6b20fc5c8943b30b43a0084f8d307c21d856c0684183e390b5d89f7f7382ae evidence/release/vulkan-shader-test.txt
|
| 58 |
14b401166825d22d9a2a3771becb2632018c21d6fd4ed370246e83d45a8ea984 figures/banking77-results.png
|
|
|
|
|
|
|
| 59 |
0bf59d136536dea5dcf80ce96c5988e46522ce69f3ae817666c7f5d10ded6618 licenses/Apache-2.0.txt
|
| 60 |
7e7170e3cebf88a9f60c7b8421418323c09304da1af4d5e90f4da1dc1c8a2661 licenses/BANKING77-CC-BY-4.0.txt
|
| 61 |
41ac81b48406cffd95db849913238063dacf58419b15c7c7c56b9d3a5755608b licenses/encoder-source.json
|
|
|
|
| 1 |
+
d786cd5135f3f9256f7bb1ef43ca828c864890d6e233b1ca12d3e39ef6d67703 ARTICLE_RU.md
|
| 2 |
4b30194ad9a38de02a937a3b00e4f27db8bc7cba5a981b0166262a4f4da9e3f1 ARTICLE_TECHNICAL_APPENDIX_RU.md
|
| 3 |
3bcff101bcd473a82cf9c5f6e342e57940e5b8f7aa6323c8602e6e793095a8de LICENSES.md
|
| 4 |
+
1d09b8b10bd28512c60f96d5a64d319a73c5c4e3c8228e7d337767e4a8dc1b78 PATENT_NOTE.md
|
| 5 |
+
db88c447b6ffb4ecf5b30771d449faebffac9cfe3dfcfdd57a862557d78ac640 README.md
|
| 6 |
+
aaacf2ff781544ce91648ea075ae5371b6d3b005ad1f538835724a9cb11f2c2c RELEASE_NOTES.md
|
| 7 |
1d1708069621ea6f2f8c0bf8ee120a74dcdc8b3a8c3590c658de90e59a3317b1 contract.json
|
| 8 |
4cdaf9ec19054f17cd34d420a56f4c8bb0eed12c2429732e9baf902ef52303df cortiq-decision.cmf
|
| 9 |
ceeb47cab7a611169bedbe38b62441b0c58794a05295eeff751550b7640708a8 evidence/banking77/HARNESS_INCIDENTS.md
|
|
|
|
| 24 |
2acd7929f2308170163e0ee72ef63873bdbeadbbcaca6dac2cfa4a6366c2fb5f evidence/release/build-cpu.txt
|
| 25 |
637dbb075d3f157a5902d7ceb00ebc6b5bcf65335c38cde485b3ba7b4cec58dc evidence/release/build-model-cli-fixture.txt
|
| 26 |
f1b6afa213c7eee891dce27267b16ddd6fcf878056108dfaa9516f916a9555f0 evidence/release/clippy.txt
|
| 27 |
+
c495306de78ecc66fd090cb01190c950e1a2d11fe71b4ff2aed028039cf8e447 evidence/release/editorial-code-smoke.json
|
| 28 |
+
6e10c071a75be744c447bf002630781fba010675dbfa5436f245db33be514263 evidence/release/editorial-python-tests.txt
|
| 29 |
ae9ef4a2695c27618f08ea72925dec58abc0789b476f657d7310652e25ce698a evidence/release/fcd-incremental-acceptance.json
|
| 30 |
ae9ef4a2695c27618f08ea72925dec58abc0789b476f657d7310652e25ce698a evidence/release/fcd-incremental-console.txt
|
| 31 |
4e2ee635fd044eb0d68b1fb75fea954d77e82e2c05d68c2b7089ed3d0707ea1c evidence/release/fcd-incremental-protocol.json
|
|
|
|
| 59 |
9448fca2db97cbd2f6e5a6b1a13c225cff511f959b3b4e20babeaef0201d8995 evidence/release/vulkan-linux-tests.txt
|
| 60 |
3a6b20fc5c8943b30b43a0084f8d307c21d856c0684183e390b5d89f7f7382ae evidence/release/vulkan-shader-test.txt
|
| 61 |
14b401166825d22d9a2a3771becb2632018c21d6fd4ed370246e83d45a8ea984 figures/banking77-results.png
|
| 62 |
+
e2e255f16d14f0a5261f56f8b19674cc216193c2f9edbe602725967b9f6d4207 figures/decision-mechanism-en.png
|
| 63 |
+
331897ea82b8e750a0e610ca610c420cea3392807eab5d010b868bf0e37a394a figures/decision-mechanism-ru.png
|
| 64 |
0bf59d136536dea5dcf80ce96c5988e46522ce69f3ae817666c7f5d10ded6618 licenses/Apache-2.0.txt
|
| 65 |
7e7170e3cebf88a9f60c7b8421418323c09304da1af4d5e90f4da1dc1c8a2661 licenses/BANKING77-CC-BY-4.0.txt
|
| 66 |
41ac81b48406cffd95db849913238063dacf58419b15c7c7c56b9d3a5755608b licenses/encoder-source.json
|
evidence/release/editorial-code-smoke.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"ARTICLE_RU.md": {
|
| 3 |
+
"client_runs": true,
|
| 4 |
+
"local_choice": "change_pin",
|
| 5 |
+
"untrained_contract_handled": true
|
| 6 |
+
},
|
| 7 |
+
"HF_MODEL_CARD.md": {
|
| 8 |
+
"client_runs": true,
|
| 9 |
+
"local_choice": "change_pin",
|
| 10 |
+
"untrained_contract_handled": true
|
| 11 |
+
},
|
| 12 |
+
"custom_model_api": {
|
| 13 |
+
"choice": "translate",
|
| 14 |
+
"source": "cmf",
|
| 15 |
+
"synthetic_fixture_not_quality_evidence": true
|
| 16 |
+
},
|
| 17 |
+
"oracle_calls": 0
|
| 18 |
+
}
|
evidence/release/editorial-python-tests.txt
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
...................................
|
| 2 |
+
----------------------------------------------------------------------
|
| 3 |
+
Ran 35 tests in 0.041s
|
| 4 |
+
|
| 5 |
+
OK
|
figures/decision-mechanism-en.png
ADDED
|
Git LFS Details
|
figures/decision-mechanism-ru.png
ADDED
|
Git LFS Details
|