mjolnir-qa 0.5.11 → 0.5.13

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
@@ -74,6 +74,38 @@ scan`. Unknown categories are a usage error (exit 10).
74
74
  - help registry gained `why`, `handoff`, `install` and the new flags;
75
75
  site/reference/cli.md documents the handoff trust model.
76
76
 
77
+ ## [0.5.13] — 2026-09-07
78
+
79
+ ### Changes since 0.5.12
80
+
81
+ - Merge pull request #33 from Sergey-Bar/claude/readme-demo-video-4rzxij
82
+ - fix(video): resolve ffmpeg/ffprobe without a shell
83
+ - Resync generated assets after merging origin/main (v0.5.12)
84
+ - Merge remote-tracking branch 'origin/main' into claude/readme-demo-video-4rzxij
85
+ - merge: catch up to main again (v0.5.6) — a second PR landed underneath this one
86
+ - Merge remote-tracking branch 'origin/main' into claude/readme-demo-video-4rzxij
87
+ - fix: explain's fixture path was OS-native, breaking Windows CI
88
+ - merge: bring in main's UX overhaul, reconcile the reporter conflicts
89
+ - Merge remote-tracking branch 'origin/main' into claude/readme-demo-video-4rzxij
90
+ - video: adopt react.doctor's terminal palette and font
91
+ - video: fix invisible command text, and guard the whole class
92
+ - video: present the terminal as a window, not a maximised screenshot
93
+ - video: re-render both demos against the fixed reporter
94
+ - report: one hammer, and output that fits the terminal it prints to
95
+ - video: add the manual render workflow and document the pipeline
96
+ - docs: restructure the README around the demo, and lead with the video
97
+ - video: add the media-format contract, and ship the hero MP4
98
+ - video: render the committed scripts to 1440p H.264, frame by frame
99
+ - video: capture the demo scripts from real scans, and contract them
100
+ - video: vendor the render font stack, gated by a cmap-exact glyph probe
101
+ - docs: fix the stale numbers in the honesty section, and guard them
102
+
103
+ ## [0.5.12] — 2026-09-07
104
+
105
+ ### Changes since 0.5.11
106
+
107
+ - Product-Experience Master Plan: content integrity, canonical terminology, brand cleanup, CI path integrity (#44)
108
+
77
109
  ## [0.5.11] — 2026-09-07
78
110
 
79
111
  ### Changes since 0.5.10
package/README.ar.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | العربية | [Bosanski](README.bs.md)
16
16
 
17
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
17
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
18
18
 
19
19
  ```bash
20
20
  npx mjolnir-qa@latest
@@ -290,13 +290,13 @@ npx mjolnir-qa@latest --scope changed
290
290
 
291
291
  ### كم من هذا مقيس
292
292
 
293
- **74 من 99 قاعدة تحمل معدل إنذارات كاذبة مقيسًا على كود OSS حقيقي**
293
+ **78 من 99 قاعدة تحمل معدل إنذارات كاذبة مقيسًا على كود OSS حقيقي**
294
294
  (≥ 10 اكتشافات مصنفة يدويًا لكل منها؛ راجع
295
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). الـ19 الأخرى تُشحن على تقدير
295
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). الـ21 الأخرى تُشحن على تقدير
296
296
  المؤلف. ذيل كل فحص يخبرك كم من القواعد التي _انطلقت_ مقيسة؛ و
297
297
  `mjolnir rules --unmeasured` يسرد غير المقيسة؛ وصفحة `mjolnir explain`
298
298
  لكل قاعدة تُصرّح بحالتها. ننشر المعدل حتى حين يكون قبيحًا — QA-CS-103
299
- يدقّق عند 95% ولذلك هو في الحجر الصحي. تنمية الـ78 تلك هي العمل
299
+ يدقّق عند 95% ولذلك هو في الحجر الصحي. تنمية ذلك العدد هي العمل
300
300
  المستمر للمشروع.
301
301
 
302
302
  ### طبقات القواعد ونضج اللغات
@@ -440,14 +440,14 @@ FAILING declines an expired card (e2e/checkout.spec.ts)
440
440
  في فرق؛ لكنها لا تثبت أن نظام التحقق ككل جدير بالثقة — وهي لا ترى إلا
441
441
  الفرق الذي تريه لها.
442
442
 
443
- | | مراجعة بالذكاء الاصطناعي (Copilot وغيره) | **Mjölnir** |
444
- | ----------------------------- | :--------------------------------------: | :-------------------------: |
445
- | الكلفة لكل فحص | رموز (تتدرج بحجم الفرق) | **صفر** (محلي، مثبَّت) |
446
- | يرى الطقم كله + كل إعدادات CI | الفرق الذي تريه فقط | **كل شيء، كل مرة** |
447
- | حتمي (مدخل واحد → مخرج واحد) | ❌ (غير حتمي) | **✅** |
448
- | يلتقط أنماطًا راقدة أشهرًا | فقط إن وردت في السياق | **✅** (يفحص كل الملفات) |
449
- | يتذكر الاكتشافات بين الجولات | ❌ (لا ذاكرة عبر الجلسات) | **✅** (baseline + diff) |
450
- | يعمل دون استداء بشري | يحتاج PR أو موجهًا | **✅** (خُطّاف CI، 3 ثوانٍ) |
443
+ | | مراجعة بالذكاء الاصطناعي (Copilot وغيره) | **Mjölnir** |
444
+ | ----------------------------- | :--------------------------------------: | :-------------------------------: |
445
+ | الكلفة لكل فحص | رموز (تتدرج بحجم الفرق) | **صفر** (محلي، مثبَّت) |
446
+ | يرى الطقم كله + كل إعدادات CI | الفرق الذي تريه فقط | **كل شيء، كل مرة** |
447
+ | حتمي (مدخل واحد → مخرج واحد) | ❌ (غير حتمي) | **✅** |
448
+ | يلتقط أنماطًا راقدة أشهرًا | فقط إن وردت في السياق | **✅** (يفحص كل الملفات) |
449
+ | يتذكر الاكتشافات بين الجولات | ❌ (لا ذاكرة عبر الجلسات) | **✅** (baseline + diff) |
450
+ | يعمل دون استداء بشري | يحتاج PR أو موجهًا | **✅** (خُطّاف CI، يعمل في ثوانٍ) |
451
451
 
