Туманомір — вимірювання туману, перш ніж AI-агенти перетворять його на архітектуру
Посилання:

Туманомір — CLI на Go, що оцифровує “туман” специфікацій, перш ніж ви дасте AI-агентам перетворити цей туман на архітектуру. Це референсна реалізація методології Джерело Невідомості: специфікації, які споживають AI-агенти, — не істина в останній інстанції, а розподіл можливих реалізацій, тож інструмент вимірює розкид, а не ігнорує його.
Проблема
Передати специфікацію AI-агенту й отримати п’ять по-різному тонко відмінних реалізацій — знайома ситуація, але “тонко відмінних” не має числа. Туманомір дає це число: наскільки трасовані вимоги, наскільки щільні машинозчитувані обмеження, і наскільки далеко одна від одної опиняються незалежні генерації з однієї й тієї ж специфікації.
Метрики
| Метрика | Шар | Що вимірює |
|---|---|---|
K_drift |
детермінований | вимоги без трасувальних зв’язків [REQ-*] -> [FUN-*] (покриття розміткою трасування, не коректність реалізації) |
D_const |
детермінований | лексична щільність машинозчитуваних обмежень (лише дорадчо, ніколи не блокує гейт) |
D_pair |
стохастичний (LLM) | 1 − середня попарна схожість AST N генерацій |
H_norm |
стохастичний (LLM) | ентропія кластерів / log₂N — лише порядковий сигнал |
Детермінований шар не потребує LLM і працює як git hook, миттєво. Стохастичний шар генерує N Go-артефактів зі специфікації через фіксований прилад (Ollama) і вимірює, наскільки далеко вони опиняються одна від одної — що ширший розкид, то туманніша специфікація.
CLI
tumanomir check docs/ # детерміновано, миттєво, без мережі
tumanomir measure spec.md --instrument ollama:qwen3-coder:30b -n 10 \
--temp 1.0 --sim-threshold 0.95 --num-ctx 8192 --num-predict 2048
tumanomir gate spec.md --instrument ollama:qwen3-coder:30b -n 3 \
--num-ctx 8192 --num-predict 2048 # обидва шари, для CI
tumanomir calibrate corpus.jsonl # кореляція Spearman проти розміченого корпусу
tumanomir label <hash-or-prefix> <score> # єдиний писар результату корпусу
check виконується детерміновано й миттєво. measure/gate вимагають
явного --instrument (backend:model) та --num-ctx/--num-predict —
gate відмовляється тихо відкочуватися до лише-детермінованого шару,
якщо передано температуру, а прилад не резолвиться: тиха деградація
була б помилкою цілісності вимірювання, а не зручністю. --format json
у check/measure/gate дає один компактний JSON-об’єкт для
CI-парсингу.
Приклад детермінованого прогону, коли Туманомір догфудить власну специфікацію:
$ tumanomir check docs/requirements.md
K_drift: 0.00 [ok] (threshold 0.20, 0/33 requirements untraced)
D_const: 0.03 [warn] (threshold 0.35, 101 markers / 3905 prose tokens)
D_pair: — (stochastic layer: run `tumanomir measure` with an instrument)
Усі стохастичні вимірювання прив’язані до приладу: результати подаються разом з повною конфігурацією приладу й непорівнянні між моделями без перекалібрування.
Архітектура, що заслуговує довіри, а не просто правильна
Детерміновані пакети (internal/metrics, internal/spec,
internal/config, internal/calibrate) не мають права торкатися
мережі — не як конвенція, а як тест (TestNoNetworkImports), що
провалює CI, якщо десь з’явиться імпорт net/*. Саме це робить check
і calibrate безпечними як git hook чи в air-gapped CI.
D_const архітектурно не може блокувати гейт (REQ-CHK-06) —
зафіксовано в коді як тестований інваріант, а не залишено застереженням
у документації, яке можна забути під тиском дедлайну: це лексичний
проксі, а не істина щодо точності специфікації.
Сканер $K_{drift}$ переписаний з regexp на hand-written byte scanner
(PR #68), знизивши алокації з масштабування за кількістю вимог до
фіксованих 14 allocs/op — повний check на специфікації 1МБ
виконується за 16.7мс, у межах бюджету 100мс.
Технологічний стек
- Go 1.26 — один бінарник, одна зовнішня залежність (
gopkg.in/yaml.v3) - Ollama — плагований бекенд-прилад для стохастичного шару
- Cobra-подібний CLI, опційний
.tumanomir.yamlдля налаштувань за замовчуванням
Статус
v0.1: check, measure, gate, calibrate та label — усі
реалізовані й працюють наскрізно — 66 комітів, 64 злитих PR, жодного
відкату за 25 днів розробки. Тегів ще немає; версія відверто позначена
-dev, без претензії на реліз.
Що досі відкрито, за власним звітом проєкту: реального розміченого
корпусу для calibrate ще немає, тож порогові значення за замовчуванням
(0.20 / 0.35 / 0.30) лишаються гіпотезами, не каліброваними числами.
D_pair прив’язаний до приладу — та сама специфікація, той самий
прилад, і три послідовні прогони дали вердикти від “ok” до “block”.
Перевірений лише один прилад (Ollama, qwen3-coder:30b); бекенди
OpenAI/Anthropic не збудовані. Реалізована лише одна проєкція
(визначення типів Go), тож v0.1 обмежений Go-проєктами. Повна
розгорнута стаття проходить через докази,
бенчмарки й чесну “драбину тверджень”, що розділяє доведене від ще
гіпотези.
Відкритий код, ліцензія Apache 2.0.