[{"data":1,"prerenderedAt":890},["ShallowReactive",2],{"navigation_docs":3,"-methodology-standard":238,"-methodology-standard-surround":887},[4,45,60],{"title":5,"description":6,"icon":7,"path":8,"stem":9,"children":10},"Методология",null,"ruler","\u002Fmethodology","1.methodology",[11,15,20,25,30,35,40],{"title":12,"path":8,"stem":13,"description":14},"bxshef: методология и проверка навыков","1.methodology\u002Findex","Как писать навыки ИИ-агентов для Битрикса и как проверять, что им можно верить",{"title":16,"path":17,"stem":18,"description":19},"Стандарт навыка","\u002Fmethodology\u002Fstandard","1.methodology\u002F1.standard","11 правил, каждое из провала на стенде",{"title":21,"path":22,"stem":23,"description":24},"Методология проверки","\u002Fmethodology\u002Fmethod","1.methodology\u002F2.method","lint → eval → стенд; что измерено",{"title":26,"path":27,"stem":28,"description":29},"bxshef — CLI","\u002Fmethodology\u002Fbxshef","1.methodology\u002F3.bxshef","lint, eval, feedback",{"title":31,"path":32,"stem":33,"description":34},"GitHub Action","\u002Fmethodology\u002Faction","1.methodology\u002F4.action","тот же lint + eval в любом репозитории навыков",{"title":36,"path":37,"stem":38,"description":39},"Заготовка репозитория","\u002Fmethodology\u002Ftemplate","1.methodology\u002F5.template","с чего начать автору модуля",{"title":41,"path":42,"stem":43,"description":44},"Приёмник отзывов","\u002Fmethodology\u002Ffeedback","1.methodology\u002F6.feedback","куда уходят отзывы ИИ-агентов",{"title":46,"description":6,"icon":47,"path":48,"stem":49,"children":50},"Навыки","sparkles","\u002Fskills","2.skills",[51,55],{"title":52,"path":48,"stem":53,"description":54},"Навыки shef.*","2.skills\u002Findex","npx skills add bx-shef\u002Fskills",{"title":56,"path":57,"stem":58,"description":59},"shef-feedback","\u002Fskills\u002Fshef-feedback","2.skills\u002F1.shef-feedback","Отправить отзыв о навыке shef-* или навыке команды. Брать ВСЕГДА, когда просят оставить или отправить отзыв о навыке — даже если сам навык в диалоге не виден, —",{"title":61,"description":6,"icon":62,"path":63,"stem":64,"children":65},"Модули shef.*","package","\u002Fmodules","3.modules",[66,69,131,179],{"title":61,"path":63,"stem":67,"description":68},"3.modules\u002Findex","Что за чем ставить",{"title":70,"description":6,"path":71,"stem":72,"children":73},"shef.options","\u002Fmodules\u002Foptions","3.modules\u002F1.options\u002Findex",[74,76,81,86,91,96,101,106,110,114,119,123,127],{"title":70,"path":71,"stem":72,"description":75},"фундамент: настройки, трейты, компоненты",{"title":77,"path":78,"stem":79,"description":80},"[`\\Shef\\Options\\Installator`] Installer","\u002Fmodules\u002Foptions\u002Finstaller","3.modules\u002F1.options\u002F1.installer","Для облегчения установок.",{"title":82,"path":83,"stem":84,"description":85},"Сборка, CI и релиз","\u002Fmodules\u002Foptions\u002Fbuild-and-install","3.modules\u002F1.options\u002F10.build-and-install","Раскладка репозитория — в module-structure.md, процесс —\nв CONTRIBUTING.md, установка глазами пользователя —\nв README.md.",{"title":87,"path":88,"stem":89,"description":90},"Раскладка репозитория","\u002Fmodules\u002Foptions\u002Fmodule-structure","3.modules\u002F1.options\u002F11.module-structure","Файл про устройство репозитория. Опорные точки модуля — в CLAUDE.md,\nпроцесс — в CONTRIBUTING.md, сборка — в\nbuild-and-install.md.",{"title":92,"path":93,"stem":94,"description":95},"Проверка на портале","\u002Fmodules\u002Foptions\u002Fportal-check","3.modules\u002F1.options\u002F12.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, кеш,\nраскладка файлов, поведение при обновлении. Проверять это приходится руками —\nи лучше по списку, потому что забытый шаг находит не разработчик, а клиент.",{"title":97,"path":98,"stem":99,"description":100},"[`\\Shef\\Options\\Main\\Options`] Опции настроек модуля","\u002Fmodules\u002Foptions\u002Foptions","3.modules\u002F1.options\u002F2.options","Поддерживает следующие типы:",{"title":102,"path":103,"stem":104,"description":105},"Работа с пользователями","\u002Fmodules\u002Foptions\u002Fsecurity","3.modules\u002F1.options\u002F3.security","",{"title":107,"path":108,"stem":109,"description":105},"[`\\Shef\\Options\\Main\\Utils`] Утилиты","\u002Fmodules\u002Foptions\u002Futils","3.modules\u002F1.options\u002F4.utils",{"title":111,"path":112,"stem":113,"description":105},"[`\\Shef\\Options\\Components`] Работа с компонентами","\u002Fmodules\u002Foptions\u002Fcomponents","3.modules\u002F1.options\u002F5.components",{"title":115,"path":116,"stem":117,"description":118},"[`\\Shef\\Options\\Options`] Паттерны","\u002Fmodules\u002Foptions\u002Fpattern","3.modules\u002F1.options\u002F6.pattern","Запускаемые примеры: singleton.php,\nconfig.php, smartstd.php —\nкак их гонять, написано в examples\u002FREADME.md.",{"title":120,"path":121,"stem":122,"description":105},"[`\\Shef\\Options\\Tests`] Тестирование","\u002Fmodules\u002Foptions\u002Ftests","3.modules\u002F1.options\u002F7.tests",{"title":124,"path":125,"stem":126,"description":105},"[`\\Shef\\Options\\TraitList`] Набор трейтов","\u002Fmodules\u002Foptions\u002Ftraitlist","3.modules\u002F1.options\u002F8.traitlist",{"title":128,"path":129,"stem":130,"description":105},"Правила для ИИ-агентов в этом репозитории","\u002Fmodules\u002Foptions\u002Fagent-rules","3.modules\u002F1.options\u002F9.agent-rules",{"title":132,"description":6,"path":133,"stem":134,"children":135},"shef.problems","\u002Fmodules\u002Fproblems","3.modules\u002F2.problems\u002Findex",[136,138,143,147,152,157,161,166,169,172,175],{"title":132,"path":133,"stem":134,"description":137},"логи, журнал событий, учёт проблем",{"title":139,"path":140,"stem":141,"description":142},"[`\\Shef\\Problems\\Integration`] События и меню","\u002Fmodules\u002Fproblems\u002Fevents","3.modules\u002F2.problems\u002F1.events","Что модуль регистрирует в ядре при установке. Список — в .settings.php, ключ\ninstallEvents; что каждый обработчик существует, сверяет\ntests\u002Fsettings_test.php.",{"title":144,"path":145,"stem":146,"description":105},"Безопасность логов","\u002Fmodules\u002Fproblems\u002Fsecurity","3.modules\u002F2.problems\u002F10.security",{"title":148,"path":149,"stem":150,"description":151},"Быстрая отладка: `_pr`, `_log`, `_log1`","\u002Fmodules\u002Fproblems\u002Fdeffunctions","3.modules\u002F2.problems\u002F2.deffunctions","Функции объявляет def-functions.php, подключается он из include.php.",{"title":153,"path":154,"stem":155,"description":156},"Уровни логирования","\u002Fmodules\u002Fproblems\u002Floglevel","3.modules\u002F2.problems\u002F3.loglevel","Уровни — стандарт PSR-3, в Monolog это \\Monolog\\Level. Ниже — когда какой брать.",{"title":158,"path":159,"stem":160,"description":105},"[`\\Shef\\Problems\\Integration\\Monolog`] Monolog","\u002Fmodules\u002Fproblems\u002Fmonolog","3.modules\u002F2.problems\u002F4.monolog",{"title":162,"path":163,"stem":164,"description":165},"Ротация логов","\u002Fmodules\u002Fproblems\u002Flogrotate","3.modules\u002F2.problems\u002F5.logrotate","Логи модуля лежат в каталоге логов — по умолчанию на уровень выше корня сайта,\nдля BitrixVM \u002Fhome\u002Fbitrix\u002Fsh_log\u002F*.log, — и сами не чистятся. Ротацию делает\nlogrotate — системная утилита, а не Monolog: Monolog тоже умеет\n(RotatingFileHandler), но тогда за файлами следит каждый PHP-процесс, а не\nодна служба.",{"title":128,"path":167,"stem":168,"description":105},"\u002Fmodules\u002Fproblems\u002Fagent-rules","3.modules\u002F2.problems\u002F6.agent-rules",{"title":82,"path":170,"stem":171,"description":85},"\u002Fmodules\u002Fproblems\u002Fbuild-and-install","3.modules\u002F2.problems\u002F7.build-and-install",{"title":87,"path":173,"stem":174,"description":90},"\u002Fmodules\u002Fproblems\u002Fmodule-structure","3.modules\u002F2.problems\u002F8.module-structure",{"title":92,"path":176,"stem":177,"description":178},"\u002Fmodules\u002Fproblems\u002Fportal-check","3.modules\u002F2.problems\u002F9.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, меню,\nраскладка файлов, журнал событий, поведение при обновлении. Проверять это\nприходится руками — и лучше по списку, потому что забытый шаг находит не\nразработчик, а клиент.",{"title":180,"description":6,"path":181,"stem":182,"children":183},"shef.insync","\u002Fmodules\u002Finsync","3.modules\u002F3.insync\u002Findex",[184,186,191,194,198,203,208,213,218,222,227,232,235],{"title":180,"path":181,"stem":182,"description":185},"агенты, импорт, API-клиенты, модели",{"title":187,"path":188,"stem":189,"description":190},"[`\\Shef\\InSync\\Agents`] Агенты","\u002Fmodules\u002Finsync\u002Fagents","3.modules\u002F3.insync\u002F1.agents","Агент импорта — наследник \\Shef\\InSync\\Agents\\AAgent. Описание агента для\nb_agent — \\Shef\\InSync\\Agents\\Entity, установку и управление берёт на себя\n\\Shef\\InSync\\Agents\\Manager.",{"title":87,"path":192,"stem":193,"description":90},"\u002Fmodules\u002Finsync\u002Fmodule-structure","3.modules\u002F3.insync\u002F10.module-structure",{"title":92,"path":195,"stem":196,"description":197},"\u002Fmodules\u002Finsync\u002Fportal-check","3.modules\u002F3.insync\u002F11.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, левое\nменю, раскладка компонентов, агенты, таблица импорта, поведение при\nобновлении. Проверять это приходится руками — и лучше по списку, потому что\nзабытый шаг находит не разработчик, а клиент.",{"title":199,"path":200,"stem":201,"description":202},"Безопасность","\u002Fmodules\u002Finsync\u002Fsecurity","3.modules\u002F3.insync\u002F12.security","Модуль даёт другим модулям заготовки для синхронизаций, и самые опасные места\nу него общие с ними: кто может запускать агенты и импорт, что ложится в каталоги\nимпорта, что уходит в SQL и в лог. Ниже — что держит модуль и что остаётся\nпроекту.",{"title":204,"path":205,"stem":206,"description":207},"[`\\Shef\\InSync\\Sync`] Импорт","\u002Fmodules\u002Finsync\u002Fimport","3.modules\u002F3.insync\u002F2.import","Импорт идёт в два шага через таблицу импорта \\Shef\\InSync\\Sync\\Model\\SyncTable\n(shef_insync_model):",{"title":209,"path":210,"stem":211,"description":212},"[`\\Shef\\InSync\\Api`] API","\u002Fmodules\u002Finsync\u002Fapi","3.modules\u002F3.insync\u002F3.api","Обращение к внешнему API по HTTP — наследник \\Shef\\InSync\\Api\\AConnector.",{"title":214,"path":215,"stem":216,"description":217},"[`\\Shef\\InSync\\TraitList\\Xml`] Парсинг XML","\u002Fmodules\u002Finsync\u002Fxml","3.modules\u002F3.insync\u002F4.xml","Разбор XML сделан через SbWereWolf\u002Fxml-navigator\n(статья на Хабре): XMLReader идёт по\nдокументу потоком, а каждый элемент с нужным тегом HierarchyComposer\nпревращает в массив — n имя, v значение, a атрибуты, s вложенные\nэлементы.",{"title":219,"path":220,"stem":221,"description":105},"Компоненты","\u002Fmodules\u002Finsync\u002Fcomponents","3.modules\u002F3.insync\u002F5.components",{"title":223,"path":224,"stem":225,"description":226},"Страницы","\u002Fmodules\u002Finsync\u002Fpage","3.modules\u002F3.insync\u002F6.page","Страницы модуля — в левом меню, штатным разделом intranet\n(Bitrix\\Intranet\\CustomSection): раздел «SH Импорт», код shinsync.\nВерхней панели и shef.uiclear больше нет.",{"title":228,"path":229,"stem":230,"description":231},"[`\\Shef\\InSync\\Main\\Options`] Опции настроек модуля","\u002Fmodules\u002Finsync\u002Foptions","3.modules\u002F3.insync\u002F7.options","Опции для страницы настроек модуля импорта (на ShOptionsConfig из\nshef.options): добавьте их во вкладку своего options_conf.php.",{"title":128,"path":233,"stem":234,"description":105},"\u002Fmodules\u002Finsync\u002Fagent-rules","3.modules\u002F3.insync\u002F8.agent-rules",{"title":82,"path":236,"stem":237,"description":85},"\u002Fmodules\u002Finsync\u002Fbuild-and-install","3.modules\u002F3.insync\u002F9.build-and-install",{"id":239,"title":16,"body":240,"description":19,"extension":881,"meta":882,"navigation":883,"path":17,"rawbody":884,"seo":885,"stem":18,"__hash__":886},"docs\u002F1.methodology\u002F1.standard.md",{"type":241,"value":242,"toc":861},"minimark",[243,255,284,293,323,331,334,337,377,381,388,392,403,407,410,414,448,452,455,462,481,485,495,506,512,604,608,622,635,739,749,790,797,845,857],[244,245,246,247,254],"p",{},"Правила, по которым навык заводят и принимают. Первые два решают, будет ли им\nвообще кто-то пользоваться, — остальное поправимо. Каждое правило с пометкой\n«прогон» стоило одного провала на стенде (см. ",[248,249,253],"a",{"href":250,"rel":251},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002FMETHOD.md",[252],"nofollow","METHOD.md",").",[244,256,257,258,262,263,267,268,271,272,275,276,279,280,283],{},"Термины: ",[259,260,261],"strong",{},"автор"," — тот, чей модуль или библиотеку описывает навык\n(",[264,265,266],"code",{},"acme",", ",[264,269,270],{},"shef",", ваш вендор); ",[259,273,274],{},"префикс"," — короткое имя автора в имени\nнавыка; ",[259,277,278],{},"справочный"," навык отвечает «как это устроено», ",[259,281,282],{},"операционный"," —\n«сделай по канону».",[285,286,288,289,292],"h2",{"id":287},"_1-имя-глагол-или-тема-каталог-и-name-совпадают","1. Имя — глагол или тема; каталог и ",[264,290,291],{},"name"," совпадают",[244,294,295,296,299,300,267,303,306,307,310,311,314,315,318,319,322],{},"Только ",[264,297,298],{},"[a-z0-9-]",",\nпрефикс автора первым: ",[264,301,302],{},"acme-new-import",[264,304,305],{},"acme-options-traits",". Справочные —\n",[264,308,309],{},"\u003Cпрефикс>-\u003Cбиблиотека>-\u003Cо чём>","; операционные — ",[264,312,313],{},"\u003Cпрефикс>-new-\u003Cчто>",",\n",[264,316,317],{},"\u003Cпрефикс>-use-\u003Cчто>"," и другие (",[264,320,321],{},"\u003Cпрефикс>-feedback","). Операционным\nсчитается всё, что не справочное, и у него обязательны evals. Префикс нужен\nне для красоты: в одном проекте живут навыки нескольких авторов, и без\nпрефикса они перепишут друг друга при установке.",[285,324,326,327,330],{"id":325},"_2-description-пишется-под-задачу-а-не-под-содержание","2. ",[264,328,329],{},"description"," пишется под задачу, а не под содержание",[244,332,333],{},"Это единственное,\nпо чему навык выбирают: модель видит список имён и описаний и берёт один.\nОписание-оглавление («в навыке есть Modules, Events, PrepareFields») проигрывает\nописанию-поводу («нужно разобрать цену из строки вида 1 234,50 — брать этот»).",[244,335,336],{},"Что обязано быть в описании:",[338,339,340,347,353,367],"ul",{},[341,342,343,346],"li",{},[259,344,345],{},"фразы задачи",", а не названия классов: «вывести на странице список»,\n«вынеси ключ в настройки модуля»;",[341,348,349,352],{},[259,350,351],{},"граница",": чего навык НЕ делает и какой брать вместо него. Именно границы\nразводят соседние навыки — без них модель берёт первый похожий. Соседи есть\nу каждого: агент — импорт, ajax-действие — API-клиент, трейты — модели;",[341,354,355,358,359,362,363,366],{},[259,356,357],{},"длина от 80 до 1024 символов"," одной строкой. Верх — жёсткий лимит\nспецификации Agent Skills, длиннее обрезается молча; мерить ",[264,360,361],{},"mb_strlen",",\nне ",[264,364,365],{},"wc -m"," в C-локали;",[341,368,369,372,373,376],{},[259,370,371],{},"без привязки к вендору."," Навык — для любого модуля на базе вашей\nбиблиотеки, а не только для ваших модулей. Прогон 1: «модуль линейки\n\u003Cвендор>.*» в описании — и ИИ-агент не брал навык для модуля ",[264,374,375],{},"acme.demo","\nв пяти случаях из девяти; после правки — 9 из 9.",[285,378,380],{"id":379},"_3-тело-то-чего-агент-не-знает-и-не-выведет-сам","3. Тело — то, чего агент не знает и не выведет сам",[244,382,383,384,387],{},"Порядок действий,\nловушки, «чего не делать». Пересказывать документацию ядра Битрикса не нужно:\nона у модели есть; а вот что ",[264,385,386],{},"prefilters"," замещает умолчания — нет.",[285,389,391],{"id":390},"_4-имена-классов-сверяются-с-кодом","4. Имена классов сверяются с кодом",[244,393,394,395,398,399,402],{},"Любой ",[264,396,397],{},"\\Vendor\\…"," в обратных кавычках\nпроверяет ",[264,400,401],{},"bxshef lint --code"," против исходников модуля: нет такого класса —\nкрасный CI. Защита от навыка, который уверенно рассказывает про\nпереименованное.",[285,404,406],{"id":405},"_5-навык-не-отсылает-к-коду-который-агент-может-не-увидеть","5. Навык не отсылает к коду, который агент может не увидеть",[244,408,409],{},"Сигнатура\nметода, namespace класса, имя файла — дословно в навыке. «Возьмите из модуля»\n— с точным путём и только как дополнение. Прогон 2: три угадывания из трёх\nтам, где навык отсылал вместо того, чтобы сказать (глобальный класс без\nnamespace, метод с массивом вместо строки, наследование без подключения\nмодуля).",[285,411,413],{"id":412},"_6-модуль-подключается-до-объявления-класса","6. Модуль подключается до объявления класса",[244,415,416,417,267,420,423,424,427,428,431,432,435,436,439,440,443,444,447],{},"Файл, в котором класс делает\n",[264,418,419],{},"extends",[264,421,422],{},"implements"," или ",[264,425,426],{},"use"," чего-либо из чужого модуля, начинается с\n",[264,429,430],{},"\\Bitrix\\Main\\Loader::includeModule('\u003Cмодуль>')"," ",[259,433,434],{},"до"," слова ",[264,437,438],{},"class",". PHP\nразбирает наследование при чтении файла; ",[264,441,442],{},"includeModule"," в теле метода к этому\nмоменту не выполнялся. Навык, который показывает такой класс, показывает и эту\nстроку. Прогон 3: ",[264,445,446],{},"Trait \"…\" not found"," там, где навык молчал.",[285,449,451],{"id":450},"_7-ссылки-наружу-абсолютные-на-github","7. Ссылки наружу — абсолютные, на GitHub",[244,453,454],{},"Навык ставится в чужой проект,\nотносительный путь там ведёт в никуда.",[285,456,458,459],{"id":457},"_8-операционному-навыку-evalsselectionjson","8. Операционному навыку — ",[264,460,461],{},"evals\u002Fselection.json",[244,463,464,465,468,469,472,473,476,477,480],{},"Минимум три фразы: на\nсебя, на соседа, ",[264,466,467],{},"\u003Cnone>",". Формат — ",[264,470,471],{},"{\"input\": \"\u003Cфраза>\", \"expected\": \"\u003Cнавык>\" | [\"\u003Cнавык>\", …] | \"\u003Cnone>\", \"notes\": \"…\"}",". Массив — когда верны\nнесколько навыков. Одна и та же фраза в двух навыках не должна ждать разных\nответов (",[264,474,475],{},"lint"," это ловит). Реальные фразы с прогонов — с вводной строкой,\nкак их ставит человек, с пометкой в ",[264,478,479],{},"notes",". Фразу пишите как задачу, а не\nкак механизм: «нужно по ночам пересчитывать остатки» проверяет описание,\n«сделай агента» — совпадение по слову.",[285,482,484],{"id":483},"_9-операционный-навык-заканчивается-разделом-в-конце","9. Операционный навык заканчивается разделом «В конце»",[244,486,487,488,490,491,494],{},"со ссылкой на\n",[264,489,321],{}," — навык отзыва, который есть в каждом наборе (заготовка\nв ",[264,492,493],{},"template\u002F","). Шаг, не вписанный в сам навык, до конца задачи не доживает —\nза первый прогон отзыв не был написан ни разу; после переноса шага внутрь\nнавыка — 5 из 5.",[285,496,498,499,502,503],{"id":497},"_10-после-правки-bxshef-lint-и-bxshef-eval","10. После правки — ",[264,500,501],{},"bxshef lint"," и ",[264,504,505],{},"bxshef eval",[244,507,508,509,511],{},"Правка ",[264,510,329],{},"\nбез прогона evals — не правка: описание меняют ради выбора, а проверить выбор\nможно только прогоном. CI сделает это на PR, локально быстрее:",[513,514,518],"pre",{"className":515,"code":516,"language":517,"meta":105,"style":105},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","npx bxshef lint --dir skills --code \u003Cпуть к исходникам модуля>\nBXSHEF_EVAL_KEY=… npx bxshef eval --dir skills --repeat 3   # ключ — из окружения\n","bash",[264,519,520,569],{"__ignoreMap":105},[521,522,525,529,533,536,540,543,546,550,553,556,559,562,566],"span",{"class":523,"line":524},"line",1,[521,526,528],{"class":527},"sbgvK","npx",[521,530,532],{"class":531},"s_sjI"," bxshef",[521,534,535],{"class":531}," lint",[521,537,539],{"class":538},"stzsN"," --dir",[521,541,542],{"class":531}," skills",[521,544,545],{"class":538}," --code",[521,547,549],{"class":548},"smGrS"," \u003C",[521,551,552],{"class":531},"путь",[521,554,555],{"class":531}," к",[521,557,558],{"class":531}," исходникам",[521,560,561],{"class":531}," модул",[521,563,565],{"class":564},"su5hD","я",[521,567,568],{"class":548},">\n",[521,570,572,575,578,581,584,586,589,591,593,596,600],{"class":523,"line":571},2,[521,573,574],{"class":564},"BXSHEF_EVAL_KEY",[521,576,577],{"class":548},"=",[521,579,580],{"class":531},"…",[521,582,583],{"class":527}," npx",[521,585,532],{"class":531},[521,587,588],{"class":531}," eval",[521,590,539],{"class":538},[521,592,542],{"class":531},[521,594,595],{"class":538}," --repeat",[521,597,599],{"class":598},"srdBf"," 3",[521,601,603],{"class":602},"sutJx","   # ключ — из окружения\n",[285,605,607],{"id":606},"_11-навыки-автора-живут-в-одном-репозитории-не-в-репозитории-модуля","11. Навыки автора живут в одном репозитории, не в репозитории модуля",[244,609,610,611,614,615,618,619,621],{},"ИИ-агент ставит и выбирает их как один набор. Связь с кодом держит CI в обе\nстороны: репозиторий навыков гоняет ",[264,612,613],{},"lint --code"," против свежих ",[264,616,617],{},"main","\nмодулей; репозиторий модуля забирает навыки и гоняет ",[264,620,613],{}," против\nсебя — переименовали класс, PR модуля красный, пока не поправлен навык.",[244,623,624,628,629,634],{},[625,626,627],"em",{},"Репозиторий модуля"," (",[248,630,633],{"href":631,"rel":632},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fissues\u002F9",[252],"#9","):",[636,637,638,648,668,680,696],"ol",{},[341,639,640,643,644,647],{},[259,641,642],{},"Навыков в модуле нет"," — ни ",[264,645,646],{},".claude\u002Fskills\u002F",", ни копий, ни синхронизации:\nдве копии расходятся с первой же правки.",[341,649,650,655,656,663,664,667],{},[259,651,652],{},[264,653,654],{},"README.md",", раздел «Для ИИ-агентов» сразу после «Установки»: «Навыки\nдля ИИ-агентов (Claude Code, Codex, Cursor) — в\n",[248,657,660],{"href":658,"rel":659},"https:\u002F\u002Fgithub.com\u002F%3Cowner%3E\u002F%3Crepo%3E",[252],[264,661,662],{},"\u003Cowner>\u002F\u003Crepo>",". В проект:\n",[264,665,666],{},"npx skills add \u003Cowner>\u002F\u003Crepo>","».",[341,669,670,679],{},[259,671,672,675,676],{},[264,673,674],{},"CLAUDE.md"," \u002F ",[264,677,678],{},"AGENTS.md"," — для агента, который правит сам модуль:\nнавыки лежат там-то; правка класса или сигнатуры здесь требует правки\nнавыка там; порядок — сначала PR в навыки, потом сюда.",[341,681,682,687,688,691,692,695],{},[259,683,684],{},[264,685,686],{},"composer.json"," → ",[264,689,690],{},"\"suggest\": {\"\u003Cvendor>\u002Fskills\": \"Навыки для ИИ-агентов: npx skills add \u003Cowner>\u002F\u003Crepo>\"}"," — пакета нет, это подсказка при\n",[264,693,694],{},"composer require",".",[341,697,698,701,702,704,705,708,709,712,713,314,716,719,720,723,724,731,732,735,736,695],{},[259,699,700],{},"CI модуля — «навыки не расходятся с кодом»",": в общий каталог забрать\nрепозиторий навыков, этот модуль из PR и соседние модули со свежего ",[264,703,617],{},"\n(без соседей их классы с общим корнем, ",[264,706,707],{},"Vendor\\…",", будут «не найдены»), и\n",[264,710,711],{},"bx-shef\u002Fskills-standard\u002Faction@v1"," с ",[264,714,715],{},"dir: .check\u002Fskills\u002Fskills",[264,717,718],{},"code: .check\u002Fmodules",". ",[264,721,722],{},"eval-key"," не передаётся — eval пропускается: в\nмодуле проверяется только связь классов с кодом. Готовый файл —\n",[248,725,728],{"href":726,"rel":727},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002Ftemplate\u002Fmodule\u002Fskills.yml",[252],[264,729,730],{},"template\u002Fmodule\u002Fskills.yml","; ",[264,733,734],{},".check\u002F"," — в\n",[264,737,738],{},".gitignore",[244,740,741,744,745,748],{},[625,742,743],{},"На проекте"," — по ",[264,746,747],{},"npx skills@latest",":",[338,750,751,774,780],{},[341,752,753,755,756,759,760,762,763,766,767,770,771,695],{},[264,754,666],{}," ставит навыки в ",[264,757,758],{},".agents\u002Fskills\u002F\u003Cимя>\u002F",", для\nClaude Code делает ссылку в ",[264,761,646],{}," и пишет ",[264,764,765],{},"skills-lock.json","\n(источник и хеш). Lock-файл коммитят; восстановить навыки по нему —\n",[264,768,769],{},"npx skills experimental_install",", обновить — ",[264,772,773],{},"npx skills update",[341,775,776,777,779],{},"Файлы навыков в проекте не правят: замечание уходит отзывом\n(",[264,778,321],{},"), и навык правит автор.",[341,781,782,783,786,787,254],{},"Отзыву ничего настраивать не нужно: адрес приёмника записан в самом навыке\nотзыва, агент шлёт тикет ",[264,784,785],{},"curl","-ом (",[264,788,789],{},"feedback\u002FREADME.md",[285,791,793,794],{"id":792},"_12-раскладка-репозитория-навыков-skillsимяskillmd","12. Раскладка репозитория навыков — ",[264,795,796],{},"skills\u002F\u003Cимя>\u002FSKILL.md",[244,798,799,800,803,804,806,807,812,813,816,817,820,821,824,825,828,829,831,832,731,834,837,838,841,842,844],{},"Рядом с\nнавыком — его ",[264,801,802],{},"evals\u002F",", в корне — ",[264,805,654],{}," и CI. Не из прогона — решение\nвладельца (",[248,808,811],{"href":809,"rel":810},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fissues\u002F10",[252],"#10","): шаблон\nлежал в ",[264,814,815],{},".agents\u002Fskills\u002F",", эталон — в ",[264,818,819],{},"skills\u002F",", и автор, сверявший одно с\nдругим, не знал, какому верить. ",[264,822,823],{},".agents\u002F"," — каталог проекта, куда навыки\nставят; в репозитории навыков ставить некуда. Пользователю раскладка не видна:\n",[264,826,827],{},"npx skills add"," находит навыки в ",[264,830,819],{}," и кладёт их в проект в\n",[264,833,815],{},[264,835,836],{},"bxshef"," без ",[264,839,840],{},"--dir"," находит ",[264,843,819],{}," сам.",[846,847,848],"note",{},[244,849,850,851,856],{},"Источник: ",[248,852,855],{"href":853,"rel":854},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002FSTANDARD.md",[252],"skills-standard\u002FSTANDARD.md"," — правки туда, сайт пересобирается сам.",[858,859,860],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":105,"searchDepth":862,"depth":862,"links":863},3,[864,866,868,869,870,871,872,873,875,876,878,879],{"id":287,"depth":571,"text":865},"1. Имя — глагол или тема; каталог и name совпадают",{"id":325,"depth":571,"text":867},"2. description пишется под задачу, а не под содержание",{"id":379,"depth":571,"text":380},{"id":390,"depth":571,"text":391},{"id":405,"depth":571,"text":406},{"id":412,"depth":571,"text":413},{"id":450,"depth":571,"text":451},{"id":457,"depth":571,"text":874},"8. Операционному навыку — evals\u002Fselection.json",{"id":483,"depth":571,"text":484},{"id":497,"depth":571,"text":877},"10. После правки — bxshef lint и bxshef eval",{"id":606,"depth":571,"text":607},{"id":792,"depth":571,"text":880},"12. Раскладка репозитория навыков — skills\u002F\u003Cимя>\u002FSKILL.md","md",{},true,"---\ntitle: \"Стандарт навыка\"\ndescription: \"11 правил, каждое из провала на стенде\"\n---\n\nПравила, по которым навык заводят и принимают. Первые два решают, будет ли им\nвообще кто-то пользоваться, — остальное поправимо. Каждое правило с пометкой\n«прогон» стоило одного провала на стенде (см. [METHOD.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002FMETHOD.md)).\n\nТермины: **автор** — тот, чей модуль или библиотеку описывает навык\n(`acme`, `shef`, ваш вендор); **префикс** — короткое имя автора в имени\nнавыка; **справочный** навык отвечает «как это устроено», **операционный** —\n«сделай по канону».\n\n## 1. Имя — глагол или тема; каталог и `name` совпадают\n\nТолько `[a-z0-9-]`,\nпрефикс автора первым: `acme-new-import`, `acme-options-traits`. Справочные —\n`\u003Cпрефикс>-\u003Cбиблиотека>-\u003Cо чём>`; операционные — `\u003Cпрефикс>-new-\u003Cчто>`,\n`\u003Cпрефикс>-use-\u003Cчто>` и другие (`\u003Cпрефикс>-feedback`). Операционным\nсчитается всё, что не справочное, и у него обязательны evals. Префикс нужен\nне для красоты: в одном проекте живут навыки нескольких авторов, и без\nпрефикса они перепишут друг друга при установке.\n\n## 2. `description` пишется под задачу, а не под содержание\n\nЭто единственное,\nпо чему навык выбирают: модель видит список имён и описаний и берёт один.\nОписание-оглавление («в навыке есть Modules, Events, PrepareFields») проигрывает\nописанию-поводу («нужно разобрать цену из строки вида 1 234,50 — брать этот»).\n\nЧто обязано быть в описании:\n\n* **фразы задачи**, а не названия классов: «вывести на странице список»,\n  «вынеси ключ в настройки модуля»;\n* **граница**: чего навык НЕ делает и какой брать вместо него. Именно границы\n  разводят соседние навыки — без них модель берёт первый похожий. Соседи есть\n  у каждого: агент — импорт, ajax-действие — API-клиент, трейты — модели;\n* **длина от 80 до 1024 символов** одной строкой. Верх — жёсткий лимит\n  спецификации Agent Skills, длиннее обрезается молча; мерить `mb_strlen`,\n  не `wc -m` в C-локали;\n* **без привязки к вендору.** Навык — для любого модуля на базе вашей\n  библиотеки, а не только для ваших модулей. Прогон 1: «модуль линейки\n  \u003Cвендор>.\\*» в описании — и ИИ-агент не брал навык для модуля `acme.demo`\n  в пяти случаях из девяти; после правки — 9 из 9.\n\n## 3. Тело — то, чего агент не знает и не выведет сам\n\nПорядок действий,\nловушки, «чего не делать». Пересказывать документацию ядра Битрикса не нужно:\nона у модели есть; а вот что `prefilters` замещает умолчания — нет.\n\n## 4. Имена классов сверяются с кодом\n\nЛюбой `\\Vendor\\…` в обратных кавычках\nпроверяет `bxshef lint --code` против исходников модуля: нет такого класса —\nкрасный CI. Защита от навыка, который уверенно рассказывает про\nпереименованное.\n\n## 5. Навык не отсылает к коду, который агент может не увидеть\n\nСигнатура\nметода, namespace класса, имя файла — дословно в навыке. «Возьмите из модуля»\n— с точным путём и только как дополнение. Прогон 2: три угадывания из трёх\nтам, где навык отсылал вместо того, чтобы сказать (глобальный класс без\nnamespace, метод с массивом вместо строки, наследование без подключения\nмодуля).\n\n## 6. Модуль подключается до объявления класса\n\nФайл, в котором класс делает\n`extends`, `implements` или `use` чего-либо из чужого модуля, начинается с\n`\\Bitrix\\Main\\Loader::includeModule('\u003Cмодуль>')` **до** слова `class`. PHP\nразбирает наследование при чтении файла; `includeModule` в теле метода к этому\nмоменту не выполнялся. Навык, который показывает такой класс, показывает и эту\nстроку. Прогон 3: `Trait \"…\" not found` там, где навык молчал.\n\n## 7. Ссылки наружу — абсолютные, на GitHub\n\nНавык ставится в чужой проект,\nотносительный путь там ведёт в никуда.\n\n## 8. Операционному навыку — `evals\u002Fselection.json`\n\nМинимум три фразы: на\nсебя, на соседа, `\u003Cnone>`. Формат — `{\"input\": \"\u003Cфраза>\", \"expected\":\n\"\u003Cнавык>\" | [\"\u003Cнавык>\", …] | \"\u003Cnone>\", \"notes\": \"…\"}`. Массив — когда верны\nнесколько навыков. Одна и та же фраза в двух навыках не должна ждать разных\nответов (`lint` это ловит). Реальные фразы с прогонов — с вводной строкой,\nкак их ставит человек, с пометкой в `notes`. Фразу пишите как задачу, а не\nкак механизм: «нужно по ночам пересчитывать остатки» проверяет описание,\n«сделай агента» — совпадение по слову.\n\n## 9. Операционный навык заканчивается разделом «В конце»\n\nсо ссылкой на\n`\u003Cпрефикс>-feedback` — навык отзыва, который есть в каждом наборе (заготовка\nв `template\u002F`). Шаг, не вписанный в сам навык, до конца задачи не доживает —\nза первый прогон отзыв не был написан ни разу; после переноса шага внутрь\nнавыка — 5 из 5.\n\n## 10. После правки — `bxshef lint` и `bxshef eval`\n\nПравка `description`\nбез прогона evals — не правка: описание меняют ради выбора, а проверить выбор\nможно только прогоном. CI сделает это на PR, локально быстрее:\n\n```bash\nnpx bxshef lint --dir skills --code \u003Cпуть к исходникам модуля>\nBXSHEF_EVAL_KEY=… npx bxshef eval --dir skills --repeat 3   # ключ — из окружения\n```\n\n## 11. Навыки автора живут в одном репозитории, не в репозитории модуля\n\n\nИИ-агент ставит и выбирает их как один набор. Связь с кодом держит CI в обе\nстороны: репозиторий навыков гоняет `lint --code` против свежих `main`\nмодулей; репозиторий модуля забирает навыки и гоняет `lint --code` против\nсебя — переименовали класс, PR модуля красный, пока не поправлен навык.\n\n*Репозиторий модуля* ([#9](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fissues\u002F9)):\n\n1. **Навыков в модуле нет** — ни `.claude\u002Fskills\u002F`, ни копий, ни синхронизации:\n   две копии расходятся с первой же правки.\n2. **`README.md`**, раздел «Для ИИ-агентов» сразу после «Установки»: «Навыки\n   для ИИ-агентов (Claude Code, Codex, Cursor) — в\n   [`\u003Cowner>\u002F\u003Crepo>`](https:\u002F\u002Fgithub.com\u002F\u003Cowner>\u002F\u003Crepo>). В проект:\n   `npx skills add \u003Cowner>\u002F\u003Crepo>`».\n3. **`CLAUDE.md` \u002F `AGENTS.md`** — для агента, который правит сам модуль:\n   навыки лежат там-то; правка класса или сигнатуры здесь требует правки\n   навыка там; порядок — сначала PR в навыки, потом сюда.\n4. **`composer.json`** → `\"suggest\": {\"\u003Cvendor>\u002Fskills\": \"Навыки для ИИ-агентов:\n   npx skills add \u003Cowner>\u002F\u003Crepo>\"}` — пакета нет, это подсказка при\n   `composer require`.\n5. **CI модуля — «навыки не расходятся с кодом»**: в общий каталог забрать\n   репозиторий навыков, этот модуль из PR и соседние модули со свежего `main`\n   (без соседей их классы с общим корнем, `Vendor\\…`, будут «не найдены»), и\n   `bx-shef\u002Fskills-standard\u002Faction@v1` с `dir: .check\u002Fskills\u002Fskills`,\n   `code: .check\u002Fmodules`. `eval-key` не передаётся — eval пропускается: в\n   модуле проверяется только связь классов с кодом. Готовый файл —\n   [`template\u002Fmodule\u002Fskills.yml`](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002Ftemplate\u002Fmodule\u002Fskills.yml); `.check\u002F` — в\n   `.gitignore`.\n\n*На проекте* — по `npx skills@latest`:\n\n- `npx skills add \u003Cowner>\u002F\u003Crepo>` ставит навыки в `.agents\u002Fskills\u002F\u003Cимя>\u002F`, для\n  Claude Code делает ссылку в `.claude\u002Fskills\u002F` и пишет `skills-lock.json`\n  (источник и хеш). Lock-файл коммитят; восстановить навыки по нему —\n  `npx skills experimental_install`, обновить — `npx skills update`.\n- Файлы навыков в проекте не правят: замечание уходит отзывом\n  (`\u003Cпрефикс>-feedback`), и навык правит автор.\n- Отзыву ничего настраивать не нужно: адрес приёмника записан в самом навыке\n  отзыва, агент шлёт тикет `curl`-ом (`feedback\u002FREADME.md`).\n\n## 12. Раскладка репозитория навыков — `skills\u002F\u003Cимя>\u002FSKILL.md`\n\nРядом с\nнавыком — его `evals\u002F`, в корне — `README.md` и CI. Не из прогона — решение\nвладельца ([#10](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fissues\u002F10)): шаблон\nлежал в `.agents\u002Fskills\u002F`, эталон — в `skills\u002F`, и автор, сверявший одно с\nдругим, не знал, какому верить. `.agents\u002F` — каталог проекта, куда навыки\nставят; в репозитории навыков ставить некуда. Пользователю раскладка не видна:\n`npx skills add` находит навыки в `skills\u002F` и кладёт их в проект в\n`.agents\u002Fskills\u002F`; `bxshef` без `--dir` находит `skills\u002F` сам.\n\n::note\nИсточник: [skills-standard\u002FSTANDARD.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002FSTANDARD.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":16,"description":19},"Shac3i9k3AP22pXrQTHbyB_tP3_rF4MxiUl5m6vKoPE",[888,889],{"title":12,"path":8,"stem":13,"description":14,"children":-1},{"title":21,"path":22,"stem":23,"description":24,"children":-1},1790857268554]