@7n/rules 1.17.1 → 1.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.17.3] - 2026-07-18
4
+
5
+ ### Changed
6
+
7
+ - ci-plan: `domainKey` експортовано — fix-хендлери плагінів (автоміграція pipeline-ів) генерують ті самі ключі outputs, що й `ci plan`
8
+
9
+ ## [1.17.2] - 2026-07-18
10
+
11
+ ### Fixed
12
+
13
+ - run-fix.mjs: rollback перед перекиданням DetectorError з canonical re-detect — раніше worker/LLM-пошкоджений файл (напр. невалідний YAML) лишався на диску, бо виняток абортував прогін до звичайного snapshot.rollback()
14
+
3
15
  ## [1.17.1] - 2026-07-18
4
16
 
5
17
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/rules",
3
- "version": "1.17.1",
3
+ "version": "1.17.3",
4
4
  "description": "CLI еталонних правил і skills (префікс n-): синк у репозиторій, дельта-lint, конформність",
5
5
  "keywords": [
6
6
  "cli",
@@ -31,11 +31,12 @@ const RESERVED_OUTPUT_KEYS = new Set(['any', 'has_tests', 'domains'])
31
31
 
32
32
  /**
33
33
  * Rule-id → ключ output-змінної: `-` → `_` (GA/Azure не люблять дефіси в
34
- * іменах змінних; `npm-module` → `npm_module`).
34
+ * іменах змінних; `npm-module` → `npm_module`). Експортовано для fix-хендлерів
35
+ * плагінів (автоміграція pipeline-ів має генерувати ті самі ключі).
35
36
  * @param {string} ruleId rule-id домену.
36
37
  * @returns {string} ключ output.
37
38
  */
38
- function domainKey(ruleId) {
39
+ export function domainKey(ruleId) {
39
40
  return ruleId.replaceAll('-', '_')
40
41
  }
41
42
 
@@ -3,9 +3,8 @@ type: JS Module
3
3
  title: ci-plan.mjs
4
4
  resource: npm/scripts/lib/lint-surface/ci-plan.mjs
5
5
  docgen:
6
- crc: a532483e
6
+ crc: ce7f2a96
7
7
  model: openai-codex/gpt-5.4-mini
8
- tier: cloud-min
9
8
  score: 90
10
9
  issues: internal-name:computeActiveDomains,judge:inaccurate:0.99
11
10
  judgeModel: openai-codex/gpt-5.4-mini
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: run-fix.mjs
4
4
  resource: npm/scripts/lib/lint-surface/run-fix.mjs
5
5
  docgen:
6
- crc: 0a7a2c75
6
+ crc: c4235855
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  ---
9
9
 
@@ -22,6 +22,7 @@ Evidence-гейт рунга (Фаза A1 run-harness, спека 2026-07-11):
22
22
  Durable-write-и (issue nitra/cursor#16): worker отримує у `FixContext` поруч із `recordWrite` опційний `recordDurableWrite` — для записів, кожен з яких є самодостатнім кінцевим станом (doc-files: дока зі свіжим CRC). Такі файли переживають rollback провального rung-а і не входять у collateral-veto: частковий прогрес великого батчу не стирається, canonical re-detect наступного rung-а/прогону рахує лише те, що реально лишилось.
23
23
  MT-tail (Фаза B, спека 2026-07-11): коли лишився невиправлений хвіст (worst=1), `renderRemaining` повертає зібрані порушення, і вони матеріалізуються у вузли MT-графа через `materializeTail` (mt-tail.mjs). Єдиний гейт — onboarded-репо (наявність `.mt.json`); fail-open: MT недоступний або будь-яка помилка → лог, lint не падає.
24
24
  Distillation-телеметрія (Фаза C, §13 pi-migration): успішний agentic-рунг (canonical clean, без veto, з реальними правками у worker telemetry) пише запис `oldText→newText` у глобальний стор (`recordFixTelemetry`, `~/.n-rules/telemetry/<rule>/open/`) — корпус для маховика дистиляції T0. Best-effort; T0/ручні фікси не пишуться.
25
+ Rollback на провалі re-detect-а: якщо canonical re-detect усередині rung-а сам кидає виняток (worker/LLM лишив файл синтаксично невалідним — детектор/conftest не може його розпарсити), `runRung` спершу відкочує `snapshot` до S1, і лише потім перекидає виняток далі — без цього зіпсований проміжний стан worker-а лишався б на диску назавжди (виняток абортує весь прогін до звичайного rollback-коду).
25
26
 
26
27
  ## Публічний API
27
28
 
@@ -238,12 +238,17 @@ async function runRung(rung, worker, violations, feedback, rungDeps) {
238
238
  error = workerError.message
239
239
  }
240
240
 
241
- // Canonical re-detect = джерело правди.
241
+ // Canonical re-detect = джерело правди. Якщо він сам кидає (напр. worker лишив файл
242
+ // синтаксично невалідним — LLM зламав YAML-структуру, детектор/conftest не може його
243
+ // розпарсити) — rollback МАЄ спрацювати перед перекиданням винятку далі. Без цього
244
+ // зіпсований проміжний стан worker-а лишався б на диску назавжди: виняток з re-detect
245
+ // абортує весь прогін, і код нижче (snapshot.rollback() для звичайного «не чисто»)
246
+ // ніколи не виконується.
242
247
  let after
243
248
  try {
244
249
  after = await reDetect(item, cwd, progress, verbose)
245
250
  } catch (detectError) {
246
- if (detectError instanceof DetectorError) throw detectError
251
+ snapshot.rollback()
247
252
  throw detectError
248
253
  }
249
254