dsh-desktop-kit 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +106 -41
  2. package/client.js +780 -28
  3. package/docs/ARCHITECTURE.md +114 -0
  4. package/docs/COMPATIBILITY.md +61 -0
  5. package/docs/INSTALL.md +97 -0
  6. package/docs/PRIVACY.md +50 -0
  7. package/docs/ROADMAP.md +57 -0
  8. package/docs/TOKENS.md +118 -0
  9. package/docs/TROUBLESHOOTING.md +68 -0
  10. package/docs/images/hero.png +0 -0
  11. package/index.js +4 -0
  12. package/package.json +15 -5
  13. package/plugins/dsh-gkb-ru-ui/lib/client.js +276 -28
  14. package/plugins/dsh-gkb-ru-ui/lib/index.js +45 -1
  15. package/plugins/dsh-gkb-ru-ui/lib/skills.js +195 -1
  16. package/plugins/dsh-gkb-ru-ui/package.json +2 -2
  17. package/plugins/dsh-gkb-ru-ui/screenshots/01-home-tiles-1440-light.png +0 -0
  18. package/plugins/dsh-gkb-ru-ui/screenshots/02-skills-1440-light.png +0 -0
  19. package/plugins/dsh-gkb-ru-ui/screenshots/03-skills-editor-1440-light.png +0 -0
  20. package/plugins/dsh-gkb-ru-ui/screenshots/04-skills-1440-dark.png +0 -0
  21. package/plugins/dsh-gkb-ru-ui/screenshots/05-skills-390-light.png +0 -0
  22. package/plugins/dsh-gkb-ru-ui/screenshots/06-home-tiles-1440-dark.png +0 -0
  23. package/plugins/dsh-peak-guard/screenshots/01-real-time-peak-start.png +0 -0
  24. package/plugins/dsh-peak-guard/screenshots/02-real-time-peak-end.png +0 -0
  25. package/plugins/dsh-peak-guard/screenshots/03-peak-card-1440-light.png +0 -0
  26. package/plugins/dsh-peak-guard/screenshots/04-peak-card-1440-dark.png +0 -0
  27. package/plugins/dsh-peak-guard/screenshots/05-peak-card-390-light.png +0 -0
  28. package/plugins/dsh-peak-guard/screenshots/05-peak-card-768-light.png +0 -0
  29. package/plugins/dsh-peak-guard/screenshots/06-peak-card-390-light.png +0 -0
  30. package/plugins/dsh-peak-guard/screenshots/07-live-preview-check.png +0 -0
  31. package/plugins/dsh-peak-guard/screenshots/07-pre-peak-1440-light.png +0 -0
  32. package/plugins/dsh-peak-guard/screenshots/08-peak-start-1440-light.png +0 -0
  33. package/plugins/dsh-peak-guard/screenshots/09-peak-end-1440-light.png +0 -0
  34. package/plugins/dsh-peak-guard/screenshots/10-pre-peak-card-1440-light.png +0 -0
  35. package/plugins/dsh-peak-guard/screenshots/11-pre-peak-card-1440-dark.png +0 -0
  36. package/plugins/dsh-peak-guard/screenshots/12-pre-peak-card-390-light.png +0 -0
  37. package/plugins/dsh-peak-guard/screenshots/qa-report.json +74 -0
  38. package/plugins/dsh-profile-transfer/screenshots/01-settings-transfer-1440-light.png +0 -0
  39. package/plugins/dsh-profile-transfer/screenshots/02-settings-transfer-preview-1440-light.png +0 -0
  40. package/plugins/dsh-profile-transfer/screenshots/03-settings-transfer-1440-dark.png +0 -0
  41. package/plugins/dsh-profile-transfer/screenshots/04-settings-transfer-390-light.png +0 -0
  42. package/plugins/dsh-profile-transfer/screenshots/05-settings-transfer-768-light.png +0 -0
  43. package/plugins/dsh-profile-transfer/screenshots/06-settings-transfer-390-dark.png +0 -0
  44. package/plugins/dsh-profile-transfer/screenshots/07-settings-transfer-export-result.png +0 -0
  45. package/plugins/dsh-profile-transfer/screenshots/08-settings-transfer-workspaces-1440-light.png +0 -0
  46. package/plugins/dsh-profile-transfer/screenshots/09-settings-transfer-workspaces-1440-dark.png +0 -0
  47. package/plugins/dsh-profile-transfer/screenshots/10-settings-transfer-workspaces-390-light.png +0 -0
  48. package/plugins/dsh-session-move/screenshots/01-row-menu-1440-light.png +0 -0
  49. package/plugins/dsh-session-move/screenshots/02-dialog-1440-light.png +0 -0
  50. package/plugins/dsh-session-move/screenshots/03-dialog-390-light.png +0 -0
  51. package/plugins/dsh-session-move/screenshots/04-dialog-1440-dark.png +0 -0
  52. package/plugins/dsh-session-move/screenshots/05-drag-highlight-1440-light.png +0 -0
  53. package/plugins/dsh-session-move/screenshots/06-drop-ungrouped-highlight.png +0 -0
  54. package/plugins/dsh-session-move/screenshots/07-after-drop-ungrouped.png +0 -0
  55. package/plugins/dsh-session-move/screenshots/08-move-dialog.png +0 -0
  56. package/plugins/dsh-session-move/screenshots/09-moved-to-second-workspace.png +0 -0
  57. package/plugins/dsh-session-move/screenshots/qa-report.json +62 -0
  58. package/plugins/dsh-skill-autopilot/cordis.patch.yml +3 -0
  59. package/plugins/dsh-skill-autopilot/index.js +444 -0
  60. package/plugins/dsh-skill-autopilot/package.json +19 -0
  61. package/plugins/dsh-token-lab/cordis.patch.yml +3 -0
  62. package/plugins/dsh-token-lab/lib/client.js +504 -0
  63. package/plugins/dsh-token-lab/lib/index.js +275 -0
  64. package/plugins/dsh-token-lab/package.json +26 -0
  65. package/plugins/dsh-token-lab/screenshots/01-token-lab-1440-light.png +0 -0
  66. package/plugins/dsh-token-lab/screenshots/02-token-lab-1440-dark.png +0 -0
  67. package/skills/code-review-checklist/SKILL.md +48 -30
  68. package/skills/content-writing/SKILL.md +64 -327
  69. package/skills/content-writing/references/process.md +123 -0
  70. package/skills/content-writing/references/quick-recipes.md +99 -0
  71. package/skills/content-writing/references/rules.md +85 -0
  72. package/skills/content-writing/references/sources.md +49 -0
  73. package/skills/context-economy/SKILL.md +60 -0
  74. package/skills/context-economy/references/long-session.md +35 -0
  75. package/skills/context-economy/references/token-math.md +42 -0
  76. package/skills/context-economy/references/tool-recipes.md +34 -0
  77. package/skills/database-safety/SKILL.md +40 -24
  78. package/skills/debugging-playbook/SKILL.md +30 -27
  79. package/skills/design-critique/SKILL.md +57 -110
  80. package/skills/design-critique/references/a11y.md +25 -0
  81. package/skills/design-critique/references/diagnoses.md +33 -0
  82. package/skills/design-critique/references/quick-tests.md +30 -0
  83. package/skills/design-critique/references/report-template.md +63 -0
  84. package/skills/design-critique/references/rubric-fast.md +73 -0
  85. package/skills/dev-workflow/SKILL.md +41 -34
  86. package/skills/dev-workflow/references/definition-of-done.md +44 -0
  87. package/skills/dev-workflow/references/memory-and-boundaries.md +31 -0
  88. package/skills/dev-workflow/references/stages.md +67 -0
  89. package/skills/git-and-ci/SKILL.md +46 -26
  90. package/skills/pg-upgrade-verify/SKILL.md +54 -35
  91. package/skills/project-deep-dive/SKILL.md +39 -164
  92. package/skills/project-deep-dive/references/recon-commands.md +12 -0
  93. package/skills/project-deep-dive/references/section-templates.md +2 -0
  94. package/skills/project-deep-dive/references/tool-and-process.md +86 -0
  95. package/skills/project-memory-maintenance/SKILL.md +39 -154
  96. package/skills/project-memory-maintenance/references/api-and-checklist.md +99 -0
  97. package/skills/project-memory-maintenance/references/journal-template.md +2 -0
  98. package/skills/project-memory-maintenance/references/section-rules.md +2 -0
  99. package/skills/release-and-deploy/SKILL.md +46 -32
  100. package/skills/requirements-and-planning/SKILL.md +44 -110
  101. package/skills/requirements-and-planning/references/antipatterns-and-checklist.md +20 -0
  102. package/skills/requirements-and-planning/references/process-steps.md +52 -0
  103. package/skills/requirements-and-planning/references/templates-and-estimates.md +29 -0
  104. package/skills/security-review/SKILL.md +33 -29
  105. package/skills/seo/SKILL.md +53 -305
  106. package/skills/seo/references/antipatterns.md +66 -0
  107. package/skills/seo/references/audit-checklist.md +14 -0
  108. package/skills/seo/references/content-seo.md +180 -174
  109. package/skills/seo/references/eeat-medical.md +2 -0
  110. package/skills/seo/references/measurement.md +28 -1
  111. package/skills/seo/references/on-page.md +5 -0
  112. package/skills/seo/references/page-templates.md +56 -0
  113. package/skills/seo/references/stack-recipes.md +2 -0
  114. package/skills/seo/references/structured-data.md +2 -0
  115. package/skills/seo/references/technical-seo.md +2 -0
  116. package/skills/service-desk-conventions/SKILL.md +40 -28
  117. package/skills/service-desk-db-safety/SKILL.md +39 -28
  118. package/skills/service-desk-release/SKILL.md +40 -22
  119. package/skills/service-desk-testing/SKILL.md +47 -33
  120. package/skills/service-desk-ui/SKILL.md +43 -24
  121. package/skills/skills-router/SKILL.md +44 -82
  122. package/skills/skills-router/references/applying-skills.md +25 -0
  123. package/skills/skills-router/references/routing-matrix.md +52 -0
  124. package/skills/testing-strategy/SKILL.md +47 -32
  125. package/skills/ui-design-system/SKILL.md +43 -38
  126. package/skills/ui-design-system/references/accessibility-and-responsive.md +50 -0
  127. package/skills/ui-design-system/references/tokens-and-components.md +67 -0
  128. package/skills/ui-design-system/references/visual-qa.md +44 -0
  129. package/skills/web-research/SKILL.md +40 -33
  130. package/skills/web-research/references/answer-and-citations.md +60 -0
  131. package/skills/web-research/references/query-recipes.md +44 -0
  132. package/skills/wow-design/SKILL.md +82 -161
  133. package/skills/wow-design/references/anti-patterns.md +3 -0
  134. package/skills/wow-design/references/critique-rubric.md +3 -0
  135. package/skills/wow-design/references/design-brief-template.md +2 -0
  136. package/skills/wow-design/references/inspiration.md +3 -0
  137. package/skills/wow-design/references/presets.md +3 -0
  138. package/skills/wow-design/references/principles.md +3 -0
  139. package/skills/wow-design/references/quick-presets.md +50 -0
  140. package/skills/wow-design/references/report-template.md +21 -0
  141. package/skills/wow-design/references/stack-recipes.md +3 -0
  142. package/skills/wow-design/references/visual-qa.md +3 -0
  143. package/skills/wow-design/references/wow-levers.md +43 -0
  144. package/tools/skill-cost.mjs +76 -0
