mednotes-opencode 0.1.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 (430) hide show
  1. package/.opencode/agents/med-chat-triager.md +204 -0
  2. package/.opencode/agents/med-flashcard-maker.md +63 -0
  3. package/.opencode/agents/med-knowledge-architect.md +230 -0
  4. package/.opencode/agents/med-link-graph-curator.md +177 -0
  5. package/.opencode/agents/med-publish-guard.md +62 -0
  6. package/.opencode/commands/flashcards.md +25 -0
  7. package/.opencode/commands/mednotes/create.md +25 -0
  8. package/.opencode/commands/mednotes/enrich.md +27 -0
  9. package/.opencode/commands/mednotes/fix-wiki.md +27 -0
  10. package/.opencode/commands/mednotes/history.md +22 -0
  11. package/.opencode/commands/mednotes/link-body.md +25 -0
  12. package/.opencode/commands/mednotes/link-related.md +27 -0
  13. package/.opencode/commands/mednotes/link.md +27 -0
  14. package/.opencode/commands/mednotes/pdf-library.md +27 -0
  15. package/.opencode/commands/mednotes/process-chats.md +23 -0
  16. package/.opencode/commands/mednotes/setup.md +21 -0
  17. package/.opencode/commands/mednotes/status.md +27 -0
  18. package/.opencode/commands/mednotes/telemetry.md +27 -0
  19. package/.opencode/commands/report.md +26 -0
  20. package/.opencode/mednotes/AGENTS.md +57 -0
  21. package/.opencode/mednotes/agents/med-chat-triager.md +197 -0
  22. package/.opencode/mednotes/agents/med-flashcard-maker.md +56 -0
  23. package/.opencode/mednotes/agents/med-knowledge-architect.md +224 -0
  24. package/.opencode/mednotes/agents/med-link-graph-curator.md +171 -0
  25. package/.opencode/mednotes/agents/med-publish-guard.md +55 -0
  26. package/.opencode/mednotes/contracts/.gitkeep +1 -0
  27. package/.opencode/mednotes/contracts/agents.json +116 -0
  28. package/.opencode/mednotes/contracts/opencode-plugin.json +70 -0
  29. package/.opencode/mednotes/docs/agent-prompt-hardening.md +567 -0
  30. package/.opencode/mednotes/docs/agent-role-contracts.md +94 -0
  31. package/.opencode/mednotes/docs/anki-mcp-twenty-rules.md +214 -0
  32. package/.opencode/mednotes/docs/anki-templates/README.md +39 -0
  33. package/.opencode/mednotes/docs/anki-templates/cloze.back.html +23 -0
  34. package/.opencode/mednotes/docs/anki-templates/cloze.front.html +14 -0
  35. package/.opencode/mednotes/docs/anki-templates/qa.back.html +24 -0
  36. package/.opencode/mednotes/docs/anki-templates/qa.front.html +14 -0
  37. package/.opencode/mednotes/docs/anki-templates/style.css +182 -0
  38. package/.opencode/mednotes/docs/atomicity-splitting-policy.md +113 -0
  39. package/.opencode/mednotes/docs/extension-docs.md +40 -0
  40. package/.opencode/mednotes/docs/flashcard-ingestion.md +278 -0
  41. package/.opencode/mednotes/docs/knowledge-architect.md +208 -0
  42. package/.opencode/mednotes/docs/merge-policy.md +110 -0
  43. package/.opencode/mednotes/docs/public-vocabulary.md +104 -0
  44. package/.opencode/mednotes/docs/semantic-linker.md +141 -0
  45. package/.opencode/mednotes/docs/taxonomy-policy.md +90 -0
  46. package/.opencode/mednotes/docs/triage-policy.md +187 -0
  47. package/.opencode/mednotes/docs/vault-version-control.md +758 -0
  48. package/.opencode/mednotes/docs/vocabulary-db-recovery.md +58 -0
  49. package/.opencode/mednotes/docs/workflow-output-contract.md +779 -0
  50. package/.opencode/mednotes/hooks/hooks.json +79 -0
  51. package/.opencode/mednotes/package-lock.json +6361 -0
  52. package/.opencode/mednotes/package.json +15 -0
  53. package/.opencode/mednotes/pyproject.toml +48 -0
  54. package/.opencode/mednotes/scripts/bootstrap_windows_python_uv.cmd +13 -0
  55. package/.opencode/mednotes/scripts/bootstrap_windows_python_uv.ps1 +172 -0
  56. package/.opencode/mednotes/scripts/enrich_notes.py +23 -0
  57. package/.opencode/mednotes/scripts/full_reset_windows_python_uv.cmd +13 -0
  58. package/.opencode/mednotes/scripts/hooks/antigravity_hook_status.mjs +212 -0
  59. package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/antigravity.mjs +169 -0
  60. package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/harness_payload.mjs +103 -0
  61. package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/opencode_plugin.mjs +341 -0
  62. package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/opencode_user_config_sync.mjs +177 -0
  63. package/.opencode/mednotes/scripts/hooks/mednotes_hook/anki_preflight.mjs +214 -0
  64. package/.opencode/mednotes/scripts/hooks/mednotes_hook/cli.mjs +143 -0
  65. package/.opencode/mednotes/scripts/hooks/mednotes_hook/diagnostics.mjs +11 -0
  66. package/.opencode/mednotes/scripts/hooks/mednotes_hook/domain/agent_directive_core.mjs +160 -0
  67. package/.opencode/mednotes/scripts/hooks/mednotes_hook/fsm_directive.mjs +1470 -0
  68. package/.opencode/mednotes/scripts/hooks/mednotes_hook/hook_errors.mjs +120 -0
  69. package/.opencode/mednotes/scripts/hooks/mednotes_hook/retention.mjs +114 -0
  70. package/.opencode/mednotes/scripts/hooks/mednotes_hook/runtime.mjs +174 -0
  71. package/.opencode/mednotes/scripts/hooks/mednotes_hook/telemetry_capture.mjs +511 -0
  72. package/.opencode/mednotes/scripts/hooks/mednotes_hook/vault_guard.mjs +624 -0
  73. package/.opencode/mednotes/scripts/hooks/mednotes_hook.mjs +5 -0
  74. package/.opencode/mednotes/scripts/mednotes/_runtime_paths.py +24 -0
  75. package/.opencode/mednotes/scripts/mednotes/anki_model_validator.py +18 -0
  76. package/.opencode/mednotes/scripts/mednotes/capture_extension_diff.py +1562 -0
  77. package/.opencode/mednotes/scripts/mednotes/feedback_report.py +16 -0
  78. package/.opencode/mednotes/scripts/mednotes/flashcard_index.py +18 -0
  79. package/.opencode/mednotes/scripts/mednotes/flashcard_pipeline.py +18 -0
  80. package/.opencode/mednotes/scripts/mednotes/flashcard_report.py +18 -0
  81. package/.opencode/mednotes/scripts/mednotes/flashcard_sources.py +18 -0
  82. package/.opencode/mednotes/scripts/mednotes/obsidian/README.md +6 -0
  83. package/.opencode/mednotes/scripts/mednotes/obsidian_note_utils.py +20 -0
  84. package/.opencode/mednotes/scripts/mednotes/pdf_library/cli.py +16 -0
  85. package/.opencode/mednotes/scripts/mednotes/project_fsm.py +229 -0
  86. package/.opencode/mednotes/scripts/mednotes/setup_telemetry_email.py +404 -0
  87. package/.opencode/mednotes/scripts/mednotes/sync_anki_twenty_rules.py +18 -0
  88. package/.opencode/mednotes/scripts/mednotes/sync_opencode_user_config.py +36 -0
  89. package/.opencode/mednotes/scripts/mednotes/wiki/cli.py +20 -0
  90. package/.opencode/mednotes/scripts/mednotes/wiki_graph.py +18 -0
  91. package/.opencode/mednotes/scripts/mednotes/wiki_tree.py +134 -0
  92. package/.opencode/mednotes/scripts/reset_windows_python_uv.ps1 +625 -0
  93. package/.opencode/mednotes/scripts/run_python.mjs +109 -0
  94. package/.opencode/mednotes/scripts/vault/vault_commit.ps1 +19 -0
  95. package/.opencode/mednotes/scripts/vault/vault_commit.sh +18 -0
  96. package/.opencode/mednotes/scripts/vault/vault_git.ps1 +19 -0
  97. package/.opencode/mednotes/scripts/vault/vault_git.py +3107 -0
  98. package/.opencode/mednotes/scripts/vault/vault_git.sh +18 -0
  99. package/.opencode/mednotes/scripts/vault/vault_precommit.ps1 +19 -0
  100. package/.opencode/mednotes/scripts/vault/vault_precommit.sh +18 -0
  101. package/.opencode/mednotes/skills/THIRD_PARTY_NOTICES.md +45 -0
  102. package/.opencode/mednotes/skills/create-medical-flashcards/SKILL.md +113 -0
  103. package/.opencode/mednotes/skills/create-medical-note/SKILL.md +90 -0
  104. package/.opencode/mednotes/skills/enrich-medical-note/SKILL.md +120 -0
  105. package/.opencode/mednotes/skills/fix-medical-wiki/SKILL.md +559 -0
  106. package/.opencode/mednotes/skills/link-medical-wiki/SKILL.md +224 -0
  107. package/.opencode/mednotes/skills/obsidian-cli/SKILL.md +118 -0
  108. package/.opencode/mednotes/skills/obsidian-markdown/SKILL.md +207 -0
  109. package/.opencode/mednotes/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
  110. package/.opencode/mednotes/skills/obsidian-markdown/references/EMBEDS.md +63 -0
  111. package/.opencode/mednotes/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
  112. package/.opencode/mednotes/skills/obsidian-ops/SKILL.md +136 -0
  113. package/.opencode/mednotes/skills/pdf-library/SKILL.md +45 -0
  114. package/.opencode/mednotes/skills/process-medical-chats/SKILL.md +246 -0
  115. package/.opencode/mednotes/skills/workflow-report/SKILL.md +100 -0
  116. package/.opencode/mednotes/src/mednotes/__init__.py +5 -0
  117. package/.opencode/mednotes/src/mednotes/domains/__init__.py +5 -0
  118. package/.opencode/mednotes/src/mednotes/domains/flashcards/README.md +26 -0
  119. package/.opencode/mednotes/src/mednotes/domains/flashcards/__init__.py +2 -0
  120. package/.opencode/mednotes/src/mednotes/domains/flashcards/build_demo_apkg.py +177 -0
  121. package/.opencode/mednotes/src/mednotes/domains/flashcards/contracts.py +385 -0
  122. package/.opencode/mednotes/src/mednotes/domains/flashcards/flashcards_machine.py +522 -0
  123. package/.opencode/mednotes/src/mednotes/domains/flashcards/fsm.py +817 -0
  124. package/.opencode/mednotes/src/mednotes/domains/flashcards/index.py +630 -0
  125. package/.opencode/mednotes/src/mednotes/domains/flashcards/install_models.py +445 -0
  126. package/.opencode/mednotes/src/mednotes/domains/flashcards/model.py +359 -0
  127. package/.opencode/mednotes/src/mednotes/domains/flashcards/obsidian_links.py +135 -0
  128. package/.opencode/mednotes/src/mednotes/domains/flashcards/obsidian_note_utils.py +546 -0
  129. package/.opencode/mednotes/src/mednotes/domains/flashcards/pipeline.py +580 -0
  130. package/.opencode/mednotes/src/mednotes/domains/flashcards/report.py +510 -0
  131. package/.opencode/mednotes/src/mednotes/domains/flashcards/sources.py +682 -0
  132. package/.opencode/mednotes/src/mednotes/domains/flashcards/sync_rules.py +184 -0
  133. package/.opencode/mednotes/src/mednotes/domains/history/__init__.py +1 -0
  134. package/.opencode/mednotes/src/mednotes/domains/history/history_fsm.py +852 -0
  135. package/.opencode/mednotes/src/mednotes/domains/history/history_machine.py +453 -0
  136. package/.opencode/mednotes/src/mednotes/domains/setup/__init__.py +7 -0
  137. package/.opencode/mednotes/src/mednotes/domains/setup/setup_fsm.py +808 -0
  138. package/.opencode/mednotes/src/mednotes/domains/setup/setup_machine.py +973 -0
  139. package/.opencode/mednotes/src/mednotes/domains/wiki/README.md +64 -0
  140. package/.opencode/mednotes/src/mednotes/domains/wiki/__init__.py +1 -0
  141. package/.opencode/mednotes/src/mednotes/domains/wiki/api.py +668 -0
  142. package/.opencode/mednotes/src/mednotes/domains/wiki/batch_state.py +102 -0
  143. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/__init__.py +1 -0
  144. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/atomicity/__init__.py +1 -0
  145. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/atomicity/atomicity.py +877 -0
  146. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/body_link/__init__.py +1 -0
  147. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/body_link/body_linker.py +1562 -0
  148. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/__init__.py +1 -0
  149. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/effect_adapters.py +949 -0
  150. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/fix_wiki_runtime_adapters.py +433 -0
  151. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/__init__.py +1 -0
  152. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/coverage.py +413 -0
  153. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/graph.py +396 -0
  154. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/graph_fixes.py +161 -0
  155. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/hygiene/__init__.py +1 -0
  156. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/hygiene/hygiene.py +483 -0
  157. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/__init__.py +2 -0
  158. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/anchors.py +185 -0
  159. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/__init__.py +0 -0
  160. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/cache.py +223 -0
  161. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/config.py +131 -0
  162. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/download.py +224 -0
  163. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/frontmatter.py +59 -0
  164. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/insert.py +227 -0
  165. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/local_import.py +54 -0
  166. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/__init__.py +42 -0
  167. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/web_profiles.py +99 -0
  168. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/web_search.py +203 -0
  169. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/wikimedia.py +102 -0
  170. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/__init__.py +1 -0
  171. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_db_adapter.mjs +434 -0
  172. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_node_runtime.py +274 -0
  173. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_query.py +227 -0
  174. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/__init__.py +1 -0
  175. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/artifacts.py +605 -0
  176. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/canonical_merge.py +277 -0
  177. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/markdown_zones.py +85 -0
  178. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/meaning_planner.py +307 -0
  179. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_iter.py +67 -0
  180. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_merge.py +278 -0
  181. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_plan.py +409 -0
  182. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_policy.py +22 -0
  183. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/__init__.py +79 -0
  184. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/fixes.py +264 -0
  185. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/frontmatter.py +435 -0
  186. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/models.py +208 -0
  187. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/prompts.py +37 -0
  188. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/tables.py +236 -0
  189. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/validate.py +404 -0
  190. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/provenance.py +478 -0
  191. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/raw_chats.py +273 -0
  192. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/sources_backfill.py +235 -0
  193. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/__init__.py +10 -0
  194. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/anchors.py +16 -0
  195. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/captions.py +47 -0
  196. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/cli.py +179 -0
  197. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/cloud.py +52 -0
  198. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/config.py +196 -0
  199. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/context_packets.py +76 -0
  200. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/db.py +81 -0
  201. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/doctor.py +102 -0
  202. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/figure_ids.py +42 -0
  203. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/ingest.py +326 -0
  204. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/insert.py +316 -0
  205. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/mentions.py +57 -0
  206. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/ocr.py +71 -0
  207. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/paths.py +35 -0
  208. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/pdf_engine.py +77 -0
  209. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/schema.py +155 -0
  210. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/search.py +188 -0
  211. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/__init__.py +1 -0
  212. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/app.py +89 -0
  213. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/image_backend.py +29 -0
  214. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/state.py +65 -0
  215. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/__init__.py +1 -0
  216. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish.py +1139 -0
  217. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish_receipts.py +365 -0
  218. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish_recovery.py +240 -0
  219. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/__init__.py +1 -0
  220. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_behavior_corpus.py +2069 -0
  221. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_report_validation.py +4448 -0
  222. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_run_audit.py +852 -0
  223. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/architect_prompt_eval.py +341 -0
  224. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/body_linker_eval.py +240 -0
  225. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/curator_output_validation.py +175 -0
  226. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/curator_prompt_eval.py +865 -0
  227. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/triager_prompt_eval.py +1295 -0
  228. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/__init__.py +1 -0
  229. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/related_notes.py +1920 -0
  230. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/related_notes_headless.py +1186 -0
  231. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/__init__.py +1 -0
  232. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/plan_attestation.py +148 -0
  233. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_receipts.py +360 -0
  234. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_runtime.py +52 -0
  235. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_task_runner.py +2470 -0
  236. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/style/__init__.py +1 -0
  237. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/style/style.py +1952 -0
  238. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/subagents/__init__.py +1 -0
  239. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/subagents/agents.py +1767 -0
  240. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/__init__.py +1 -0
  241. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/alias_projection.py +331 -0
  242. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/link_terms.py +151 -0
  243. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/llm_disambiguation.py +182 -0
  244. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/__init__.py +116 -0
  245. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/audit.py +201 -0
  246. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/migration.py +314 -0
  247. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/normalize.py +72 -0
  248. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/policy.py +135 -0
  249. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/resolve.py +413 -0
  250. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/schema.py +157 -0
  251. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/status.py +137 -0
  252. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_bootstrap.py +509 -0
  253. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_curator_batch.py +1115 -0
  254. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_ingestion.py +632 -0
  255. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_map.py +930 -0
  256. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_recovery.py +1388 -0
  257. package/.opencode/mednotes/src/mednotes/domains/wiki/cli.py +6665 -0
  258. package/.opencode/mednotes/src/mednotes/domains/wiki/common.py +69 -0
  259. package/.opencode/mednotes/src/mednotes/domains/wiki/config.py +210 -0
  260. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/__init__.py +74 -0
  261. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agent_report.py +242 -0
  262. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agent_run_audit.py +196 -0
  263. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agents.py +601 -0
  264. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/curator.py +256 -0
  265. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/effect_payloads.py +519 -0
  266. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/happy_path.py +190 -0
  267. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/link_git.py +110 -0
  268. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/link_runtime_artifact.py +52 -0
  269. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/note_plan.py +75 -0
  270. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/paths.py +114 -0
  271. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/public_report.py +53 -0
  272. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/publish.py +111 -0
  273. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/raw_coverage.py +217 -0
  274. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes.py +136 -0
  275. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes_headless.py +153 -0
  276. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes_runtime.py +395 -0
  277. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/schema_registry.py +637 -0
  278. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/specialist.py +432 -0
  279. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/status.py +62 -0
  280. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/style_rewrite.py +568 -0
  281. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/vocabulary_ingestion.py +223 -0
  282. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_blockers.py +510 -0
  283. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_guardrails.py +637 -0
  284. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_outcomes.py +121 -0
  285. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_receipts.py +100 -0
  286. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/__init__.py +1 -0
  287. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/__init__.py +1 -0
  288. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/__main__.py +4 -0
  289. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/cli.py +275 -0
  290. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/__init__.py +2 -0
  291. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/candidates.py +193 -0
  292. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/cli.py +189 -0
  293. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/gemini.py +220 -0
  294. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/inputs.py +120 -0
  295. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/models.py +34 -0
  296. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/parsing.py +48 -0
  297. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/prompts.py +216 -0
  298. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/quality.py +54 -0
  299. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/reporting.py +24 -0
  300. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/runner.py +433 -0
  301. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/utils.py +39 -0
  302. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/vault_guard_bridge.py +17 -0
  303. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/__init__.py +1 -0
  304. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_context_packets.py +454 -0
  305. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_decision_projection.py +133 -0
  306. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_effects.py +1260 -0
  307. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_fsm.py +2768 -0
  308. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_machine.py +1588 -0
  309. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_plan.py +306 -0
  310. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_primary_objective.py +316 -0
  311. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_problem.py +153 -0
  312. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_receipt_evidence.py +306 -0
  313. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_states.py +290 -0
  314. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_user_report.py +342 -0
  315. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/health.py +6332 -0
  316. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/__init__.py +1 -0
  317. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_fsm.py +1119 -0
  318. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_git.py +638 -0
  319. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_machine.py +1106 -0
  320. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_retry_governance.py +374 -0
  321. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_runtime_result.py +485 -0
  322. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_triggers.py +183 -0
  323. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/linking.py +2758 -0
  324. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/reference_repair.py +718 -0
  325. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/related_notes_fsm.py +1855 -0
  326. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link_related/__init__.py +1 -0
  327. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link_related/link_related_machine.py +834 -0
  328. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/__init__.py +1 -0
  329. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_fsm.py +1592 -0
  330. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_machine.py +3097 -0
  331. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_primary_objective.py +28 -0
  332. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_runtime_result.py +185 -0
  333. package/.opencode/mednotes/src/mednotes/domains/wiki/performance.py +97 -0
  334. package/.opencode/mednotes/src/mednotes/kernel/__init__.py +6 -0
  335. package/.opencode/mednotes/src/mednotes/kernel/agent_directive.py +336 -0
  336. package/.opencode/mednotes/src/mednotes/kernel/base.py +51 -0
  337. package/.opencode/mednotes/src/mednotes/kernel/blockers.py +39 -0
  338. package/.opencode/mednotes/src/mednotes/kernel/effect_executor.py +55 -0
  339. package/.opencode/mednotes/src/mednotes/kernel/effect_intent.py +69 -0
  340. package/.opencode/mednotes/src/mednotes/kernel/effects.py +160 -0
  341. package/.opencode/mednotes/src/mednotes/kernel/errors.py +38 -0
  342. package/.opencode/mednotes/src/mednotes/kernel/fsm_event.py +35 -0
  343. package/.opencode/mednotes/src/mednotes/kernel/fsm_model.py +55 -0
  344. package/.opencode/mednotes/src/mednotes/kernel/fsm_transition_result.py +75 -0
  345. package/.opencode/mednotes/src/mednotes/kernel/guardrails.py +188 -0
  346. package/.opencode/mednotes/src/mednotes/kernel/progress.py +319 -0
  347. package/.opencode/mednotes/src/mednotes/kernel/public_report.py +346 -0
  348. package/.opencode/mednotes/src/mednotes/kernel/state_machine.py +164 -0
  349. package/.opencode/mednotes/src/mednotes/kernel/workflow.py +619 -0
  350. package/.opencode/mednotes/src/mednotes/platform/__init__.py +5 -0
  351. package/.opencode/mednotes/src/mednotes/platform/backup_policy.py +382 -0
  352. package/.opencode/mednotes/src/mednotes/platform/feedback/__init__.py +62 -0
  353. package/.opencode/mednotes/src/mednotes/platform/feedback/cli.py +275 -0
  354. package/.opencode/mednotes/src/mednotes/platform/feedback/contracts.py +83 -0
  355. package/.opencode/mednotes/src/mednotes/platform/feedback/core.py +4168 -0
  356. package/.opencode/mednotes/src/mednotes/platform/feedback/integrity.py +989 -0
  357. package/.opencode/mednotes/src/mednotes/platform/feedback/operational_contract.py +2293 -0
  358. package/.opencode/mednotes/src/mednotes/platform/feedback/telemetry.py +875 -0
  359. package/.opencode/mednotes/src/mednotes/platform/feedback/telemetry_config.py +65 -0
  360. package/.opencode/mednotes/src/mednotes/platform/opencode_runtime_config.py +182 -0
  361. package/.opencode/mednotes/src/mednotes/platform/paths/__init__.py +1560 -0
  362. package/.opencode/mednotes/src/mednotes/platform/secrets.py +89 -0
  363. package/.opencode/mednotes/src/mednotes/platform/user_config.py +103 -0
  364. package/.opencode/mednotes/src/mednotes/platform/vault_guard.py +214 -0
  365. package/.opencode/mednotes/uv.lock +932 -0
  366. package/.opencode/mednotes.generated.json +395 -0
  367. package/.opencode/opencode.json +31 -0
  368. package/.opencode/plugins/mednotes-fsm.mjs +7 -0
  369. package/.opencode/plugins/mednotes_hook/adapters/antigravity.mjs +169 -0
  370. package/.opencode/plugins/mednotes_hook/adapters/harness_payload.mjs +103 -0
  371. package/.opencode/plugins/mednotes_hook/adapters/opencode_plugin.mjs +341 -0
  372. package/.opencode/plugins/mednotes_hook/adapters/opencode_user_config_sync.mjs +177 -0
  373. package/.opencode/plugins/mednotes_hook/anki_preflight.mjs +214 -0
  374. package/.opencode/plugins/mednotes_hook/cli.mjs +143 -0
  375. package/.opencode/plugins/mednotes_hook/diagnostics.mjs +11 -0
  376. package/.opencode/plugins/mednotes_hook/domain/agent_directive_core.mjs +160 -0
  377. package/.opencode/plugins/mednotes_hook/fsm_directive.mjs +1470 -0
  378. package/.opencode/plugins/mednotes_hook/hook_errors.mjs +120 -0
  379. package/.opencode/plugins/mednotes_hook/retention.mjs +114 -0
  380. package/.opencode/plugins/mednotes_hook/runtime.mjs +174 -0
  381. package/.opencode/plugins/mednotes_hook/telemetry_capture.mjs +511 -0
  382. package/.opencode/plugins/mednotes_hook/vault_guard.mjs +624 -0
  383. package/AGENTS.md +57 -0
  384. package/README.md +194 -0
  385. package/adapters/antigravity/agents.json +80 -0
  386. package/adapters/antigravity/templates/med-chat-triager.md +214 -0
  387. package/adapters/antigravity/templates/med-flashcard-maker.md +72 -0
  388. package/adapters/antigravity/templates/med-knowledge-architect.md +241 -0
  389. package/adapters/antigravity/templates/med-link-graph-curator.md +187 -0
  390. package/adapters/antigravity/templates/med-publish-guard.md +71 -0
  391. package/adapters/gemini-cli/gemini-extension.json +14 -0
  392. package/adapters/gemini-cli/package.json +15 -0
  393. package/adapters/gemini-cli/pyproject.toml +48 -0
  394. package/bin/mednotes-opencode.mjs +155 -0
  395. package/contracts/agents.json +116 -0
  396. package/core/agents/med-chat-triager.md +197 -0
  397. package/core/agents/med-flashcard-maker.md +56 -0
  398. package/core/agents/med-knowledge-architect.md +224 -0
  399. package/core/agents/med-link-graph-curator.md +171 -0
  400. package/core/agents/med-publish-guard.md +55 -0
  401. package/core/commands/flashcards.toml +22 -0
  402. package/core/commands/mednotes/create.toml +22 -0
  403. package/core/commands/mednotes/enrich.toml +24 -0
  404. package/core/commands/mednotes/fix-wiki.toml +24 -0
  405. package/core/commands/mednotes/history.toml +19 -0
  406. package/core/commands/mednotes/link-body.toml +22 -0
  407. package/core/commands/mednotes/link-related.toml +24 -0
  408. package/core/commands/mednotes/link.toml +24 -0
  409. package/core/commands/mednotes/pdf-library.toml +24 -0
  410. package/core/commands/mednotes/process-chats.toml +20 -0
  411. package/core/commands/mednotes/setup.toml +18 -0
  412. package/core/commands/mednotes/status.toml +24 -0
  413. package/core/commands/mednotes/telemetry.toml +24 -0
  414. package/core/commands/report.toml +23 -0
  415. package/core/skills/THIRD_PARTY_NOTICES.md +45 -0
  416. package/core/skills/create-medical-flashcards/SKILL.md +113 -0
  417. package/core/skills/create-medical-note/SKILL.md +90 -0
  418. package/core/skills/enrich-medical-note/SKILL.md +120 -0
  419. package/core/skills/fix-medical-wiki/SKILL.md +559 -0
  420. package/core/skills/link-medical-wiki/SKILL.md +224 -0
  421. package/core/skills/obsidian-cli/SKILL.md +118 -0
  422. package/core/skills/obsidian-markdown/SKILL.md +207 -0
  423. package/core/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
  424. package/core/skills/obsidian-markdown/references/EMBEDS.md +63 -0
  425. package/core/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
  426. package/core/skills/obsidian-ops/SKILL.md +136 -0
  427. package/core/skills/pdf-library/SKILL.md +45 -0
  428. package/core/skills/process-medical-chats/SKILL.md +246 -0
  429. package/core/skills/workflow-report/SKILL.md +100 -0
  430. package/package.json +45 -0
