dsh-desktop-kit 0.0.0-stage → 2.0.0

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 (269) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -2
  3. package/client.js +4101 -0
  4. package/cordis.patch.yml +5 -0
  5. package/docs/ARCHITECTURE.md +114 -0
  6. package/docs/COMPATIBILITY.md +61 -0
  7. package/docs/INSTALL.md +84 -0
  8. package/docs/PRIVACY.md +50 -0
  9. package/docs/ROADMAP.md +57 -0
  10. package/docs/TOKENS.md +118 -0
  11. package/docs/TROUBLESHOOTING.md +68 -0
  12. package/docs/images/hero.png +0 -0
  13. package/index.js +84 -0
  14. package/package.json +70 -4
  15. package/plugins/dsh-gkb-ru-ui/cordis.patch.yml +6 -0
  16. package/plugins/dsh-gkb-ru-ui/lib/client.js +1331 -0
  17. package/plugins/dsh-gkb-ru-ui/lib/index.js +186 -0
  18. package/plugins/dsh-gkb-ru-ui/lib/skills.js +570 -0
  19. package/plugins/dsh-gkb-ru-ui/package.json +28 -0
  20. package/plugins/dsh-gkb-ru-ui/screenshots/01-home-tiles-1440-light.png +0 -0
  21. package/plugins/dsh-gkb-ru-ui/screenshots/02-skills-1440-light.png +0 -0
  22. package/plugins/dsh-gkb-ru-ui/screenshots/03-skills-editor-1440-light.png +0 -0
  23. package/plugins/dsh-gkb-ru-ui/screenshots/04-skills-1440-dark.png +0 -0
  24. package/plugins/dsh-gkb-ru-ui/screenshots/05-skills-390-light.png +0 -0
  25. package/plugins/dsh-gkb-ru-ui/screenshots/06-home-tiles-1440-dark.png +0 -0
  26. package/plugins/dsh-peak-guard/README.md +70 -0
  27. package/plugins/dsh-peak-guard/client.js +741 -0
  28. package/plugins/dsh-peak-guard/cordis.patch.yml +5 -0
  29. package/plugins/dsh-peak-guard/icon.svg +12 -0
  30. package/plugins/dsh-peak-guard/index.js +2 -0
  31. package/plugins/dsh-peak-guard/locale/en.json +6 -0
  32. package/plugins/dsh-peak-guard/locale/ru.json +6 -0
  33. package/plugins/dsh-peak-guard/locale/zh.json +6 -0
  34. package/plugins/dsh-peak-guard/package.json +33 -0
  35. package/plugins/dsh-peak-guard/screenshots/01-real-time-peak-start.png +0 -0
  36. package/plugins/dsh-peak-guard/screenshots/02-real-time-peak-end.png +0 -0
  37. package/plugins/dsh-peak-guard/screenshots/03-peak-card-1440-light.png +0 -0
  38. package/plugins/dsh-peak-guard/screenshots/04-peak-card-1440-dark.png +0 -0
  39. package/plugins/dsh-peak-guard/screenshots/05-peak-card-390-light.png +0 -0
  40. package/plugins/dsh-peak-guard/screenshots/05-peak-card-768-light.png +0 -0
  41. package/plugins/dsh-peak-guard/screenshots/06-peak-card-390-light.png +0 -0
  42. package/plugins/dsh-peak-guard/screenshots/07-live-preview-check.png +0 -0
  43. package/plugins/dsh-peak-guard/screenshots/07-pre-peak-1440-light.png +0 -0
  44. package/plugins/dsh-peak-guard/screenshots/08-peak-start-1440-light.png +0 -0
  45. package/plugins/dsh-peak-guard/screenshots/09-peak-end-1440-light.png +0 -0
  46. package/plugins/dsh-peak-guard/screenshots/10-pre-peak-card-1440-light.png +0 -0
  47. package/plugins/dsh-peak-guard/screenshots/11-pre-peak-card-1440-dark.png +0 -0
  48. package/plugins/dsh-peak-guard/screenshots/12-pre-peak-card-390-light.png +0 -0
  49. package/plugins/dsh-peak-guard/screenshots/qa-report.json +74 -0
  50. package/plugins/dsh-profile-transfer/README.md +62 -0
  51. package/plugins/dsh-profile-transfer/bootstrap/01-INSTALL.cmd +7 -0
  52. package/plugins/dsh-profile-transfer/bootstrap/README-ARCHIVE.md +54 -0
  53. package/plugins/dsh-profile-transfer/bootstrap/README-/320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/232/320/220.md +42 -0
  54. package/plugins/dsh-profile-transfer/bootstrap/install-on-clean-machine.ps1 +119 -0
  55. package/plugins/dsh-profile-transfer/bootstrap//320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/230/320/242/320/254.cmd +5 -0
  56. package/plugins/dsh-profile-transfer/client.js +806 -0
  57. package/plugins/dsh-profile-transfer/cordis.patch.yml +3 -0
  58. package/plugins/dsh-profile-transfer/icon.svg +13 -0
  59. package/plugins/dsh-profile-transfer/index.js +375 -0
  60. package/plugins/dsh-profile-transfer/locale/en.json +6 -0
  61. package/plugins/dsh-profile-transfer/locale/ru.json +6 -0
  62. package/plugins/dsh-profile-transfer/locale/zh.json +6 -0
  63. package/plugins/dsh-profile-transfer/package.json +36 -0
  64. package/plugins/dsh-profile-transfer/screenshots/01-settings-transfer-1440-light.png +0 -0
  65. package/plugins/dsh-profile-transfer/screenshots/02-settings-transfer-preview-1440-light.png +0 -0
  66. package/plugins/dsh-profile-transfer/screenshots/03-settings-transfer-1440-dark.png +0 -0
  67. package/plugins/dsh-profile-transfer/screenshots/04-settings-transfer-390-light.png +0 -0
  68. package/plugins/dsh-profile-transfer/screenshots/05-settings-transfer-768-light.png +0 -0
  69. package/plugins/dsh-profile-transfer/screenshots/06-settings-transfer-390-dark.png +0 -0
  70. package/plugins/dsh-profile-transfer/screenshots/07-settings-transfer-export-result.png +0 -0
  71. package/plugins/dsh-profile-transfer/screenshots/08-settings-transfer-workspaces-1440-light.png +0 -0
  72. package/plugins/dsh-profile-transfer/screenshots/09-settings-transfer-workspaces-1440-dark.png +0 -0
  73. package/plugins/dsh-profile-transfer/screenshots/10-settings-transfer-workspaces-390-light.png +0 -0
  74. package/plugins/dsh-profile-transfer/transfer.js +1004 -0
  75. package/plugins/dsh-project-memory/README.md +71 -0
  76. package/plugins/dsh-project-memory/cordis.patch.yml +4 -0
  77. package/plugins/dsh-project-memory/icon.svg +12 -0
  78. package/plugins/dsh-project-memory/index.js +1240 -0
  79. package/plugins/dsh-project-memory/locale/en.json +6 -0
  80. package/plugins/dsh-project-memory/locale/ru.json +6 -0
  81. package/plugins/dsh-project-memory/locale/zh.json +6 -0
  82. package/plugins/dsh-project-memory/package.json +26 -0
  83. package/plugins/dsh-session-move/README.md +67 -0
  84. package/plugins/dsh-session-move/client.js +719 -0
  85. package/plugins/dsh-session-move/cordis.patch.yml +5 -0
  86. package/plugins/dsh-session-move/icon.svg +14 -0
  87. package/plugins/dsh-session-move/index.js +497 -0
  88. package/plugins/dsh-session-move/locale/en.json +6 -0
  89. package/plugins/dsh-session-move/locale/ru.json +6 -0
  90. package/plugins/dsh-session-move/locale/zh.json +6 -0
  91. package/plugins/dsh-session-move/package.json +31 -0
  92. package/plugins/dsh-session-move/screenshots/01-row-menu-1440-light.png +0 -0
  93. package/plugins/dsh-session-move/screenshots/02-dialog-1440-light.png +0 -0
  94. package/plugins/dsh-session-move/screenshots/03-dialog-390-light.png +0 -0
  95. package/plugins/dsh-session-move/screenshots/04-dialog-1440-dark.png +0 -0
  96. package/plugins/dsh-session-move/screenshots/05-drag-highlight-1440-light.png +0 -0
  97. package/plugins/dsh-session-move/screenshots/06-drop-ungrouped-highlight.png +0 -0
  98. package/plugins/dsh-session-move/screenshots/07-after-drop-ungrouped.png +0 -0
  99. package/plugins/dsh-session-move/screenshots/08-move-dialog.png +0 -0
  100. package/plugins/dsh-session-move/screenshots/09-moved-to-second-workspace.png +0 -0
  101. package/plugins/dsh-session-move/screenshots/qa-report.json +62 -0
  102. package/plugins/dsh-skill-autopilot/cordis.patch.yml +3 -0
  103. package/plugins/dsh-skill-autopilot/index.js +444 -0
  104. package/plugins/dsh-skill-autopilot/package.json +19 -0
  105. package/plugins/dsh-token-lab/cordis.patch.yml +3 -0
  106. package/plugins/dsh-token-lab/lib/client.js +504 -0
  107. package/plugins/dsh-token-lab/lib/index.js +275 -0
  108. package/plugins/dsh-token-lab/package.json +26 -0
  109. package/plugins/dsh-token-lab/screenshots/01-token-lab-1440-light.png +0 -0
  110. package/plugins/dsh-token-lab/screenshots/02-token-lab-1440-dark.png +0 -0
  111. package/skills/code-review-checklist/SKILL.md +55 -0
  112. package/skills/content-writing/README.md +87 -0
  113. package/skills/content-writing/SKILL.md +85 -0
  114. package/skills/content-writing/assets/checklists/fact-check.md +53 -0
  115. package/skills/content-writing/assets/checklists/publish.md +65 -0
  116. package/skills/content-writing/assets/checklists/social.md +40 -0
  117. package/skills/content-writing/assets/templates/article.md +47 -0
  118. package/skills/content-writing/assets/templates/brief.md +44 -0
  119. package/skills/content-writing/assets/templates/doctor-card.md +41 -0
  120. package/skills/content-writing/assets/templates/image-prompts.md +128 -0
  121. package/skills/content-writing/assets/templates/post-telegram.md +36 -0
  122. package/skills/content-writing/assets/templates/post-vk.md +42 -0
  123. package/skills/content-writing/assets/templates/press-release.md +56 -0
  124. package/skills/content-writing/assets/templates/science-pop-note.md +55 -0
  125. package/skills/content-writing/assets/templates/service-card.md +46 -0
  126. package/skills/content-writing/references/anti-ai-style.md +248 -0
  127. package/skills/content-writing/references/editing.md +185 -0
  128. package/skills/content-writing/references/fact-checking.md +205 -0
  129. package/skills/content-writing/references/government-medical.md +246 -0
  130. package/skills/content-writing/references/images.md +212 -0
  131. package/skills/content-writing/references/journalism.md +252 -0
  132. package/skills/content-writing/references/process.md +123 -0
  133. package/skills/content-writing/references/quick-recipes.md +99 -0
  134. package/skills/content-writing/references/rules.md +85 -0
  135. package/skills/content-writing/references/science-popular.md +218 -0
  136. package/skills/content-writing/references/seo-content.md +172 -0
  137. package/skills/content-writing/references/social-media.md +253 -0
  138. package/skills/content-writing/references/sources.md +49 -0
  139. package/skills/content-writing/references/templates.md +291 -0
  140. package/skills/context-economy/SKILL.md +60 -0
  141. package/skills/context-economy/references/long-session.md +35 -0
  142. package/skills/context-economy/references/token-math.md +42 -0
  143. package/skills/context-economy/references/tool-recipes.md +34 -0
  144. package/skills/database-safety/SKILL.md +47 -0
  145. package/skills/debugging-playbook/SKILL.md +42 -0
  146. package/skills/design-critique/SKILL.md +65 -0
  147. package/skills/design-critique/references/a11y.md +25 -0
  148. package/skills/design-critique/references/diagnoses.md +33 -0
  149. package/skills/design-critique/references/quick-tests.md +30 -0
  150. package/skills/design-critique/references/report-template.md +63 -0
  151. package/skills/design-critique/references/rubric-fast.md +73 -0
  152. package/skills/dev-workflow/SKILL.md +48 -0
  153. package/skills/dev-workflow/references/definition-of-done.md +44 -0
  154. package/skills/dev-workflow/references/memory-and-boundaries.md +31 -0
  155. package/skills/dev-workflow/references/stages.md +67 -0
  156. package/skills/git-and-ci/SKILL.md +60 -0
  157. package/skills/pg-upgrade-verify/SKILL.md +67 -0
  158. package/skills/project-deep-dive/SKILL.md +45 -0
  159. package/skills/project-deep-dive/references/recon-commands.md +90 -0
  160. package/skills/project-deep-dive/references/section-templates.md +104 -0
  161. package/skills/project-deep-dive/references/tool-and-process.md +86 -0
  162. package/skills/project-memory-maintenance/SKILL.md +55 -0
  163. package/skills/project-memory-maintenance/references/api-and-checklist.md +99 -0
  164. package/skills/project-memory-maintenance/references/journal-template.md +50 -0
  165. package/skills/project-memory-maintenance/references/section-rules.md +59 -0
  166. package/skills/release-and-deploy/SKILL.md +53 -0
  167. package/skills/requirements-and-planning/SKILL.md +49 -0
  168. package/skills/requirements-and-planning/references/antipatterns-and-checklist.md +20 -0
  169. package/skills/requirements-and-planning/references/process-steps.md +52 -0
  170. package/skills/requirements-and-planning/references/templates-and-estimates.md +29 -0
  171. package/skills/security-review/SKILL.md +40 -0
  172. package/skills/seo/README.md +60 -0
  173. package/skills/seo/SKILL.md +77 -0
  174. package/skills/seo/assets/README.md +66 -0
  175. package/skills/seo/assets/scripts/LICENSE-playwright-core.txt +202 -0
  176. package/skills/seo/assets/scripts/README.md +179 -0
  177. package/skills/seo/assets/scripts/lib/args.mjs +105 -0
  178. package/skills/seo/assets/scripts/lib/browser.mjs +620 -0
  179. package/skills/seo/assets/scripts/lib/zip.mjs +191 -0
  180. package/skills/seo/assets/scripts/seo-audit.mjs +1675 -0
  181. package/skills/seo/assets/snippets/jsonld-breadcrumb.json +30 -0
  182. package/skills/seo/assets/snippets/jsonld-faq.json +39 -0
  183. package/skills/seo/assets/snippets/jsonld-medical-clinic.json +49 -0
  184. package/skills/seo/assets/snippets/jsonld-medical-webpage.json +33 -0
  185. package/skills/seo/assets/snippets/jsonld-organization.json +74 -0
  186. package/skills/seo/assets/snippets/jsonld-physician.json +46 -0
  187. package/skills/seo/assets/snippets/meta.blade.php +61 -0
  188. package/skills/seo/assets/snippets/robots.txt +61 -0
  189. package/skills/seo/assets/snippets/sitemap-urlset-example.xml +72 -0
  190. package/skills/seo/assets/snippets/sitemap.xml +36 -0
  191. package/skills/seo/references/antipatterns.md +66 -0
  192. package/skills/seo/references/audit-checklist.md +319 -0
  193. package/skills/seo/references/content-seo.md +204 -0
  194. package/skills/seo/references/eeat-medical.md +219 -0
  195. package/skills/seo/references/measurement.md +250 -0
  196. package/skills/seo/references/on-page.md +214 -0
  197. package/skills/seo/references/page-templates.md +56 -0
  198. package/skills/seo/references/stack-recipes.md +695 -0
  199. package/skills/seo/references/structured-data.md +487 -0
  200. package/skills/seo/references/technical-seo.md +296 -0
  201. package/skills/service-desk-conventions/SKILL.md +52 -0
  202. package/skills/service-desk-db-safety/SKILL.md +63 -0
  203. package/skills/service-desk-release/SKILL.md +61 -0
  204. package/skills/service-desk-testing/SKILL.md +61 -0
  205. package/skills/service-desk-ui/SKILL.md +52 -0
  206. package/skills/skills-router/SKILL.md +53 -0
  207. package/skills/skills-router/references/applying-skills.md +25 -0
  208. package/skills/skills-router/references/routing-matrix.md +52 -0
  209. package/skills/testing-strategy/SKILL.md +52 -0
  210. package/skills/ui-design-system/SKILL.md +50 -0
  211. package/skills/ui-design-system/references/accessibility-and-responsive.md +50 -0
  212. package/skills/ui-design-system/references/tokens-and-components.md +67 -0
  213. package/skills/ui-design-system/references/visual-qa.md +44 -0
  214. package/skills/web-research/SKILL.md +47 -0
  215. package/skills/web-research/references/answer-and-citations.md +60 -0
  216. package/skills/web-research/references/query-recipes.md +44 -0
  217. package/skills/wow-design/SKILL.md +89 -0
  218. package/skills/wow-design/assets/kit/README.md +195 -0
  219. package/skills/wow-design/assets/kit/assets/css/base.css +158 -0
  220. package/skills/wow-design/assets/kit/assets/css/components.css +1001 -0
  221. package/skills/wow-design/assets/kit/assets/css/fonts.css +73 -0
  222. package/skills/wow-design/assets/kit/assets/css/pages.css +737 -0
  223. package/skills/wow-design/assets/kit/assets/css/tokens.css +218 -0
  224. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-golos-text.txt +93 -0
  225. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-lora.txt +93 -0
  226. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-unbounded.txt +93 -0
  227. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-400-normal.woff2 +0 -0
  228. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-500-normal.woff2 +0 -0
  229. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-600-normal.woff2 +0 -0
  230. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-700-normal.woff2 +0 -0
  231. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-400-normal.woff2 +0 -0
  232. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-500-normal.woff2 +0 -0
  233. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-600-normal.woff2 +0 -0
  234. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-700-normal.woff2 +0 -0
  235. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-italic.woff2 +0 -0
  236. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-normal.woff2 +0 -0
  237. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-500-normal.woff2 +0 -0
  238. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-600-normal.woff2 +0 -0
  239. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-400-normal.woff2 +0 -0
  240. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-500-normal.woff2 +0 -0
  241. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-600-normal.woff2 +0 -0
  242. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-400-normal.woff2 +0 -0
  243. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-500-normal.woff2 +0 -0
  244. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-600-normal.woff2 +0 -0
  245. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-400-normal.woff2 +0 -0
  246. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-500-normal.woff2 +0 -0
  247. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-600-normal.woff2 +0 -0
  248. package/skills/wow-design/assets/kit/assets/js/kit.js +550 -0
  249. package/skills/wow-design/assets/kit/pages/dashboard.html +539 -0
  250. package/skills/wow-design/assets/kit/pages/hospital.html +430 -0
  251. package/skills/wow-design/assets/kit/showcase.html +1164 -0
  252. package/skills/wow-design/assets/scripts/LICENSE-axe-core.txt +362 -0
  253. package/skills/wow-design/assets/scripts/LICENSE-playwright-core.txt +202 -0
  254. package/skills/wow-design/assets/scripts/README.md +312 -0
  255. package/skills/wow-design/assets/scripts/audit.mjs +1200 -0
  256. package/skills/wow-design/assets/scripts/capture.mjs +337 -0
  257. package/skills/wow-design/assets/scripts/package.json +30 -0
  258. package/skills/wow-design/references/anti-patterns.md +252 -0
  259. package/skills/wow-design/references/critique-rubric.md +262 -0
  260. package/skills/wow-design/references/design-brief-template.md +48 -0
  261. package/skills/wow-design/references/inspiration.md +203 -0
  262. package/skills/wow-design/references/presets.md +99 -0
  263. package/skills/wow-design/references/principles.md +371 -0
  264. package/skills/wow-design/references/quick-presets.md +50 -0
  265. package/skills/wow-design/references/report-template.md +21 -0
  266. package/skills/wow-design/references/stack-recipes.md +96 -0
  267. package/skills/wow-design/references/visual-qa.md +82 -0
  268. package/skills/wow-design/references/wow-levers.md +43 -0
  269. package/tools/skill-cost.mjs +76 -0