@@ -0,0 +1,67 @@
1
+ # Этапы разработки — подробно
2
+
3
+ > Часть навыка dev-workflow. ≈2 000 токенов. Читать, когда: нужен полный разбор этапов — что на входе, что на выходе, где остановиться и какие ошибки типичны.
4
+
5
+ ## Шаг 0. Триаж
6
+ - Вход: формулировка задачи.
7
+ - Действия: `skills-router` → тип работы → все применимые скиллы (планирование, UI, SEO, БД, тесты, безопасность, релиз, проектные).
8
+ - Выход: список загруженных скиллов и объяснение, зачем они — в плане или первом сообщении.
9
+ - Стоп-условие: задача непонятна → вопросы, а не догадки.
10
+
11
+ ## 1. Разведка
12
+ - Прочитать память проекта (досье, журнал), правила проекта (`AGENTS.md`), найти затронутые файлы, маршруты, модели, миграции.
13
+ - Понять текущее поведение фактами: тесты, логи, скриншот, запрос к БД — что реально происходит.
14
+ - Отметить риски: данные, доступ, прод, деньги, публичный контент, необратимость.
15
+ - Выход: список файлов и зон, риски, критерии приёмки.
16
+
17
+ ## 2. План
18
+ - Короткий список шагов; для крупного — todo и, если есть, договорённость с командой или заказчиком.
19
+ - Для каждой правки: как проверим — тест, скриншот, запрос, ручной сценарий.
20
+ - План должен быть проверяемым: «сделать X, чтобы Y стал Z».
21
+
22
+ ## 3. Бэкап и безопасность
23
+ - Git: рабочая ветка, понятный коммит до крупных правок; проект без git — копия затрагиваемых файлов.
24
+ - БД: дамп (`pg_dump -Fc`), проверка окружения и `migrate:status`; миграции — аддитивные, с планом отката.
25
+ - Секреты не выносить в код и логи; `.env` не менять без необходимости и пересборки конфига.
26
+ - Выход: известный путь отката.
27
+
28
+ ## 4. Реализация
29
+ - Минимальные локальные правки в затронутых зонах; не переписывать чужое «по пути».
30
+ - Соблюдать инварианты проекта и стиль файла; новую зависимость — только с причиной.
31
+ - Валидация на границе, транзакции для связанных записей, права проверять на сервере.
32
+ - Не оставлять отладочный код, `console.log`, закомментированные блоки.
33
+
34
+ ## 5. Проверки
35
+ - Линтер и статанализ — без новых ошибок; существующие не «чинить» мимоходом.
36
+ - Тесты: unit/feature; новые тесты падают без правки и проходят с ней.
37
+ - E2E/UI, если задет интерфейс; визуальные скриншоты 1440/390, light/dark.
38
+ - Ручная проверка сценария вживую: тесты не заменяют глаза и реальные данные.
39
+ - Выход: вывод команд и скриншоты в отчёте.
40
+
41
+ ## 6. Ревью
42
+ - `code-review-checklist`: данные, доступ, ввод/вывод, секреты, тесты, дифф, стиль.
43
+ - Прочитать свой дифф целиком, как чужой: нет лишних файлов, форматирования и случайностей.
44
+ - Проверить поведение на ошибках: пустые данные, отказ сети, неверный ввод.
45
+
46
+ ## 7. Документация и версия
47
+ - Обновить документацию/CHANGELOG, если поведение или конфиг изменились.
48
+ - Версия — по правилам проекта (пакет, `APP_VERSION`, тег); миграции — в инструкции.
49
+ - В память — то, что понадобится позже: решения, ловушки, команды.
50
+
51
+ ## 8. Релиз
52
+ - `release-and-deploy`: сборка артефакта, checksums, безопасная выкатка, smoke-проверки, план отката.
53
+ - Перед выкаткой — бэкап и проверка на копии; после — ключевые сценарии и логи.
54
+ - Необратимые операции и прод — только с явного разрешения.
55
+
56
+ ## 9. Память
57
+ - Итог: что сделано, как проверено, какие риски остались, что дальше.
58
+ - Записать в память проекта (досье/журнал) без секретов и лишних деталей.
59
+
60
+ ## Типичные ошибки
61
+ - Застрял: сузить проблему, собрать факты, написать минимальное воспроизведение, затем `debugging-playbook`.
62
+ - Начал править без триажа и чтения памяти → сломал инвариант.
63
+ - Правки «заодно» в чужих зонах → неожиданный дифф и баги.
64
+ - Тесты не запускал или проверял только счастливый путь.
65
+ - Миграция без бэкапа и отката; destructive-команда на боевой БД.
66
+ - «Проверил вживую» = открыл страницу один раз без мобильного и тёмной темы.
67
+ - Забыл версию, документацию и память — следующий заход начинается с нуля.
@@ -1,40 +1,60 @@
1
1
  ---
