Results
Muszka: the released INT8 file, sensitive mode (windows), threshold 0.5. Holdouts, PL-Guard, GadziJęzyk and
false-alarm tests - model only, no regex; exam and critical list - with regex, as deployed. We compare with the
model Muszka started from - Bielik-Guard "Sójka" 0.1B and 0.5B by SpeakLeash, run as published (fp32, up to 512
tokens, no windows). Exception: for PL-Guard we also show Sójka run by us in the same 128/32-token windows as
Muszka.
Holdouts, PL-Guard, GadziJęzyk, Roget and the exam were set aside before training (exceptions: 3 exam items and
7 short holdout v1 texts were in the data of one of the two averaged checkpoints). The profanity test and the word
audit measure coverage - their words were in training. Terms (AUROC, F1, holdout…) are explained in the
glossary.
PL-Guard (NASK), a Polish safety benchmark
0.81vs 0.54
macro F1, higher is better (max. 1)
Report half, "test" split. We ran Sójka 0.1B in the same 128/32-token windows as Muszka (Sójka itself does not use windows and reads up to 512 tokens - then 0.497).
Obfuscated profanity blocked
99%vs 78%
"k*rwa", "kórwa", "k u r w a" inside messages
Sealed exam, 194 messages. Sójka 0.5B: 92.3%.
Adversarial attacks caught
88%vs 19%
harmful requests disguised as fiction, role-play, euphemisms
Holdout v2 (WildGuardMix test, in Polish). Sójka 0.5B: 17.1%. Muszka in windows, Sójka without (not measured in windows on this set). The cost: innocent adversarial prompts blocked - Muszka 20.2%, Sójka 0.1B 3.8%, Sójka 0.5B 1.6%.
Source of all numbers in this section: the Muszka Guard 0.1B v1.1 model card on Hugging Face and the PDF report.
The tables below are wider than a phone screen - swipe them sideways.
Sealed final exam
A separate set, generated by Bielik and labelled by a Bielik judge before measurement (the standalone insults were
picked by hand), measured once on the chosen model - so the model cannot be tuned to the test. The table shows the percent of texts blocked. For
"block" rows higher is better; for "allow" rows lower is better.
| Exam section | n | Expected | Muszka v1.1 | Sójka 0.1B | Sójka 0.5B |
| Vulgar chat messages (new situations) | 288 | block | 93.8% | 92.4% | 93.1% |
| Obfuscated vulgar messages | 194 | block | 99.0% | 77.8% | 92.3% |
| Innocent messages with look-alike words | 250 | allow | 4.8% | 2.8% | 0.8% |
| Innocent messages with one obfuscated word | 175 | allow | 6.3% | 6.3% | 4.0% |
| Standalone insults outside the profanity lexicon used in training | 15 | block | 6.7% | 60.0% | 26.7% |
Muszka is clearly better on obfuscated profanity and on par for plain vulgar messages. It
is clearly worse than Sójka on standalone insults outside the profanity lexicon used in training (some of
these words, e.g. "palantem", appeared in training data labelled innocent) - see
known limitations. On innocent messages with look-alike words Muszka
blocks more than both Sójka models (4.8% vs 2.8% and 0.8%). Note: after measurement we saw that the exam builder
(a Bielik-based judge) labelled some non-vulgar messages as vulgar, so the true rate for the first row is likely
higher; we did not edit the sealed exam after measuring.
PL-Guard (NASK) - Polish safety benchmark
A public test prepared by NASK: 14 categories, with both prompts and model responses. We report binary
macro F1 (safe / unsafe, from 0 to 1). We split the test into two fixed halves: one was used for choosing settings,
the other - the report half - for reporting. The report half was computed in
every gate run (5 candidates) and the gate threshold used the whole set; the candidate was not chosen by it - the
released model scores lowest of the last three on it. "Adv" is the adversarial part. Numbers in brackets: Sójka
run by us in the same 128/32-token windows as Muszka, for a fair comparison (Sójka itself does not use windows and
reads up to 512 tokens).
| Model | Report half: test / adv | Whole test: test / adv |
| Muszka v1.1 | 0.811 / 0.768 | 0.852 / 0.774 |
| Sójka 0.1B (in brackets: run by us in windows) | 0.497 (0.537) / 0.472 (0.527) | 0.489 (0.541) / 0.481 (0.537) |
| Sójka 0.5B (in brackets: run by us in windows) | 0.475 (0.568) / 0.464 (0.551) | 0.480 (0.568) / 0.470 (0.555) |
| HerBERT-PL-Guard (NASK, from the paper) | - | 0.927 / 0.913 |
HerBERT-PL-Guard was trained on data prepared by the PL-Guard authors, with the same taxonomy - which may explain
the gap. Muszka's training data has no overlap with PL-Guard (checked).
Held-out tests
Test sets set aside before training (exception: 7 short holdout v1 texts were in the data of one of the two
averaged checkpoints).
Holdout v1: Jigsaw test comments (translated with Bielik 11B) and 36 attack and innocent prompts written in Polish for the muszkaowocowa.pl chat; holdout v2: WildGuardMix test prompts (translated with Bielik 11B). Recall - how many
harmful texts were caught; false alarms - how many innocent ones were blocked. GadziJęzyk is a set of native Polish,
human-written harmful prompts (Prof. Jerzy Surma, SGH).
| Test | Muszka v1.1 | Sójka 0.1B | Sójka 0.5B |
| Holdout v1: AUROC | 0.961 | 0.940 | 0.942 |
| Holdout v1: recall / false alarms | 83.5% / 6.3% | 78.2% / 7.5% | 78.4% / 6.9% |
| Holdout v2: AUROC | 0.916 | 0.802 | 0.846 |
| Holdout v2: recall / false alarms | 87.1% / 11.5% | 40.3% / 6.1% | 41.5% / 3.6% |
| Adversarial attacks caught (v2; Muszka in windows, Sójka without) | 87.6% | 18.9% | 17.1% |
| Innocent adversarial prompts blocked (false alarms) | 20.2% | 3.8% | 1.6% |
| GadziJęzyk (native Polish harmful prompts) | 98.9% | 62.7% | 81.3% |
An honest caveat: v1 and v2 are the test splits of datasets whose training splits Muszka used (translated by Jan
Sowa) - same domain for Muszka, not for Sójka. GadziJęzyk was excluded from Muszka's training. Adversarial prompts
are mostly longer than one window, so Muszka's windows matter here; Sójka was not measured in windows on this set.
The gain in caught attacks comes with more false alarms - the cost of sensitive mode: 11.5% of innocent prompts on
v2 and 20.2% of innocent adversarial prompts (Sójka 0.1B: 6.1% and 3.8%).
Profanity and obfuscation
Test built from Jan Sowa's lexicon of Polish vulgar words and phrases, every inflected form, 13 kinds of
obfuscation. Muszka v1.1 was trained on all word families, so this measures coverage.
Generalisation to unseen families, measured on an earlier model with 30% of families held out: 87.2% of all
variants (forms and obfuscations) blocked; plain forms 90.3% (release gate, INT8). Innocent words in the same
unusual spellings are blocked in 0.5%-6.7% of cases depending on the spelling (u→ó 6.7% - above the 5% gate
threshold).
| Spelling | Muszka v1.1 | Sójka 0.1B | Sójka 0.5B |
| plain form | 99.8% | 89.4% | 80.8% |
| u→ó (kórwa) | 99.7% | 46.4% | 43.3% |
| ch→h (huj) | 100.0% | 92.1% | 64.5% |
| ch→h + u→ó (hój) | 100.0% | 62.3% | 26.9% |
| asterisk (k*rwa) | 99.0% | 87.6% | 99.6% |
| spaced letters (k u r w a) | 98.4% | 32.5% | 10.9% |
| dots (k.u.r.w.a) | 98.4% | 99.9% | 41.9% |
| leet (kurw@) | 99.1% | 61.8% | 49.2% |
| repeated letter (kuuurwa) | 98.7% | 65.9% | 72.8% |
| no Polish diacritics | 99.4% | 82.9% | 75.0% |
| UPPERCASE | 98.5% | 58.1% | 53.9% |
Table: all three models in full precision (PyTorch fp32), profanity test v2; the released INT8 file scores up to
0.5 pp lower (release gate, test v3).
Other checks
A good filter doesn't only catch bad things - it must not get in the way of ordinary conversation. Here we check
false alarms on everyday texts, and whether Muszka catches harmful replies of the models themselves.
| Check | Result |
| False alarms on 5100 ordinary Polish texts (Roget semantic fields) | 0.6% |
| False alarms on innocent health / legal / finance / election questions | 0.7% |
| Model refusals ("I can't help with that") blocked | 1.2% |
| Ordinary (non-harmful) model responses blocked - false alarms | 15.3% |
| Innocent texts on negative topics (Roget) blocked | 6.7% |
| Harmful model responses caught (PolyGuardMix, held out) | 79.4% |
| Harmful text behind a refusal-style opening ("I can't help, but...") caught | 65.5% |
| Blocks: single letters / 2-letter words / 3-letter words / top 2000 words (in training as innocent examples; the 3 are lexicon or policy words - 0 false alarms on ordinary words) | 0 / 0 / 0 / 3 |
Short texts: a fix over Sójka
Sójka mistakes some ordinary letters and words for vulgar ones: the single letter "k" scores 0.73 in Sójka 0.1B and 0.90 in 0.5B (blocked), "wujek" (uncle) 0.40 in 0.1B (warning). Muszka v1.0 fixed this and v1.1 keeps it: "k" 0.0005, "wujek" 0.0005. Of 86 single letters and short spellings Muszka blocks 0, Sójka 0.1B 31 and 0.5B 26. Audit (letters / 2 / 3 letters / top 2000 words): Muszka 0 / 0 / 0 / 3, Sójka 0.1B 21 / 15 / 9 / 48, 0.5B 12 / 5 / 4 / 39. These letters and words were in Muszka's training as innocent examples; Muszka - released INT8 file with regex, Sójka as published.
Release gate: 38 of 45
Before release every candidate goes through 45 control conditions (critical cases reported by people, profanity
and obfuscation, extreme controls, word audit, benchmarks). v1.1 meets 38 of 45 -
we released it despite 7 unmet conditions, listed below as known limitations. Before release we raised the
holdout v2 false-alarm threshold from 10% to 12% (no candidate in sensitive mode met 10%).
Speed and memory
Muszka runs on an ordinary CPU, no GPU needed. The INT8 file (126 MB, 120 MiB) is 4 times smaller than full fp32
precision (498 MB) and about 2-3 times faster (median), about 2 times on long texts. p50 is the typical message
time (half are faster), p95 the "near-worst" one (95 in 100 are faster). Measured on the released file, sensitive
mode, one message at a time, 500 texts from the test sets (median 38 tokens), ONNX Runtime 1.30 with default
threads (all cores), tokenization included, no regex.
| Device | File | p50 | p95 | mean | long texts (~420 tokens) | process RAM (MiB) |
| NVIDIA GB10 (ARM) | INT8 (126 MB) | 10.1 ms | 119.2 ms | 30.7 ms | 237 ms | 386 |
| NVIDIA GB10 (ARM) | fp32 (498 MB) | 25.4 ms | 287.8 ms | 75.2 ms | 511 ms | 788 |
| Intel i5-12600K (x86) | INT8 (126 MB) | 8.7 ms | 113.3 ms | 28.5 ms | 242 ms | 406 |
| Intel i5-12600K (x86) | fp32 (498 MB) | 19.3 ms | 235.5 ms | 60.5 ms | 475 ms | 809 |
Source: v1.1 model card; the p95 column comes from the raw measurement results (liczby_v1_1.json). INT8 vs fp32 decision agreement: 99.0% on 300 test texts.