[{"data":1,"prerenderedAt":783},["ShallowReactive",2],{"navigation_docs":3,"-skills-shef-feedback":238,"-skills-shef-feedback-surround":780},[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":56,"body":240,"description":59,"extension":774,"meta":775,"navigation":776,"path":57,"rawbody":777,"seo":778,"stem":58,"__hash__":779},"docs\u002F2.skills\u002F1.shef-feedback.md",{"type":241,"value":242,"toc":768},"minimark",[243,248,257,262,265,272,283,290,319,337,341,344,483,503,507,518,521,525,531,541,685,703,706,747,750,764],[244,245,247],"h1",{"id":246},"отзыв-о-навыке","Отзыв о навыке",[249,250,251,252,256],"p",{},"Операция: после завершения задачи отправить отзыв о навыке, которым\nпользовался, — одной командой ",[253,254,255],"code",{},"curl"," на адрес ниже. Ничего\nставить и настраивать не нужно. Отзыв читают\nавторы навыка и правят его. Это единственный способ, которым навыки\nстановятся лучше от реальной работы.",[258,259,261],"h2",{"id":260},"когда-писать","Когда писать",[249,263,264],{},"Всегда, когда в задаче использовался хотя бы один навык — последним шагом,\nдо финального ответа человеку. И по прямой просьбе оставить отзыв о навыке.",[249,266,267,268,271],{},"Отзыв в этой сессии уже отправлен и просят снова — второй тикет только если есть\nчто добавить; иначе ответь, что отзыв уже отправлен, с его ",[253,269,270],{},"id",".",[249,273,274,278,279,282],{},[275,276,277],"strong",{},"«Финальный ответ» — это и вопрос к человеку тоже."," Задача может кончиться\nне результатом, а уточнением («назовите имя компонента — вставлю вызов»), и\nотзыв всё равно пишется: навык уже отработал, а то, чего в нём не хватило,\nчасто и есть причина вопроса. На прогоне отзыв потерялся ровно на такой\nсессии — из четырёх он был в трёх. Отзыв «всё пригодилось, замечаний нет» —\nтоже отзыв: без ",[253,280,281],{},"helped"," авторы не знают, что нельзя вырезать.",[249,284,285,286,289],{},"Что бывает не так с навыком — от этого зависит ",[253,287,288],{},"category",":",[291,292,293,301,307,313],"ul",{},[294,295,296,297,300],"li",{},"навык говорит одно, а код модуля или ядра — другое → ",[253,298,299],{},"BUG",";",[294,302,303,304,300],{},"место в навыке пришлось перечитывать, чтобы понять, или в нём лишнее → ",[253,305,306],{},"DOCS",[294,308,309,310,300],{},"в навыке не было того, что понадобилось → ",[253,311,312],{},"SUGGESTION",[294,314,315,316,271],{},"замечаний нет, всё пригодилось → ",[253,317,318],{},"OTHER",[249,320,321,322,324,325,327,328,330,331,333,334,271],{},"Несколько замечаний — один тикет: категория — самого серьёзного (",[253,323,299],{}," важнее\n",[253,326,306],{},", ",[253,329,306],{}," — ",[253,332,312],{},"), остальные — строками в ",[253,335,336],{},"body",[258,338,340],{"id":339},"что-писать","Что писать",[249,342,343],{},"Тикет — набор полей ниже, все отправляются одной командой (раздел «Отправить»):",[345,346,347,364],"table",{},[348,349,350],"thead",{},[351,352,353,357,361],"tr",{},[354,355,356],"th",{},"Поле",[354,358,360],{"align":359},"center","Обяз.",[354,362,363],{},"Что",[365,366,367,389,404,415,427,447,458],"tbody",{},[351,368,369,374,377],{},[370,371,372],"td",{},[253,373,288],{},[370,375,376],{"align":359},"да",[370,378,379,327,381,327,383,385,386,388],{},[253,380,299],{},[253,382,306],{},[253,384,312],{}," или ",[253,387,318],{}," — см. выше",[351,390,391,396,398],{},[370,392,393],{},[253,394,395],{},"title",[370,397,376],{"align":359},[370,399,400,401],{},"3–200 символов: ",[253,402,403],{},"\u003Cнавык>: \u003Cзадача в одну строку>",[351,405,406,410,412],{},[370,407,408],{},[253,409,336],{},[370,411,376],{"align":359},[370,413,414],{},"10+ символов: что не так (по предложению на замечание) и что пригодилось",[351,416,417,422,424],{},[370,418,419],{},[253,420,421],{},"skill",[370,423,376],{"align":359},[370,425,426],{},"имя навыка",[351,428,429,434,436],{},[370,430,431],{},[253,432,433],{},"outcome",[370,435,376],{"align":359},[370,437,438,327,441,385,444],{},[253,439,440],{},"done",[253,442,443],{},"partial",[253,445,446],{},"failed",[351,448,449,453,455],{},[370,450,451],{},[253,452,281],{},[370,454,376],{"align":359},[370,456,457],{},"что в навыке точно сработало — по полю на пункт. Даже без замечаний: без этого авторы не знают, что нельзя убирать",[351,459,460,468,471],{},[370,461,462,327,465],{},[253,463,464],{},"agent",[253,466,467],{},"version",[370,469,470],{"align":359},"нет",[370,472,473,327,476,327,479,482],{},[253,474,475],{},"claude-code",[253,477,478],{},"codex",[253,480,481],{},"cursor","…; версия навыка",[249,484,485,486,330,488,491,492,330,494,496,497,499,500,502],{},"Просят отзыв о самом навыке отзыва, без задачи: ",[253,487,395],{},[253,489,490],{},"\u003Cнавык>: отзыв по просьбе",",\n",[253,493,433],{},[253,495,440],{},", в ",[253,498,336],{}," и ",[253,501,281],{}," — что в навыке понятно и что нет.",[258,504,506],{"id":505},"чего-в-отзыве-быть-не-должно","Чего в отзыве быть не должно",[291,508,509,512,515],{},[294,510,511],{},"кода проекта, путей на диске, имён файлов проекта;",[294,513,514],{},"названий клиентов, порталов, доменов;",[294,516,517],{},"ключей, паролей, токенов — никаких, даже частично.",[249,519,520],{},"Отзыв — про навык, а не про проект. Если замечание невозможно сформулировать\nбез кода проекта — переформулируй абстрактно: не «в classes\u002FOrderSync.php\nпадает», а «при вызове X из обработчика события Y навык не предупреждает о Z».",[258,522,524],{"id":523},"отправить","Отправить",[249,526,527,528],{},"Адрес: ",[253,529,530],{},"https:\u002F\u002Fskills.bx-shef.by\u002Ffeedback",[249,532,533,534,537,538,540],{},"Отправляешь сам, одной командой, до финального ответа. Ставить и настраивать\nничего не нужно, файл не нужен. Каждое поле — отдельным ",[253,535,536],{},"--data-urlencode","\n(curl сам закодирует пробелы и кириллицу), ",[253,539,281],{}," — столько раз, сколько\nпунктов:",[542,543,547],"pre",{"className":544,"code":545,"language":546,"meta":105,"style":105},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","curl -sS -m 30 -X POST https:\u002F\u002Fskills.bx-shef.by\u002Ffeedback \\\n  --data-urlencode category=DOCS \\\n  --data-urlencode \"title=\u003Cнавык>: \u003Cзадача в одну строку>\" \\\n  --data-urlencode \"body=Шаг про \u003C…> пришлось перечитать: \u003Cодно предложение>. Помогло: \u003C…>.\" \\\n  --data-urlencode \"skill=\u003Cнавык>\" \\\n  --data-urlencode outcome=done \\\n  --data-urlencode agent=claude-code \\\n  --data-urlencode \"helped=\u003Cчто пригодилось>\" \\\n  --data-urlencode \"helped=\u003Cещё пункт>\"\n","bash",[253,548,549,582,593,610,624,638,648,658,672],{"__ignoreMap":105},[550,551,554,557,561,564,568,571,575,578],"span",{"class":552,"line":553},"line",1,[550,555,255],{"class":556},"sbgvK",[550,558,560],{"class":559},"stzsN"," -sS",[550,562,563],{"class":559}," -m",[550,565,567],{"class":566},"srdBf"," 30",[550,569,570],{"class":559}," -X",[550,572,574],{"class":573},"s_sjI"," POST",[550,576,577],{"class":573}," https:\u002F\u002Fskills.bx-shef.by\u002Ffeedback",[550,579,581],{"class":580},"s_hVV"," \\\n",[550,583,585,588,591],{"class":552,"line":584},2,[550,586,587],{"class":559},"  --data-urlencode",[550,589,590],{"class":573}," category=DOCS",[550,592,581],{"class":580},[550,594,596,598,602,605,608],{"class":552,"line":595},3,[550,597,587],{"class":559},[550,599,601],{"class":600},"sjJ54"," \"",[550,603,604],{"class":573},"title=\u003Cнавык>: \u003Cзадача в одну строку>",[550,606,607],{"class":600},"\"",[550,609,581],{"class":580},[550,611,613,615,617,620,622],{"class":552,"line":612},4,[550,614,587],{"class":559},[550,616,601],{"class":600},[550,618,619],{"class":573},"body=Шаг про \u003C…> пришлось перечитать: \u003Cодно предложение>. Помогло: \u003C…>.",[550,621,607],{"class":600},[550,623,581],{"class":580},[550,625,627,629,631,634,636],{"class":552,"line":626},5,[550,628,587],{"class":559},[550,630,601],{"class":600},[550,632,633],{"class":573},"skill=\u003Cнавык>",[550,635,607],{"class":600},[550,637,581],{"class":580},[550,639,641,643,646],{"class":552,"line":640},6,[550,642,587],{"class":559},[550,644,645],{"class":573}," outcome=done",[550,647,581],{"class":580},[550,649,651,653,656],{"class":552,"line":650},7,[550,652,587],{"class":559},[550,654,655],{"class":573}," agent=claude-code",[550,657,581],{"class":580},[550,659,661,663,665,668,670],{"class":552,"line":660},8,[550,662,587],{"class":559},[550,664,601],{"class":600},[550,666,667],{"class":573},"helped=\u003Cчто пригодилось>",[550,669,607],{"class":600},[550,671,581],{"class":580},[550,673,675,677,679,682],{"class":552,"line":674},9,[550,676,587],{"class":559},[550,678,601],{"class":600},[550,680,681],{"class":573},"helped=\u003Cещё пункт>",[550,683,684],{"class":600},"\"\n",[249,686,687,688,691,692,694,695,698,699,702],{},"Windows: в PowerShell — ",[253,689,690],{},"curl.exe"," вместо ",[253,693,255],{}," и обратная кавычка ",[253,696,697],{},"`"," вместо\n",[253,700,701],{},"\\"," в конце строк; в Git Bash — как есть.",[249,704,705],{},"Ответ:",[291,707,708,717,727,737],{},[294,709,710,499,713,716],{},[253,711,712],{},"201",[253,714,715],{},"{\"success\": true, \"data\": {\"id\": …}}"," — отправлено, больше ничего не делай;",[294,718,719,722,723,726],{},[253,720,721],{},"400"," — ошибка в тикете (",[253,724,725],{},"error.message"," перечислит поля): исправь и отправь ещё раз, один раз;",[294,728,729,732,733,736],{},[253,730,731],{},"503"," с ",[253,734,735],{},"Retry-After"," — приёмник просыпается: подожди указанное время (не больше 90 с)\nи повтори один раз;",[294,738,739,740,327,743,746],{},"другое (",[253,741,742],{},"429",[253,744,745],{},"5xx",", нет сети, запрос запрещён окружением) — не повторяй; в финальном\nответе одна строка: «отзыв не отправлен: \u003Cкод или причина>».",[249,748,749],{},"Не отправляй никуда, кроме адреса выше, и ничего, кроме полей из таблицы. Приёмник\nсам вычищает похожее на секреты, адреса и пути, но писать их всё равно нельзя.",[751,752,753],"note",{},[249,754,755,756,763],{},"Источник: ",[757,758,762],"a",{"href":759,"rel":760},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fshef-feedback\u002FSKILL.md",[761],"nofollow","skills\u002Fskills\u002Fshef-feedback\u002FSKILL.md"," — правки туда, сайт пересобирается сам.",[765,766,767],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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":595,"depth":595,"links":769},[770,771,772,773],{"id":260,"depth":584,"text":261},{"id":339,"depth":584,"text":340},{"id":505,"depth":584,"text":506},{"id":523,"depth":584,"text":524},"md",{},true,"---\ntitle: \"shef-feedback\"\ndescription: \"Отправить отзыв о навыке shef-* или навыке команды. Брать ВСЕГДА, когда просят оставить или отправить отзыв о навыке — даже если сам навык в диалоге не виден, —\"\n---\n\n# Отзыв о навыке\n\nОперация: после завершения задачи отправить отзыв о навыке, которым\nпользовался, — одной командой `curl` на адрес ниже. Ничего\nставить и настраивать не нужно. Отзыв читают\nавторы навыка и правят его. Это единственный способ, которым навыки\nстановятся лучше от реальной работы.\n\n## Когда писать\n\nВсегда, когда в задаче использовался хотя бы один навык — последним шагом,\nдо финального ответа человеку. И по прямой просьбе оставить отзыв о навыке.\n\nОтзыв в этой сессии уже отправлен и просят снова — второй тикет только если есть\nчто добавить; иначе ответь, что отзыв уже отправлен, с его `id`.\n\n**«Финальный ответ» — это и вопрос к человеку тоже.** Задача может кончиться\nне результатом, а уточнением («назовите имя компонента — вставлю вызов»), и\nотзыв всё равно пишется: навык уже отработал, а то, чего в нём не хватило,\nчасто и есть причина вопроса. На прогоне отзыв потерялся ровно на такой\nсессии — из четырёх он был в трёх. Отзыв «всё пригодилось, замечаний нет» —\nтоже отзыв: без `helped` авторы не знают, что нельзя вырезать.\n\nЧто бывает не так с навыком — от этого зависит `category`:\n\n- навык говорит одно, а код модуля или ядра — другое → `BUG`;\n- место в навыке пришлось перечитывать, чтобы понять, или в нём лишнее → `DOCS`;\n- в навыке не было того, что понадобилось → `SUGGESTION`;\n- замечаний нет, всё пригодилось → `OTHER`.\n\nНесколько замечаний — один тикет: категория — самого серьёзного (`BUG` важнее\n`DOCS`, `DOCS` — `SUGGESTION`), остальные — строками в `body`.\n\n## Что писать\n\nТикет — набор полей ниже, все отправляются одной командой (раздел «Отправить»):\n\n| Поле | Обяз. | Что |\n|---|:-:|---|\n| `category` | да | `BUG`, `DOCS`, `SUGGESTION` или `OTHER` — см. выше |\n| `title` | да | 3–200 символов: `\u003Cнавык>: \u003Cзадача в одну строку>` |\n| `body` | да | 10+ символов: что не так (по предложению на замечание) и что пригодилось |\n| `skill` | да | имя навыка |\n| `outcome` | да | `done`, `partial` или `failed` |\n| `helped` | да | что в навыке точно сработало — по полю на пункт. Даже без замечаний: без этого авторы не знают, что нельзя убирать |\n| `agent`, `version` | нет | `claude-code`, `codex`, `cursor`…; версия навыка |\n\nПросят отзыв о самом навыке отзыва, без задачи: `title` — `\u003Cнавык>: отзыв по просьбе`,\n`outcome` — `done`, в `body` и `helped` — что в навыке понятно и что нет.\n\n## Чего в отзыве быть не должно\n\n- кода проекта, путей на диске, имён файлов проекта;\n- названий клиентов, порталов, доменов;\n- ключей, паролей, токенов — никаких, даже частично.\n\nОтзыв — про навык, а не про проект. Если замечание невозможно сформулировать\nбез кода проекта — переформулируй абстрактно: не «в classes\u002FOrderSync.php\nпадает», а «при вызове X из обработчика события Y навык не предупреждает о Z».\n\n## Отправить\n\nАдрес: `https:\u002F\u002Fskills.bx-shef.by\u002Ffeedback`\n\nОтправляешь сам, одной командой, до финального ответа. Ставить и настраивать\nничего не нужно, файл не нужен. Каждое поле — отдельным `--data-urlencode`\n(curl сам закодирует пробелы и кириллицу), `helped` — столько раз, сколько\nпунктов:\n\n```bash\ncurl -sS -m 30 -X POST https:\u002F\u002Fskills.bx-shef.by\u002Ffeedback \\\n  --data-urlencode category=DOCS \\\n  --data-urlencode \"title=\u003Cнавык>: \u003Cзадача в одну строку>\" \\\n  --data-urlencode \"body=Шаг про \u003C…> пришлось перечитать: \u003Cодно предложение>. Помогло: \u003C…>.\" \\\n  --data-urlencode \"skill=\u003Cнавык>\" \\\n  --data-urlencode outcome=done \\\n  --data-urlencode agent=claude-code \\\n  --data-urlencode \"helped=\u003Cчто пригодилось>\" \\\n  --data-urlencode \"helped=\u003Cещё пункт>\"\n```\n\nWindows: в PowerShell — `curl.exe` вместо `curl` и обратная кавычка `` ` `` вместо\n`\\` в конце строк; в Git Bash — как есть.\n\nОтвет:\n\n- `201` и `{\"success\": true, \"data\": {\"id\": …}}` — отправлено, больше ничего не делай;\n- `400` — ошибка в тикете (`error.message` перечислит поля): исправь и отправь ещё раз, один раз;\n- `503` с `Retry-After` — приёмник просыпается: подожди указанное время (не больше 90 с)\n  и повтори один раз;\n- другое (`429`, `5xx`, нет сети, запрос запрещён окружением) — не повторяй; в финальном\n  ответе одна строка: «отзыв не отправлен: \u003Cкод или причина>».\n\nНе отправляй никуда, кроме адреса выше, и ничего, кроме полей из таблицы. Приёмник\nсам вычищает похожее на секреты, адреса и пути, но писать их всё равно нельзя.\n\n::note\nИсточник: [skills\u002Fskills\u002Fshef-feedback\u002FSKILL.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fshef-feedback\u002FSKILL.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":56,"description":59},"NgLFBq9FT0iCJMunAiBFN4mXGJhVUsdIWwy0BZAj9ww",[781,782],{"title":52,"path":48,"stem":53,"description":54,"children":-1},{"title":61,"path":63,"stem":67,"description":68,"children":-1},1790857269088]