2
2
  name: git-and-ci
3
- description: "Работа с git и CI — ветки, коммиты, теги, гигиена репозитория, pre-commit проверки и пайплайн."
4
- whenToUse: "При инициализации репозитория, коммитах, ветках, тегах релизов и настройке CI для любого проекта."
3
+ description: "Git и CI: гигиена репозитория, ветки, атомарные коммиты, теги релизов, pre-commit, пайплайн и защита секретов."
4
+ whenToUse: "При init репозитория, коммитах, ветках, тегах, настройке или отладке CI, перед релизом и при утечке секрета в историю."
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
8
  # Git и CI (универсально)
9
9
 
10
- ## Репозиторий
11
- - `.gitignore` до начала работы: зависимости, сборки, секреты (`.env*`), runtime-данные, IDE.
12
- - Проверять `git status` перед коммитом: не должно быть мусора/секретов/сгенерированных файлов.
13
- - Не коммитить `vendor/`, `node_modules/`, `public/build`, `storage/`-рантайм, дампы БД, PII.
10
+ ## 0. Когда применять
11
+ - Создаёшь репозиторий, `.gitignore`, первый коммит.
12
+ - Коммитишь, ветвишься, мержишь, ставишь тег.
13
+ - Настраиваешь/чинишь CI или pre-commit.
14
+ - Секрет попал в дифф/историю; нужен откат опубликованного.
14
15
 
15
- ## Ветки и коммиты
16
- - `main` — стабильная; работа — в `feature/<кратко>` / `fix/<кратко>`.
17
- - Коммиты небольшие и атомарные; сообщение — «что и зачем» (например, `feat: ...`, `fix: ...`, `chore: ...`).
18
- - Не смешивать форматирование и функциональные изменения в одном коммите.
19
- - Тег релиза: `vX.Y.Z` на проверенном коммите; тег не двигать после публикации.
16
+ ## 1. Главное
20
17
 
21
- ## Перед коммитом (pre-commit)
18
+ **Репозиторий**
19
+ - `.gitignore` до первого коммита: зависимости, сборки, `.env*`, runtime, IDE, дампы; lock-файлы — в git.
20
+ - Перед коммитом: `git status --short`, `git diff --check`, `git diff --stat`; в индекс — только осознанные файлы.
21
+ - Не коммитить: `vendor/`, `node_modules/`, `public/build`, `storage/`-рантайм, дампы, PII.
22
+
23
+ **Ветки и коммиты**
24
+ - `main` — стабильная и защищённая; работа — в `feature/<кратко>` / `fix/<кратко>`.
25
+ - Коммиты атомарные: «что и зачем» (`feat:`, `fix:`, `chore:`); форматирование и функционал — раздельно.
26
+ - Полный дифф перед коммитом: секреты, `dd`/`dump`, отладка, случайные файлы.
27
+ - Тег — аннотированный `vX.Y.Z` на проверенном коммите: `git tag -a vX.Y.Z -m "..."`, `git push origin vX.Y.Z`; опубликованный не двигать.
28
+
29
+ **Перед коммитом**
22
30
  1. Линтер по изменённым файлам.
