---
docgen:
  source: normalize-pipeline.mjs
  crc: 6619ff48
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
  score: 100
---

# normalize-pipeline.mjs

## Огляд

Файл реалізує локально-орієнтований конвеєр для нормалізації чернеток ADR. Він використовує LLM лише для вузьких, верифікованих бінарних суджень. Конвеєр працює у послідовних стадіях: JS виконує пошук кандидатів-ребер на основі лексичної схожості, LLM оцінює ці ребра (Stage 1: `same/different`) та драфти (Stage 1b: `standalone/trivial`), JS кластеризує підтверджені ребра (використовуючи `union-find`), LLM реформатує анотера (Stage 2: `gen-MADR`), а LLM генерує доповнення для злиття (Stage 3: `gen-merge`). Глобальний стан (кластери, слаги, покриття) зберігається в JS. Конвеєр повертає операції у форматі `operations[]`, сумісного з контрактом `apply-ops`.

## Поведінка

tokenize токенізує назву або слаг у множину значущих токенів, виключаючи стоп-слова.
jaccard обчислює Jaccard-схожість між двома множинами токенів.
draftTitle витягує заголовок чернетки, надаючи пріоритет заголовку ADR.
isNoDecision визначає, чи не прийнято рішення у чернетці, аналізуючи секцію Decision Outcome.
buildEdges будує кандидати-ребра між чернетками та між чернетками і чистими ADR на основі лексичної схожості.
validateMadr перевіряє згенерований контент на відповідність канону чистого MADR.
normalizePipeline виконує повний конвеєр нормалізації, групуючи чернетки, оцінюючи їх та генеруючи операції для застосування.

## Публічний API

tokenize — розбиває назву чи слаг на значущі частини, замінюючи пробіли та дефіси, і відсіюючи загальні слова.
jaccard — обчислює ступінь подібності між двома наборами слів.
draftTitle — витягує заголовок з чернетки, надаючи пріоритет заголовку у форматі `## ADR <title>`, а у відсутності такого — використовує перший не-ADR заголовок або ім'я файлу.
isNoDecision — визначає, чи не містить чернетка чіткого рішення, що робить її непотрібною для окремого ADR.
buildEdges — створює потенційні зв'язки між елементами на основі схожості слів.
validateMadr — перевіряє якість згенерованого документа ADR.
normalizePipeline — виконує повний процес обробки, повертаючи список виконаних кроків та статистику.

## Гарантії поведінки

- Read-only: файл не виконує операцій запису у файлову систему.
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
- За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
- Не звертається до мережі.
