Borrowing it
Nothing to install: this file belongs to AlexToster/SlangUA. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/AlexToster/SlangUA/main/AGENTS.mdgit clone --depth 1 https://github.com/AlexToster/SlangUAWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/instructions/alextoster/slangua/agents-md)<a href="https://agentmods.dev/instructions/alextoster/slangua/agents-md"><img src="https://agentmods.dev/badge/instructions/alextoster/slangua/agents-md/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/instructions/alextoster/slangua/agents-md"><img src="https://agentmods.dev/badge/instructions/alextoster/slangua/agents-md.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.06511 | $0.06511 |
| Opus 5.5 | $0.02604 | $0.02604 |
| Sonnet 5.5 | $0.01302 | $0.01302 |
| Haiku 4.5 | $0.00651 | $0.00651 |
Grade A, and why
SlangUA AGENTS.md scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 153 lines — stays where its author put it; the contents beside it link to each section on GitHub.
AGENTS.md
Правила роботи в репозиторії SlangUA для AI-агентів і нових контриб'юторів.
Цей файл описує як тут працювати. Що саме побудовано — у README.md та plans/docs/README.md. Повний технічний контекст одним документом, який можна віддати сторонній моделі, — plans/SLANGUA-BRIEFING.md.
1. Перед початком роботи
- Прочитай plans/docs/README.md → plans/architecture.md → plans/ROADMAP.md. Документація тут є контрактом, а не описом післяфактум.
- Виконай
git statusодин раз на початку. Незв'язані зміни, які вже були в робочій копії, — чужі: не комітити, не відкочувати, не «чистити». - Знайди поточну стадію в ROADMAP. Стадії виконуються послідовно; не перестрибуй наперед.
- Перед зміною поведінки API або безпеки прочитай відповідний документ у
plans/docs/— там зафіксовано обґрунтування, і його потрібно оновити разом із кодом.
2. Непорушні інваріанти
Це не стильові побажання. Порушення будь-якого пункту — привід відкинути зміну.
- Не послаблювати age gate, автентифікацію, перевірку власності, rate limiting, захист від prompt injection і серверну валідацію заради спрощення UI. Ніколи.
- Age gate має єдину справжню точку перевірки для перекладу —
TranslationService. Він порівнюєageRestrictedстилю зuser.ageConfirmedAdultдо звернення до preview-кешу і до AI.GET /stylesповертає всі увімкнені стилі разом із прапорцемageRestricted(він не фільтрує), а UI лише блокує картку — щоб користувач бачив стиль і міг підтвердити вік. Клієнтське блокування не є захистом і не може його замінити. Окрема серверна перевірка того самого правила стоїть уPOST /share/inline(шарити 18+ може лише підтверджений повнолітній) — це власний gate іншої дії, а не дублікат. - Сервер ніколи не довіряє тексту від клієнта.
POST /translate/saveприймає лишеpreviewId;POST /share/inline— лишеpreviewIdабоtranslationId. НіoriginalText, ніtranslatedTextз клієнта не зберігаються і не надсилаються. - Rate limiter падає закрито. Якщо Redis недоступний — 503
RATE_LIMITER_UNAVAILABLE. Сервіс не працює, вдаючи, що лімітів немає. - Style Engine не має тихого fallback. Невідомий або вимкнений стиль завжди кидає помилку, яка перетворюється на 400 зі списком доступних стилів. Ніякого підставляння
GEN_Z. - Шеринг — лише всередині Telegram. Основний шлях: сервер рендерить текст (
shareText), клієнт передає його у власний чат-пікер Telegram черезopenTelegramLink('t.me/share/url?...'); inline mode (switchInlineQuery) — резервний шлях. Заборонено: браузерний share sheet, будь-який неявно створений публічний URL з перекладом, а також будь-що в share-інтенті, крім самого тексту повідомлення (ні токена, ніpreviewId, ні внутрішнього посилання). - Адмінка невидима для не-адмінів і не має ролі в базі. Доступ дають два незалежні фактори: Telegram-id у
ADMIN_TELEGRAM_IDSі пароль (ADMIN_PASSWORD_HASH), який відкриває крок-ап сесію підX-Admin-Token. Кому не дозволено — усі/api/v1/admin/*віддають 404 з тим самим тілом, що й неіснуючий маршрут (не 401 і не 403: вони підтверджують існування панелі). Тому гейт — це хукonRequest, а неpreHandler: Fastify валідує тіло раніше заpreHandler, і 400VALIDATION_ERRORвиказував би маршрут так само. ПрапорецьisAdminу/user/me— лише підказка клієнту, чи малювати кнопку, а не рішення про доступ. Ознаки адміна в Postgres немає навмисно: адмінство — конфігурація деплою, а рядок у БД міг би змінити будь-хто з правом запису, і відкат з бекапу воскресив би колишнього адміна. - Кіл-світч провайдерів — не circuit breaker, і він не має TTL. Breaker відповідає на питання «чи провайдер зараз падає?» і сам себе лікує через
CIRCUIT_BREAKER_RESET_MS; кіл-світч відповідає на питання «чи людина взагалі хоче туди трафік?» і не лікується ніколи — ні через кулдаун, ні через рестарт, ні через успішний пробний запит. Стан — один хеш Redisai:provider:disabled(поле = id провайдера, значення ={by, at, reason}), без TTL: у пам'яті процесу він тихо ввімкнув би провайдера на наступному деплої, а з TTL — воскресив би його в довільний момент, коли ніхто не дивиться.AIServiceчитає світч один раз на запит, перед breaker'ами, і вимкнений провайдер не потрапляє ні в ланцюг fallback, ні в пробний запит на відновлення, ні в явний виклик за id. Світч сильніший і за preview-кеш:TranslationServiceвикликаєaiService.hasPermittedProviders()до звернення до кешу на обох шляхах перекладу, тому при повністю вимкненому ланцюгу теплий кеш віддає той самий503, а не власний вивід уже вбитого провайдера до кінця TTL — інакше оператор не може сказати, чи його рішення взагалі подіяло. Стан breaker'ів у цій точці навмисно не читається: breaker лікується сам, і під час справжнього збою кеш саме й має продовжувати відповідати. Читання падає закрито: помилка Redis перетворюється на звичний503 AI_PROVIDER_UNAVAILABLE, бо трактувати її як «нічого не вимкнено» означало б відправити трафік саме туди, куди оператор заборонив. Наявність поля — це і є світч: нерозбірливе значення все одно вимикає провайдера (щобHSET, зроблений руками під час інциденту, працював). Вимкнути все дозволено навмисно — інакше панель була б безсилою саме тоді, коли потрібна, — але наслідок озвучується заздалегідь: клієнт попереджає, сервер логує результат на рівніerrorз Telegram-id оператора, а користувач бачить той самий503, у якому немає ні id провайдера, ні причини. - Спостережуваність нічого не сповільнює і нічого не ідентифікує. Метрики й стрічка помилок пишуться в одному хуку
onResponse— після того, як відповідь уже пішла, — тому обидва записи падають відкрито: помилка Redis коштує однієї точки на графіку і логується на рівніdebug. Це не суперечить правилу «rate limiter падає закрито»: лімітер вирішує, чи пускати запит, і мусить відмовити, коли не може вирішити, а цей хук лише описує вже завершене. Читання, навпаки, падає закрито — сторінка з нулями читалася б як «трафіку немає», а не «даних немає». Що можна зберігати — це список дозволеного, а не фільтр: статус-код, шаблон маршруту (/api/v1/history/:id, ніколи конкретний шлях із id), наш код помилки, технічне повідомлення, обрізане до 300 символів, внутрішній id користувача іrequestId. Ні тіла запиту, ні заголовків, ні тексту перекладу, ні Telegram-id: стрічка, що цитувала б текст користувача, відтворила б у Redis саме те, що розділення preview/save тримає подалі. Не рахуютьсяOPTIONS,/health*і самі/api/v1/admin/*— панель опитує себе, і оператор, який дивиться на графік, не повинен його роздувати. Код і повідомлення в стрічку кладеcaptureErrorSnapshot(request, code, message): глобальний обробник помилок робить це для всього, що до нього доходить, а маршрути, які ловлять свої помилки самі (/translate/*,/share/inline), мусять викликати його явно — інакше найчастіший реальний збій виглядав би в стрічці як голий 5xx без причини. - Аудіо голосового вводу не зберігається ніде і ніколи.
POST /api/v1/transcribeотримує запис, передає його провайдеру й повертає текст: ні Postgres, ні Redis, ні тимчасовий файл, ні рядок логу. Транскрипт стає рядкомTranslationлише тоді, коли користувач сам зробить preview і збереже його — голос це спосіб набору, а не окремий шлях перекладу. Маршрут обов'язково автентифікований (відкритий ендпоінт транскрипції — це безкоштовний STT-проксі за кошт оператора) і має власний бюджет запитів, бо кожен виклик витрачає квоту провайдера, спільну для всього деплою. Ключі транскрипції — окремий пул (STT_API_KEY), а не ключі AI-шару. Деталі — plans/docs/06-security.md. - Секрети лише через env. Ключі AI-провайдерів ніколи не потрапляють на клієнт.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2mo ago Changed · +7 lines · +273 tokens per session e69fbf1db74a
- 2mo ago First seen · 146 lines · 6,238 tokens per session scan A d4007a515bf6
SlangUA AGENTS.md is an instructions file published in the GitHub repository AlexToster/SlangUA (5 stars, last pushed 2mo ago), licensed MIT. It adds 6,511 tokens to every session, about $0.0260 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
SlangUA AGENTS.md compared with instructions from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| SlangUA AGENTS.mdAlexToster/SlangUA | Instructions file | 5 | 2mo ago | MIT | A | 6,511 | Codex, OpenCode |
| vscode buildNext.instructions.mdmicrosoft/vscode | Instructions file | 195k | today | MIT | A | 9,719 | GitHub Copilot |
| next.js AGENTS.mdvercel/next.js | Instructions file | 143k | yesterday | MIT | A | 7,461 | Codex, OpenCode |
| vscode oss-third-party-notices.instructions.mdmicrosoft/vscode | Instructions file | 195k | today | MIT | A | 5,649 | GitHub Copilot |
| langchain AGENTS.mdlangchain-ai/langchain | Instructions file | 149k | today | MIT | A | 4,680 | Codex, OpenCode |
| vscode copilot-instructions.mdmicrosoft/vscode | Instructions file | 195k | today | MIT | A | 3,093 | GitHub Copilot |
| vscode ai-customization.instructions.mdmicrosoft/vscode | Instructions file | 195k | today | MIT | A | 1,907 | GitHub Copilot |