23
- 2. Статанализ (без новых ошибок).
24
- 3. Тесты (unit/feature; E2E — если UI).
25
- 4. Просмотр диффа целиком: секреты, отладка, случайные файлы.
31
+ 2. Статанализ без новых ошибок.
32
+ 3. Тесты unit/feature; E2E для UI.
33
+ 4. Дифф на секреты/отладку/мусор; `--no-verify` — только в аварии.
26
34
 
27
- ## CI-пайплайн (этапы)
28
- 1. Checkout + кэш зависимостей.
29
- 2. Установка зависимостей (lock-файл, без интерактива).
35
+ **CI**
36
+ 1. Checkout + кэш зависимостей (без секретов).
37
+ 2. Установка из lock, неинтерактивно.
30
38
  3. Линтер + статанализ.
31
- 4. Тесты на реальной СУБД (сервис-контейнер), с baseline.
32
- 5. Сборка ассетов/compile.
33
- 6. E2E (стенд поднимается в CI) + артефакты при падении (скриншоты/логи).
34
- 7. Сборка релизного артефакта/checksums (по тегу).
39
+ 4. Тесты на реальной СУБД (service-контейнер) с baseline.
40
+ 5. Сборка ассетов.
41
+ 6. E2E; при падении — скриншоты/логи.
42
+ 7. По тегу — артефакт и `checksums.txt`.
43
+
44
+ CI гоняет те же команды, что локально; `main` — только с зелёным пайплайном и ревью.
35
45
 
36
- ## Гигиена истории
46
+ **История**
37
47
  - `git log --oneline`, `git diff main...HEAD` перед ревью.
38
- - Откат: `git revert` для опубликованного, `git reset` — только для локального.
39
- - Большие бинарники/дампы — не в git (артефакты/хранилище).
40
- - Секрет, попавший в историю, считается скомпрометированным — ротировать.
48
+ - Опубликованное — `git revert`; `git reset` — только локально; force-push — лишь своя ветка с `--force-with-lease`, никогда `main`.
49
+ - Большие бинарники/дампы — не в git.
50
+ - Секрет в истории скомпрометирован: ротировать и чистить историю (`git filter-repo`/BFG) с предупреждением команды.
51
+
52
+ ## 2. Куда грузить дальше
53
+ `release-and-deploy` — версия, артефакт, checksums, выкатка; `code-review-checklist` — ревью; `security-review` — секреты; `service-desk-release` — проектный релиз.
54
+
55
+ ## 3. Гейт перед сдачей
56
+ - [ ] `.gitignore` актуален; status/дифф без мусора, секретов и PII.
57
+ - [ ] Ветка и сообщение коммита отражают суть; форматирование отдельно.
58
+ - [ ] Линтер, статанализ, тесты зелёные; для UI — E2E.
59
+ - [ ] Тег на проверенном коммите; CI на `main` зелёный.
60
+ - [ ] Секрет ротирован, история очищена.
@@ -1,48 +1,67 @@
1
1
  ---
2
2
  name: pg-upgrade-verify
3
- description: "Универсальная проверка обновления на копии живой PostgreSQL-базы — до/после без риска для прода."
4
- whenToUse: "Перед выкаткой любого обновления, которое трогает схему БД, сиды или данные; для доказательства, что данные не потеряны."
3
+ description: "Проверка обновления на копии живой PostgreSQL-базы: до/после, контрольные суммы, схема и smoke — без риска для прода."
4
+ whenToUse: "Перед выкаткой обновления со схемой, миграциями, сидами или данными; когда нужно доказать, что данные не потеряны."
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
8
  # Проверка обновления на копии живой БД (PostgreSQL)
9
9
 
10
- Цель: доказать, что после обновления данные существующей базы не изменились и приложение работает.
10
+ Цель: доказать, что обновление не изменило данные и приложение работает. **Только на копии.**
11
11
 
12
- ## 1. Подготовка
13
- 1. Отдельная БД: `servicedesk_upgrade_test` (никогда не боевая!).
14
- 2. Развернуть **старую** версию кода в отдельную папку (распаковать архив старой версии).
15
- 3. Скопировать `vendor` из рабочей копии (если `composer.lock` совпадает) — так быстрее и без сети.
16
- 4. `.env`: указать `DB_DATABASE=servicedesk_upgrade_test`, `APP_URL=http://localhost`, `APP_KEY` через `php artisan key:generate`.
17
- 5. `php artisan migrate --force` + `db:seed --force` + при наличии `DemoDataSeeder`.
18
- 6. Добавить «живые» данные: по 1–3 строки в ключевые таблицы (tickets, comments, attachments, assets, consumables, stock_moves, kb_articles, activity_logs, ticket_reads).
12
+ ## 0. Когда применять
13
+ - Обновление меняет схему, миграции, сиды или данные.
14
+ - Нужно доказать «до/после», что записи не потеряны.
15
+ - Перед релизом.
19
16
 