452
452
  **استخدم كليهما.** يلتقط الذكاء الاصطناعي الدقائق والقصد وعيوب التصميم
453
453
  التي لا يعثر عليها أي regex. يلتقط Mjölnir الأنماط البنيوية التي يغفلها
@@ -562,10 +562,16 @@ Mjölnir صفر إعداد. ملف `mjolnir.config.json` اختياري (أو `.
562
562
  حقيقي تُشحن في الطبقات الرئيسية (انظر
563
563
  [كم من هذا مقيس](#كم-من-هذا-مقيس))؛ ذيل الفحص و`mjolnir rules --unmeasured`
564
564
  يخبرانك أيُّها أي.
565
- - **الثقة بالإضافات** — الإضافات حزم npm معلنة تحت `"plugins"`.
565
+ - **الثقة بالإضافات وبوابة التنفيذ** — الإضافات حزم npm معلنة تحت
566
+ `"plugins"`؛ وحدات JS تعيش في `mjolnir-rules/*.mjs`.
566
567
  **لا غرفة رمل**: كود الإضافة يجري بكامل صلاحيات Node، النموذج نفسه
567
- لإضافات ESLint أو Vitest. بادئات معرّفات القواعد الأساسية محجوزة
568
- وتُرفض من الإضافات منعًا للانتحال.
568
+ لإضافات ESLint أو Vitest. لهذا فإن تنفيذ الكود **اختياري في كل فحص**:
569
+ مرّر `--enable-plugins` (أو اضبط `MJOLNIR_ENABLE_PLUGINS=1`)، وإلا
570
+ فلن تُحمَّل المصادر — تنبيه صريح على stderr يسرد بالضبط ما تم تخطيه.
571
+ فحص كود غير موثوق لا ينفّذه أبدًا. بيانات القواعد JSON
572
+ (`mjolnir-rules/*.json`) غير متأثرة: تعلن أنماط regex ولا تنفذ أي
573
+ كود بحكم تصميمها. بادئات معرّفات القواعد الأساسية محجوزة
574
+ وتُرفض من الإضافات والقواعد الخارجية منعًا للانتحال.
569
575
  - **قواعد خارجية محلية للمساحة** (مجلدية، صفر شبكة) — مجلد
570
576
  `mjolnir-rules/` بجوار هدف الفحص يحمّل قواعد مخصصة: ملفات JSON تعلن
571
577
  أنماط regex (لا يُنفَّذ كود)، ووحدات `.mjs`/`.js` تصدّر `rules` (ثقة
package/README.bn.md CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | বাংলা | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -293,14 +293,14 @@ false-positive ফায়ারওয়াল।
293
293
 
294
294
  ### এর মধ্যে কতটা পরিমাপ করা হয়েছে
295
295
 
296
- **৯৯টি রুলের ৭৪টি বাস্তব OSS কোডের বিরুদ্ধে পরিমাপকৃত false-positive
296
+ **৯৯টি রুলের ৭৮টি বাস্তব OSS কোডের বিরুদ্ধে পরিমাপকৃত false-positive
297
297
  হার বহন করে** (প্রতিটিতে ≥ ১০টি হাতে-শ্রেণিবদ্ধ finding; দেখুন
298
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md))। বাকি ১৯টি লেখকের অনুমানে শিপ হয়।
298
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md))। বাকি ২১টি লেখকের অনুমানে শিপ হয়।
299
299
  প্রতিটি স্ক্যানের ফুটার বলে দেয় _ফায়ার_ করা রুলগুলোর কতগুলো পরিমাপকৃত;
300
300
  `mjolnir rules --unmeasured` যেগুলো নয় তা তালিকাভুক্ত করে; প্রতিটি রুলের
301
301
  `mjolnir explain` পেজ তার অবস্থা জানায়। আমরা হারটি প্রকাশ করি — এমনকি
302
302
  কুৎসিত হলেও — QA-CS-103 ৯৫%-এ অডিট হয় এবং এজন্যই কোয়ারেন্টাইনে। সেই
303
- ৭৮ বাড়ানোই প্রজেক্টের চলমান কাজ।
303
+ সংখ্যা বাড়ানোই প্রজেক্টের চলমান কাজ।
304
304
 
305
305
  ### রুল টিয়ার ও ভাষা-পরিপক্বতা
306
306
 
@@ -454,7 +454,7 @@ flakiness রিপোর্ট তৈরি করে না।
454
454
  | নির্ধারণী (একই ইনপুট → একই আউটপুট) | ❌ (অনির্ধারণী) | **✅** |
455
455
  | মাসের পর মাস সুপ্ত প্যাটার্ন ধরে | শুধু কনটেক্সটে থাকলে | **✅** (সব ফাইল স্ক্যান করে) |
456
456
  | রানের মাঝে finding মনে রাখে | ❌ (সেশনের মাঝে কোনো স্মৃতি নেই) | **✅** (baseline + diff) |
457
- | মানুষের ট্রিগার ছাড়াই চলে | PR বা prompt দরকার | **✅** (CI হুক, ৩ সেকেন্ড) |
457
+ | মানুষের ট্রিগার ছাড়াই চলে | PR বা prompt দরকার | **✅** (CI হুক, সেকেন্ডে চলে) |
458
458
 
459
459
  **দুটোই ব্যবহার করুন।** AI সূক্ষ্মতা, অভিপ্রায় ও এমন ডিজাইন-ত্রুটি ধরে
460
460
  যা কোনো regex খুঁজে পায় না। Mjölnir সেই কাঠামোগত প্যাটার্ন ধরে যা AI
@@ -572,10 +572,18 @@ JSON/SARIF রিপোর্ট `schemaVersion: 1`। রুল ID (`QA-<FAMILY
572
572
  false-positive হার আছে তা হেডলাইন টিয়ারে শিপ হয় (দেখুন
573
573
  [এর মধ্যে কতটা পরিমাপ করা হয়েছে](#এর-মধ্যে-কতটা-পরিমাপ-করা-হয়েছে));
574
574
  স্ক্যান ফুটার ও `mjolnir rules --unmeasured` কোনটি কী তা বলে।
575
- - **প্লাগইন-আস্থা** — প্লাগইন হলো `"plugins"`-এর অধীনে ঘোষিত npm
576
- প্যাকেজ। **কোনো sandbox নেই**: প্লাগইন কোড পূর্ণ Node বিশেষাধিকারে
577
- চলে, ESLint বা Vitest প্লাগইনের একই আস্থার মডেল। core রুল-ID প্রিফিক্স
578
- সংরক্ষিত এবং জালিয়াতি রোধে প্লাগইন থেকে প্রত্যাখ্যাত।
575
+ - **প্লাগইন-আস্থা এবং এক্সিকিউশন গেট** — প্লাগইন হলো `"plugins"`-এর
576
+ অধীনে ঘোষিত npm
577
+ প্যাকেজ; JS মডিউল থাকে `mjolnir-rules/*.mjs`-এ।
578
+ **কোনো sandbox নেই**: প্লাগইন কোড পূর্ণ Node বিশেষাধিকারে
579
+ চলে, ESLint বা Vitest প্লাগইনের একই আস্থার মডেল। এজন্যই কোড এক্সিকিউশন
580
+ **প্রতিটি স্ক্যানে opt-in**: `--enable-plugins` দিন (অথবা
581
+ `MJOLNIR_ENABLE_PLUGINS=1` সেট করুন), নইলে সোর্স লোড হয় না —
582
+ stderr-এ একটি স্পষ্ট বার্তা ঠিক কী বাদ পড়েছে তা তালিকাভুক্ত করে।
583
+ অবিশ্বস্ত কোড স্ক্যান করা কখনোই তা চালায় না। JSON রুল ম্যানিফেস্ট
584
+ (`mjolnir-rules/*.json`) প্রভাবিত হয় না: সেগুলো regex প্যাটার্ন
585
+ ঘোষণা করে এবং ডিজাইনগতভাবে কোনো কোড চালায় না। core রুল-ID প্রিফিক্স
586
+ সংরক্ষিত এবং জালিয়াতি রোধে প্লাগইন ও বাহ্যিক রুল থেকে প্রত্যাখ্যাত।
579
587
  - **Workspace-লোকাল বাহ্যিক রুল** (ফোল্ডার-ভিত্তিক, শূন্য নেটওয়ার্ক) —
580
588
  স্ক্যান টার্গেটের পাশে একটি `mjolnir-rules/` ডিরেক্টরি কাস্টম রুল লোড
581
589
  করে: JSON ফাইল regex প্যাটার্ন ঘোষণা করে (কোনো কোড চালানো হয় না),
package/README.br.md CHANGED
@@ -15,7 +15,7 @@ exatamente onde a confiança se quebra.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | Português (Brasil) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -299,14 +299,14 @@ que dispara na própria fixture negativa não pode ser publicada — esse
299
299
 
300
300
  ### Quanto disso é medido
301
301
 
302
- **74 de 99 regras carregam uma taxa de falsos positivos medida contra
302
+ **78 de 99 regras carregam uma taxa de falsos positivos medida contra
303
303
  código OSS real** (≥ 10 findings classificados à mão cada; veja
304
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). As outras 19 são publicadas com
304
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). As outras 21 são publicadas com
305
305
  a estimativa do autor. O rodapé de cada escaneio diz quantas das regras
306
306
  _que dispararam_ são medidas; `mjolnir rules --unmeasured` lista as que
307
307
  não são; a página `mjolnir explain` de cada regra declara seu status.
308
308
  Publicamos a taxa mesmo quando ela é feia — QA-CS-103 audita em 95 % e
309
- está em quarentena por isso. Fazer esse 78 crescer é o trabalho contínuo
309
+ está em quarentena por isso. Fazer esse número crescer é o trabalho contínuo
310
310
  do projeto.
311
311
 
312
312
  ### Tiers de regras e maturidade por linguagem
@@ -459,14 +459,14 @@ Problema diferente, camada diferente. A revisão com IA pode detectar uma
459
459
  mudança suspeita de teste em um diff; ela não prova que o sistema de
460
460
  verificação como um todo é confiável — e só vê o diff que você mostra.
461
461
 
462
- | | Revisão de código com IA (Copilot etc.) | **Mjölnir** |
463
- | -------------------------------------------- | :-------------------------------------: | :---------------------------------: |
464
- | Custo por escaneio | Tokens (escala com o tamanho do diff) | **Zero** (local, instalado) |
465
- | Vê toda a suíte + todas as configs de CI | Só o diff da PR que você mostra | **Tudo, toda vez** |
466
- | Determinístico (mesma entrada → mesma saída) | ❌ (não determinístico) | **✅** |
467
- | Pega padrões dormentes por meses | Só se estiver no contexto | **✅** (escaneia todos os arquivos) |
468
- | Lembra dos findings entre execuções | ❌ (sem memória entre sessões) | **✅** (baseline + diff) |
469
- | Roda sem gatilho humano | Precisa de uma PR ou prompt | **✅** (hook de CI, 3 segundos) |
462
+ | | Revisão de código com IA (Copilot etc.) | **Mjölnir** |
463
+ | -------------------------------------------- | :-------------------------------------: | :-----------------------------------: |
464
+ | Custo por escaneio | Tokens (escala com o tamanho do diff) | **Zero** (local, instalado) |
465
+ | Vê toda a suíte + todas as configs de CI | Só o diff da PR que você mostra | **Tudo, toda vez** |
466
+ | Determinístico (mesma entrada → mesma saída) | ❌ (não determinístico) | **✅** |
467
+ | Pega padrões dormentes por meses | Só se estiver no contexto | **✅** (escaneia todos os arquivos) |
468
+ | Lembra dos findings entre execuções | ❌ (sem memória entre sessões) | **✅** (baseline + diff) |
469
+ | Roda sem gatilho humano | Precisa de uma PR ou prompt | **✅** (hook de CI, roda em segundos) |
470
470
 
471
471
  **Use ambos.** A IA captura nuance, intenção e defeitos de design que
472
472
  nenhuma regex encontra. O Mjölnir captura os padrões estruturais que a
@@ -591,11 +591,20 @@ O relatório JSON/SARIF é `schemaVersion: 1`. Os IDs de regra
591
591
  de código OSS real entram nos tiers de destaque (veja
592
592
  [Quanto disso é medido](#quanto-disso-é-medido)); o rodapé do
593
593
  escaneio e o `mjolnir rules --unmeasured` dizem qual é qual.
594
- - **Confiança em plugins** — plugins são pacotes npm declarados sob
595
- `"plugins"`. **Não há sandbox**: o código do plugin roda com todos os
594
+ - **Confiança em plugins e porta de execução** — plugins são pacotes
595
+ npm declarados sob
596
+ `"plugins"`; módulos JS vivem em `mjolnir-rules/*.mjs`.
597
+ **Não há sandbox**: o código do plugin roda com todos os
596
598
  privilégios do Node, o mesmo modelo de confiança dos plugins ESLint
597
- ou Vitest. Prefixos de IDs de regras core são reservados e rejeitados
598
- de plugins para evitar falsificação.
599
+ ou Vitest. Por isso, a execução de código é **opt-in a cada
600
+ escaneio**: passe `--enable-plugins` (ou defina
601
+ `MJOLNIR_ENABLE_PLUGINS=1`), ou as fontes NÃO são carregadas — um
602
+ aviso sonoro no stderr lista exatamente o que foi pulado. Escanear
603
+ código não confiável nunca o executa. Manifestos de regras JSON
604
+ (`mjolnir-rules/*.json`) não são afetados: eles declaram padrões
605
+ regex e por projeto não executam código. Prefixos de IDs de regras
606
+ core são reservados e rejeitados
607
+ de plugins e regras externas para evitar falsificação.
599
608
  - **Regras externas locais ao workspace** (baseadas em pasta, zero
600
609
  rede) — um diretório `mjolnir-rules/` ao lado do alvo do escaneio
601
610
  carrega regras personalizadas: arquivos JSON declaram padrões regex
package/README.bs.md CHANGED
@@ -15,7 +15,7 @@ povjerenje lomi.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | Bosanski
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -291,14 +291,14 @@ Ukupno 20 Python pravila (QA-PY-001…012 pytest higijena + QA-PY-101…108 Play
291
291
 
292
292
  ### Koliko je od ovoga izmjereno
293
293
 
294
- **74 od 99 pravila nose stopu lažnih pozitiva izmjerenu nad stvarnim
294
+ **78 od 99 pravila nose stopu lažnih pozitiva izmjerenu nad stvarnim
295
295
  OSS kodom** (≥ 10 ručno klasificiranih nalaza svako; vidi
296
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Ostalih 19 izlazi na autorovoj
296
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Ostalih 21 izlazi na autorovoj
297
297
  procjeni. Podnožje svakog skana kaže koliko od _okinutih_ pravila je
298
298
  izmjereno; `mjolnir rules --unmeasured` izlista neizmjerena; stranica
299
299
  `mjolnir explain` svakog pravila navodi njen status. Objavljujemo stopu
300
300
  čak i kad je ružna — QA-CS-103 se audita na 95 % i u karanteni je radi
301
- toga. Rast tog 78 je neprekidni rad projekta.
301
+ toga. Rast tog broja je neprekidni rad projekta.
302
302
 
303
303
  ### Tierovi pravila i jezična zrelost
304
304
 
@@ -448,14 +448,14 @@ Drugi problem, drugi sloj. AI review može primijetiti sumnjivu promjenu
448
448
  testa u diffu; ne dokazuje da je verifikacioni sistem kao cjelina
449
449
  dostojan povjerenja — i vidi samo diff koji mu pokažeš.
450
450
 
451
- | | AI code review (Copilot i sl.) | **Mjölnir** |
452
- | ---------------------------------------- | :------------------------------: | :-----------------------------: |
453
- | Trošak po skanu | Tokeni (raste s veličinom diffa) | **Nula** (lokalno, instalirano) |
454
- | Vidi cijeli suite + sve CI konfiguracije | Samo PR diff koji pokažeš | **Sve, svaki put** |
455
- | Deterministički (isti ulaz → isti izlaz) | ❌ (nedeterministički) | **✅** |
456
- | Hvata obrasce dormantne mjesecima | Samo ako je u kontekstu | **✅** (skenira sve fajlove) |
457
- | Pamti nalaze između runova | ❌ (nema memorije između sesija) | **✅** (baseline + diff) |
458
- | Radi bez ljudskog okidača | Treba PR ili prompt | **✅** (CI hook, 3 sekunde) |
451
+ | | AI code review (Copilot i sl.) | **Mjölnir** |
452
+ | ---------------------------------------- | :------------------------------: | :-------------------------------------: |
453
+ | Trošak po skanu | Tokeni (raste s veličinom diffa) | **Nula** (lokalno, instalirano) |
454
+ | Vidi cijeli suite + sve CI konfiguracije | Samo PR diff koji pokažeš | **Sve, svaki put** |
455
+ | Deterministički (isti ulaz → isti izlaz) | ❌ (nedeterministički) | **✅** |
456
+ | Hvata obrasce dormantne mjesecima | Samo ako je u kontekstu | **✅** (skenira sve fajlove) |
457
+ | Pamti nalaze između runova | ❌ (nema memorije između sesija) | **✅** (baseline + diff) |
458
+ | Radi bez ljudskog okidača | Treba PR ili prompt | **✅** (CI hook, izvodi se u sekundama) |
459
459
 
460
460
  **Koristi oba.** AI hvata nijansu, namjeru i dizajnerske mane koje
461
461
  nijedan regex ne nađe. Mjölnir hvata strukturne obrasce koje AI
@@ -578,11 +578,19 @@ ponovo koriste.
578
578
  stopom lažnih pozitiva iz stvarnog OSS koda (vidi
579
579
  [Koliko je od ovoga izmjereno](#koliko-je-od-ovoga-izmjereno));
580
580
  podnožje skana i `mjolnir rules --unmeasured` kažu koje su koje.
581
- - **Povjerenje u pluginove** — pluginovi su npm paketi deklarirani pod
582
- `"plugins"`. **Nema sandboxa**: plugin kod radi s punim Node
581
+ - **Povjerenje u pluginove i kapija izvršavanja** — pluginovi su npm
582
+ paketi deklarirani pod
583
+ `"plugins"`; JS moduli žive u `mjolnir-rules/*.mjs`.
584
+ **Nema sandboxa**: plugin kod radi s punim Node
583
585
  privilegijama, isti model povjerenja kao ESLint ili Vitest pluginovi.
586
+ Zato je izvršavanje koda **opt-in pri svakom skanu**: proslijedite
587
+ `--enable-plugins` (ili postavite `MJOLNIR_ENABLE_PLUGINS=1`), inače
588
+ se izvori NE učitavaju — glasna stderr obavijesta izlista tačno što
589
+ je preskočeno. Skeniranje nepouzdanog koda nikada ga ne izvršava.
590
+ JSON pravila manifesti (`mjolnir-rules/*.json`) nisu pogođeni:
591
+ deklariraju regex obrasce i po konstrukciji ne izvršavaju kod.
584
592
  Core prefiksi ID-jeva pravila su rezervirani i odbijaju se od
585
- pluginova radi sprečavanja spoofinga.
593
+ pluginova i eksternih pravila radi sprečavanja spoofinga.
586
594
  - **Eksterna pravila lokalna workspaceu** (folder-bazirana, nula
587
595
  mreže) — `mjolnir-rules/` direktorij pored skan cilja učitava
588
596
  vlastita pravila: JSON fajlovi deklariraju regex obrasce (nikakav kod
package/README.da.md CHANGED
@@ -15,7 +15,7 @@ tilliden brister.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | Dansk | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -297,14 +297,14 @@ det er false-positive-firewallen.
297
297
 
298
298
  ### Hvor meget er målt
299
299
 
300
- **74 af 99 regler bærer en false-positive-rate målt mod rigtig OSS-kode**
300
+ **78 af 99 regler bærer en false-positive-rate målt mod rigtig OSS-kode**
301
301
  (≥ 10 håndklassificerede fund hver; se
302
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). De andre 19 skiber på forfatterens
302
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). De andre 21 skiber på forfatterens
303
303
  estimat. Hver scan-fodnote fortæller, hvor mange af de _udløste_ regler,
304
304
  der er målt; `mjolnir rules --unmeasured` lister de uregistrerede; hver
305
305
  regels `mjolnir explain`-side angiver dens status. Vi offentliggør
306
306
  raten, selv når den er grim — QA-CS-103 auditeres til 95 % og er sat i
307
- karantæne for det. At få de 78 til at vokse er projektets fortsatte
307
+ karantæne for det. At få det tal til at vokse er projektets fortsatte
308
308
  arbejde.
309
309
 
310
310
  ### Regel-tiers og sproglig modenhed
@@ -456,14 +456,14 @@ Andet problem, andet lag. AI-review kan spotte en mistænkelig
456
456
  testændring i en diff; det beviser ikke, at verifikationssystemet som
457
457
  helhed er troværdigt — og det ser kun den diff, du viser det.
458
458
 
459
- | | AI-kodereview (Copilot m.fl.) | **Mjölnir** |
460
- | ------------------------------------------- | :-----------------------------------------: | :--------------------------: |
461
- | Omkostning pr. scan | Tokens (skalerer med diff-størrelse) | **Nul** (lokal, installeret) |
462
- | Ser hele suiten + alle CI-konfigs | Kun den PR-diff, du viser | **Alt, hver gang** |
463
- | Deterministisk (samme input → samme output) | ❌ (ikke-deterministisk) | **✅** |
464
- | Fanger mønstre, der har sovet i måneder | Kun hvis det er i konteksten | **✅** (scanner alle filer) |
465
- | Husker fund mellem kørsler | ❌ (ingen hukommelse på tværs af sessioner) | **✅** (baseline + diff) |
466
- | Kører uden menneskelig udløser | Kræver en PR eller prompt | **✅** (CI-hook, 3 sekunder) |
459
+ | | AI-kodereview (Copilot m.fl.) | **Mjölnir** |
460
+ | ------------------------------------------- | :-----------------------------------------: | :--------------------------------: |
461
+ | Omkostning pr. scan | Tokens (skalerer med diff-størrelse) | **Nul** (lokal, installeret) |
462
+ | Ser hele suiten + alle CI-konfigs | Kun den PR-diff, du viser | **Alt, hver gang** |
463
+ | Deterministisk (samme input → samme output) | ❌ (ikke-deterministisk) | **✅** |
464
+ | Fanger mønstre, der har sovet i måneder | Kun hvis det er i konteksten | **✅** (scanner alle filer) |
465
+ | Husker fund mellem kørsler | ❌ (ingen hukommelse på tværs af sessioner) | **✅** (baseline + diff) |
466
+ | Kører uden menneskelig udløser | Kræver en PR eller prompt | **✅** (CI-hook, kører i sekunder) |
467
467
 
468
468
  **Brug begge.** AI fanger nuance, intention og designfejl, ingen regex
469
469
  kan finde. Mjölnir fanger de strukturelle mønstre, AI overser, fordi de
@@ -587,11 +587,18 @@ genbruges aldrig.
587
587
  rigtig OSS-kode skiber i overskriftstierne (se
588
588
  [Hvor meget er målt](#hvor-meget-er-målt)); scan-fodnoten og
589
589
  `mjolnir rules --unmeasured` fortæller dig, hvilke der er hvad.
590
- - **Plugin-tillid** — plugins er npm-pakker deklareret under
591
- `"plugins"`. Der er **ingen sandbox**: plugin-kode kører med fulde
590
+ - **Plugin-tillid og kørselsport** — plugins er npm-pakker deklareret under
591
+ `"plugins"`; JS-moduler bor i `mjolnir-rules/*.mjs`.
592
+ Der er **ingen sandbox**: plugin-kode kører med fulde
592
593
  Node-privilegier, samme tillidsmodel som ESLint- eller
593
- Vitest-plugins. Core regel-ID-præfikser er reserverede og afvises
594
- fra plugins mod spoofing.
594
+ Vitest-plugins. Derfor er kodekørsel **opt-in ved hver scan**: giv
595
+ `--enable-plugins` (eller sæt `MJOLNIR_ENABLE_PLUGINS=1`), ellers
596
+ indlæses kilderne IKKE — en højlydt stderr-meddelelse lister
597
+ præcis, hvad der blev sprunget over. At skanne utroværdig kode
598
+ udfører den aldrig. JSON-regelmanifester (`mjolnir-rules/*.json`)
599
+ berøres ikke: de deklarerer regex-mønstre og udfører ingen kode af
600
+ konstruktion. Core regel-ID-præfikser er reserverede og afvises
601
+ fra plugins og eksterne regler mod spoofing.
595
602
  - **Workspace-lokale eksterne regler** (mappebaserede, nul netværk) —
596
603
  en `mjolnir-rules/`-mappe ved siden af scan-målet loader brugerdefinerede
597
604
  regler: JSON-filer deklarerer regex-mønstre (ingen kode eksekveres),
package/README.de.md CHANGED
@@ -15,7 +15,7 @@ bricht.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | Deutsch | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -301,15 +301,15 @@ geshippt werden — das ist die False-Positive-Firewall.
301
301
 
302
302
  ### Wie viel davon gemessen ist
303
303
 
304
- **74 von 99 Regeln tragen eine False-Positive-Rate, gemessen an echtem
304
+ **78 von 99 Regeln tragen eine False-Positive-Rate, gemessen an echtem
305
305
  OSS-Code** (jeweils ≥ 10 handklassifizierte Befunde; siehe
306
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Die anderen 19 gehen auf der
306
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Die anderen 21 gehen auf der
307
307
  Schätzung des Autors. Jeder Scan-Footer sagt dir, wie viele der
308
308
  _ausgelösten_ Regeln gemessen sind; `mjolnir rules --unmeasured` listet
309
309
  die nicht gemessenen; die `mjolnir explain`-Seite jeder Regel nennt
310
310
  ihren Status. Wir veröffentlichen die Rate, selbst wenn sie hässlich
311
311
  ist — QA-CS-103 auditiert bei 95 % und ist deshalb quarantäniert. Diese
312
- 78 zu vergrößern ist die fortlaufende Arbeit des Projekts.
312
+ Zahl zu vergrößern ist die fortlaufende Arbeit des Projekts.
313
313
 
314
314
  ### Regel-Tiers und Sprachreife
315
315
 
@@ -463,14 +463,14 @@ Teständerung in einem Diff erkennen; sie beweist nicht, dass das
463
463
  Verifikationssystem als Ganzes vertrauenswürdig ist — und sie sieht nur
464
464
  das Diff, das du ihr zeigst.
465
465
 
466
- | | KI-Code-Review (Copilot & co.) | **Mjölnir** |
467
- | -------------------------------------------------- | :--------------------------------: | :---------------------------: |
468
- | Kosten pro Scan | Tokens (skaliert mit Diff-Größe) | **Null** (lokal, installiert) |
469
- | Sieht die ganze Suite + alle CI-Konfigs | Nur das PR-Diff, das du zeigst | **Alles, jedes Mal** |
470
- | Deterministisch (gleicher Input → gleicher Output) | ❌ (nicht-deterministisch) | **✅** |
471
- | Findet monatelang schlafende Muster | Nur, wenn es im Kontext steht | **✅** (scannt alle Dateien) |
472
- | Erinnert sich an Befunde zwischen Läufen | ❌ (kein Gedächtnis über Sessions) | **✅** (Baseline + Diff) |
473
- | Läuft ohne menschlichen Auslöser | Braucht einen PR oder Prompt | **✅** (CI-Hook, 3 Sekunden) |
466
+ | | KI-Code-Review (Copilot & co.) | **Mjölnir** |
467
+ | -------------------------------------------------- | :--------------------------------: | :---------------------------------: |
468
+ | Kosten pro Scan | Tokens (skaliert mit Diff-Größe) | **Null** (lokal, installiert) |
469
+ | Sieht die ganze Suite + alle CI-Konfigs | Nur das PR-Diff, das du zeigst | **Alles, jedes Mal** |
470
+ | Deterministisch (gleicher Input → gleicher Output) | ❌ (nicht-deterministisch) | **✅** |
471
+ | Findet monatelang schlafende Muster | Nur, wenn es im Kontext steht | **✅** (scannt alle Dateien) |
472
+ | Erinnert sich an Befunde zwischen Läufen | ❌ (kein Gedächtnis über Sessions) | **✅** (Baseline + Diff) |
473
+ | Läuft ohne menschlichen Auslöser | Braucht einen PR oder Prompt | **✅** (CI-Hook, läuft in Sekunden) |
474
474
 
475
475
  **Benutze beides.** KI findet Nuance, Intent und Designfehler, die
476
476
  keine Regex findet. Mjölnir findet die strukturellen Muster, die KI
@@ -597,11 +597,19 @@ nie wiederverwendet.
597
597
  Headline-Tiers (siehe [Wie viel davon gemessen ist](#wie-viel-davon-gemessen-ist));
598
598
  der Scan-Footer und `mjolnir rules --unmeasured` sagen dir, welche
599
599
  welche sind.
600
- - **Plugin-Vertrauen** — Plugins sind npm-Pakete, deklariert unter
601
- `"plugins"`. Es gibt **keine Sandbox**: Plugin-Code läuft mit vollen
600
+ - **Plugin-Vertrauen & Ausführungs-Gate** — Plugins sind npm-Pakete,
601
+ deklariert unter `"plugins"`; JS-Module liegen in `mjolnir-rules/*.mjs`.
602
+ Es gibt **keine Sandbox**: Plugin-Code läuft mit vollen
602
603
  Node-Privilegien, dasselbe Vertrauensmodell wie ESLint- oder
603
- Vitest-Plugins. Kern-Regel-ID-Präfixe sind reserviert und werden von
604
- Plugins abgelehnt, um Spoofing zu verhindern.
604
+ Vitest-Plugins. Deshalb ist Code-Ausführung **bei jedem Scan
605
+ Opt-in**: Übergib `--enable-plugins` (oder setze
606
+ `MJOLNIR_ENABLE_PLUGINS=1`), sonst werden die Quellen NICHT geladen —
607
+ ein deutlicher stderr-Hinweis listet genau, was übersprungen wurde.
608
+ Das Scannen nicht vertrauenswürdigen Codes führt ihn nie aus.
609
+ JSON-Regel-Manifeste (`mjolnir-rules/*.json`) sind davon unberührt:
610
+ sie deklarieren Regex-Muster und führen per Design keinen Code aus.
611
+ Kern-Regel-ID-Präfixe sind reserviert und werden von Plugins und
612
+ externen Regeln abgelehnt, um Spoofing zu verhindern.
605
613
  - **Workspace-lokale externe Regeln** (ordnerbasiert, null Netzwerk) —
606
614
  ein `mjolnir-rules/`-Verzeichnis neben dem Scan-Ziel lädt eigene
607
615
  Regeln: JSON-Dateien deklarieren Regex-Muster (kein Code wird
package/README.es.md CHANGED
@@ -15,7 +15,7 @@ exactamente dónde se rompe la confianza.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | Español | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -299,14 +299,14 @@ ese es el cortafuegos de falsos positivos.
299
299
 
300
300
  ### Cuánto está medido
301
301
 
302
- **74 de 99 reglas llevan una tasa de falsos positivos medida contra
302
+ **78 de 99 reglas llevan una tasa de falsos positivos medida contra
303
303
  código OSS real** (≥ 10 hallazgos clasificados a mano cada una; ver
304
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Las otras 19 salen sobre la
304
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Las otras 21 salen sobre la
305
305
  estimación del autor. Cada pie de escaneo te dice cuántas de las reglas
306
306
  _que se dispararon_ están medidas; `mjolnir rules --unmeasured` lista
307
307
  las que no; la página `mjolnir explain` de cada regla declara su
308
308
  estado. Publicamos la tasa aunque sea fea — QA-CS-103 audita al 95 % y
309
- está en cuarentena por ello. Hacer crecer ese 78 es el trabajo continuo
309
+ está en cuarentena por ello. Hacer crecer esa cifra es el trabajo continuo
310
310
  del proyecto.
311
311
 
312
312
  ### Tiers de reglas y madurez por lenguaje
@@ -461,14 +461,14 @@ cambio de test sospechoso en un diff; no demuestra que el sistema de
461
461
  verificación en su conjunto sea confiable — y solo ve el diff que le
462
462
  muestras.
463
463
 
464
- | | Revisión de código con IA (Copilot, etc.) | **Mjölnir** |
465
- | ------------------------------------------- | :---------------------------------------: | :---------------------------------: |
466
- | Coste por escaneo | Tokens (escala con el tamaño del diff) | **Cero** (local, instalado) |
467
- | Ve toda la suite + todas las configs de CI | Solo el diff de PR que le muestras | **Todo, cada vez** |
468
- | Determinista (misma entrada → misma salida) | ❌ (no determinista) | **✅** |
469
- | Detecta patrones dormidos durante meses | Solo si está en el contexto | **✅** (escanea todos los archivos) |
470
- | Recuerda hallazgos entre ejecuciones | ❌ (sin memoria entre sesiones) | **✅** (baseline + diff) |
471
- | Corre sin disparador humano | Necesita una PR o un prompt | **✅** (hook de CI, 3 segundos) |
464
+ | | Revisión de código con IA (Copilot, etc.) | **Mjölnir** |
465
+ | ------------------------------------------- | :---------------------------------------: | :------------------------------------: |
466
+ | Coste por escaneo | Tokens (escala con el tamaño del diff) | **Cero** (local, instalado) |
467
+ | Ve toda la suite + todas las configs de CI | Solo el diff de PR que le muestras | **Todo, cada vez** |
468
+ | Determinista (misma entrada → misma salida) | ❌ (no determinista) | **✅** |
469
+ | Detecta patrones dormidos durante meses | Solo si está en el contexto | **✅** (escanea todos los archivos) |
470
+ | Recuerda hallazgos entre ejecuciones | ❌ (sin memoria entre sesiones) | **✅** (baseline + diff) |
471
+ | Corre sin disparador humano | Necesita una PR o un prompt | **✅** (hook de CI, corre en segundos) |
472
472
 
473
473
  **Usa ambos.** La IA capta el matiz, la intención y los defectos de
474
474
  diseño que ninguna regex encuentra. Mjölnir capta los patrones
@@ -594,11 +594,20 @@ reutilizan.
594
594
  código OSS real salen en los tiers titulares (ver
595
595
  [Cuánto está medido](#cuánto-está-medido)); el pie del escaneo y
596
596
  `mjolnir rules --unmeasured` te dicen cuál es cuál.
597
- - **Confianza en plugins** — los plugins son paquetes npm declarados
598
- bajo `"plugins"`. **No hay sandbox**: el código del plugin corre con
597
+ - **Confianza en plugins y puerta de ejecución** — los plugins son
598
+ paquetes npm declarados
599
+ bajo `"plugins"`; los módulos JS viven en `mjolnir-rules/*.mjs`.
600
+ **No hay sandbox**: el código del plugin corre con
599
601
  todos los privilegios de Node, el mismo modelo de confianza que los
600
- plugins de ESLint o Vitest. Los prefijos de IDs de reglas core están
601
- reservados y se rechazan de los plugins para evitar suplantación.
602
+ plugins de ESLint o Vitest. Por eso, la ejecución de código es
603
+ **opt-in en cada escaneo**: pasa `--enable-plugins` (o define
604
+ `MJOLNIR_ENABLE_PLUGINS=1`), o las fuentes NO se cargan — un aviso
605
+ ruidoso en stderr lista exactamente qué se omitió. Escanear código
606
+ no confiable nunca lo ejecuta. Los manifiestos de reglas JSON
607
+ (`mjolnir-rules/*.json`) no se ven afectados: declaran patrones regex
608
+ y por diseño no ejecutan código. Los prefijos de IDs de reglas core
609
+ están reservados y se rechazan de plugins y reglas externas para
610
+ evitar suplantación.
602
611
  - **Reglas externas locales al workspace** (basadas en carpeta, cero
603
612
  red) — un directorio `mjolnir-rules/` junto al objetivo del escaneo
604
613
  carga reglas personalizadas: archivos JSON declaran patrones regex