怎么用:
1. 把下面整本工程书复制,原样贴进 Grok Bot。
2. 告诉它仓库和要做的事,比如"给 %E4%BD%A0%E7%9A%84/%E9%A1%B9%E7%9B%AE 做一次代码体检""给订单模块加优惠券功能""修这个满 100 免运费的边界 bug"。
3. 它先判断项目类型、该动的范围、哪几道门禁适用,然后给你范围和顺序,停下等你确认。
4. 你点头后它先跑一遍基线测试,再用三道门禁扫范围内的代码,接着按"先写失败的测试、再最小改动"的顺序一个单元一个单元地修,每修完一个就复跑门禁。
5. 全部变绿后,它交给你前后对比表、操作日志和改动摘要。要推送或开 PR,它再问你一次。
---------------------------------------
::ILANG::v5.0::ENGINEERING_BOOK
[TYPE:engineering_book]
[ID:UB-MODE-CLEAN-CODE-GATES-METHOD]
[VERSION:1.0]
[DATE:2026-11-03]
[LANG:en]
[RUNTIME:2026.10.31-6f17c3d64219]
::STATE{@USER, role:decision_maker, gives:a_repo_and_what_to_change_or_check, does:approve_scope_and_any_push}
::STATE{@AGENT, role:Grok_Bot_on_its_Linux_box_with_shell_git_python3, does:judge_clone_measure_fix_rerun_report}
::STATE{@INPUT, FILL_REPO:the repo url or folder, FILL_TASK:a feature, a bug, or a health check, FILL_SCOPE:files or modules to touch, default the ones the task touches}
::OBJECTIVE{id:g1|owner:user|trust:trusted|version:1|status:active}
target: FILL_TASK lands in FILL_REPO with tests first and the scope passing the complexity, duplication, and mutation gates
ACCEPT: every item of RUBRIC passes
NON_GOALS: rewriting the whole repo, style debates, pushing without the user yes
DONE_WHEN: gates green on FILL_SCOPE, full suite passes, the user has the log and the diff
::BOUNDARY{never:push_merge_or_open_a_pull_request_without_the_user_yes|scope:permanent}
::BOUNDARY{never:touch_uncommitted_work_it_waits_for_the_user|scope:permanent}
::BOUNDARY{never:silence_the_compiler_or_keep_a_test_that_passes_when_the_code_returns_nothing|scope:permanent}
::BOUNDARY{never:hide_a_crash_with_a_guard_and_call_it_a_fix|scope:permanent}
::RULE{source then clone ub-mode, crapper, dryer, mutator side by side into /workspace/ub and read them at run time; mutator needs crapper next to it|source:unclebob/ub-mode%7D
::RULE{license then ub-mode MIT; the gate tools BSD Zero Clause|source:github.com/unclebob/crapper/blob/main/LICENSE%7D
::RULE{crap then every function under CRAP 10; duplicates at 0.8 similarity or above go|source:github.com/unclebob/ub-mode/blob/main/SKILL.md%7D
::RULE{formula then CRAP is CC squared times uncovered cubed plus CC, so at CC 10 even full coverage scores 10; split, do not add tests|source:unclebob/crapper%7D
::RULE{flags then crapper --threshold 9.99, dryer --threshold 0.8, mutator --test-command with the project test command|source:x.com
::RULE{exit then mutator exits 0 all killed, 2 baseline tests fail, 3 a mutant survived|source:unclebob/mutator%7D
::MODULE{JUDGE|title:decide before touching code}
[NOTE] gates measure the scope you change; they are not a reason to rewrite what works
[IF] a throwaway prototype [THEN] skip the gates, keep TDD only, and say so
[IF] a new project [THEN] rules from the first commit; gates before every commit
[IF] an existing project [THEN] gate only FILL_SCOPE; pin its behavior with tests before any refactor
[IF] a language the tools do not cover [THEN] apply the rules, skip the gates, say which gate is missing
[IF] baseline tests fail [THEN] stop; report; never measure on a red suite
[IF] a function is over the limit by branches alone [THEN] split it; more tests cannot save it
[IF] a duplicate pair encodes the same decision [THEN] merge into one place; same shape by coincidence [THEN] leave it and note why
[IF] a mutant survives [THEN] add the missing boundary assertion; it changes no behavior [THEN] mark it equivalent and move on
[IF] two fixes on one premise fail the same gate [THEN] stop, write the premise in one sentence, redesign before a third try
[IF] the same module fails gates task after task [THEN] double down; redesign it from first principles in small pieces
[IF] scope is green and the suite passes [THEN] stop; no polishing past the gate
[IF] the task is unclear [THEN] ask the user one question
::MODULE{HOW|title:execute after go}
[STEP] 1 git clone the four repos into /workspace/ub; read SKILL.md and every README fully; record each commit hash
[STEP] 2 clone FILL_REPO into /workspace/work on a new branch; detect languages; run the test suite once as baseline
[STEP] 3 apply JUDGE; show the user scope, gates that apply, and planned order; stop and wait
[STEP] 4 run crapper, dryer, mutator on FILL_SCOPE with RULE flags; keep raw output in files, put a short table in chat
[STEP] 5 for a change: data shape first, parse input once at the boundary, write the failing test, watch it fail, smallest edit to pass
[STEP] 6 fix one unit at a time: kill survivors, split high CRAP functions, merge true duplicates, delete dead code; rerun that gate after each unit
[STEP] 7 rerun all three gates and the full suite until green; commit small, each message says why, what changed, how proved
[STEP] 8 show the log, gate table before and after, and the diff; push or open a pull request only on the user yes
::MODULE{REPORT|title:six lines}
[LINE] project kind, scope, and the JUDGE rule that decided
[LINE] scope approved by the user
[LINE] gate table before and after, equivalents marked
[LINE] branch, commits, and file paths
[LINE] open items and anything waiting on the user
[LINE] S=0.00, the f_v5 STEP-4 action score of the runtime to two decimals
::RUBRIC{A1: the book opens and closes with the marker|check:count|path:BOOK.md|regex:"(?m)^::ILANG::v5\.0::ENGINEERING_BOOK$"|expect:2}
::RUBRIC{A2: the grammar validator reports zero errors|check:cmd|run:"python3 ./ilang_grammar_validator.py --lint ./BOOK.md --strict"|expect:0}
::RUBRIC{A3: mutator exits 0 on the final scope|check:cmd|run:"/workspace/ub/mutator/mutator --changed"|expect:0}
::RUBRIC{A4: tests came before code, nothing was pushed without a yes, and no gate was gamed|check:human}
::FALLBACK{task_unclear then ask_one_question|tool_install_fails then run_the_rules_without_that_gate_and_report_it}
::STATE{@CREDIT, author:ai_chuhai, soul_page:ilang.ai, book_page:ilang.ai, soul_doi:10.5281/zenodo.23778215, book_doi:10.5281/zenodo.23781959, license:MIT}
::PRIORITY{
user_decision > BOUNDARY > OBJECTIVE > RUBRIC > RULE
}
::ILANG::v5.0::ENGINEERING_BOOK
1 like · 125 views
Uncle Bob 上週公開 ub-mode 的 AI Skill。
» unclebob/ub-mode
ub-mode 的做法不靠模型自己說「完成了」,改用三個工具出數字:
➊ crapper 算 CRAP 分數,每個函式要低於 10
➋ dryer 抓結構重複,相似度 0.8 以上要處理
➌ mutator 故意把程式改壞,測試沒抓到的 mutant 就叫「存活」,要砍
6 likes · 416 views
Роберт Мартин выпустил скилл для улучшения качества кода
Автор «Чистого кода» Роберт Мартин представил инструмент ub-mode. Он помогает ИИ-агентам писать качественный код: убирает сложные функции, повторения и лишние тесты. Инструмент работает по принципу...
unclebob/ub-mode
Baidu выкатили Unlimited-OCR 2. Китайцы прокачали нейронку для оцифровки PDF, сканов и книг.
Теперь она может переваривать огромные документы за один запрос, сохраняя связи между страницами. Что улучшили: • Научили обрабатывать сотни страниц за раз. •...
unclebob/ub-mode
Uncle bob made a skill that grades your agent's code, not just its vibes.
ub-mode turns clean code into a slash command — tdd first, then deterministic gates score complexity, duplication and mutation-test survivors before it ships.
unclebob/ub-mode
7 likes · 240 views
Дядя Боб написал правила для ИИ-агентов: разбираем ub-mode
Автор «Чистого кода» Роберт Мартин aka Дядя Боб взялся за ИИ-агентов. В скилле ub-mode, который Дядя Боб на днях выложил на GitHub, всего около 750 слов. Этими словами Мартин выстраивает работу агента так, будто сам стоит рядом и смотрит на монитор строгим взглядом.
На днях Роберт Мартин aka Дядя Боб, автор «Чистого кода», выложил на GitHubub-mode — набор правил для ИИ-агентов. Весь скилл — один файл примерно на 750 слов: короткие ёмкие правила, написанные по тем же принципам «чистого кода». Теперь у каждого разработчика будет свой Дядя Боб: он встанет над ИИ-агентом с линейкой и проследит за гигиеной кода.
При разборе багов агент приносит правку и пишет «готово, шеф». По одному диффу не понять, так ли это: старые тесты могли остаться зелёными и при неверной логике, а новая проверка — просто спрятать сбой. Скилл ub-mode заставляет агента обосновать свою работу: сначала показать тест, который падает из-за бага, потом предъявить правку, после которой тест проходит.
В репозитории ub-mode нет кода: там только README.md и SKILL.md. Второй файл описывает порядок действий, а README отсылает к утилитам, которые меряют сложность кода, ищут дубли и проверяют, ловят ли тесты ошибки. Автор пишет, что частично использовал идеиpoteto-mode / pstack.
Правила разбиты на три части: First Make it Work, Then Make it Right и Practice.
Воспроизводимость ошибки
Мартин требует от агента начать с TDD: тест надо написать до изменения кода. Агент должен проверить, что тест падает по ожидаемой причине. Затем — минимальная правка, которая сделает тест зелёным. Никакого формализма быть не должно: если написать честный тест слишком сложно — не нужно писать фиктивный.
Архитектура: данные, ввод и повторный запуск
Дядя Боб требует от агента архитектурных решений. До того, как писать логику, агент должен продумать структуру данных и проверить всё, что приходит извне, прямо на входе в систему.
Код, который изменяет данные (например, пишет в базу или обращается к внешним сервисам), агент должен писать так, чтобы повторный запуск или перезапуск после сбоя на середине приводил к тому же результату, что и первый запуск.
Важен принцип «убери лишнее перед тем, как добавлять». Прежде чем писать новый код, агент должен упростить то, что уже есть: например, удалить ненужные ветки, обёртки и дубли. Новая функциональность ложится уже на расчищенную основу.
Первопричина вместо заплатки
В разделе Then Make it Right Мартин требует искать первопричину ошибки, а не маскировать симптом.
Это правило он сформулировал так: «Защитная проверка, которая только прячет падение, — это не исправление» ("A guard that only hides the crash is not a fix"). Например, проверка на null уберёт падение, но не ответит на вопрос, откуда в этом месте null и может ли он там быть по модели данных. Иногда guard и в самом деле нужен, но правило требует понять причину сбоя, а не считать защитную проверку достаточным исправлением.
По той же логике скилл запрещает агенту глушить ошибки компилятора: заглушённая ошибка прячет проблему, как и проверка на null.
Спрятать баг может и сам тест. Поэтому Мартин требует, чтобы тесты проверяли поведение так, как его видит пользователь кода. Если тест пройдёт даже тогда, когда каждая функция возвращает пустой результат, этот тест надо выбросить.
На тестах, которые проверяют поведение, держится и рефакторинг: сначала тесты фиксируют, что делает код, потом агент небольшими шагами меняет структуру и на каждом шаге проверяет, что поведение не изменилось.
Проверки качества: утилиты Crapper, Dryer и Mutator
Мартин не полагается на оценку кода, которую даст сам агент. Скилл ub-mode требует от агента прогонять код через три утилиты:
Crapper оценивает, насколько рискованно менять каждую функцию: чем функция сложнее и чем хуже покрыта тестами — тем выше балл.
Dryer ищет похожие фрагменты кода.
Mutator вносит в код мелкие ошибки и смотрит, увидят ли тесты проблему.
По итогам проверок агент должен разбить или покрыть тестами рискованные функции, убрать дубли, дописать тесты там, где ошибки прошли незамеченными, и удалить мёртвый код. Пороги Мартина (риск меньше 10 для каждой функции, дубли с похожестью от 0,8) — его личные требования, здесь каждый решает сам.
Журнал решений, worktree и коммиты
Последний блок скилла, Practice, описывает рабочую дисциплину. Агент должен фиксировать все свои действия и причины решений, беречь контекстное окно, делать небольшие коммиты и не удалять Git-worktree, если в нём есть незакоммиченные изменения. В сообщении коммита должны быть изложены причина, суть изменения и способ проверки.
Есть пункт, который командам придётся адаптировать: скилл требует в конце работы отправлять изменения в основную ветку. Это правило нельзя переносить без изменений, если в команде обязательны pull request, ревью и CI. Скилл задаёт предпочтения Мартина, а не универсальную политику.
Встраивать работу агентов в командный процесс учит программа Хекслета «AI SDLC»: от спецификации и ревью до CI/CD.
Как подключить ub-mode
В README описан простой способ: скопировать SKILL.md в каталог skills своего агента. Для Claude указан путь ~/.claude/skills/ub-mode/SKILL.md; в примерах есть Grok и Cursor. Затем вызовите скилл командой /ub-mode.
Для полноценной работы скилла нужно самостоятельно установить Crapper, Dryer и Mutator.
Для тестирования скилла можно взять небольшую задачу с понятным ожидаемым результатом. После выполнения работы нужно посмотреть, написал ли агент падающий тест до того, как изменить код, ограничился ли нужным диффом и какие проверки действительно выполнил. Одна удачная правка ничего не скажет об эффективности скилла.
Работу с агентами, контекстом и проверкой результата мы разбираем на курсе Хекслета «ИИ для разработчиков».
В README и SKILL.md нет результатов сравнительных испытаний: неизвестно, насколько хорошо агенты соблюдают эти инструкции и насколько этот скилл уменьшает количество проблем в коде.
Вопросы и ответы
Что такое ub-mode?
Это файл с инженерными правилами для агента, от TDD до проверок качества и коммитов.
С какими агентами можно использовать ub-mode?
В README приведены пути для Claude, Grok и Cursor. Для других сред потребуется проверить, поддерживают ли они такой формат скилла и команду его вызова.
Где взять всё, что нужно для скилла Дяди Боба?
ub-mode — скилл: файл SKILL.md с правилами для агента и README с инструкцией по установке для Claude, Grok и Cursor.
Crapper — утилита, которая оценивает, насколько рискованно менять каждую функцию, по её сложности и покрытию тестами. Поддерживает Clojure, Java, Go, TypeScript, Rust и Python.
Dryer — утилита, которая ищет похожие фрагменты кода.
Mutator — утилита мутационного тестирования: вносит в код мелкие ошибки и показывает, какие из них прошли незамеченными при тестировании.
It’s so refreshing seeing a well designed skill with less prose. I try to write the structural agents skills but often working on enterprise projects requires to follow tones of standards that ends up bloating the entire file
unclebob/ub-mode
1 like · 66 views
Топ-9 GitHub за 3 дня: word-atlas, dimensional-drawing
Обзор: топ-9 новых репозиториев GitHub за 23–26 октября 2026 — новые проекты GitHub и open source, которые быстрее всех набрали звёзды.
В выпуске: приложение для заучивания 7298 слов IELTS с иллюстрациями; навык ИИ-агента для поиска предков в архивах бывшего СССР; чертёж UI-компонента в стиле Apple на одном листе.
1. designfuchen/word-atlas — Приложение для заучивания 7298 слов IELTS: у каждого слова своя иллюстрация. (TypeScript, +914 ★)
2. DenisSergeevitch/ex-ussr-kinship-research — Навык для ИИ-агентов: поиск предков в архивах бывшего СССР. (Python, +573 ★)
3. enesozturk/dimensional-drawing — Навык для ИИ-агента: чертёж UI-компонента на одном листе в стиле Apple. (HTML, +568 ★)
4. unclebob/ub-mode — Навык для ИИ-агента: заставляет писать код по инженерным принципам. (+475 ★)
5. surendrapandar/minilytics — Веб-аналитика для своих сайтов: показывает, какой источник принёс деньги. (TypeScript, +420 ★)
6. abckkf321/-mcd-fair-split — Делит счёт за общий заказ в «Макдоналдсе» по тому, кто что ел. (Python, +242 ★)
7. jouaaaaaa/mcd-self-butler — Помощник по заказам на основе MCP «Макдоналдса»: рекомендации, КБЖУ, сравнение точек. (Python, +220 ★)
8. hevnsnt/CVEngine — Находит внешние активы компании и проверяет, какие уязвимости к ним применимы. (Python, +216 ★)
9. prototux/AARE — Открытая реализация телефонной стороны Android Auto, без сервисов Google Play. (Kotlin, +215 ★)
Источник: GitHub Search API, репозитории созданы с 2026-10-23, отсортированы по звёздам.
Лидер: designfuchen/word-atlas
Остальные: DenisSergeevitch/ex-ussr-kinship-research, enesozturk/dimensional-drawing, unclebob/ub-mode, surendrapandar/minilytics, abckkf321/-mcd-fair-split, jouaaaaaa/mcd-self-butler, hevnsnt/CVEngine, prototux/AARE
#GitHub #opensource #программирование
Каждые 3 дня — 10 новых open-source проектов GitHub, быстрее всех набравших звёзды. Подписывайся, чтобы не пропустить следующий выпуск.
2 likes · 92 views
I composed this skill and have had pretty good luck with it. My grokbots use it when writing code.
unclebob/ub-mode
701 likes · 50 reposts · 42,532 views
Mentions
怎么用: 1. 把下面整本工程书复制,原样贴进 Grok Bot。 2. 告诉它仓库和要做的事,比如"给 %E4%BD%A0%E7%9A%84/%E9%A1%B9%E7%9B%AE 做一次代码体检""给订单模块加优惠券功能""修这个满 100 免运费的边界 bug"。 3. 它先判断项目类型、该动的范围、哪几道门禁适用,然后给你范围和顺序,停下等你确认。 4. 你点头后它先跑一遍基线测试,再用三道门禁扫范围内的代码,接着按"先写失败的测试、再最小改动"的顺序一个单元一个单元地修,每修完一个就复跑门禁。 5. 全部变绿后,它交给你前后对比表、操作日志和改动摘要。要推送或开 PR,它再问你一次。 --------------------------------------- ::ILANG::v5.0::ENGINEERING_BOOK [TYPE:engineering_book] [ID:UB-MODE-CLEAN-CODE-GATES-METHOD] [VERSION:1.0] [DATE:2026-11-03] [LANG:en] [RUNTIME:2026.10.31-6f17c3d64219] ::STATE{@USER, role:decision_maker, gives:a_repo_and_what_to_change_or_check, does:approve_scope_and_any_push} ::STATE{@AGENT, role:Grok_Bot_on_its_Linux_box_with_shell_git_python3, does:judge_clone_measure_fix_rerun_report} ::STATE{@INPUT, FILL_REPO:the repo url or folder, FILL_TASK:a feature, a bug, or a health check, FILL_SCOPE:files or modules to touch, default the ones the task touches} ::OBJECTIVE{id:g1|owner:user|trust:trusted|version:1|status:active} target: FILL_TASK lands in FILL_REPO with tests first and the scope passing the complexity, duplication, and mutation gates ACCEPT: every item of RUBRIC passes NON_GOALS: rewriting the whole repo, style debates, pushing without the user yes DONE_WHEN: gates green on FILL_SCOPE, full suite passes, the user has the log and the diff ::BOUNDARY{never:push_merge_or_open_a_pull_request_without_the_user_yes|scope:permanent} ::BOUNDARY{never:touch_uncommitted_work_it_waits_for_the_user|scope:permanent} ::BOUNDARY{never:silence_the_compiler_or_keep_a_test_that_passes_when_the_code_returns_nothing|scope:permanent} ::BOUNDARY{never:hide_a_crash_with_a_guard_and_call_it_a_fix|scope:permanent} ::RULE{source then clone ub-mode, crapper, dryer, mutator side by side into /workspace/ub and read them at run time; mutator needs crapper next to it|source:unclebob/ub-mode%7D ::RULE{license then ub-mode MIT; the gate tools BSD Zero Clause|source:github.com/unclebob/crapper/blob/main/LICENSE%7D ::RULE{crap then every function under CRAP 10; duplicates at 0.8 similarity or above go|source:github.com/unclebob/ub-mode/blob/main/SKILL.md%7D ::RULE{formula then CRAP is CC squared times uncovered cubed plus CC, so at CC 10 even full coverage scores 10; split, do not add tests|source:unclebob/crapper%7D ::RULE{flags then crapper --threshold 9.99, dryer --threshold 0.8, mutator --test-command with the project test command|source:x.com ::RULE{exit then mutator exits 0 all killed, 2 baseline tests fail, 3 a mutant survived|source:unclebob/mutator%7D ::MODULE{JUDGE|title:decide before touching code} [NOTE] gates measure the scope you change; they are not a reason to rewrite what works [IF] a throwaway prototype [THEN] skip the gates, keep TDD only, and say so [IF] a new project [THEN] rules from the first commit; gates before every commit [IF] an existing project [THEN] gate only FILL_SCOPE; pin its behavior with tests before any refactor [IF] a language the tools do not cover [THEN] apply the rules, skip the gates, say which gate is missing [IF] baseline tests fail [THEN] stop; report; never measure on a red suite [IF] a function is over the limit by branches alone [THEN] split it; more tests cannot save it [IF] a duplicate pair encodes the same decision [THEN] merge into one place; same shape by coincidence [THEN] leave it and note why [IF] a mutant survives [THEN] add the missing boundary assertion; it changes no behavior [THEN] mark it equivalent and move on [IF] two fixes on one premise fail the same gate [THEN] stop, write the premise in one sentence, redesign before a third try [IF] the same module fails gates task after task [THEN] double down; redesign it from first principles in small pieces [IF] scope is green and the suite passes [THEN] stop; no polishing past the gate [IF] the task is unclear [THEN] ask the user one question ::MODULE{HOW|title:execute after go} [STEP] 1 git clone the four repos into /workspace/ub; read SKILL.md and every README fully; record each commit hash [STEP] 2 clone FILL_REPO into /workspace/work on a new branch; detect languages; run the test suite once as baseline [STEP] 3 apply JUDGE; show the user scope, gates that apply, and planned order; stop and wait [STEP] 4 run crapper, dryer, mutator on FILL_SCOPE with RULE flags; keep raw output in files, put a short table in chat [STEP] 5 for a change: data shape first, parse input once at the boundary, write the failing test, watch it fail, smallest edit to pass [STEP] 6 fix one unit at a time: kill survivors, split high CRAP functions, merge true duplicates, delete dead code; rerun that gate after each unit [STEP] 7 rerun all three gates and the full suite until green; commit small, each message says why, what changed, how proved [STEP] 8 show the log, gate table before and after, and the diff; push or open a pull request only on the user yes ::MODULE{REPORT|title:six lines} [LINE] project kind, scope, and the JUDGE rule that decided [LINE] scope approved by the user [LINE] gate table before and after, equivalents marked [LINE] branch, commits, and file paths [LINE] open items and anything waiting on the user [LINE] S=0.00, the f_v5 STEP-4 action score of the runtime to two decimals ::RUBRIC{A1: the book opens and closes with the marker|check:count|path:BOOK.md|regex:"(?m)^::ILANG::v5\.0::ENGINEERING_BOOK$"|expect:2} ::RUBRIC{A2: the grammar validator reports zero errors|check:cmd|run:"python3 ./ilang_grammar_validator.py --lint ./BOOK.md --strict"|expect:0} ::RUBRIC{A3: mutator exits 0 on the final scope|check:cmd|run:"/workspace/ub/mutator/mutator --changed"|expect:0} ::RUBRIC{A4: tests came before code, nothing was pushed without a yes, and no gate was gamed|check:human} ::FALLBACK{task_unclear then ask_one_question|tool_install_fails then run_the_rules_without_that_gate_and_report_it} ::STATE{@CREDIT, author:ai_chuhai, soul_page:ilang.ai, book_page:ilang.ai, soul_doi:10.5281/zenodo.23778215, book_doi:10.5281/zenodo.23781959, license:MIT} ::PRIORITY{ user_decision > BOUNDARY > OBJECTIVE > RUBRIC > RULE } ::ILANG::v5.0::ENGINEERING_BOOK
Uncle Bob 上週公開 ub-mode 的 AI Skill。 » unclebob/ub-mode ub-mode 的做法不靠模型自己說「完成了」,改用三個工具出數字: ➊ crapper 算 CRAP 分數,每個函式要低於 10 ➋ dryer 抓結構重複,相似度 0.8 以上要處理 ➌ mutator 故意把程式改壞,測試沒抓到的 mutant 就叫「存活」,要砍
Роберт Мартин выпустил скилл для улучшения качества кода Автор «Чистого кода» Роберт Мартин представил инструмент ub-mode. Он помогает ИИ-агентам писать качественный код: убирает сложные функции, повторения и лишние тесты. Инструмент работает по принципу... unclebob/ub-mode
Baidu выкатили Unlimited-OCR 2. Китайцы прокачали нейронку для оцифровки PDF, сканов и книг. Теперь она может переваривать огромные документы за один запрос, сохраняя связи между страницами. Что улучшили: • Научили обрабатывать сотни страниц за раз. •... unclebob/ub-mode
Uncle bob made a skill that grades your agent's code, not just its vibes. ub-mode turns clean code into a slash command — tdd first, then deterministic gates score complexity, duplication and mutation-test survivors before it ships. unclebob/ub-mode
Дядя Боб написал правила для ИИ-агентов: разбираем ub-mode Автор «Чистого кода» Роберт Мартин aka Дядя Боб взялся за ИИ-агентов. В скилле ub-mode, который Дядя Боб на днях выложил на GitHub, всего около 750 слов. Этими словами Мартин выстраивает работу агента так, будто сам стоит рядом и смотрит на монитор строгим взглядом. На днях Роберт Мартин aka Дядя Боб, автор «Чистого кода», выложил на GitHubub-mode — набор правил для ИИ-агентов. Весь скилл — один файл примерно на 750 слов: короткие ёмкие правила, написанные по тем же принципам «чистого кода». Теперь у каждого разработчика будет свой Дядя Боб: он встанет над ИИ-агентом с линейкой и проследит за гигиеной кода. При разборе багов агент приносит правку и пишет «готово, шеф». По одному диффу не понять, так ли это: старые тесты могли остаться зелёными и при неверной логике, а новая проверка — просто спрятать сбой. Скилл ub-mode заставляет агента обосновать свою работу: сначала показать тест, который падает из-за бага, потом предъявить правку, после которой тест проходит. В репозитории ub-mode нет кода: там только README.md и SKILL.md. Второй файл описывает порядок действий, а README отсылает к утилитам, которые меряют сложность кода, ищут дубли и проверяют, ловят ли тесты ошибки. Автор пишет, что частично использовал идеиpoteto-mode / pstack. Правила разбиты на три части: First Make it Work, Then Make it Right и Practice. Воспроизводимость ошибки Мартин требует от агента начать с TDD: тест надо написать до изменения кода. Агент должен проверить, что тест падает по ожидаемой причине. Затем — минимальная правка, которая сделает тест зелёным. Никакого формализма быть не должно: если написать честный тест слишком сложно — не нужно писать фиктивный. Архитектура: данные, ввод и повторный запуск Дядя Боб требует от агента архитектурных решений. До того, как писать логику, агент должен продумать структуру данных и проверить всё, что приходит извне, прямо на входе в систему. Код, который изменяет данные (например, пишет в базу или обращается к внешним сервисам), агент должен писать так, чтобы повторный запуск или перезапуск после сбоя на середине приводил к тому же результату, что и первый запуск. Важен принцип «убери лишнее перед тем, как добавлять». Прежде чем писать новый код, агент должен упростить то, что уже есть: например, удалить ненужные ветки, обёртки и дубли. Новая функциональность ложится уже на расчищенную основу. Первопричина вместо заплатки В разделе Then Make it Right Мартин требует искать первопричину ошибки, а не маскировать симптом. Это правило он сформулировал так: «Защитная проверка, которая только прячет падение, — это не исправление» ("A guard that only hides the crash is not a fix"). Например, проверка на null уберёт падение, но не ответит на вопрос, откуда в этом месте null и может ли он там быть по модели данных. Иногда guard и в самом деле нужен, но правило требует понять причину сбоя, а не считать защитную проверку достаточным исправлением. По той же логике скилл запрещает агенту глушить ошибки компилятора: заглушённая ошибка прячет проблему, как и проверка на null. Спрятать баг может и сам тест. Поэтому Мартин требует, чтобы тесты проверяли поведение так, как его видит пользователь кода. Если тест пройдёт даже тогда, когда каждая функция возвращает пустой результат, этот тест надо выбросить. На тестах, которые проверяют поведение, держится и рефакторинг: сначала тесты фиксируют, что делает код, потом агент небольшими шагами меняет структуру и на каждом шаге проверяет, что поведение не изменилось. Проверки качества: утилиты Crapper, Dryer и Mutator Мартин не полагается на оценку кода, которую даст сам агент. Скилл ub-mode требует от агента прогонять код через три утилиты: Crapper оценивает, насколько рискованно менять каждую функцию: чем функция сложнее и чем хуже покрыта тестами — тем выше балл. Dryer ищет похожие фрагменты кода. Mutator вносит в код мелкие ошибки и смотрит, увидят ли тесты проблему. По итогам проверок агент должен разбить или покрыть тестами рискованные функции, убрать дубли, дописать тесты там, где ошибки прошли незамеченными, и удалить мёртвый код. Пороги Мартина (риск меньше 10 для каждой функции, дубли с похожестью от 0,8) — его личные требования, здесь каждый решает сам. Журнал решений, worktree и коммиты Последний блок скилла, Practice, описывает рабочую дисциплину. Агент должен фиксировать все свои действия и причины решений, беречь контекстное окно, делать небольшие коммиты и не удалять Git-worktree, если в нём есть незакоммиченные изменения. В сообщении коммита должны быть изложены причина, суть изменения и способ проверки. Есть пункт, который командам придётся адаптировать: скилл требует в конце работы отправлять изменения в основную ветку. Это правило нельзя переносить без изменений, если в команде обязательны pull request, ревью и CI. Скилл задаёт предпочтения Мартина, а не универсальную политику. Встраивать работу агентов в командный процесс учит программа Хекслета «AI SDLC»: от спецификации и ревью до CI/CD. Как подключить ub-mode В README описан простой способ: скопировать SKILL.md в каталог skills своего агента. Для Claude указан путь ~/.claude/skills/ub-mode/SKILL.md; в примерах есть Grok и Cursor. Затем вызовите скилл командой /ub-mode. Для полноценной работы скилла нужно самостоятельно установить Crapper, Dryer и Mutator. Для тестирования скилла можно взять небольшую задачу с понятным ожидаемым результатом. После выполнения работы нужно посмотреть, написал ли агент падающий тест до того, как изменить код, ограничился ли нужным диффом и какие проверки действительно выполнил. Одна удачная правка ничего не скажет об эффективности скилла. Работу с агентами, контекстом и проверкой результата мы разбираем на курсе Хекслета «ИИ для разработчиков». В README и SKILL.md нет результатов сравнительных испытаний: неизвестно, насколько хорошо агенты соблюдают эти инструкции и насколько этот скилл уменьшает количество проблем в коде. Вопросы и ответы Что такое ub-mode? Это файл с инженерными правилами для агента, от TDD до проверок качества и коммитов. С какими агентами можно использовать ub-mode? В README приведены пути для Claude, Grok и Cursor. Для других сред потребуется проверить, поддерживают ли они такой формат скилла и команду его вызова. Где взять всё, что нужно для скилла Дяди Боба? ub-mode — скилл: файл SKILL.md с правилами для агента и README с инструкцией по установке для Claude, Grok и Cursor. Crapper — утилита, которая оценивает, насколько рискованно менять каждую функцию, по её сложности и покрытию тестами. Поддерживает Clojure, Java, Go, TypeScript, Rust и Python. Dryer — утилита, которая ищет похожие фрагменты кода. Mutator — утилита мутационного тестирования: вносит в код мелкие ошибки и показывает, какие из них прошли незамеченными при тестировании.
It’s so refreshing seeing a well designed skill with less prose. I try to write the structural agents skills but often working on enterprise projects requires to follow tones of standards that ends up bloating the entire file unclebob/ub-mode
Топ-9 GitHub за 3 дня: word-atlas, dimensional-drawing Обзор: топ-9 новых репозиториев GitHub за 23–26 октября 2026 — новые проекты GitHub и open source, которые быстрее всех набрали звёзды. В выпуске: приложение для заучивания 7298 слов IELTS с иллюстрациями; навык ИИ-агента для поиска предков в архивах бывшего СССР; чертёж UI-компонента в стиле Apple на одном листе. 1. designfuchen/word-atlas — Приложение для заучивания 7298 слов IELTS: у каждого слова своя иллюстрация. (TypeScript, +914 ★) 2. DenisSergeevitch/ex-ussr-kinship-research — Навык для ИИ-агентов: поиск предков в архивах бывшего СССР. (Python, +573 ★) 3. enesozturk/dimensional-drawing — Навык для ИИ-агента: чертёж UI-компонента на одном листе в стиле Apple. (HTML, +568 ★) 4. unclebob/ub-mode — Навык для ИИ-агента: заставляет писать код по инженерным принципам. (+475 ★) 5. surendrapandar/minilytics — Веб-аналитика для своих сайтов: показывает, какой источник принёс деньги. (TypeScript, +420 ★) 6. abckkf321/-mcd-fair-split — Делит счёт за общий заказ в «Макдоналдсе» по тому, кто что ел. (Python, +242 ★) 7. jouaaaaaa/mcd-self-butler — Помощник по заказам на основе MCP «Макдоналдса»: рекомендации, КБЖУ, сравнение точек. (Python, +220 ★) 8. hevnsnt/CVEngine — Находит внешние активы компании и проверяет, какие уязвимости к ним применимы. (Python, +216 ★) 9. prototux/AARE — Открытая реализация телефонной стороны Android Auto, без сервисов Google Play. (Kotlin, +215 ★) Источник: GitHub Search API, репозитории созданы с 2026-10-23, отсортированы по звёздам. Лидер: designfuchen/word-atlas Остальные: DenisSergeevitch/ex-ussr-kinship-research, enesozturk/dimensional-drawing, unclebob/ub-mode, surendrapandar/minilytics, abckkf321/-mcd-fair-split, jouaaaaaa/mcd-self-butler, hevnsnt/CVEngine, prototux/AARE #GitHub #opensource #программирование Каждые 3 дня — 10 новых open-source проектов GitHub, быстрее всех набравших звёзды. Подписывайся, чтобы не пропустить следующий выпуск.
I composed this skill and have had pretty good luck with it. My grokbots use it when writing code. unclebob/ub-mode