## Дві моделі бази порівняння

Режим визначається автоматично з маніфесту.

### registry-published (npm / PyPI)

**npm:** непорожнє `name`, не `private: true`, масив `files`.

**Python:** статичні `project.name` і `project.version` у `pyproject.toml` (або Poetry-секція).

1. **Локальна `version` ≠ опублікованій** (npm / PyPI): drift поза CI → **fail** (ручний bump заборонено; навіть із change-файлом). Відкоти `version`.
2. **Версії збігаються**, але в git є **релевантні** зміни без change-файлу → fail. Для npm `"CHANGELOG.md"` має бути в `files` (публікується разом із пакетом).
3. **Реєстр недосяжний** — fail-safe pass.
4. **Немає релевантних змін** — pass.

### local-only

**npm:** `private: true` або без `files`. **Python:** без пари name+version для реєстру. Гілки визначає `.n-rules.json:git`: `baseBranch` (за замовчуванням `main`) і `releaseBranches` (за замовчуванням `["main"]`). На обох значеннях за замовчуванням блок `git` у конфіг не пишуть.

1. На **`baseBranch`** local-only не активний (крім незакомічених registry-published).
2. На гілці з **`releaseBranches`** — diff від її `origin/<branch>`; без remote — від `HEAD~1`.
3. На feature-гілці — merge-base з кандидатами `baseBranch` і `releaseBranches`. Для кожного кандидата локальна та `origin/`-версії порівнюються, береться новіша спільна база; порядок кандидатів детермінований конфігом.
4. Drift `version` від бази → **fail** (ручний bump заборонено). Зміни фіксуй change-файлом; bump зробить CI.

Якщо немає git або refs із Git policy — local-only пропускається.

Merge-коміт (готовий, з другим предком, або `MERGE_HEAD` під час незавершеного `git commit`) пропускається цілком — changeset документують feature-коміти, а не інтеграційний merge.

## Чеклист агента (деталі)

Основний робочий алгоритм — «перед фінальною відповіддю виконай `npx @7n/rules lint changelog`, познач результат рядком `Changelog: …`» (AGENTS.md/AGENTS.template.md); тут лише уточнення, що саме перевіряється.

**Інверсія (за замовчуванням не вимагають change-файлу):**

- зміни **лише** під `docs/` або `doc/`;
- синхронізований із `@7n/rules` інструментарій під `.cursor/` (канонічні правила й скіли) і `.claude/` (ADR-хуки) — це дзеркало tooling-пакета, а не логіка воркспейсу;
- будь-які зміни в **корені монорепо** (воркспейс `.` за наявності підпакетів) — корінь веде glue/конфіг/tooling, власного CHANGELOG не має; помітні зміни документують підпакети. Сюди потрапляють і кореневі `AGENTS.md` / `CLAUDE.md`, і bump `@7n/rules` у `devDependencies`;
- файли під **`.gitignore`**.

**Вимагають change-файл** — усі інші зміни в каталозі workspace (код, rego, правила, скіли, конфіги, тести тощо). Виняток `.cursor/` / `.claude/` **не** поширюється на джерело правил у репо `@7n/rules` — воно лежить під `npm/`, тож зміни в ньому далі вимагають change-файлу.

Ніколи не редагуй `version` і `CHANGELOG.md` вручну — навіть для hotfix; єдиний артефакт зміни — change-файл (`npx @7n/n ch [--bump <major|minor|patch>] [--section <Added|Changed|Fixed|Removed>] [--message "<…>"]`), bump/секцію CHANGELOG формує `n-rules release` у CI на `main`.

Канонічне pre-commit wiring (крок `npm-changelog` у `hk.pkl`, autofix через `N_RULES_CHANGELOG_AUTOFIX=1`) — деталь `npm-module.mdc`, тут не дублюється.

Перевірка програмна — native-концерни **`crates/rules-core/src/concerns/changelog_consistency.rs`** (+ `changelog_consistency_git.rs`/`changelog_consistency_version.rs`/`changelog_consistency_workspace.rs`), delta-гейт присутності — **`crates/rules-core/src/concerns/changelog_presence.rs`**.