20
- ## 2. Зафиксировать «до»
17
+ ## 1. Главное
18
+
19
+ **Правила**
20
+ - Тестовая БД `servicedesk_upgrade_test` и отдельная папка; боевая БД, `migrate:fresh` и `db:wipe` — запрещены.
21
+ - Перед командами проверь `.env` (`DB_DATABASE=servicedesk_upgrade_test`, `APP_ENV=local`, `APP_URL=http://localhost`).
22
+ - Дамп с PII — локально, не в git/отчёт.
23
+
24
+ **Подготовка**
25
+ 1. Отдельная БД `servicedesk_upgrade_test` (не боевая).
26
+ 2. Развернуть **старую** версию в отдельную папку.
27
+ 3. `vendor` — из рабочей копии при совпадении `composer.lock`.
28
+ 4. `.env`: тестовая БД, `APP_URL=http://localhost`, `APP_KEY` — `key:generate`.
29
+ 5. `php artisan migrate --force` + `db:seed --force` (+ `DemoDataSeeder`).
30
+ 6. «Живые» данные: 1–3 строки в `tickets`, `ticket_comments`, `ticket_attachments`, `assets`, `consumables`, `stock_moves`, `kb_articles`, `activity_logs`, `ticket_reads`.
31
+ 7. Лучше — дамп боевой БД в тестовую; без него — п. 2–6.
32
+
33
+ **«До»**
21
34
  ```sql
22
- SELECT 'tickets' t, count(*) FROM tickets UNION ALL SELECT 'users', count(*) FROM users /* ... */;
35
+ SELECT 'tickets', count(*) FROM tickets UNION ALL SELECT 'users', count(*) FROM users;
23
36
  SELECT 'tickets_max', max(id)||'/'||max(number) FROM tickets;
24
- SELECT 'tickets_checksum', md5(string_agg(t::text,'|' ORDER BY id)) FROM tickets t;
37
+ SELECT 'tickets_checksum', md5(string_agg(t::text,'|' ORDER BY id)) FROM tickets;
25
38
  SELECT 'comments_checksum', md5(coalesce(string_agg(c::text,'|' ORDER BY id),'')) FROM ticket_comments c;
26
39
  ```
