infosave commited on
Commit
7db8695
·
verified ·
1 Parent(s): 13af1cf

Cortiq Decision: professional model card, practical article and verified Patent 1 reference

Browse files
.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
- # Не каждый запрос требует LLM: запускаем локальную модель решений в CMF
2
 
3
- В поддержку приходит сообщение: «Как изменить PIN-код?» Чтобы передать его нужному обработчику, системе не обязательно писать ответ, рассуждать вслух и генерировать JSON. Ей нужно выбрать одно действие: `change_pin`.
4
 
5
- На таких повторяющихся решениях я и проверил CMF Decision: **обучить небольшого специалиста под свой процесс, выполнять знакомые задачи локально, а сомнительные передавать человеку или модели-оракулу**.
6
 
7
- Это не замена ChatGPT и не универсальный собеседник. Модель не напишет письмо клиенту. Зато её можно поставить перед генеративной моделью: выбрать инструмент, разложить обращения по категориям, решить, какой сценарий запускать дальше.
8
 
9
- ## Что получилось
10
 
11
- Для проверки я взял BANKING77 — публичный набор обращений с 77 банковскими категориями — и сравнил свой обученный классификатор с **TypeSafe Jev через OpenRouter**.
12
 
13
- | Режим | Результат |
14
- |---|---|
15
- | CMF отвечает на все 3080 тестовых обращений | **91,49% правильных ответов** |
16
- | Jev на тех же обращениях | **до 85,65%** с консервативным зачётом двух спорных ответов |
17
- | CMF отвечает только при достаточной уверенности | **98,69% правильных среди ответов**, отвечает на **74,16%** обращений |
18
 
19
- В последнем режиме оставшиеся запросы не исчезают: система отказывается решать их автоматически. Это и есть место для человека или оракула.
20
 
21
- Важная оговорка: CMF учился на тысячах примеров этой задачи, а Jev получил описание категорий и 154 примера в запросе. Здесь обученный специалист сравнивается с универсальным сервисом, а не два одинаково обученных конкурента.
22
 
23
- На моём MacBook M4 медиана обработки текста локально составила **около 4,8 мс**. Вызов Jev по сети — **около 348 мс**. Это сравнение пользовательской задержки, а не доказательство превосходства на одинаковом железе.
24
 
