# Commands The copy that matters is not this file: `!pomoc` prints the same list **in the group**, in Polish, one line of description per command. That version is built from the command registry at run time and cannot drift, because `CommandRegistry.register` takes the description as a required argument and `help_command.render_help` prints any command its `GROUPS` table forgot to file anyway, under no heading. This file is the trigger reference — every spelling that resolves, which `!pomoc` deliberately does not print. | Command | Aliases | |---|---| | cat | `!kot` `!koty` `!kots` `!cat` `!cats` `!meow` `!miau` + styled variants | | dog | `!pies` `!psy` `!dog` `!dogs` `!woof` `!szczek` + styled variants | | gecko | `!gekon` `!gekony` `!geko` `!gecko` `!geckon` `!geckos` | | pope | `!papież` `!papiez` `!papieze` `!papieża` `!papa` `!pope` `!popes` `!pontifex` + styled variants | | stats_today | `!staty` `!statystyki` `!stats` `!dziś` `!dzis` | | stats_yesterday | `!wczoraj` `!yesterday` | | stats_week | `!tydzień` `!tydzien` `!week` | | stats_month | `!miesiąc` `!miesiac` `!month` | | stats_year | `!rok` `!year` | | stats_records | `!rekordy` `!rekord` `!records` | | stats_crown | `!korona` `!crown` | | stats_weekdays | `!dni` `!days` | | stats_me | `!ja` `!moje` `!mnie` | | help | `!pomoc` `!pomocy` `!help` `!komendy` `!commands` | | add_photo | `!dodaj` `!dodaj_zdjecie` `!dodajzdjecie` `!add_photo` `!addphoto` | | random | `!losowe` `!losuj` `!random` `!rand` | Aliases live in `signal_bot/aliases.json`, not in source, because they are data: adding one should never mean touching Python. `add_photo` and `random` exist **only in the photo album's own groups**, and only on an installation that has an album at all — everywhere else they are not commands, not refused and never logged. Both take arguments, and those arguments are resolved to pseudonym keys by the registry before any handler, log line or `command_uses` row sees them. See `DOCS-photo-pack.md` and `DOCS-add-photo.md`. ## Why `!pomoc` shows the first alias and not a trigger `Command.triggers` is a `frozenset` of **folded skeletons** — `folding.py` runs NFKC, strips diacritics and maps Cyrillic/Greek/small-caps/leet lookalikes onto ASCII, so that `!gecko` typed on a Russian keyboard still resolves. Everything that makes those triggers robust also makes them unprintable: the set has no order, `!papież` survives only as `!papiez`, and the styled variants come out as zalgo. So `Command.primary` holds the first *raw* trigger instead, which `aliases.json` lists as the canonical Polish spelling for every command. Two consequences worth remembering, both from `folding.py`: - A command name can never contain a digit — `fold` maps `0134578` onto letters, so `!7dni` would resolve as `!tdni`. - The styled Unicode aliases in the table above are redundant now; folding covers them. They are kept because removing an alias can only take something away.