27
- Сохранить в файл (например `_upgrade-before.txt`).
28
-
29
- ## 3. Имитация обновления
30
- 1. Наложить новый код поверх папки старой версии (`tar -xzf new.tgz -C <папка>`).
31
- 2. `php artisan backup:run` (если используется) — проверить, что копия создалась.
32
- 3. `php artisan migrate --force` (ожидаемо «Nothing to migrate», если миграций нет).
33
- 4. `php artisan db:seed --force`.
34
- 5. Обновить `APP_VERSION` в `.env` (как делает `deploy/update.sh`).
35
-
36
- ## 4. Зафиксировать «после» и сравнить
37
- - Повторить SQL из п.2 → сравнить количества и md5 (должны совпасть; допустимый рост — только журналы от самих команд backup/seed).
38
- - Smoke: `/login` 200, вход, `/tickets` 200 со старыми номерами, `/tickets/{id}/edit` — старые комментарии/вложения видны.
39
- - `php artisan migrate:status | grep -c Ran` — все миграции Ran.
40
-
41
- ## 5. Убрать за собой
42
- - Удалить тестовую БД (`DROP DATABASE servicedesk_upgrade_test`) и папку теста.
43
- - Артефакты «до/после» — в память/отчёт: `...\memory\projects\<проект>\tests\`.
44
- - Записать вывод в `SESSIONS.md`.
45
-
46
- ## Важно
47
- - Не запускать на боевой БД; не использовать `migrate:fresh`.
48
- - Если контрольные суммы разошлись — остановиться, не выкатывать, искать причину в миграциях/сидерах.
40
+ Сохранить в `_upgrade-before.txt`; снять схему: `pg_dump --schema-only -d servicedesk_upgrade_test -f before-schema.sql`.
41
+
42
+ **Имитация**
43
+ 1. Наложить новый код: `tar -xzf new.tgz -C <папка>`.
44
+ 2. Изменился `composer.lock` → `composer install --no-dev`; UI → `npm ci && npm run build`.
45
+ 3. `php artisan backup:run` (если используется) — копия создалась.
46
+ 4. `php artisan migrate --force` (ожидаемо «Nothing to migrate»).
47
+ 5. `php artisan db:seed --force`.
48
+ 6. `APP_VERSION` в `.env` (как `deploy/update.sh`).
49
+
50
+ **«После»**
51
+ - Повторить SQL и `pg_dump -s`: counts/max/md5 совпадают, схема — только новые объекты; рост — лишь журналы backup/seed.
52
+ - Smoke: `/login` 200 и вход, `/tickets` 200 со старыми номерами, `/tickets/{id}/edit` — старые комментарии/вложения.
53
+ - `migrate:status` — все `Ran`; лог чист.
54
+ - Расхождение → стоп, не выкатывать, искать причину в миграциях/сидерах.
55
+
56
+ **Уборка**
57
+ - `DROP DATABASE servicedesk_upgrade_test`; удалить папку теста.
58
+ - Артефакты — в `...\memory\projects\<проект>\tests\`; запись в `SESSIONS.md`.
59
+
60
+ ## 2. Куда грузить дальше
61
+ `database-safety` — общие правила; `service-desk-db-safety` — бэкап; `release-and-deploy` / `service-desk-release` — выкатка.
62
+
63
+ ## 3. Гейт перед сдачей
64
+ - [ ] Тестовая БД/папка; `.env` проверен, прод не затронут.
65
+ - [ ] «До/после» сняты: counts, max, md5, схема; расхождений нет.
66
+ - [ ] Smoke: вход, `/tickets`, старые данные; `migrate:status` — `Ran`.
67
+ - [ ] Тестовая БД/папка удалены; отчёт записан в память.
@@ -1,170 +1,45 @@
1
1
  ---
2
2
  name: project-deep-dive
3
- description: "Глубокий анализ проекта с запоминанием в локальное досье через project_memory: разведка, архитектура, карта кода, инварианты, ловушки, runbook, теги достоверности и честный отчёт."
4
- whenToUse: "Пользователь просит «глубоко проанализируй / разберись и запомни <проект>», вызвана команда /remember, досье отсутствует или устарело (старый lastAnalyzedAt или другой git HEAD), либо предстоит крупная работа в незнакомом проекте."
3
+ description: "Глубокий анализ проекта с записью в локальное досье project_memory: разведка, архитектура, карта кода, инварианты, ловушки, runbook, теги достоверности и честный отчёт."
4
+ whenToUse: "Просьба «глубоко проанализируй / разберись и запомни проект», /remember, досье отсутствует или устарело, либо впереди крупная работа в незнакомом проекте."
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
- # PROJECT-DEEP-DIVE — анализ проекта и запоминание
9
-
10
- > Цель: понять проект настолько, чтобы дальше работать в нём без повторной разведки.
11
- > Результат — досье в `%USERPROFILE%\.dsh\projects-memory\<slug>\` и отчёт: что записано,
12
- > что проверено, что осталось неясным. Досье хранит выводы и ссылки, а не копии кода.
13
-
14
- ## 0. Контракт (нарушать нельзя)
15
-
16
- 1. **Первый вызов — `project_memory(action="status")`**, до чтения файлов проекта: он определяет проект, наличие и свежесть досье.
17
- 2. **Никогда не отправляй содержимое проекта в сеть.** Ни `web_fetch`, ни `web_search`, ни внешние API не получают код, конфиги, пути, имена серверов, фрагменты БД и журналы. Анализ только локальный.
18
- 3. **Никогда не сохраняй секреты и PII.** Пароли, токены, ключи, строки подключения, e-mail, телефоны, ФИО, адреса не попадают ни в досье, ни в журнал. Допустимо указать только имя переменной или файла: «секрет в `.env`, `DB_PASSWORD`».
19
- 4. **Секции пишутся только через `update_section`.** Файлы досье и `INDEX.json` вручную не редактируй — иначе рассинхронизируются индекс и свежесть.
20
- 5. **Финальный ответ обязан перечислить:** какие секции записаны, какие факты проверены, что осталось неясным. Отчёт без пункта «неясно» — признак поверхностного анализа.
21
-
22
- ## 1. Когда применять
23
-
24
- - Просьба «глубоко проанализируй / разберись и запомни <проект>», «составь досье», «введи в курс».
25
- - Команда `/remember`: объём средний — `PROJECT`, `ARCHITECTURE`, `CODE-MAP`, `RUNBOOK`.
26
- - Перед крупной работой в незнакомом проекте: сначала досье, потом правки (см. `dev-workflow`, `requirements-and-planning`).
27
- - Досье устарело: `lastAnalyzedAt` старше ~30 дней, `git.head` в INDEX.json не равен текущему `git rev-parse HEAD`, сменилась ветка.
28
- - Не применять: точечный вопрос по одному файлу; разовая правка при актуальном досье.
29
-
30
- ## 2. Инструмент project_memory
31
-
32
- Сигнатура: `project_memory(action, project?, file?, content?, query?, root?, name?, mode?, maxChars?)`.
33
- В текущей сборке инструмента у `register` есть также необязательный `stack` — короткое описание стека.
34
- Хранилище: `%USERPROFILE%\.dsh\projects-memory\<slug>\` — `PROJECT.md`, `ARCHITECTURE.md`, `CODE-MAP.md`, `INVARIANTS.md`, `GOTCHAS.md`, `RUNBOOK.md`, `JOURNAL/YYYY-MM.md`, `INDEX.json`.
35
-
36
- | action | Что делает | Обязательные аргументы | Пример |
37
- |---|---|---|---|
38
- | `status` | состояние хранилища, досье и свежести | — | `project_memory(action="status")` |
39
- | `register` | регистрирует проект | `name`, `root` (+ `stack`) | `project_memory(action="register", name="my-app", root="C:\work\my-app", stack="Laravel 13 / PostgreSQL")` |
40
- | `list` | список проектов | — | `project_memory(action="list")` |
41
- | `read` | читает файл досье | `project`, `file` | `project_memory(action="read", project="my-app", file="ARCHITECTURE", maxChars=8000)` |
42
- | `search` | ищет по досье перед записью | `query` | `project_memory(action="search", project="my-app", query="очереди")` |
43
- | `append_journal` | дописывает сессию в `JOURNAL/YYYY-MM.md` | `project`, `content` | `project_memory(action="append_journal", project="my-app", content="...")` |
44
- | `update_section` | записывает секцию досье | `project`, `file`, `content`, `mode` | `project_memory(action="update_section", project="my-app", file="ARCHITECTURE", content="...", mode="replace")` |
45
-
46
- - `file` — только `PROJECT`, `ARCHITECTURE`, `CODE-MAP`, `INVARIANTS`, `GOTCHAS`, `RUNBOOK`, `JOURNAL`.
47
- - `mode` — `replace` (секция перезаписывается целиком, по умолчанию) или `append` (дописать в конец).
48
- - `maxChars` — ограничение вывода `read` (500–30000, по умолчанию 12000); целиком досье не выкачивай.
49
- - `root` — абсолютный путь к корню проекта; `name` — slug в kebab-case (`service-desk`); `stack` — короткое описание стека при `register`.
50
- - `project` по умолчанию — проект текущей сессии; чужой проект указывай явно.
51
- - `content` — markdown секции по каркасам из §4.
52
-
53
- ## 3. Процесс (8 шагов)
54
-
55
- ### Шаг 1. Статус и проект
56
- `project_memory(action="status")`.
57
- - Проект найден — запомни slug и переходи к Шагу 2.
58
- - Нет проекта — `project_memory(action="register", name="<slug>", root="<абсолютный путь>")`.
59
- - Несколько кандидатов или непонятно, о каком проекте речь, — **спроси пользователя**, не угадывай.
60
- - Досье устарело — предупреди сразу; устаревшие факты в новых секциях помечай `[устарело]`.
61
-
62
- ### Шаг 2. Что уже известно
63
- Прочитай существующие секции (`read` с `maxChars=6000–8000`). Цель — не дублировать и не противоречить.
64
- Новый факт спорит со старым — перепроверь по коду: победивший запиши, проигравший пометь `[устарело]`.
65
-
66
- ### Шаг 3. Разведка (только чтение)
67
- Источники по порядку: `AGENTS.md` → `README*` → манифесты → структура каталогов → git.
68
- ```powershell
69
- $root = "C:\path\to\project"
70
- git -C $root rev-parse --abbrev-ref HEAD; git -C $root rev-parse --short HEAD
71
- git -C $root log -5 --oneline; git -C $root status --short
72
- rg --files $root -g '!node_modules' -g '!vendor' -g '!dist' -g '!build' -g '!.git' | Select-Object -First 300
73
- Get-ChildItem $root -Name
74
- ```
75
- Манифесты и конфиги: `composer.json`, `package.json`, `pnpm-workspace.yaml`, `pyproject.toml`, `requirements.txt`, `go.mod`, `Cargo.toml`, `pom.xml`, `docker-compose.yml`, `Dockerfile`, `Makefile`, `.env.example`, `phpunit.xml`, `vite.config.*`, `tsconfig.json`.
76
- Дальше — `references/recon-commands.md` (рецепты для Laravel/PHP, JS/TS, Bitrix, generic).
77
-
78
- ### Шаг 4. Трассировка потоков
79
- Веди цепочку «точка входа → маршрут → обработчик → домен → данные → тесты». Команды:
80
- ```powershell
81
- rg -n "Route::|router\.|app\.(get|post)|urlpatterns" $root -g '!node_modules' -g '!vendor'
82
- rg --files $root | rg "migrations|schema|models|entities"
83
- rg -n "class \w+(Service|Controller|Handler|Repository)\b" $root -g '!vendor' -g '!node_modules'
84
- rg -n "process\.env|config\(|ENV\[|getenv\(" $root -g '!node_modules' -g '!vendor'
85
- rg --files $root | rg "(^|/)(tests?|spec|__tests__|phpunit|playwright)/"
86
- ```
87
- Фиксируй не всё подряд, а то, что объясняет: как запустить, где бизнес-логика, где данные, что легко сломать.
88
-
89
- ### Шаг 5. Сборка секций
90
- Порядок записи: `PROJECT` → `ARCHITECTURE` → `CODE-MAP` → `INVARIANTS` → `GOTCHAS` → `RUNBOOK`.
91
- Каждая секция — отдельный `update_section`; после записи прочитай её обратно (`read`).
92
-
93
- | Секция | Минимум | Обязательные блоки |
8
+ # Project-deep-dive — ядро
9
+ > ≈1 600 токенов. Понимание проекта → локальное досье; детали — по ссылкам.
10
+
11
+ ## 0. Контракт
12
+ 1. `project_memory(action="status")` — первым, до чтения проекта.
13
+ 2. Только локально: код, конфиги, пути, серверы, БД и логи не уходят в `web_fetch`/`web_search`/внешние API.
14
+ 3. Секреты и PII (пароли, токены, ключи, DSN, e-mail, телефоны, ФИО, адреса) не пишем; можно «секрет в `.env`, `DB_PASSWORD`».
15
+ 4. Секции — только `update_section`; досье и `INDEX.json` руками не правь.
16
+ 5. Финал: записанные секции + проверенные факты + «неясно»; без последнего отчёт неполон.
17
+
18
+ ## 1. Когда и API
19
+ - «Глубоко проанализируй/запомни», «составь досье», `/remember` (`PROJECT`, `ARCHITECTURE`, `CODE-MAP`, `RUNBOOK`); перед крупной работой в незнакомом проекте.
20
+ - Устарело: `lastAnalyzedAt` >~30 дней, `git.head` ≠ HEAD, другая ветка. Не нужно при актуальном досье и точечном вопросе.
21
+ - API: `project_memory(...)`; `status` → `register(name, root, stack?)` → `read`/`search` → `update_section`/`append_journal`; `file` — секция досье, `mode` — replace/append, `maxChars` 500–30000 (12000), `project` — текущий по умолчанию.
22
+
23
+ ## 2. Алгоритм
24
+ 1. **Статус.** `status`; нет проекта — `register`; неясно — спроси, не угадывай; устарело — предупреди, старое помечай `[устарело]`.
25
+ 2. **Известное.** `read` (6000–8000), не дублируй; конфликт — перепроверь код: победитель в досье, проигравший `[устарело]`.
26
+ 3. **Разведка.** Только чтение: `AGENTS.md` → `README*` → манифесты → структура → git; изменяющих команд нет.
27
+ 4. **Потоки.** Вход → маршрут → обработчик → домен → данные → тесты; фиксируй только объясняющее запуск, логику, данные и хрупкие места.
28
+ 5. **Секции.** `PROJECT` → `ARCHITECTURE` → `CODE-MAP` → `INVARIANTS` → `GOTCHAS` → `RUNBOOK`; каждая отдельным `update_section` + `read`. Минимумы: 8–15 строк / 15+ / 10+ записей / 5+ / 3+ / 5+ команд; малый проект — пропорционально.
29
+ 6. **Теги.** `[проверено]` — источник + `path:line`; `[выведено]` — логический вывод; `[устарело]` — было верно раньше. Без кода, логов и дампов.
30
+ 7. **Журнал.** Значимую сессию — `append_journal` по шаблону `project-memory-maintenance` (5 пунктов).
31
+ 8. **Отчёт.** «Записано» (каждая секция), «Проверено» (факты), «Неясно» (каждый пункт), «Дальше».
32
+
33
+ ## 3. Куда грузить дальше
34
+ | Нужно | Файл | ≈токенов |
94
35
  |---|---|---|
95
- | `PROJECT` | 8–15 строк | назначение; стек и версии; где лежит (копия, прод); запуск; статус |
96
- | `ARCHITECTURE` | 15+ строк | компоненты и границы; точки входа; поток данных; внешние зависимости; ключевые решения |
97
- | `CODE-MAP` | 10+ записей | область → путь → зачем; сервисы; конфиги; тесты |
98
- | `INVARIANTS` | 5+ правил | правило → почему → как проверить → ссылка `path:line` |
99
- | `GOTCHAS` | 3+ ловушки | симптом → причина → обход |
100
- | `RUNBOOK` | 5+ команд | запуск; тесты; сборка; деплой и откат; бэкап; диагностика |
101
-
102
- Малый проект (один скрипт/сервис) — минимумы пропорционально ниже, но блоки те же. Подробные каркасы — `references/section-templates.md`.
103
-
104
- ### Шаг 6. Метки достоверности и ссылки
105
- - `[проверено]` — прочитано в файле или подтверждено выводом команды; рядом ссылка `path:line`.
106
- - `[выведено]` — логический вывод (соглашение фреймворка, косвенная связь); прямого источника в коде нет.
107
- - `[устарело]` — было верно в прошлой версии/ветке; требует перепроверки.
108
- - Ссылка — всегда `относительный/путь:строка`; копировать код, логи и дампы в досье нельзя.
109
-
110
- ### Шаг 7. Журнал
111
- Значимую сессию зафиксируй `append_journal` (сжато, по шаблону из `project-memory-maintenance`): что анализировали, что выяснили, какие решения, что осталось.
112
-
113
- ### Шаг 8. Отчёт пользователю
114
- ```markdown
115
- ## Записано в досье
116
- - PROJECT — ...
117
- - ARCHITECTURE — ...
118
-
119
- ## Проверено
120
- - [проверено] ... (path:line)
121
-
122
- ## Неясно / требует проверки
123
- 1. ...
124
- 2. ...
125
-
126
- ## Дальше
127
- - ...
128
- ```
129
- Перечисли **каждую** записанную секцию и **каждый** неясный пункт. Не замалчивай сомнения.
130
-
131
- ## 4. Каркасы секций (сжато)
132
-
133
- - `PROJECT`: что делает; стек и версии; репозиторий и прод; как поднять; статус и владелец.
134
- - `ARCHITECTURE`: слои и модули; поток данных текстом; очереди/крон; внешние сервисы; ключевые решения.
135
- - `CODE-MAP`: таблица «область | путь | зачем»; точки входа; модели/схема; тесты; конфиги.
136
- - `INVARIANTS`: нумерованные «нельзя», каждое с причиной и способом проверки.
137
- - `GOTCHAS`: симптом → причина → обход; отдельная ловушка — отдельный пункт.
138
- - `RUNBOOK`: окружение; установка; запуск; тесты; сборка; деплой; откат; бэкап; где логи.
139
-
140
- Полные шаблоны с примерами — `references/section-templates.md`.
141
-
142
- ## 5. Гейт качества (перед сдачей)
143
-
144
- - [ ] `status` вызван первым, проект определён (slug зафиксирован).
145
- - [ ] Существующие секции прочитаны, дублей нет.
146
- - [ ] Каждая записанная секция отправлена отдельным `update_section` и прочитана обратно.
147
- - [ ] Секретов и PII нет: перечитанный текст не содержит значений паролей/токенов/персональных данных.
148
- - [ ] У ключевых утверждений есть метка достоверности и ссылка `path:line`.
149
- - [ ] Код и логи не скопированы в досье.
150
- - [ ] Минимумы по объёму соблюдены; каждая секция ≤ 40 KB.
151
- - [ ] Противоречия разобраны; устаревшее помечено `[устарело]`.
152
- - [ ] Отчёт содержит «Записано» и «Неясно».
153
- - [ ] В сеть ничего из проекта не уходило.
154
-
155
- ## 6. Антипаттерны
156
-
157
- - Копировать целые файлы, конфиги, миграции и логи «чтобы было».
158
- - Сохранять `.env`, дампы, токены, персональные данные.
159
- - Отправлять код/конфиги в веб-поиск или внешние API «для уточнения».
160
- - Писать «очевидно», «скорее всего» без метки `[выведено]`.
161
- - Заполнять шаблон пунктами без доказательств.
162
- - Править файлы досье и `INDEX.json` руками.
163
- - Начинать анализ без `status`.
164
- - Оставлять старые факты без пометки и заявлять о свежести досье.
165
- - Складывать всё в одну гигантскую секцию вместо ссылок на файлы.
166
-
167
- ## 7. Связанное
168
-
169
- - Постоянное ведение памяти — `project-memory-maintenance` (журнал, дедупликация, свежесть).
170
- - Процесс разработки — `dev-workflow`; планирование — `requirements-and-planning`; финальное ревью — `code-review-checklist`.
36
+ | Разведка, трассировка, git, `[проверено]` | `references/recon-commands.md` | ≈2 000 |
37
+ | Каркасы секций, примеры, форма отчёта | `references/section-templates.md` | ≈1 450 |
38
+ | Полный API, детали шагов, антипаттерны | `references/tool-and-process.md` | ≈2 950 |
39
+
40
+ ## 4. Гейт перед сдачей
41
+ - [ ] `status` первым, slug определён; секции прочитаны, дублей нет.
42
+ - [ ] Каждая секция — `update_section` + `read`; минимумы и ≤ 40 KB.
43
+ - [ ] Нет секретов/PII (перечитано), кода, логов и дампов.
44
+ - [ ] Теги и `path:line`; противоречия разобраны, старое помечено.
45
+ - [ ] JOURNAL дописан; отчёт: «Записано» и «Неясно»; в сеть ничего.
@@ -1,5 +1,7 @@
1
1
  # Разведка проекта: команды и источники
2
2
 
3
+ > Часть навыка project-deep-dive. ≈2 000 токенов. Читать, когда: нужны команды разведки по стеку, трассировка потоков, проверка git-свежести или критерий `[проверено]`.
4
+
3
5
  > Только чтение. Ничего не запускай на изменение (миграции, seed, деплой, install) ради досье.
4
6
  > Если `rg` нет — используй инструменты `glob`/`grep` или `Get-ChildItem -Recurse`.
5
7
  > Значения `.env` не читай: имена переменных бери из `.env.example` или из кода.
@@ -25,6 +27,16 @@ rg --files $root -g '!node_modules' -g '!vendor' -g '!dist' -g '!build' -g '!.gi
25
27
  - Манифесты: `composer.json`, `package.json`, `pnpm-lock.yaml`, `yarn.lock`, `pyproject.toml`, `requirements.txt`, `go.mod`, `Cargo.toml`, `pom.xml`, `Dockerfile`, `docker-compose.yml`, `Makefile`, `.env.example`.
26
28
  - CI: `.github/workflows/`, `.gitlab-ci.yml`, `Jenkinsfile` — какие проверки реально гоняются.
27
29
 
30
+ ## 1a. Трассировка потоков
31
+ Цепочка: точка входа → маршрут → обработчик → домен → данные → тесты. Фиксируй только то, что объясняет запуск, бизнес-логику, данные и хрупкие места.
32
+ ```powershell
33
+ rg -n "Route::|router\.|app\.(get|post)|urlpatterns" $root -g '!node_modules' -g '!vendor'
34
+ rg --files $root | rg "migrations|schema|models|entities"
35
+ rg -n "class \w+(Service|Controller|Handler|Repository)\b" $root -g '!vendor' -g '!node_modules'
36
+ rg -n "process\.env|config\(|ENV\[|getenv\(" $root -g '!node_modules' -g '!vendor'
37
+ rg --files $root | rg "(^|/)(tests?|spec|__tests__|phpunit|playwright)/"
38
+ ```
39
+
28
40
  ## 2. Laravel / PHP
29
41
  ```powershell
30
42
  rg -n "Route::|->group\(|middleware\(" routes app -g '*.php'
@@ -1,5 +1,7 @@
1
1
  # Шаблоны секций досье
2
2
 
3
+ > Часть навыка project-deep-dive. ≈1 450 токенов. Читать, когда: заполняешь секции досье или собираешь обязательный отчёт; нужны примеры формы, минимумы и структура блоков.
4
+
3
5
  > Правило: ссылки `path:line` вместо кода; метка достоверности у ключевых утверждений;
4
6
  > объём секции ≤ 40 KB; содержимое — выводы, а не дампы.
5
7
  > Примеры ниже — образец формы, а не текст для копирования.