25
- Дальше — не устройство GPU-ядра, а как этим пользоваться.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 numpy scipy
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
- Минимальный Python-клиент:
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
- if e.code == 409: # Модель не уверена: нужен другой сценарий.
99
- return None
 
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
- Форма запроса похожа на [Decisions API Jev](https://openrouter.ai/blog/insights/what-is-jev/): состояние плюс вопросы. Но произвольный новый вопрос не станет освоенным навыком только потому, что мы записали его в JSON. Для своей задачи модель нужно обучить.
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. **Такой запрос передаёт текст внешнему провайдеру.** По умолчанию у сервиса отдельный лимит: $1 и 100 вызовов. Источник ответа обозначается явно; облачный ответ не выдаётся за работу локальной модели.
194
 
195
  Оракул не переписывает веса автоматически. Практический цикл такой: собрать сложные случаи, независимо проверить разметку, пополнить свои данные, обучить `my-inbox-v2`, сравнить со старой версией и только потом заменить её. Использовать ответы чужой модели для обучения можно лишь при наличии соответствующих прав.
196
 
197
- ## Что дальше: маленькие добавляемые навыки
 
 
198
 
199
- Отдельно от BANKING77 я проверил FCD-вариант: общее ядро остаётся неизменным, новый навык получает свой небольшой набор параметров. После последовательного добавления двух навыков все **43 старых контрольных решения сохранились**.
200
 
201
- Это пока исследовательская ветка: покрытие новых навыков ограничено, проверено только два добавления. Команда обучения выше создаёт обычного affine-специалиста — результаты двух подходов я не смешиваю.
202
 
203
- Для пакетной обработки есть Metal-энкодер: на проверенном workload он обрабатывал около **671 текста/с против 135 на CPU**. Но одиночный запрос почти не ускорился. На NVIDIA проверен Vulkan-классификатор, пока без переноса энкодера. Эти оптимизации полезны, но начинать стоит не с GPU, а с понятной задачи и хороших примеров.
204
 
205
- **Главная идея проста: повторяющееся решение не обязано каждый раз быть дорогим облачным рассуждением. Его можно обучить, сохранить в одном CMF-файле и выполнять рядом с приложением — оставив честный выход «не знаю».**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
 
207
  ---
208
 
209
- Модель и код: [закрытый HF-релиз](https://huggingface.co/infosave/cortiq-decision). Данные эксперимента: [BANKING77](https://github.com/PolyAI-LDN/task-specific-datasets). Полная методика, аппаратные замеры, ограничения и инциденты сравнения — в техническом приложении к релизу, а не спрятаны за рекламными цифрами.
 
 
 
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
+ ![Путь запроса: общий энкодер, реконструкции категорий, выбор и проверка уверенности](figures/decision-mechanism-ru.png)
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
- Included starter weights: **BANKING77 specialist**. Other domains require training on your own labels.
19
 
20
- **Private research release, 2026-09-25. Working model, not a web demo.**
 
 
 
21
 
22
- A fixed-taxonomy supervised specialist: frozen multilingual MiniLM encoder plus
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
- ## Start here
 
 
 
 
 
27
 
28
- **[Practical guide: run, connect your app, train your own model (Russian)](ARTICLE_RU.md)**
 
 
29
 
30
- Create your own choice classifier from labeled `examples.jsonl` and `task.json`:
31
 
32
- ```sh
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 guide defines `$BIN`, the data format and deployment commands. No cloud calls.
41
- The base file supplies only the shared encoder; the new classes are learned from
42
- **your** labels, not copied from BANKING77. Inspect `acceptance.json`; rejected
43
- candidates are not silently deployed. Raw example counts do not guarantee quality.
44
 
45
- ## Measured results
 
 
 
 
 
46
 
47
- Official BANKING77 test, all 3,080 rows:
 
 
 
48
 
49
- | Model/mode | Correct | Accuracy | Coverage |
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
- The selective mode makes **30 errors** and abstains on 796 examples. It is not
56
- 98.69% accuracy at full coverage and not an OOD guarantee. Macro-F1 of forced-choice
57
- CMF is 91.4860%. CMF received 6,996 training labels; Jev received 154 training examples
58
- in its rubric. This is a specialist-vs-general-service comparison, not equal supervision.
 
59
 
60
- Warm local CPU p50: 4.776 ms in-process, including encoder. Hosted Jev p50: 348.329 ms,
61
- including network. Their ratio is **not hardware-normalized algorithmic speedup**.
62
- Full model including encoder is about 468.70 MiB; decision weights alone 3.70 MiB.
63
- Jev server RAM/VRAM/energy are unknown. Detailed evidence and limitations accompany this release.
64
 
65
- ## Run offline
66
 
67
- From this downloaded repository, with a current Rust toolchain and Python 3:
 
 
68
 
69
- ```sh
70
- cargo build --release --locked --manifest-path source/tools/cortiq-decision/Cargo.toml
71
- BIN=source/tools/cortiq-decision/target/release/cortiq-decision
72
- $BIN infer cortiq-decision.cmf 'How do I change my PIN?' --policy policy.json
73
- python3 source/tools/cortiq-decision/serve_model.py cortiq-decision.cmf \
74
- --binary "$BIN" --state-dir ./local-state --port 8789
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  ```
76
 
77
- Build may download Cargo/ONNX Runtime dependencies; inference does not download
78
- models. Apple Silicon CPU runtime was tested. See Linux/Vulkan evidence separately;
79
- Vulkan scorer validation does not imply a Vulkan encoder. Generic Transformers
80
- `from_pretrained` cannot load CMF; use the supplied runtime.
81
-
82
- `GET http://127.0.0.1:8789/v1/models` exposes the exact trained question contract.
83
- POST that question plus your `state` to `/api/alpha/decisions` or `/v1/decisions`,
84
- using model `cortiq/decision-v1`. Untrained questions abstain. A request with
85
- `cmf.allow_oracle=false` is always local-only. No UI is served at `/`.
86
-
87
- For Jev fallback, restart with `--oracle-key-prompt` (hidden input, memory only), then
88
- explicitly set **both** `cmf.allow_oracle=true` and `cmf.approved_for_external=true`.
89
- This sends the state to OpenRouter. Hard service limits default to $1 / 100 calls;
90
- no silent fallback model, retries, or automatic teacher training. `consent_store`
91
- is a separate permission. Never put a key into this repository.
92
-
93
- ## Data and representation
94
-
95
- [PolyAI BANKING77](https://github.com/PolyAI-LDN/task-specific-datasets), commit
96
- `57ec275d8078af65b7731c2a98be812d844a6d6b`, CC-BY-4.0.
97
- Casanueva et al., [Efficient Intent Detection with Dual Sentence Encoders](https://arxiv.org/abs/2003.04807), 2020.
98
- Remove seven normalized train/test overlaps, deduplicate train, then split into
99
- 6,996 train / 1,498 dev / 1,498 calibration. Select rank on dev; temperature and gate
100
- use separate 749-row calibration halves. Final test was not used to tune these choices.
101
-
102
- Encoder: [Xenova/paraphrase-multilingual-MiniLM-L12-v2](https://huggingface.co/Xenova/paraphrase-multilingual-MiniLM-L12-v2),
103
- revision `2c4055b12046f11709e9df2c122e59ffbdc2f900`, based on the
104
- [Sentence Transformers model](https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2).
105
- Mean pooling, max length 512, exact original tokenizer, two F32 L2 normalizations.
106
- Representation SHA-256:
107
- `e5991f3eff5987b1ad5228b158682be638c7944fcd891bc30b461c4079f387d2`.
108
-
109
- The contract-bound release is prediction-identical to the evaluated artifact on
110
- all 3,080 embeddings. See `evidence/release/release-acceptance.json` and `SHA256SUMS`.
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
+ ![Shared text encoder, category reconstructions, selection and acceptance](figures/decision-mechanism-en.png)
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
- e4223c216d21946f3ce56d92b7920e8e97c4dbc879c45da58534dd7926e5cbed ARTICLE_RU.md
2
  4b30194ad9a38de02a937a3b00e4f27db8bc7cba5a981b0166262a4f4da9e3f1 ARTICLE_TECHNICAL_APPENDIX_RU.md
3
  3bcff101bcd473a82cf9c5f6e342e57940e5b8f7aa6323c8602e6e793095a8de LICENSES.md
4
- 01315e1a400cdc37ab5b2c2446626c9048e7ad9356ff93777bbef6333b63de81 README.md
5
- b13a346b93d2b50cf20629620145f1a008039deae84f79d09c41ad4e998af027 RELEASE_NOTES.md
 
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

  • SHA256: e2e255f16d14f0a5261f56f8b19674cc216193c2f9edbe602725967b9f6d4207
  • Pointer size: 131 Bytes
  • Size of remote file: 125 kB
figures/decision-mechanism-ru.png ADDED

Git LFS Details

  • SHA256: 331897ea82b8e750a0e610ca610c420cea3392807eab5d010b868bf0e37a394a
  • Pointer size: 131 Bytes
  • Size of remote file: 117 kB