@@ -0,0 +1,559 @@
1
+ ---
2
+ name: fix-medical-wiki
3
+ description: Fix-wiki para taxonomia, estilo, grafo. Use com /mednotes:fix-wiki.
4
+ ---
5
+
6
+ # Skill: fix-medical-wiki
7
+
8
+ `${extensionPath}` é a raiz da extensão/plugin ativo. Se a skill vier de
9
+ `~/.gemini/config/skills/fix-medical-wiki` ou de contexto stale, pare,
10
+ recarregue `${extensionPath}/skills/fix-medical-wiki/SKILL.md` e use só esse
11
+ root. Não chame `read_file` em `${extensionPath}/docs/workflow-output-contract.md` só para responder.
12
+
13
+ `Wiki_Medicina`: estilo, YAML, grafo, taxonomia.
14
+
15
+ ## Pré-vôo (Hard Stops antes de qualquer comando)
16
+
17
+ Responda sempre em português do Brasil, inclusive avisos intermediários.
18
+ Releia `${extensionPath}/docs/agent-prompt-hardening.md` antes.
19
+ `/mednotes:fix-wiki` é o workflow mais arriscado: chama linker, curator
20
+ batch, taxonomy migration e style rewrite. Stop rules específicas:
21
+
22
+ - C23 FSM_POLICY_BOUNDARY:
23
+ Adapter detecta fato. FSM decide política. CLI executa efeito.
24
+ Sem WorkflowEffect emitido pela FSM, não existe recovery automático.
25
+ blocked_reason, next_action, status e operation_payload não autorizam retry/recovery/apply.
26
+ - C22 AGY_APPLY_NO_DISCOVERY: no AGY, depois de carregar esta skill e
27
+ `obsidian-ops`, o próximo tool call em `--apply` deve abrir a proteção do
28
+ vault com `<plugin-root>/scripts/vault/vault_git.py run-start`. Não use
29
+ `grep_search`, `list_permissions`, `list_dir`, `list_directory`, `ls`,
30
+ `echo` ou `--help` para confirmar scripts, permissões ou plugin root; o
31
+ `<plugin-root>` já é o diretório desta skill.
32
+ - C18 HARD_STOP_DECISION: `decision.kind=ask_human` ou
33
+ `human_decision_packet` pendente em qualquer payload canônico é HARD STOP.
34
+ Mostre a pergunta/opções em pt-BR e pare; não continue recovery, reindex,
35
+ curadoria, plan-subagents ou apply sem resposta humana.
36
+ - C15 EVAL_TERMINAL: `eval-curator-batch` ou `eval-triager-output` em
37
+ `needs_review` = regenerar outputs ou ajustar prompt; nunca editar o JSON
38
+ de avaliação.
39
+ - C16 NO_EVAL_BYPASS_IN_PUBLIC: `--skip-prompt-eval` é dev-escape; nunca em
40
+ fluxo público.
41
+ - C14 NO_PARENT_SCHEMA: pai NÃO escreve `note-semantic-ingestion.v1`. Use
42
+ `plan-subagents --phase vocabulary-curation`, lance
43
+ `med-link-graph-curator` por `work_item`, colete via
44
+ `collect-curator-outputs`.
45
+ - C13 OFFICIAL_ROUTE_ONLY: `related-notes-sync --recover-export` é a única
46
+ rota de recuperação do export Related Notes. Ela pode acionar Obsidian CLI ou
47
+ fallback headless; sem `agent_directive.control.effects`, reporte e pare.
48
+ - C12 NEXT_ACTION_NOT_AUTHZ: `next_action` é orientação. Continue só com
49
+ `agent_directive.control.status=waiting_agent`,
50
+ `agent_directive.control.capabilities.continue=true`, efeitos executáveis
51
+ e pedido original permitindo continuar.
52
+ Se `agent_directive.control.status=waiting_agent`, não finalize o guard e não responda
53
+ ainda; execute ou bloqueie explicitamente essa continuação primeiro.
54
+ - C17 GAP_IS_STOP: `contract_gap.missing_next_action` = reportar e parar;
55
+ sem workarounds.
56
+ - C19 INSTALLED_BUNDLE_IMMUTABLE: não edite o bundle instalado em
57
+ `~/.gemini/extensions`, `~/.gemini/config/plugins`, `C:\Users\<usuario>\.gemini\extensions`
58
+ ou `C:\Users\<usuario>\.gemini\config\plugins`. Reporte
59
+ `installed_extension_runtime_edit_forbidden`, aponte o fonte em `bundle/`
60
+ e pare; correção real exige rebuild/reinstall oficial.
61
+ - C20 LAYERED_STATUS_REQUIRED: responda sempre com estado em camadas
62
+ (ambiente Python, índice Markdown, proteção do vault, linker, Related Notes,
63
+ cota/especialista). Um layer verde não torna o workflow concluído. Mostre um
64
+ bloqueio atual e uma próxima ação.
65
+ - C21 PACKAGED_SPECIALIST_AGENT: não fabrique prompt curto para
66
+ `med-knowledge-architect`. Para `style_rewrite`, consuma o efeito
67
+ `call_specialist_model` e seu `current_batch_items`. No AGY, leia
68
+ `agents/med-knowledge-architect.md`,
69
+ chame `define_subagent`, invoque exatamente um item tipado por vez com
70
+ `Prompt` igual ao JSON do `current_batch_item` e finalize a evidência com
71
+ `finalize-agy-specialist-task` para gerar recibo validável;
72
+ no OpenCode, use a tool `task` somente no harness OpenCode, com um único
73
+ work item tipado dentro de JSON raiz contendo somente `current_batch_items`,
74
+ e finalize com `uv run python
75
+ bundle/scripts/mednotes/wiki/cli.py finalize-opencode-specialist-task`
76
+ sem `--task-metadata` manual; o hook prova provider/modelo por `work_id`;
77
+ não recrie `agent.json`; não envie conteúdo clínico por `send_message`. Sem
78
+ capacidade/modelo/evidência no runtime, bloqueie
79
+ `specialist_agent_runtime_unavailable`, `agy_specialist_model_evidence_missing`
80
+ ou `specialist_model_quota_exhausted`.
81
+
82
+ UX pública: use `${extensionPath}/docs/public-vocabulary.md`; não exponha
83
+ `uv`, `--dry-run`, `manifest`, `hash`, `SQLite`, `needs_review`,
84
+ `skip-prompt-eval` ou nomes de subagent por padrão.
85
+ Resposta pública padrão: use `reports.public_report.lines` quando existir e
86
+ não exponha comandos literais, flags, schemas, recibos, hashes, paths internos,
87
+ `run_id` nem nomes de campos. Detalhes técnicos ficam no canal agente/debug ou
88
+ laboratório. Decisão humana aparece como pergunta, opções fechadas, item
89
+ afetado e retomada em linguagem humana.
90
+
91
+ ## Fonte canônica
92
+
93
+ - Estilo: `${extensionPath}/docs/knowledge-architect.md`.
94
+ - Grafo/linker: `${extensionPath}/docs/semantic-linker.md`.
95
+ - CLI pública: `${extensionPath}/scripts/mednotes/wiki/cli.py`; domínio em `wiki.*`.
96
+ - Taxonomia: `wiki.health` e `wiki.taxonomy.migration`.
97
+ - Links: /mednotes:fix-wiki não implementa grafo; chama /mednotes:link.
98
+ - Reescrita/merge LLM: `med-knowledge-architect` só com pedido da CLI.
99
+
100
+ ## Contrato de mudança do modelo de nota
101
+
102
+ Mudança no modelo exige `/mednotes:process-chats` novo e `/mednotes:fix-wiki`
103
+ retroativo. Novo `StyleIssue` entra em
104
+ `wiki.note_style.NOTE_MODEL_ISSUE_COVERAGE`; sem rota retroativa, bloqueie.
105
+ `didactic_visual_opportunity` em nota existente vira `style-rewrite`; regra em
106
+ `${extensionPath}/docs/knowledge-architect.md`, nunca saúde verde.
107
+ Notas geradas de vídeo, aula, livro, artigo ou outra fonte não-chat continuam
108
+ notas normais da Wiki. Preserve `source`, `sources` e `source_*`; não trate a
109
+ ausência de `chats[]` como problema quando a nota já documenta fonte não-chat.
110
+
111
+ ## Fluxo
112
+
113
+ 1. Use sempre o `${extensionPath}` carregado. Execute CLI por
114
+ `node "${extensionPath}/scripts/run_python.mjs" "${extensionPath}/scripts/mednotes/wiki/cli.py" ...`.
115
+ Cada `run_shell_command` deve conter um único comando completo; não crie
116
+ variável de shell como `EXT_PATH`, não use `export`, não envie script
117
+ multiline e não encadeie comandos.
118
+ No AGY, para comandos oficiais longos (`fix-wiki --apply`,
119
+ `finalize-agy-specialist-task` e `apply-specialist-style-rewrite`), use
120
+ `WaitMsBeforeAsync=120000` para receber o JSON direto da tool em vez de cair
121
+ em task log/background. Para `run-start` e
122
+ `run-finish`, use `WaitMsBeforeAsync=30000`. Se o AGY ainda mover para
123
+ segundo plano, não use `schedule`/timer e não descubra logs: leia
124
+ imediatamente somente o task log indicado pela própria tool como fallback
125
+ oficial, parseie o JSON final desse log e, se precisar mencionar isso ao
126
+ usuário, diga em linguagem humana que você leu o log indicado pela
127
+ ferramenta. Não use rótulo técnico literal para esse fallback.
128
+ `run-finish` deve usar o
129
+ same plugin root as run-start:
130
+ `${extensionPath}/scripts/vault/vault_git.py`; qualquer caminho como
131
+ `~/.gemini/config/plugins/vault/vault_git.py` ou
132
+ `config/plugins/vault/vault_git.py` está errado e não deve ser executado.
133
+ Não invente variantes como `dist/gemini-cli-experiment`, não use
134
+ `bundle/scripts/...` relativo ao cwd. Do not execute `cli.py` directly.
135
+ Do not set/export `UV_PROJECT_ENVIRONMENT`.
136
+ No preparatory shell probes before explicit `fix-wiki --dry-run`: deve ser
137
+ o primeiro shell command, salvo pedido do JSON fresco. Se stdout truncar, leia artefatos
138
+ oficiais; não repita o mesmo `fix-wiki --dry-run --json` e não redirecione stdout do workflow para scratch.
139
+ Do not self-debug `uv run` failures: se houver erro de `uv`, Python, venv,
140
+ import, path ou PowerShell, feche o guard se aberto, reporte
141
+ `environment_blocker.windows_path_or_venv`, aponte `/mednotes:setup` e pare.
142
+ Não conserte com `env`, `pip list`, `read_file`, direct venv Python ou
143
+ `PYTHONPATH`.
144
+ Se o usuário já pediu continuidade e `/mednotes:setup`/rebuild resolver
145
+ pendência determinística, retome o workflow quando o payload fresco trouxer
146
+ `agent_directive.control.effects` sem decisão humana.
147
+ 2. Pedido explícito com `--apply` não é dry-run: abra proteção com
148
+ `node "${extensionPath}/scripts/run_python.mjs" "${extensionPath}/scripts/vault/vault_git.py" run-start --agent gemini-cli --workflow /mednotes:fix-wiki --json`;
149
+ aguarde o `tool_result` do `run-start`, leia `run_id` não vazio e só então execute
150
+ `node "${extensionPath}/scripts/run_python.mjs" "${extensionPath}/scripts/mednotes/wiki/cli.py" fix-wiki --apply --json`.
151
+ Não envie `run-start` e `fix-wiki --apply` no mesmo lote. Examine o JSON
152
+ fresco antes de fechar o guard. Se houver
153
+ `agent_directive.control.status=waiting_agent`,
154
+ `agent_directive.control.capabilities.continue=true`,
155
+ `agent_directive.control.capabilities.final_report=false` e
156
+ `agent_directive.control.effects`, execute a fase indicada no mesmo guard
157
+ antes de responder ou rodar `run-finish`. Feche com
158
+ `node "${extensionPath}/scripts/run_python.mjs" "${extensionPath}/scripts/vault/vault_git.py" run-finish --agent gemini-cli --workflow /mednotes:fix-wiki --run-id <run_id> --title "Reparo da Wiki_Medicina" --public-json --json`.
159
+ Copie o `run_id` literal; `--run-id ""` e `run-finish` sem `--workflow` são
160
+ blockers. Não entre em Plan mode, não escreva plano `.md`, não peça
161
+ confirmação de estratégia. `tracker_create_task`/`tracker_update_task` não
162
+ são necessários neste fluxo; uso ou erro de tracker deve entrar como atrito
163
+ de UX, mas `update_topic` normal não é desvio do workflow. Não converta
164
+ `/mednotes:fix-wiki --apply` em dry-run.
165
+ Nota Markdown estritamente vazia na raiz da Wiki é higiene estrutural: o CLI
166
+ deve arquivar antes de style/taxonomia/grafo. Nota raiz com conteúdo
167
+ inválido entra na camada de reparo/aviso, não em taxonomia. Só trate nota
168
+ raiz como decisão humana de taxonomia quando ela já for uma nota Wiki válida.
169
+
170
+ Não rode `set-paths` como preflight genérico. Use só se o JSON fresco indicar
171
+ `wiki_dir` ou `raw_dir` vazio/inválido. Não edite `config.toml` manualmente;
172
+ para paths, use:
173
+
174
+ ```bash
175
+ node "${extensionPath}/scripts/run_python.mjs" "${extensionPath}/scripts/mednotes/wiki/cli.py" set-paths --wiki-dir "<Wiki_Medicina>" --raw-dir "<Chats_Raw>" --agent-repair --json
176
+ ```
177
+
178
+ Se retornar `path_conflict.requires_decision`, mostre o pacote e pare. Para
179
+ mojibake de template, use `repair-config-template --json`.
180
+
181
+ `--apply` usa a proteção do vault como rollback primário. `.bak` adjacente
182
+ de Markdown está aposentado e não deve ser criado. Taxonomia exige
183
+ confirmação extra por `taxonomy_plan_path` e `--apply-taxonomy`.
184
+ 3. Interprete `progress_view_model`, `state_machine_snapshot`, `decision`,
185
+ `receipt`, `reports`, `agent_directive`, blockers, rewrites, backups,
186
+ higiene e linker.
187
+ Não rode `root-hygiene-audit` dentro de `/mednotes:fix-wiki`; ele é
188
+ diagnóstico de `/mednotes:status` e polui o relatório da Wiki.
189
+ Se houver mutação, confira os artefatos de link em `artifacts`/`receipt`
190
+ e o status canônico em `agent_directive.control`. Se o grafo bloquear, continue
191
+ dentro do fluxo público de `fix-wiki`, mas chame apenas os comandos oficiais
192
+ de `/mednotes:link`; não implemente reparo privado de grafo.
193
+ `requires_llm_rewrite` não pula linker: em `--apply`, aplique grafo/body
194
+ linker/Related Notes quando seguro. Se embeddings bloquear em recuperação
195
+ de Related Notes, continue antes de responder; sem plano
196
+ pronto, reporte o bloqueio. MarkdownDB não é gate global.
197
+ Related Notes estável exige export revalidado + prévia zero; senão continue
198
+ ou bloqueie.
199
+ Nunca remova `chats:` do YAML no bootstrap/reset de vocabulário ou estilo.
200
+ Em apply, `vocabulary_semantic_repair` resolve a fila simples antes do
201
+ linker. Se ainda houver `blocked_pending`, use o plano do link
202
+ (`vocabulary_curator_batch_plan_path`), lance `med-link-graph-curator` por
203
+ `work_items[]`, colete outputs via `collect-curator-outputs` e aplique o
204
+ lote como fase interna de `/mednotes:link`:
205
+
206
+ Se o payload fresco vier com
207
+ `agent_directive.control.status=waiting_agent` e efeitos executáveis,
208
+ isso não é bloqueio terminal:
209
+ continue somente por `agent_directive.control.effects[]`. Para
210
+ `call_specialist_model`, consuma
211
+ `agent_directive.control.effects[].payload.current_batch_items`; para
212
+ `run_subworkflow`, execute a sub-rotina indicada pelo próprio efeito e
213
+ valide o recibo retornado. Não repita `fix-wiki --dry-run` enquanto houver
214
+ efeito executável fresco. `continuation_steps` não é rota operacional.
215
+
216
+ ```bash
217
+ uv run python "<wiki/cli.py>" plan-subagents --phase vocabulary-curation --vocabulary-db <vocabulary.sqlite> --output <vocabulary-curator-batch-plan.json> --json
218
+ uv run python "<wiki/cli.py>" collect-curator-outputs --plan <vocabulary-curator-batch-plan.json> --manifest <manifest.json> --json
219
+ uv run python "<wiki/cli.py>" eval-curator-batch --plan <vocabulary-curator-batch-plan.json> --outputs <manifest.json> --report <curator-prompt-eval.json> --json
220
+ uv run python "<wiki/cli.py>" apply-curator-batch --plan <vocabulary-curator-batch-plan.json> --outputs <manifest.json> --prompt-eval <curator-prompt-eval.json> --receipt <receipt.json> --json
221
+ ```
222
+
223
+ Batch valida prompt eval, hashes, enum `atomic_status` e link nota->meaning;
224
+ escreve só no SQLite, marca itens e depois repete `/mednotes:link`.
225
+ Corpus de ouro: `init-curator-expectations`, 2+ asserções/item e
226
+ `--expectations <golden.json>` só no eval.
227
+ Não use `@generalist`: o agente pai é o único orquestrador; lance `med-link-graph-curator` diretamente por `work_items[]`.
228
+ 4. Com `write_error_count > 0`, trate como IO bloqueado: linker real fica
229
+ pendente por erro de escrita; peça liberar
230
+ iCloud/Obsidian/antivírus/processo antes de retentar.
231
+ 5. Continuação automática é proibida sem autorização explícita do payload. O
232
+ campo `next_action` é orientação para reportar ao usuário; ele não autoriza
233
+ execução. Repita ou avance só se `agent_directive.control.status=waiting_agent`,
234
+ `agent_directive.control.capabilities.continue=true`,
235
+ `agent_directive.control.effects` existir e o pedido original permitir
236
+ continuidade. Se não houver efeitos executáveis, `dry_run=true` ou
237
+ `human_decision_packet` pendente, mostre a pergunta/opções do pacote humano,
238
+ a ação de `decision.next_action`/`receipt.next_action` quando existir, e pare.
239
+ Pedido inicial com `--apply` autoriza somente a continuação automática
240
+ descrita por `agent_directive.control.effects` quando
241
+ `agent_directive.control.capabilities.continue=true`,
242
+ `capabilities.final_report=false` e não houver decisão humana; isso ainda
243
+ faz parte do mesmo workflow protegido. Sem efeito canônico executável, depois
244
+ de payload bloqueado só avance com nova confirmação explícita.
245
+ Para recuperação de Related Notes, aguarde retry, retome o índice parcial
246
+ e reexecute apply; sem dry-run ou edição manual.
247
+ 6. Só planeje reescrita LLM quando o payload fresco trouxer
248
+ `agent_directive.control.status=waiting_agent` com
249
+ `agent_directive.control.effects` para `style_rewrite`, sem decisão humana,
250
+ ou quando o usuário pedir continuidade depois de ver o bloqueio e o payload
251
+ não exigir decisão humana. Não planeje rewrite se o mesmo payload tiver
252
+ `human_decision_packet` pendente ou se faltar `agent_directive.control.effects`,
253
+ mesmo que `next_action` mencione uma rota técnica:
254
+
255
+ Use o `agent_directive.control.effects[].payload.current_batch_items` do JSON fresco. Antes de invocar
256
+ o subagente, garanta que
257
+ `agent_directive.control.effects[].payload.agent_workspace_requirements.required_workspace_dirs`
258
+ estão disponíveis no workspace do runtime/subagente. Se algum `temp_output` oficial
259
+ não for gravável, bloqueie como `agent_workspace_missing`; não use scratch,
260
+ `run_command`, Python inline, cópia paralela ou Markdown colado como workaround.
261
+ Se precisar
262
+ regenerar o plano técnico fora do apply principal, mantenha lote pequeno:
263
+
264
+ ```bash
265
+ uv run python "<wiki/cli.py>" plan-subagents --phase style-rewrite --max-concurrency 3 --limit 3 --temp-root <tmp-rewrites>
266
+ ```
267
+
268
+ Use exatamente um `med-knowledge-architect` por `current_batch_items[].target_path`.
269
+
270
+ ### Reescrita Especializada Por Harness
271
+
272
+ Quando `progress_view_model.status=waiting_external`,
273
+ `can_continue_now=false` ou não houver efeito canônico executável,
274
+ pare e reporte a pausa; não invoque subagente, não procure schema e não
275
+ tente fabricar recibo. Quando `progress_view_model.status=waiting_agent` e
276
+ `agent_directive.control.effects` trouxer `call_specialist_model`, continue
277
+ no harness atual:
278
+
279
+ - Gemini CLI: invoque o especialista empacotado com um único
280
+ `current_batch_item` do efeito `call_specialist_model` e aguarde o
281
+ `specialist-task-run-receipt.v1` validável.
282
+ - AGY: leia o template empacotado indicado pelo
283
+ `specialist_agent_invocation_contract.antigravity_cli`, use
284
+ `define_subagent` com o template completo, chame `invoke_subagent` com
285
+ `Prompt` igual ao JSON de um único `current_batch_item` tipado e finalize
286
+ com `finalize-agy-specialist-task` usando o transcript/task log oficial e
287
+ `--runtime-log` quando houver janela AGY settings switch.
288
+ - OpenCode: use `task` somente quando o harness atual for OpenCode.
289
+ O parent pode estar em Flash para orquestrar, mas a task especialista deve
290
+ receber JSON raiz contendo somente `current_batch_items` e provar modelo
291
+ especialista via metadata OpenCode; depois rode
292
+ `uv run python bundle/scripts/mednotes/wiki/cli.py
293
+ finalize-opencode-specialist-task --plan <plan> --work-id <work_id>
294
+ --json`, sem `--task-metadata` manual. Não exija OpenCode
295
+ quando o usuário estiver no Gemini CLI ou AGY; nao exija OpenCode
296
+ fora do harness OpenCode.
297
+
298
+ O especialista deve receber somente o work item tipado, paths oficiais,
299
+ hashes e `temp_output`. Não cole Markdown bruto nem raw chat no parent.
300
+ Depois que o especialista escrever `temp_output`, use somente o
301
+ `medical-notes-workbench.specialist-task-run-receipt.v1` atestado pela borda
302
+ oficial do Workbench. O parent não deve copiar, editar ou simular esse
303
+ recibo; no AGY, a criação permitida é via `finalize-agy-specialist-task`
304
+ com evidência de transcript/task log e runtime log quando houver settings
305
+ switch; no OpenCode, é via `finalize-opencode-specialist-task` com metadata
306
+ oficial da task. Se não
307
+ houver `receipt_attestation` válida, bloqueie como
308
+ `specialist_task_run_receipt_attestation_required`. Nunca use
309
+ `--gemini-binary`, script em scratch, mock ou backup manual de
310
+ `temp_output` para assinar saída de outro processo. Depois do recibo, use
311
+ `apply-specialist-style-rewrite --specialist-run-receipt` para finalizar,
312
+ coletar e aplicar o `work_id` em uma única chamada oficial; não divida
313
+ finalize/collect/apply em tool calls separadas. Depois de aplicar o lote,
314
+ rerode `/mednotes:fix-wiki` quando a fila estiver vazia e reporte qualidade
315
+ antes/depois do lote.
316
+
317
+ No AGY, o caminho padrão é o subagente empacotado do próprio AGY, não o
318
+ runner Gemini CLI. Nunca coloque duas notas no mesmo prompt de especialista;
319
+ faça uma chamada oficial por `work_id`, em série. O especialista escreve só no `temp_output` literal do
320
+ `work_item`; não substitua por `~/.gemini/tmp`, caminho inventado ou cópia
321
+ paralela. O pai não deve chamar `read_file` para colar a nota no prompt do
322
+ subagente; passe apenas os campos oficiais do `work_item` (`target_path`,
323
+ `rewrite_prompt`, `temp_output`, hashes/ids e o
324
+ `subagent_output_contract`) e deixe o subagente ler a nota dentro do escopo
325
+ dele. `output_attestation_path` é campo parent-only: o especialista não deve
326
+ criar, editar ou simular atestação. A rota deve respeitar
327
+ `model_policy=medical_specialist_authoring.v1`; Gemini usa o modelo
328
+ configurado no subagente, e runtimes com fallback precisam registrar um
329
+ modelo aceito pela política quando esse dado existir. Não invente
330
+ `actual_model`: a atestação do Workbench trata argumento do parent como
331
+ alegação não verificada. O caminho forte é o
332
+ `specialist-task-run-receipt.v1` atestado pelo runner. Sem runner Python,
333
+ siga os efeitos canônicos no harness atual. Só reporte
334
+ `specialist_model_capacity_unavailable` após
335
+ falha real do runtime/modelo; então bloqueie e feche o guard. Depois de
336
+ uma parada por quota, capacidade ou validação, a resposta pública final
337
+ deve ser humana e curta: não anexe bloco diagnóstico, JSON, XML, YAML,
338
+ campos internos, recibos, hashes ou caminhos locais. Detalhes técnicos
339
+ ficam no log/JSON de validação.
340
+ Depois de
341
+ aplicar um lote, não rode a conferência completa do `fix-wiki` se ainda há
342
+ reescritas pendentes; use `plan-subagents --phase style-rewrite` para montar
343
+ o próximo lote e deixe a verificação completa para quando a fila de
344
+ reescrita estiver vazia. Repetir o workflow inteiro entre lotes é bug de
345
+ performance/UX.
346
+ Para aplicação da reescrita, use sempre
347
+ `agent_directive.control.effects[].payload.plan_path` e
348
+ `agent_directive.control.effects[].payload.manifest_path`. Não use
349
+ `fix_wiki_plan_path`: esse é o
350
+ plano geral do workflow, não o plano `subagent-plan.v1` exigido pela rota
351
+ atômica.
352
+ 7. Aplicação atômica de cada rewrite:
353
+
354
+ ```bash
355
+ uv run python "<wiki/cli.py>" apply-specialist-style-rewrite --plan <style-rewrite-plan.json> --manifest <style-rewrite-manifest.json> --work-id <work_id> --specialist-run-receipt <specialist-task-run-receipt.json> --json
356
+ ```
357
+
358
+ O recibo do runner deve registrar o modelo realmente usado pelo especialista,
359
+ os hashes do pacote de entrada, output e transcript, e uma assinatura válida
360
+ do runner oficial; vazio, `unknown`, `auto`, Flash ou recibo sem evidência
361
+ operacional bloqueiam a aplicação. O apply real não aceita Markdown solto. A
362
+ rota atômica cria a atestação Workbench, coleta um manifest de item único e
363
+ aplica o rewrite validado. O plano também precisa vir de `plan-subagents` com
364
+ `subagent-plan-attestation.v1`; não copie, edite ou fabrique o JSON do
365
+ plano, porque a rota atômica bloqueia plano sem hash/assinatura oficial. Use
366
+ limite 2 tentativas por nota; aplique rewrites em série por `work_id`, um
367
+ comando por tool call. Depois de cada apply, leia o
368
+ `agent_directive` root do stdout compacto. Se
369
+ `agent_directive.control.effects` ainda trouxer trabalho especialista
370
+ executável, continue por `current_batch_items` sem reler plano/manifest e
371
+ sem rodar validação final. Se o lote acabou, reporte um checkpoint humano
372
+ com quantas notas foram corrigidas, quantas faltam, estado honesto do grafo
373
+ e estado de Notas Relacionadas; depois siga somente efeitos canônicos novos
374
+ emitidos pela FSM.
375
+ Rode o workflow completo novamente só quando a fila de reescrita estiver
376
+ vazia. Se o manifest, atestação, hash do output, hash do plano ou hash da
377
+ nota alvo divergir, pare e reporte o bloqueio (`agent_notice`,
378
+ `error_context`, `next_action`). Nunca reescreva a mesma nota em paralelo.
379
+ 8. Se a FSM/`agent_directive` indicar merge de notas como rota recuperável, não
380
+ pare no primeiro `fix-wiki`. O diagnostic context é apenas evidência privada;
381
+ a rota executável continua sendo `agent_directive.control`. Se vier
382
+ `title_driven_merge_review`, confirme a identidade semântica antes de criar
383
+ qualquer merge. Planeje merges:
384
+
385
+ ```bash
386
+ uv run python "<wiki/cli.py>" plan-subagents --phase note-merge --max-concurrency 3 --temp-root <tmp-merges>
387
+ ```
388
+
389
+ Use um `med-knowledge-architect` por `work_item.group_id`. Payload completo
390
+ vem só de `work_items`; `batches[].work_ids` apenas escolhe a rodada.
391
+ 9. Valide cada merge:
392
+
393
+ ```bash
394
+ uv run python "<wiki/cli.py>" apply-note-merge --plan <plan.json> --content <merged.md> --dry-run --json
395
+ ```
396
+
397
+ Aplique automaticamente só se o plano oficial trouxer identidade semântica
398
+ auditável, nenhuma `decision.kind=ask_human`, nenhum
399
+ `human_decision_packet` pendente e nenhum conflito `images_*`:
400
+
401
+ ```bash
402
+ uv run python "<wiki/cli.py>" apply-note-merge --plan <plan.json> --content <merged.md> --json
403
+ ```
404
+
405
+ Apply valida hashes, contrato Wiki, provenance e preservação; rollback se
406
+ falhar depois de mutar. Quando aplica, grava recibo,
407
+ `linker_trigger_context_path` e chama o pacote completo do linker.
408
+ 10. Atomicidade segue `${extensionPath}/docs/atomicity-splitting-policy.md`:
409
+ vem do DB, nunca de título/tamanho aparente. Só
410
+ `atomicity_decision=split_required`, derivado de `semantic_signal` no corpo,
411
+ cria split aplicável. Se
412
+ `atomicity_split_plan_path` existir ou
413
+ `identity.atomicity.one_note_multiple_meanings` aparecer pendente, planeje:
414
+
415
+ ```bash
416
+ uv run python "<wiki/cli.py>" plan-subagents --phase atomicity-split --fix-wiki-plan <fix-wiki-plan.json> --temp-root <tmp-splits> --json
417
+ ```
418
+
419
+ Use um `med-knowledge-architect` por `work_item.source_path`; ele escreve
420
+ apenas `atomicity-split-bundle.v1` e Markdown temporário. O bundle deve
421
+ copiar `work_id`, `source_path` e `source_hash` do work item oficial.
422
+ Preserve `work_item.semantic_signal`; não substitua por opinião sobre nota
423
+ nem por title-only signal.
424
+ Aplique por:
425
+
426
+ ```bash
427
+ uv run python "<wiki/cli.py>" apply-atomicity-split --bundle <atomicity-split-bundle.json> --json
428
+ ```
429
+
430
+ O apply marca o `deferred_work_item` como `completed` no vocabulary DB.
431
+ Enquanto o plano existir, trate `blocked_reason=atomicity_split_required`
432
+ como pendência real; não encerre como saúde verde. `--defer-linker` só vale
433
+ com `--parent-batch-id` dentro de lote pai que vai rodar `/mednotes:link`
434
+ uma vez ao final.
435
+ 11. Após rewrites/merges/splits aceitos, revalide:
436
+
437
+ ```bash
438
+ uv run python "<wiki/cli.py>" fix-wiki --apply --json
439
+ ```
440
+
441
+ 12. Se `taxonomy_action_required` vier com
442
+ `taxonomy_apply_requires_confirmation=true`, nenhum movimento de pasta foi
443
+ feito. Revise `taxonomy_plan_path`; se estiver correto:
444
+
445
+ ```bash
446
+ uv run python "<wiki/cli.py>" fix-wiki --apply --apply-taxonomy --json
447
+ ```
448
+
449
+ Se persistir depois disso, falta decisão humana/semântica. Use `decision`,
450
+ `human_decision_packet`, `receipt`, `agent_directive` e evidência privada em
451
+ `diagnostic_context`; não dirija o fluxo por campos diagnósticos soltos.
452
+ 13. Backups `.bak` são legado e não devem ser criados. Se a higiene encontrar
453
+ `.bak` antigo ou `.rewrite`, eles devem ficar fora do vault; confira higiene
454
+ e cleanup antes de concluir.
455
+ 14. Resposta final: priorize o objetivo do usuário. Se o JSON fresco trouxer
456
+ `reports.public_report.lines`, use essas linhas como fonte determinística da saída
457
+ pública e não reconstrua um relatório operacional. Em revisão, confira
458
+ bloqueio antes de mutar.
459
+ Para dry-run/apply bloqueado, não exponha `blocked_reason`,
460
+ `blocking_reasons`, `required_inputs`, paths de artefatos ou schemas por
461
+ padrão. Esses campos são contrato de automação/debugging; só aparecem se o
462
+ usuário pedir laboratório ou se você estiver fazendo relatório técnico. Não
463
+ use "concluído", "concluída", "concluiu", "finalizado", "pronto",
464
+ "sucesso", "com sucesso" ou "comportamento esperado" para descrever
465
+ workflow bloqueado/parcial. Subetapa atualizada não é workflow completo:
466
+ escreva "Notas Relacionadas atualizadas", "grafo sem blockers" ou "proteção
467
+ do vault encerrada", nunca "etapa concluída com sucesso" quando a Wiki ainda
468
+ aguarda especialista/cota.
469
+ Se você rodou `list_directory`/listou diretório fora do roteiro,
470
+ reporte como listagem de diretório. Não rode
471
+ `plan-subagents` por iniciativa própria e não invente campos ausentes/nulos
472
+ como `linker_pending_reason`.
473
+ Preserve os rótulos de artefato: `fix_wiki_plan_path` aponta para
474
+ `fix-wiki-plan.json`, e `run_state_path` aponta para `run_state.json`.
475
+ Se `Exit Code:` for diferente de zero, reporte o código mesmo quando
476
+ `tool status=success`; `Exit Code: 3` com JSON `status=blocked` é blocker
477
+ do workflow, não warning auxiliar. Workflows FSM-first expõem
478
+ `agent_directive` como o único contrato FSM -> agente
479
+ consumível por automação. Consumidores usam `agent_directive.control` para
480
+ enforcement e validação, e podem renderizar `agent_directive.instructions`
481
+ como contexto para o modelo. Não parseie relatórios humanos nem preâmbulos
482
+ em stderr para decidir o estado do workflow.
483
+ Se aplicou reescrita de nota, reporte uma auditoria antes/depois do lote:
484
+ preservação de YAML/proveniência/links, se a pendência indicada foi
485
+ resolvida na seção correta e se a qualidade médica/didática ficou boa.
486
+ Nota formalmente válida mas ruim é bug de UX/conteúdo.
487
+ Em saída pública, não liste comandos internos, `node`, paths de script,
488
+ `--json`, `run-start` ou `run-finish`; traduza para proteção preparada,
489
+ reparo executado e proteção encerrada. não invente warning para ferramenta
490
+ que não foi chamada. `update_topic` segue a mesma política de redação
491
+ pública, mas `update_topic` bem-sucedido não é desvio; se for mencionado,
492
+ não inclua `run_id`, hash curto, comando interno ou flag técnica. Em
493
+ resposta pública normal, não liste `required_inputs`; traduza o que falta
494
+ para linguagem acionável. Em relatório técnico/debugging, cite
495
+ `decision.next_action`/`receipt.next_action` como campo canônico; na saída
496
+ pública prefira `reports.public_report.lines`. Não misture ação de decisão
497
+ com retomada; se mostrar `resume_action`, use rótulo separado.
498
+ Em relatório técnico, preserve códigos de bloqueio nos campos canônicos da
499
+ FSM (`decision`, `diagnostic_context`, `error_context` ou recibos técnicos)
500
+ sem transformá-los em verdade paralela. Não copie `blocked_reason`
501
+ top-level como contrato público. Se houver
502
+ `primary_human_decision_kind`, `human_decision_kinds[]` ou
503
+ `human_decision_packet.decision_kind`, reporte em rótulo separado; não
504
+ transforme isso em `blocked_reason` composto. Backups `.bak` novos não
505
+ devem ser relatados como criados; `.bak`/`.old` legados são pendência de
506
+ higiene explícita, não mutação automática de `fix-wiki`. Use
507
+ `final_validation.hygiene.bak_or_rewrite` apenas como sinal técnico de
508
+ legado pendente. Se
509
+ `change_count_context.changed_count_applied=false`, `changed_count` é plano
510
+ de prévia, não mutação no vault; mutação real vem de `written_count`,
511
+ `total_changed_count` e
512
+ `version_control_mutation_summary.changed_file_count`; não derive contagem
513
+ de backups de `changed_count`/`written_count`.
514
+ Em run com mutação, reporte a evidência de fechamento do guard:
515
+ `guard_lease.status=closed` no `run-finish` ou `guard-status.active_count=0`.
516
+ Se `blocked_reason=guard_lease_mismatch`, `guard_lease.status=missing` ou
517
+ houver lease ativa, reporte como pendência; não diga que o guard foi fechado.
518
+ Em resposta pública, traduza isso para "proteção do vault encerrada" ou
519
+ "pendência na proteção do vault"; não imprima `guard_lease`, lease id/path,
520
+ `run_id`, hash de ponto de restauração ou identificador curto como
521
+ `7da9fcf` salvo se o usuário pedir debugging. Nunca escreva "Ponto de
522
+ restauração `<id>` disponível"; escreva apenas "ponto de restauração
523
+ disponível". Se listar o comando `run-finish`, redija o argumento como
524
+ `--run-id <run_id>`, nunca com o valor literal.
525
+ Em dry-run bloqueado sem efeito canônico executável, reporte e pare: não rode `feedback_report.py` manualmente,
526
+ não rode `feedback_report.py --help` e
527
+ não crie comandos extras de registro. O workflow já registra feedback
528
+ quando apropriado.
529
+ Se `decision.kind=ask_human` ou `human_decision_packet` estiver pendente,
530
+ mostre pergunta, opções, item afetado e `resume_action` do pacote. Antes da resposta final, revise
531
+ todos os `tool_result`: qualquer tool call falha (`status=error`,
532
+ parâmetros inválidos, `invalid_tool_params`, `tracker_update_task` ou
533
+ `read_file` fora do workspace) vira `warnings de execução`, mesmo se retry
534
+ posterior corrigiu; tool call `status=success` nunca vira warning. Se o
535
+ workflow ficou parcial, bloqueado, aguardando agente ou aguardando recurso
536
+ externo, não use a palavra `sucesso` nem a expressão `com sucesso` em
537
+ nenhuma camada do relatório; diga aplicado, atualizado, parcial, guard
538
+ fechado ou ponto de restauração disponível. Subetapa atualizada não é
539
+ workflow completo. Se ocorreu `list_permissions`, reporte como
540
+ probe de permissões. Se o AGY leu log indicado pela própria ferramenta,
541
+ reporte em linguagem humana e não use rótulo técnico literal.
542
+ `update_topic` bem-sucedido é normal e não deve ser listado como atrito.
543
+ `read_file` fora do workspace em YOLO é baixa severidade quando não afeta a
544
+ conclusão, mas ainda deve ser listado.
545
+ Use `reports.public_report.lines` como base da resposta humana e deixe
546
+ comandos, flags e recibos técnicos apenas para debugging explícito. Inclua
547
+ erros de ferramenta de preparação, como `activate_skill` com parâmetro não
548
+ aceito. A successful retry does not erase the earlier tool error.
549
+
550
+ ## Limites
551
+
552
+ - Não edite YAML/status de raw chats.
553
+ - Não publique notas.
554
+ - Não use regex manual para links; use `fix-wiki`, grafo/linker ou
555
+ `/mednotes:link`.
556
+ - Não escreva manualmente sobre a Wiki; use `fix-wiki` ou
557
+ `apply-style-rewrite`/`apply-note-merge`.
558
+ - Não mova pastas manualmente; hierarquia é `taxonomy-migrate` com plano,
559
+ recibo e rollback. No `fix-wiki`, só execute com `--apply-taxonomy`.