[{"data":1,"prerenderedAt":759},["ShallowReactive",2],{"navigation_docs":3,"-methodology-method":238,"-methodology-method-surround":756},[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":21,"body":240,"description":24,"extension":750,"meta":751,"navigation":752,"path":22,"rawbody":753,"seo":754,"stem":23,"__hash__":755},"docs\u002F1.methodology\u002F2.method.md",{"type":241,"value":242,"toc":741},"minimark",[243,256,343,348,382,386,398,439,443,446,460,484,518,524,561,581,627,640,646,650,715,718,722,729],[244,245,246,247,251,252,255],"p",{},"Три уровня, от дешёвого к дорогому. Первые два — в CI на каждый PR, третий —\nна стенде по расписанию. Уровень выше не заменяет уровень ниже: ",[248,249,250],"code",{},"lint"," ловит\nформу, ",[248,253,254],{},"eval"," — выбор, стенд — правду.",[257,258,259,278],"table",{},[260,261,262],"thead",{},[263,264,265,269,272,275],"tr",{},[266,267,268],"th",{},"уровень",[266,270,271],{},"что проверяет",[266,273,274],{},"инструмент",[266,276,277],{},"цена",[279,280,281,298,319],"tbody",{},[263,282,283,287,290,295],{},[284,285,286],"td",{},"1. lint",[284,288,289],{},"frontmatter, длина описания, evals у операционных, противоречия в evals, привязка к вендору, классы против кода",[284,291,292],{},[248,293,294],{},"bxshef lint [--code]",[284,296,297],{},"0, секунды",[263,299,300,303,306,316],{},[284,301,302],{},"2. eval",[284,304,305],{},"по фразе задачи модель выбирает нужный навык из всех описаний",[284,307,308,311,312,315],{},[248,309,310],{},"bxshef eval"," (любая OpenAI-совместимая модель; по умолчанию BitrixGPT через AI Router, бесплатно) и ",[248,313,314],{},"--agent claude"," (настоящий Claude Code)",[284,317,318],{},"0 \u002F токены, минуты",[263,320,321,324,327,340],{},[284,322,323],{},"3. стенд",[284,325,326],{},"ИИ-агент с навыками решает реальную задачу, результат ставится на портал, чек-лист по факту",[284,328,329,332,333,336,337],{},[248,330,331],{},"stand\u002Fbx.php",", ",[248,334,335],{},"claude -p",", задачи из ",[248,338,339],{},"TASKS",[284,341,342],{},"час стенда, токены",[344,345,347],"h2",{"id":346},"уровень-1-lint","Уровень 1 — lint",[244,349,350,353,354,361,362,365,366,369,370,373,374,377,378,381],{},[248,351,352],{},"bxshef lint --dir \u003Cнавыки> --code \u003Cисходники>"," проверяет каждый навык по\n",[355,356,360],"a",{"href":357,"rel":358},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002FSTANDARD.md",[359],"nofollow","STANDARD.md",". С ",[248,363,364],{},"--code"," каждый класс вида ",[248,367,368],{},"\\Vendor\\Ns\\Class","\nиз текста навыка должен объявляться в коде (совпадение по namespace или по\nсуффиксу); корни, которых в коде нет (",[248,371,372],{},"Bitrix\\*","), не проверяются; примерные\nвендоры — ",[248,375,376],{},"--ignore '*\\Demo\\*,Acme\\*'",". Навыки, которые ссылаются на несколько\nмодулей, проверяются против общего каталога с их checkout'ами — маски\n",[248,379,380],{},"--ignore"," по namespace ненадёжны.",[344,383,385],{"id":384},"уровень-2-eval","Уровень 2 — eval",[244,387,388,389,393,394,397],{},"Не тест кода — тест ",[390,391,392],"strong",{},"описания",": модель получает имена и описания всех\nнавыков набора и по фразе выбирает один. Промах — вина ",[248,395,396],{},"description",", править\nего, а не порог.",[399,400,401,408,414,423,429],"ul",{},[402,403,404,407],"li",{},[248,405,406],{},"--repeat 3 --min 0.9"," — выбор стохастичен; одиночный прогон давал 9\u002F9 и\n7\u002F9 на одних описаниях. Три повтора и порог 0.9 — рабочая настройка для CI.",[402,409,410,413],{},[248,411,412],{},"--only реальная"," — только фразы с пометкой из настоящих задач; они важнее\nпридуманных.",[402,415,416,418,419,422],{},[248,417,314],{}," — настоящий Claude Code во временном каталоге с навыками,\nбез записи и сети; считается первый вызов ",[248,420,421],{},"Skill"," в первых N ходах. Гонять\nпо расписанию, не на каждый PR: медленно (~30 мин на 9 фраз × 3).",[402,424,425,428],{},[248,426,427],{},"expected"," может быть массивом: если на фразу верны два навыка, метрика не\nдолжна считать второй промахом.",[402,430,431,432,435,436,438],{},"При объединении наборов разных модулей в один каталог первым делом\nдобавить ",[390,433,434],{},"перекрёстные фразы",": фразу соседа с ",[248,437,427],{}," соседа. Без них\nрост числа навыков ухудшает выбор молча.",[344,440,442],{"id":441},"уровень-3-стенд","Уровень 3 — стенд",[244,444,445],{},"Что отладили за три прогона и что нужно повторять дословно.",[244,447,448,451,452,455,456,459],{},[390,449,450],{},"Два каталога."," Решатель (ИИ-агент) работает в отдельном каталоге без\n",[248,453,454],{},".git",", без evals, без отчётов — только ",[248,457,458],{},"local\u002F",", навыки и исходники\nбиблиотеки, на которую опирается задача (в реальном проекте они всегда рядом,\nи агент может их прочитать). Исполнитель прогона держит результаты в другом\nкаталоге. Прогон 1 провалился именно на этом: решатель читал чек-листы.",[244,461,462,465,466,468,469,472,473,476,477,332,480,483],{},[390,463,464],{},"Решатель без хостовых настроек."," ",[248,467,335],{}," с ",[248,470,471],{},"--setting-sources project --strict-mcp-config",", запрет сети и docker через ",[248,474,475],{},"--disallowedTools",",\n",[248,478,479],{},"--permission-mode acceptEdits",[248,481,482],{},"--output-format stream-json"," в файл — из него\nпотом видно, какой навык взят и каким по счёту действием.",[244,485,486,489,490,493,494,497,498,501,502,505,506,509,510,513,514,517],{},[390,487,488],{},"Отзыв — единственная сеть решателя."," Навык отзыва шлёт тикет сам, ",[248,491,492],{},"curl","-ом\n(",[248,495,496],{},"feedback\u002FREADME.md",", «Подключить навыки»). Стенд поднимает свой приёмник\n(",[248,499,500],{},"cd feedback && make build-local"," — ",[248,503,504],{},"127.0.0.1:8787",", токен чтения ",[248,507,508],{},"dev","), в\nкопии навыка отзыва в каталоге решателя меняет боевой адрес на\n",[248,511,512],{},"http:\u002F\u002F127.0.0.1:8787\u002Ffeedback"," и разрешает решателю ровно этот вызов:\n",[248,515,516],{},"--allowedTools 'Bash(curl -sS -m 30 -X POST http:\u002F\u002F127.0.0.1:8787\u002Ffeedback:*)'",".\nОстальная сеть закрыта, как раньше; в боевой приёмник стенд не пишет.",[244,519,520,523],{},[390,521,522],{},"Режим A\u002FB."," Одна и та же фраза без навыков и с навыками; счёт — число\nправок до приёмки и пункты чек-листа. Режим A измеряется один раз, дальше\nтолько B против прошлого B.",[244,525,526,465,529,532,533,536,537,532,540,542,543,546,547,532,550,552,553,556,557,560],{},[390,527,528],{},"Порядок одной задачи:",[248,530,531],{},"reset"," → ",[248,534,535],{},"footprint"," до (пусто) → сессия решателя →\nпоставить результат на портал → ",[248,538,539],{},"install",[248,541,535],{}," после (строки\n",[248,544,545],{},"CORE-TOUCHED"," — красный флаг) → чек-лист → ",[248,548,549],{},"uninstall",[248,551,535],{},"\n(остатки — дефект) → отзыв в приёмнике стенда: тикет с ",[248,554,555],{},"context.skill"," задачи,\nпринятый после её начала (нет — дефект) → строка в ",[248,558,559],{},"results.csv",".",[244,562,563,566,567,570,571,573,574,577,578,560],{},[390,564,565],{},"Чек-лист — да\u002Fнет с доказательством одной строкой",", общие пункты на каждую\nзадачу: код в ",[248,568,569],{},"local\u002Fmodules\u002F\u003Cid>","; установка не пишет вне ",[248,572,458],{}," кроме\nразрешённого; после удаления нет остатков; отзыв есть. Образец — ",[248,575,576],{},"stand\u002FTASKS.example.md",".\nОтзывы стенда: ",[248,579,580],{},"curl -s -H 'Authorization: Bearer dev' 'http:\u002F\u002F127.0.0.1:8787\u002Ffeedback?skill=\u003Cнавык>'",[244,582,583,587,588,332,591,332,593,595,596,598,599,602,603,605,606,609,610,332,613,332,616,619,620,623,624,560],{},[390,584,585],{},[248,586,331],{}," — обвязка на портале: ",[248,589,590],{},"status",[248,592,539],{},[248,594,549],{},"\n(печатает причину фатала), ",[248,597,531],{}," (только для тестовых модулей, без\n",[248,600,601],{},"DoUninstall","), ",[248,604,535],{}," (файлы вне модуля, опции, агенты, события, UF),\n",[248,607,608],{},"run-agent"," (печатает FATAL), ",[248,611,612],{},"options",[248,614,615],{},"uf",[248,617,618],{},"sql",". Кладётся в\n",[248,621,622],{},"\u002Fopt\u002Fwww\u002Ftools\u002F"," контейнера, вызывается ",[248,625,626],{},"php bx.php \u003Cкоманда> \u003Cmodule_id>",[244,628,629,632,633,635,636,639],{},[390,630,631],{},"Что мерить:"," навык взят (да\u002Fнет, каким действием), пунктов чек-листа,\nправок до приёмки, отзыв оставлен, ",[248,634,545],{},", остатки после удаления.\nОтдельно — ",[390,637,638],{},"угадывания",": места, где агент придумал namespace или сигнатуру.\nКаждое угадывание — правило в навык (см. STANDARD п. 5).",[244,641,642,645],{},[390,643,644],{},"Ревизия чужого модуля"," — отдельный сценарий: агенту дают модуль на базе\nбиблиотеки и просят список расхождений с каноном; исполнитель помечает каждое\n«подтверждаю по коду \u002F не подтверждаю \u002F не могу проверить». Показывает, видит\nли агент канон или выдумывает. В прогоне 2: 6 из 6 подтверждены, 0 ложных.",[344,647,649],{"id":648},"что-измерено-сентябрь-2026-модули-shef","Что измерено (сентябрь 2026, модули shef.*)",[257,651,652,665],{},[260,653,654],{},[263,655,656,659,662],{},[266,657,658],{},"прогон",[266,660,661],{},"что проверяли",[266,663,664],{},"результат",[279,666,667,678,689,700],{},[263,668,669,672,675],{},[284,670,671],{},"1",[284,673,674],{},"A\u002FB на 9 задачах",[284,676,677],{},"навык взят в 5 из 9; где взят — правок 60 → 20",[263,679,680,683,686],{},[284,681,682],{},"1 → 2",[284,684,685],{},"описания без привязки к вендору",[284,687,688],{},"выбор 9\u002F9 настоящим агентом",[263,690,691,694,697],{},[284,692,693],{},"2",[284,695,696],{},"точные контракты вместо отсылок",[284,698,699],{},"нечего угадывать → задачи 5\u002F5",[263,701,702,705,708],{},[284,703,704],{},"3",[284,706,707],{},"повтор проблемных задач",[284,709,710,711,714],{},"5\u002F5 с 0 правок; найден дефект в самом модуле (",[248,712,713],{},"_log()"," не объявлена), который не нашли ни тесты, ни ревьюеры",[244,716,717],{},"Каждая строка стала правилом в STANDARD.md. Это и есть способ, которым\nстандарт растёт: не из соображений, а из провалов на стенде.",[344,719,721],{"id":720},"что-не-публикуется","Что не публикуется",[244,723,724,725,728],{},"Образ коробки Битрикс24 (лицензия) — стенд только на своём Docker или\nself-hosted раннере. Задачи ",[248,726,727],{},"TASKS.example.md"," привязаны к модулям shef.*;\nдля другой библиотеки их пишут заново по тому же шаблону: фраза дословно,\nожидаемый навык, чек-лист с доказательствами.",[730,731,732],"note",{},[244,733,734,735,740],{},"Источник: ",[355,736,739],{"href":737,"rel":738},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002FMETHOD.md",[359],"skills-standard\u002FMETHOD.md"," — правки туда, сайт пересобирается сам.",{"title":105,"searchDepth":742,"depth":742,"links":743},3,[744,746,747,748,749],{"id":346,"depth":745,"text":347},2,{"id":384,"depth":745,"text":385},{"id":441,"depth":745,"text":442},{"id":648,"depth":745,"text":649},{"id":720,"depth":745,"text":721},"md",{},true,"---\ntitle: \"Методология проверки\"\ndescription: \"lint → eval → стенд; что измерено\"\n---\n\nТри уровня, от дешёвого к дорогому. Первые два — в CI на каждый PR, третий —\nна стенде по расписанию. Уровень выше не заменяет уровень ниже: `lint` ловит\nформу, `eval` — выбор, стенд — правду.\n\n| уровень | что проверяет | инструмент | цена |\n|---|---|---|---|\n| 1. lint | frontmatter, длина описания, evals у операционных, противоречия в evals, привязка к вендору, классы против кода | `bxshef lint [--code]` | 0, секунды |\n| 2. eval | по фразе задачи модель выбирает нужный навык из всех описаний | `bxshef eval` (любая OpenAI-совместимая модель; по умолчанию BitrixGPT через AI Router, бесплатно) и `--agent claude` (настоящий Claude Code) | 0 \u002F токены, минуты |\n| 3. стенд | ИИ-агент с навыками решает реальную задачу, результат ставится на портал, чек-лист по факту | `stand\u002Fbx.php`, `claude -p`, задачи из `TASKS` | час стенда, токены |\n\n## Уровень 1 — lint\n\n`bxshef lint --dir \u003Cнавыки> --code \u003Cисходники>` проверяет каждый навык по\n[STANDARD.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002FSTANDARD.md). С `--code` каждый класс вида `\\Vendor\\Ns\\Class`\nиз текста навыка должен объявляться в коде (совпадение по namespace или по\nсуффиксу); корни, которых в коде нет (`Bitrix\\*`), не проверяются; примерные\nвендоры — `--ignore '*\\Demo\\*,Acme\\*'`. Навыки, которые ссылаются на несколько\nмодулей, проверяются против общего каталога с их checkout'ами — маски\n`--ignore` по namespace ненадёжны.\n\n## Уровень 2 — eval\n\nНе тест кода — тест **описания**: модель получает имена и описания всех\nнавыков набора и по фразе выбирает один. Промах — вина `description`, править\nего, а не порог.\n\n* `--repeat 3 --min 0.9` — выбор стохастичен; одиночный прогон давал 9\u002F9 и\n  7\u002F9 на одних описаниях. Три повтора и порог 0.9 — рабочая настройка для CI.\n* `--only реальная` — только фразы с пометкой из настоящих задач; они важнее\n  придуманных.\n* `--agent claude` — настоящий Claude Code во временном каталоге с навыками,\n  без записи и сети; считается первый вызов `Skill` в первых N ходах. Гонять\n  по расписанию, не на каждый PR: медленно (~30 мин на 9 фраз × 3).\n* `expected` может быть массивом: если на фразу верны два навыка, метрика не\n  должна считать второй промахом.\n* При объединении наборов разных модулей в один каталог первым делом\n  добавить **перекрёстные фразы**: фразу соседа с `expected` соседа. Без них\n  рост числа навыков ухудшает выбор молча.\n\n## Уровень 3 — стенд\n\nЧто отладили за три прогона и что нужно повторять дословно.\n\n**Два каталога.** Решатель (ИИ-агент) работает в отдельном каталоге без\n`.git`, без evals, без отчётов — только `local\u002F`, навыки и исходники\nбиблиотеки, на которую опирается задача (в реальном проекте они всегда рядом,\nи агент может их прочитать). Исполнитель прогона держит результаты в другом\nкаталоге. Прогон 1 провалился именно на этом: решатель читал чек-листы.\n\n**Решатель без хостовых настроек.** `claude -p` с `--setting-sources project\n--strict-mcp-config`, запрет сети и docker через `--disallowedTools`,\n`--permission-mode acceptEdits`, `--output-format stream-json` в файл — из него\nпотом видно, какой навык взят и каким по счёту действием.\n\n**Отзыв — единственная сеть решателя.** Навык отзыва шлёт тикет сам, `curl`-ом\n(`feedback\u002FREADME.md`, «Подключить навыки»). Стенд поднимает свой приёмник\n(`cd feedback && make build-local` — `127.0.0.1:8787`, токен чтения `dev`), в\nкопии навыка отзыва в каталоге решателя меняет боевой адрес на\n`http:\u002F\u002F127.0.0.1:8787\u002Ffeedback` и разрешает решателю ровно этот вызов:\n`--allowedTools 'Bash(curl -sS -m 30 -X POST http:\u002F\u002F127.0.0.1:8787\u002Ffeedback:*)'`.\nОстальная сеть закрыта, как раньше; в боевой приёмник стенд не пишет.\n\n**Режим A\u002FB.** Одна и та же фраза без навыков и с навыками; счёт — число\nправок до приёмки и пункты чек-листа. Режим A измеряется один раз, дальше\nтолько B против прошлого B.\n\n**Порядок одной задачи:** `reset` → `footprint` до (пусто) → сессия решателя →\nпоставить результат на портал → `install` → `footprint` после (строки\n`CORE-TOUCHED` — красный флаг) → чек-лист → `uninstall` → `footprint`\n(остатки — дефект) → отзыв в приёмнике стенда: тикет с `context.skill` задачи,\nпринятый после её начала (нет — дефект) → строка в `results.csv`.\n\n**Чек-лист — да\u002Fнет с доказательством одной строкой**, общие пункты на каждую\nзадачу: код в `local\u002Fmodules\u002F\u003Cid>`; установка не пишет вне `local\u002F` кроме\nразрешённого; после удаления нет остатков; отзыв есть. Образец — `stand\u002FTASKS.example.md`.\nОтзывы стенда: `curl -s -H 'Authorization: Bearer dev' 'http:\u002F\u002F127.0.0.1:8787\u002Ffeedback?skill=\u003Cнавык>'`.\n\n**`stand\u002Fbx.php`** — обвязка на портале: `status`, `install`, `uninstall`\n(печатает причину фатала), `reset` (только для тестовых модулей, без\n`DoUninstall`), `footprint` (файлы вне модуля, опции, агенты, события, UF),\n`run-agent` (печатает FATAL), `options`, `uf`, `sql`. Кладётся в\n`\u002Fopt\u002Fwww\u002Ftools\u002F` контейнера, вызывается `php bx.php \u003Cкоманда> \u003Cmodule_id>`.\n\n**Что мерить:** навык взят (да\u002Fнет, каким действием), пунктов чек-листа,\nправок до приёмки, отзыв оставлен, `CORE-TOUCHED`, остатки после удаления.\nОтдельно — **угадывания**: места, где агент придумал namespace или сигнатуру.\nКаждое угадывание — правило в навык (см. STANDARD п. 5).\n\n**Ревизия чужого модуля** — отдельный сценарий: агенту дают модуль на базе\nбиблиотеки и просят список расхождений с каноном; исполнитель помечает каждое\n«подтверждаю по коду \u002F не подтверждаю \u002F не могу проверить». Показывает, видит\nли агент канон или выдумывает. В прогоне 2: 6 из 6 подтверждены, 0 ложных.\n\n## Что измерено (сентябрь 2026, модули shef.*)\n\n| прогон | что проверяли | результат |\n|---|---|---|\n| 1 | A\u002FB на 9 задачах | навык взят в 5 из 9; где взят — правок 60 → 20 |\n| 1 → 2 | описания без привязки к вендору | выбор 9\u002F9 настоящим агентом |\n| 2 | точные контракты вместо отсылок | нечего угадывать → задачи 5\u002F5 |\n| 3 | повтор проблемных задач | 5\u002F5 с 0 правок; найден дефект в самом модуле (`_log()` не объявлена), который не нашли ни тесты, ни ревьюеры |\n\nКаждая строка стала правилом в STANDARD.md. Это и есть способ, которым\nстандарт растёт: не из соображений, а из провалов на стенде.\n\n## Что не публикуется\n\nОбраз коробки Битрикс24 (лицензия) — стенд только на своём Docker или\nself-hosted раннере. Задачи `TASKS.example.md` привязаны к модулям shef.*;\nдля другой библиотеки их пишут заново по тому же шаблону: фраза дословно,\nожидаемый навык, чек-лист с доказательствами.\n\n::note\nИсточник: [skills-standard\u002FMETHOD.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002FMETHOD.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":21,"description":24},"Zlr2LifAtGnSHb5sZNlpoqErZ84QT7Cw1-QyPyFjlck",[757,758],{"title":16,"path":17,"stem":18,"description":19,"children":-1},{"title":26,"path":27,"stem":28,"description":29,"children":-1},1790857268555]