@@ -0,0 +1,487 @@
1
+ > Часть навыка seo. ≈8 700 токенов. Читать, когда: добавляешь JSON-LD — шаблоны Organization, BreadcrumbList, MedicalWebPage, Physician, MedicalClinic, Service, FAQPage, Article; что не размечать; валидация.
2
+
3
+ # Структурированные данные (JSON-LD) — шаблоны и правила
4
+
5
+ > Разметка помогает поисковикам и ИИ-системам **понять сущности** страницы: кто вы, где вы, какие услуги, кто врач,
6
+ > что за статья. Она не «поднимает позиции», но улучшает понимание, сниппеты (где они ещё работают) и цитируемость
7
+ > в ИИ-ответах. Правило №1: **разметка = видимый контент**, слово в слово по смыслу.
8
+
9
+ ## 0. Правила, которые важнее шаблонов
10
+
11
+ 1. **JSON-LD**, а не микроразметка/RDFa: проще, не ломает вёрстку, рекомендован Google.
12
+ 2. Один `<script type="application/ld+json">` на сущность или один `@graph` — оба варианта валидны.
13
+ 3. `@context: "https://schema.org"` (https, не http); `@id` — абсолютный URL с `#`-фрагментом для связывания
14
+ сущностей в граф (`#organization`, `#website`, `#webpage`, `#physician-ivanov`).
15
+ 4. **Абсолютные URL** во всех `url/item/image/logo/sameAs/mainEntityOfPage`.
16
+ 5. Даты — ISO 8601: `2026-11-04` или `2026-11-04T10:00:00+03:00`. Время события — с часовым поясом.
17
+ 6. Цены — число + `priceCurrency: "RUB"`; не пиши «от 4500 ₽» в `price` (число `4500`, а «от» — в описании/Offer
18
+ `priceSpecification` если нужно).
19
+ 7. **Не размечай невидимое**: рейтинги, отзывы, цены, которые не показаны пользователю на странице.
20
+ 8. Не дублируй сущность с разными данными на одной странице (два `Organization` с разными телефонами — ошибка).
21
+ 9. Валидируй **после каждого изменения**: Rich Results Test + Schema Markup Validator. Ошибка в JSON = весь блок
22
+ игнорируется.
23
+ 10. Разметка **не заменяет** on-page: title/description/H1/текст остаются главными.
24
+
25
+ ## 1. Схема «граф сайта» (главная + все страницы)
26
+
27
+ На каждой странице удобно отдавать `@graph` с тремя узлами — Organization, WebSite, WebPage — и связями.
28
+ Все остальные сущности (`Physician`, `Article`, `Service`) ссылаются на `#organization`/`#webpage`.
29
+
30
+ ```json
31
+ {
32
+ "@context": "https://schema.org",
33
+ "@graph": [
34
+ {
35
+ "@type": ["MedicalOrganization", "MedicalClinic"],
36
+ "@id": "https://example.org/#organization",
37
+ "name": "Городская клиническая больница №31",
38
+ "alternateName": "организация",
39
+ "url": "https://example.org/",
40
+ "logo": {
41
+ "@type": "ImageObject",
42
+ "url": "https://example.org/upload/logo-512.png",
43
+ "width": 512,
44
+ "height": 512
45
+ },
46
+ "image": "https://example.org/upload/building-1200x630.jpg",
47
+ "description": "Многопрофильная больница в Москве: консультации, диагностика, стационар.",
48
+ "telephone": "+7-495-000-00-00",
49
+ "email": "info@example.org",
50
+ "address": {
51
+ "@type": "PostalAddress",
52
+ "streetAddress": "ул. Новая, 12",
53
+ "addressLocality": "Москва",
54
+ "addressRegion": "Москва",
55
+ "postalCode": "105005",
56
+ "addressCountry": "RU"
57
+ },
58
+ "geo": { "@type": "GeoCoordinates", "latitude": 55.7654, "longitude": 37.6543 },
59
+ "openingHoursSpecification": [{
60
+ "@type": "OpeningHoursSpecification",
61
+ "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
62
+ "opens": "08:00",
63
+ "closes": "20:00"
64
+ }],
65
+ "areaServed": { "@type": "City", "name": "Москва" },
66
+ "medicalSpecialty": ["Cardiovascular", "Oncologic", "Neurologic", "PrimaryCare"],
67
+ "isAcceptingNewPatients": true,
68
+ "sameAs": [
69
+ "https://vk.com/service-desk",
70
+ "https://t.me/service-desk",
71
+ "https://yandex.ru/maps/org/00000000000"
72
+ ],
73
+ "hasCredential": {
74
+ "@type": "EducationalOccupationalCredential",
75
+ "credentialCategory": "Лицензия на осуществление медицинской деятельности",
76
+ "identifier": "ЛО-77-01-000000",
77
+ "validFrom": "2024-01-15"
78
+ }
79
+ },
80
+ {
81
+ "@type": "WebSite",
82
+ "@id": "https://example.org/#website",
83
+ "url": "https://example.org/",
84
+ "name": "организация — официальный сайт",
85
+ "inLanguage": "ru-RU",
86
+ "publisher": { "@id": "https://example.org/#organization" }
87
+ },
88
+ {
89
+ "@type": "WebPage",
90
+ "@id": "https://example.org/uslugi/mrt-golovy/#webpage",
91
+ "url": "https://example.org/uslugi/mrt-golovy/",
92
+ "name": "МРТ головного мозга в организация",
93
+ "isPartOf": { "@id": "https://example.org/#website" },
94
+ "about": { "@id": "https://example.org/#organization" },
95
+ "inLanguage": "ru-RU",
96
+ "breadcrumb": { "@id": "https://example.org/uslugi/mrt-golovy/#breadcrumb" }
97
+ }
98
+ ]
99
+ }
100
+ ```
101
+
102
+ Примечание: `hasCredential` — schema.org-свойство `Organization` (используется и в `EducationalOccupationalProgram`);
103
+ для лицензии это самый «чистый» способ показать её не текстом. Если валидатор ругается — вынеси лицензию
104
+ в `identifier` или оставь видимым текстом (доверие важнее разметки).
105
+
106
+ ## 2. `BreadcrumbList` — на всех внутренних страницах
107
+
108
+ ```json
109
+ {
110
+ "@context": "https://schema.org",
111
+ "@type": "BreadcrumbList",
112
+ "@id": "https://example.org/uslugi/mrt-golovy/#breadcrumb",
113
+ "itemListElement": [
114
+ { "@type": "ListItem", "position": 1, "name": "Главная", "item": "https://example.org/" },
115
+ { "@type": "ListItem", "position": 2, "name": "Услуги", "item": "https://example.org/uslugi/" },
116
+ { "@type": "ListItem", "position": 3, "name": "МРТ", "item": "https://example.org/uslugi/mrt/" },
117
+ { "@type": "ListItem", "position": 4, "name": "МРТ головного мозга" }
118
+ ]
119
+ }
120
+ ```
121
+
122
+ - Обязательны `position`, `name`, `item`; последний элемент — без `item` (текущая страница).
123
+ - Совпадает с видимыми крошками и с URL-структурой.
124
+ - Google: крошки показываются **только на десктопе** (с 01.2025), на мобильных — нет.
125
+
126
+ ## 3. `MedicalWebPage` — медицинский контент (услуга, статья, направление)
127
+
128
+ Рекомендуемый тип для страниц о здоровье: связывает контент с аудиторией, специализацией, рецензентом и датой
129
+ проверки — это сигналы E-E-A-T и данные для ИИ.
130
+
131
+ ```json
132
+ {
133
+ "@context": "https://schema.org",
134
+ "@type": "MedicalWebPage",
135
+ "@id": "https://example.org/uslugi/mrt-golovy/#webpage",
136
+ "url": "https://example.org/uslugi/mrt-golovy/",
137
+ "name": "МРТ головного мозга: показания, подготовка, цена",
138
+ "description": "Как проходит МРТ головного мозга, кому показано, как подготовиться, сколько стоит в организация.",
139
+ "inLanguage": "ru-RU",
140
+ "isPartOf": { "@id": "https://example.org/#website" },
141
+ "about": { "@type": "MedicalCondition", "name": "Заболевания головного мозга" },
142
+ "mainContentOfPage": { "@type": "WebPageElement" },
143
+ "audience": { "@type": "MedicalAudience", "audienceType": "Patient" },
144
+ "medicalAudience": "https://schema.org/Patient",
145
+ "specialty": "https://schema.org/Neurologic",
146
+ "lastReviewed": "2026-10-20",
147
+ "reviewedBy": {
148
+ "@type": "Physician",
149
+ "@id": "https://example.org/vrachi/petrov-sergey/#physician",
150
+ "name": "Петров Сергей Николаевич",
151
+ "jobTitle": "Врач-рентгенолог",
152
+ "url": "https://example.org/vrachi/petrov-sergey/"
153
+ },
154
+ "datePublished": "2025-02-10",
155
+ "dateModified": "2026-10-20",
156
+ "breadcrumb": { "@id": "https://example.org/uslugi/mrt-golovy/#breadcrumb" },
157
+ "potentialAction": {
158
+ "@type": "ReserveAction",
159
+ "target": "https://example.org/zapis/"
160
+ }
161
+ }
162
+ ```
163
+
164
+ Специальности (`specialty`) — из enum `MedicalSpecialty`: `Cardiovascular`, `Oncologic` (не «Oncology»!),
165
+ `Neurologic`, `Gastroenterologic`, `Endocrine`, `Gynecologic`, `Urologic`, `Otolaryngologic`, `Dermatology`,
166
+ `Pediatric`, `Psychiatric`, `PrimaryCare`, `Surgical`, `Rheumatologic`, `Hematologic`, `Pulmonologic`
167
+ (проверять точные URI в schema.org/MedicalSpecialty — список полный, не выдумывай кастомные URL).
168
+
169
+ ## 4. `Physician` — профиль врача
170
+
171
+ ```json
172
+ {
173
+ "@context": "https://schema.org",
174
+ "@type": ["Physician", "Person"],
175
+ "@id": "https://example.org/vrachi/ivanov-ivan/#physician",
176
+ "name": "Иванов Иван Иванович",
177
+ "jobTitle": "Врач-кардиолог",
178
+ "description": "Кардиолог с 18-летним стажем, кандидат медицинских наук.",
179
+ "url": "https://example.org/vrachi/ivanov-ivan/",
180
+ "image": "https://example.org/upload/vrachi/ivanov-ivan.jpg",
181
+ "telephone": "+7-495-000-00-01",
182
+ "medicalSpecialty": "https://schema.org/Cardiovascular",
183
+ "availableService": [
184
+ { "@type": "MedicalProcedure", "name": "ЭКГ" },
185
+ { "@type": "MedicalProcedure", "name": "Эхокардиография" }
186
+ ],
187
+ "worksFor": { "@id": "https://example.org/#organization" },
188
+ "hospitalAffiliation": { "@id": "https://example.org/#organization" },
189
+ "alumniOf": {
190
+ "@type": "CollegeOrUniversity",
191
+ "name": "РНИМУ им. Н. И. Пирогова"
192
+ },
193
+ "memberOf": {
194
+ "@type": "Organization",
195
+ "name": "Российское кардиологическое общество"
196
+ },
197
+ "knowsAbout": ["Артериальная гипертензия", "Ишемическая болезнь сердца", "Аритмии"],
198
+ "identifier": {
199
+ "@type": "PropertyValue",
200
+ "name": "Сертификат специалиста",
201
+ "value": "№ 000000"
202
+ },
203
+ "isAcceptingNewPatients": true,
204
+ "sameAs": ["https://example.org/vrachi/", "https://vk.com/..."]
205
+ }
206
+ ```
207
+
208
+ Правила:
209
+ - `worksFor`/`hospitalAffiliation` — ссылка на `@id` организации (единый граф).
210
+ - Не придумывай стаж/учёную степень; только из анкеты врача (`memory/DOCTOR-QUESTIONNAIRES-FORMAT.md`).
211
+ - `image` — реальное фото врача (согласие на публикацию!) либо фото не выводится и поле опускается.
212
+ - Для персональных данных (фото, образование) соблюдай 152-ФЗ и согласия — разметка публична.
213
+
214
+ ## 5. `MedicalClinic` / `Hospital` + `LocalBusiness`-поля (локальное SEO)
215
+
216
+ `MedicalClinic` наследует свойства `MedicalBusiness`/`LocalBusiness` — адрес, часы, гео, телефон работают.
217
+ Для главной и страницы «Контакты/Филиалы» используй отдельный узел на каждый филиал.
218
+
219
+ ```json
220
+ {
221
+ "@context": "https://schema.org",
222
+ "@type": "MedicalClinic",
223
+ "@id": "https://example.org/kontakty/#clinic",
224
+ "name": "организация — главный корпус",
225
+ "url": "https://example.org/kontakty/",
226
+ "image": "https://example.org/upload/building-1200x630.jpg",
227
+ "telephone": "+7-495-000-00-00",
228
+ "priceRange": "₽₽",
229
+ "currenciesAccepted": "RUB",
230
+ "paymentAccepted": "Наличные, банковская карта, ДМС, ОМС",
231
+ "address": {
232
+ "@type": "PostalAddress",
233
+ "streetAddress": "ул. Новая, 12",
234
+ "addressLocality": "Москва",
235
+ "postalCode": "105005",
236
+ "addressCountry": "RU"
237
+ },
238
+ "geo": { "@type": "GeoCoordinates", "latitude": 55.7654, "longitude": 37.6543 },
239
+ "hasMap": "https://yandex.ru/maps/org/00000000000",
240
+ "openingHoursSpecification": [{
241
+ "@type": "OpeningHoursSpecification",
242
+ "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
243
+ "opens": "08:00",
244
+ "closes": "20:00"
245
+ }],
246
+ "medicalSpecialty": ["Cardiovascular", "Oncologic"],
247
+ "isAcceptingNewPatients": true,
248
+ "parentOrganization": { "@id": "https://example.org/#organization" },
249
+ "sameAs": ["https://yandex.ru/maps/org/00000000000", "https://2gis.ru/moscow/firm/000000000000000"]
250
+ }
251
+ ```
252
+
253
+ **Важно про отзывы:** Google показывает «звёзды» из `aggregateRating`/`review` для LocalBusiness **только если
254
+ отзывы о других организациях**; собственные отзывы о себе Google в rich results не показывает (self-serving
255
+ reviews policy). Накрученные рейтинги — риск ручных санкций. Для клиники правильнее: реальные отзывы в тексте
256
+ страницы, ссылки на Яндекс Карты/2ГИС, ответы на отзывы; `aggregateRating` — только если это реальный,
257
+ проверяемый рейтинг с площадки и политика это допускает.
258
+
259
+ ## 6. `Service` / `MedicalProcedure` — услуга
260
+
261
+ ```json
262
+ {
263
+ "@context": "https://schema.org",
264
+ "@type": ["MedicalProcedure", "Service"],
265
+ "@id": "https://example.org/uslugi/mrt-golovy/#service",
266
+ "name": "МРТ головного мозга",
267
+ "serviceType": "Магнитно-резонансная томография головного мозга",
268
+ "description": "МРТ головного мозга на аппарате 1.5 Тл с расшифровкой врачом-рентгенологом.",
269
+ "procedureType": "https://schema.org/NoninvasiveProcedure",
270
+ "bodyLocation": "Головной мозг",
271
+ "preparation": "Специальная подготовка не требуется; при контрастировании — натощак и с результатами анализов.",
272
+ "howPerformed": "Пациент ложится на стол томографа, исследование занимает 20–30 минут.",
273
+ "provider": { "@id": "https://example.org/#organization" },
274
+ "areaServed": { "@type": "City", "name": "Москва" },
275
+ "offers": {
276
+ "@type": "Offer",
277
+ "price": 4500,
278
+ "priceCurrency": "RUB",
279
+ "availability": "https://schema.org/InStock",
280
+ "url": "https://example.org/uslugi/mrt-golovy/",
281
+ "priceValidUntil": "2026-12-31"
282
+ },
283
+ "relevantSpecialty": "https://schema.org/Radiography"
284
+ }
285
+ ```
286
+
287
+ Правила:
288
+ - `offers.price` — только если цена реально видна на странице и актуальна; иначе опусти `offers` целиком.
289
+ - «от 4500» → `price: 4500` + в тексте «от». Не пиши `price: "от 4500"` (невалидное число).
290
+ - `MedicalProcedureType` — из enum: `NoninvasiveProcedure`, `PercutaneousProcedure`, `SurgicalProcedure`
291
+ (проверить точные значения в schema.org).
292
+
293
+ ## 7. `FAQPage` — блок вопросов
294
+
295
+ > **Статус 2026:** Google **отключил FAQ rich results с 07.05.2026** (документация удалена 15.06.2026).
296
+ > Разметка остаётся валидной и полезной для понимания контента и ИИ-ответов, но **не жди расширенного сниппета**.
297
+ > Яндекс может использовать FAQ-разметку в «Вопросах и ответах» — проверяй в Вебмастере.
298
+
299
+ ```json
300
+ {
301
+ "@context": "https://schema.org",
302
+ "@type": "FAQPage",
303
+ "@id": "https://example.org/uslugi/mrt-golovy/#faq",
304
+ "mainEntity": [
305
+ {
306
+ "@type": "Question",
307
+ "name": "Нужно ли направление врача на МРТ?",
308
+ "acceptedAnswer": {
309
+ "@type": "Answer",
310
+ "text": "Направление не обязательно при платном исследовании, но при ОМС требуется направление лечащего врача. Результат действителен для консультации в организация."
311
+ }
312
+ },
313
+ {
314
+ "@type": "Question",
315
+ "name": "Сколько длится МРТ головного мозга?",
316
+ "acceptedAnswer": {
317
+ "@type": "Answer",
318
+ "text": "Исследование без контраста занимает 20–30 минут, с контрастом — до 45 минут."
319
+ }
320
+ }
321
+ ]
322
+ }
323
+ ```
324
+
325
+ Правила: вопросы и ответы должны быть **видимы на странице** (можно в аккордеоне), ответ — полный текст,
326
+ не «читайте по ссылке». 5–8 вопросов из реального спроса (Вордстат/подсказки/GSC), не выдуманных.
327
+
328
+ ## 8. `Article` / `NewsArticle` — статьи и новости
329
+
330
+ ```json
331
+ {
332
+ "@context": "https://schema.org",
333
+ "@type": "Article",
334
+ "@id": "https://example.org/blog/vysokoe-davlenie/#article",
335
+ "headline": "Высокое давление: причины, симптомы и когда идти к врачу",
336
+ "description": "Почему повышается давление, какие симптомы опасны и как измерять его дома.",
337
+ "image": ["https://example.org/upload/blog/davlenie-1200x630.jpg"],
338
+ "datePublished": "2026-03-12",
339
+ "dateModified": "2026-10-18",
340
+ "inLanguage": "ru-RU",
341
+ "author": {
342
+ "@type": "Physician",
343
+ "name": "Иванов Иван Иванович",
344
+ "jobTitle": "Врач-кардиолог",
345
+ "url": "https://example.org/vrachi/ivanov-ivan/"
346
+ },
347
+ "reviewedBy": {
348
+ "@type": "Person",
349
+ "name": "Смирнова Анна Петровна",
350
+ "jobTitle": "Заместитель главного врача по медицинской части"
351
+ },
352
+ "publisher": { "@id": "https://example.org/#organization" },
353
+ "mainEntityOfPage": { "@type": "WebPage", "@id": "https://example.org/blog/vysokoe-davlenie/" },
354
+ "articleSection": "Кардиология",
355
+ "keywords": ["высокое давление", "гипертония", "артериальная гипертензия"]
356
+ }
357
+ ```
358
+
359
+ - `headline` — без жёсткого лимита, но короче 110 символов и без «кликбейта».
360
+ - `author` — **реальный врач** (не «Редакция»), с `url` на профиль; `reviewedBy` — рецензент, если есть.
361
+ - `publisher` — организация с `logo` (Google требует `ImageObject`/`Organization`).
362
+ - `NewsArticle` — для новостей и пресс-релизов, `Article` — для блога/статей.
363
+ - Разметку статьи не ставь на страницу услуги.
364
+
365
+ ## 9. `Event` — мероприятия (день открытых дверей, школа родителей)
366
+
367
+ ```json
368
+ {
369
+ "@context": "https://schema.org",
370
+ "@type": "Event",
371
+ "@id": "https://example.org/novosti/den-otkrytyh-dverey-2026-04-12/#event",
372
+ "name": "День открытых дверей: проверка сердца",
373
+ "description": "Бесплатная проверка сердца, консультации кардиолога и эндокринолога.",
374
+ "startDate": "2026-04-12T09:00:00+03:00",
375
+ "endDate": "2026-04-12T15:00:00+03:00",
376
+ "eventStatus": "https://schema.org/EventScheduled",
377
+ "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
378
+ "location": {
379
+ "@type": "Place",
380
+ "name": "организация, главный корпус",
381
+ "address": {
382
+ "@type": "PostalAddress",
383
+ "streetAddress": "ул. Новая, 12",
384
+ "addressLocality": "Москва",
385
+ "addressCountry": "RU"
386
+ }
387
+ },
388
+ "image": ["https://example.org/upload/events/den-otkrytyh-dverey-1200x630.jpg"],
389
+ "organizer": { "@id": "https://example.org/#organization" },
390
+ "offers": {
391
+ "@type": "Offer",
392
+ "price": 0,
393
+ "priceCurrency": "RUB",
394
+ "availability": "https://schema.org/InStock",
395
+ "url": "https://example.org/novosti/den-otkrytyh-dverey-2026-04-12/",
396
+ "validFrom": "2026-03-01T00:00:00+03:00"
397
+ },
398
+ "isAccessibleForFree": true
399
+ }
400
+ ```
401
+
402
+ Правила (Google, 2025): событие должно быть **реально доступно публике и проводиться офлайн** (онлайн-события
403
+ в Event rich results больше не поддерживаются — онлайн-атрибуты удалены из документации в 2025).
404
+ После события страницу не удаляй в ноль: обнови (итоги) или 301 на раздел новостей.
405
+
406
+ ## 10. `Product` — только для товаров (аптеки, медтехника)
407
+
408
+ ```json
409
+ {
410
+ "@context": "https://schema.org",
411
+ "@type": "Product",
412
+ "name": "Тонометр автоматический ...",
413
+ "image": ["https://example.org/upload/shop/tonometr.jpg"],
414
+ "description": "Автоматический тонометр на плечо, память на 60 измерений.",
415
+ "sku": "TM-0001",
416
+ "brand": { "@type": "Brand", "name": "..." },
417
+ "offers": {
418
+ "@type": "Offer",
419
+ "url": "https://example.org/shop/tonometr/",
420
+ "priceCurrency": "RUB",
421
+ "price": 3990,
422
+ "availability": "https://schema.org/InStock",
423
+ "priceValidUntil": "2026-12-31"
424
+ }
425
+ }
426
+ ```
427
+
428
+ Для медицинских **услуг** `Product` не используй — это `Service`/`MedicalProcedure`.
429
+
430
+ ## 11. Что НЕ размечать (устарело/не работает в Google в 2026)
431
+
432
+ | Тип | Статус | Комментарий |
433
+ |---|---|---|
434
+ | `FAQPage` rich results | **отключены 07.05.2026** | разметка валидна, сниппета не будет |
435
+ | `HowTo` | удалён 2023 | не тратить время |
436
+ | `SpecialAnnouncement` | отключён 31.07.2025 | COVID-эпоха |
437
+ | `Practice problems` (упражнения) | отключён 01.2026 | — |
438
+ | `Dataset` | только Dataset Search | в Google Search не показывается |
439
+ | `Sitelinks searchbox` (`nositelinkssearchbox`) | отключён 11.2024 | WebSite+SearchAction можно оставить, сниппета нет |
440
+ | `QAPage` | показывается редко | лучше обычный контент + FAQ-блок |
441
+ | `VideoObject` карусель | только часть провайдеров | основное video-разметку оставляй |
442
+ | `Course`, `EmployerAggregateRating` | не для медицины | — |
443
+
444
+ Полный список изменений: https://developers.google.com/search/updates
445
+
446
+ ## 12. Валидация (обязательный шаг)
447
+
448
+ 1. **Rich Results Test** — https://search.google.com/test/rich-results — поддерживаемые типы и ошибки.
449
+ 2. **Schema Markup Validator** — https://validator.schema.org — любые типы schema.org, проверка свойств.
450
+ 3. **GSC → Улучшения/Оформление** — ошибки разметки на живом сайте (после индексации).
451
+ 4. **Яндекс Вебмастер** — «Инструменты → Валидатор микроразметки» (расположение/название проверить на актуальной
452
+ версии), а также «Диагностика» — предупреждения о разметке.
453
+ 5. **JSON-LD Playground** — https://json-ld.org/playground/ — проверить синтаксис/граф.
454
+ 6. **Своя проверка в CI:** `assets/scripts/seo-audit.mjs` парсит JSON-LD, проверяет JSON-валидность, наличие
455
+ обязательных полей у ключевых типов, абсолютность URL, совпадение `@type` с содержимым страницы.
456
+
457
+ Типовые ошибки валидации: висящая запятая в JSON, `"@type": "Physician "` с пробелом, относительные URL,
458
+ `datePublished: "12.03.2026"` вместо ISO, пустые массивы `image: []`, дубли `@id`, `price` строкой.
459
+
460
+ ## 13. Минимальный обязательный набор по типам страниц
461
+
462
+ | Страница | Обязательно (минимум) | Желательно |
463
+ |---|---|---|
464
+ | Главная | Organization/MedicalOrganization, WebSite | MedicalClinic, SearchAction, sameAs |
465
+ | Направление | MedicalWebPage, BreadcrumbList | Service, FAQPage, physician-ссылки |
466
+ | Услуга | MedicalWebPage/Service, BreadcrumbList | MedicalProcedure, Offer, FAQPage |
467
+ | Врач | Physician/Person, BreadcrumbList | availableService, alumniOf, memberOf |
468
+ | Статья | Article, BreadcrumbList | FAQPage, reviewedBy, MedicalWebPage-совместимость |
469
+ | Новость | NewsArticle/Article | Event (если мероприятие) |
470
+ | Контакты/филиалы | MedicalClinic, Organization | geo, openingHours, hasMap |
471
+ | Цены | WebPage/MedicalWebPage | Offer (если цены публичные) |
472
+ | Мероприятие | Event | Offer, organizer |
473
+
474
+ ## 14. Первоисточники
475
+
476
+ - Введение в структурированные данные: https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data
477
+ - Список поддерживаемых типов (Google): https://developers.google.com/search/docs/appearance/structured-data/search-gallery
478
+ - Breadcrumb: https://developers.google.com/search/docs/appearance/structured-data/breadcrumb
479
+ - Article: https://developers.google.com/search/docs/appearance/structured-data/article
480
+ - Organization: https://developers.google.com/search/docs/appearance/structured-data/organization
481
+ - LocalBusiness: https://developers.google.com/search/docs/appearance/structured-data/local-business
482
+ - Event: https://developers.google.com/search/docs/appearance/structured-data/event
483
+ - Product: https://developers.google.com/search/docs/appearance/structured-data/product
484
+ - schema.org медицинские типы: https://schema.org/MedicalWebPage · https://schema.org/MedicalClinic ·
485
+ https://schema.org/Physician · https://schema.org/MedicalSpecialty · https://schema.org/MedicalOrganization
486
+ - Отзывы/self-serving reviews: https://developers.google.com/search/docs/appearance/structured-data/local-business#reviews
487
+ - Хронология изменений: https://developers.google.com/search/updates