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,104 @@
1
+ # Dicionário Público (Internal → User)
2
+
3
+ Tradução canônica para resposta visível em workflow público. "Não dizer" é
4
+ proibido por padrão; "Dizer" é a forma humana. Termos internos só aparecem
5
+ em `<details>` técnicos quando o usuário pediu, em `/mednotes:status`, em
6
+ debug explícito, ou na seção `Detalhes técnicos` ao final do relatório.
7
+
8
+ Workflows que exigem UX "just works" (esconder internals por padrão):
9
+ `/mednotes:create`, `/mednotes:enrich`, `/mednotes:fix-wiki`,
10
+ `/mednotes:link`, `/mednotes:link-body`, `/mednotes:link-related`,
11
+ `/mednotes:process-chats`, `/mednotes:pdf-library`, `/flashcards`.
12
+
13
+ Workflows mistos (mais técnico no default): `/mednotes:setup`,
14
+ `/mednotes:status`, `/mednotes:history`, `/mednotes:telemetry`, `/report`.
15
+
16
+ ## Execução E Ambiente
17
+
18
+ | Interno | Não dizer | Dizer |
19
+ |---|---|---|
20
+ | `uv run python ...` / `uv` | "rodei `uv`", "vou rodar `uv run`" | "preparei o ambiente e rodei", "executei" |
21
+ | `--dry-run`, dry-run | "rodei `--dry-run`", "dry-run limpo" | "fiz uma prévia", "nada foi alterado ainda" |
22
+ | `--apply`, apply | "vou rodar apply" | "vou aplicar" / "aplico se você confirmar" |
23
+ | receipt / recibo (técnico) | "gerei recibo `<path>.json`" | "registrei o que foi feito" / "guardei ponto de restauração" |
24
+ | manifest / batch | "manifest do batch" | "lote" só se precisar contar; preferir "essas 4 notas" |
25
+ | hash / sha256 / `content_hash` | "hash bate", "sha256=…" | omitir; ou "identifiquei a versão da nota" |
26
+ | schema / schema drift / plan v4/v5 | "schema drift", "plano v5" | "o formato esperado mudou; vou recalcular" |
27
+ | `Exit Code:` | "Exit Code 1" | "o comando falhou: <causa curta>" |
28
+ | `tool status=success` | "tool status success" | omitir; falar do resultado |
29
+ | `agent_metrics` / `turns_used` / `max_turns` | "12 turns used" | omitir; em bloqueio: "o agente esgotou tentativas; precisa de revisão" |
30
+
31
+ ## Estado E Decisão
32
+
33
+ | Interno | Não dizer | Dizer |
34
+ |---|---|---|
35
+ | `next_action` / `next_command` | "next_action", "next_command" | "próxima ação" |
36
+ | `human_decision_required` | "human decision required" | "preciso de uma decisão sua" |
37
+ | `human_decision_packet` | "packet", "opções do packet" | "opções para você escolher" |
38
+ | `blocked_reason` / `status=blocked` | "status=blocked", "blocked_reason=…" | "bloqueio: <causa em pt-BR>" |
39
+ | `preview_ready` / `ready_to_publish` | "preview_ready", "ready_to_publish" | "prévia pronta", "pronto para publicar" |
40
+ | `phase` (ex. `architect`, `triage`) | "fase architect" | "etapa atual: arquitetura/triagem" |
41
+ | `contract_gap` / `error_context` | "contract_gap.missing_next_action" | "o sistema não me deu próxima ação clara; preciso de orientação sua" |
42
+
43
+ ## Armazenamento
44
+
45
+ | Interno | Não dizer | Dizer |
46
+ |---|---|---|
47
+ | SQLite / vocabulary DB / DB | "SQLite", "DB de vocabulário" | "índice de vocabulário" |
48
+ | `vocabulary_bootstrap` / `bootstrap_required` | "bootstrap_required" | "o índice de vocabulário precisa ser construído" |
49
+ | `link-trigger-context.v1` | "link trigger context" | omitir; o linker é dito como "reparei as conexões entre notas" |
50
+ | `images_*` frontmatter | "frontmatter `images_*`" | "imagens da nota" |
51
+
52
+ ## Versionamento E Vault
53
+
54
+ | Interno | Não dizer | Dizer |
55
+ |---|---|---|
56
+ | restore point / `restore_point_id` / commit | "commit", "branch", "SHA `<abc>`" | "ponto de restauração" |
57
+ | Git / push / `sync_status` | "git push", "sync_status=skipped" | "backup online" / "backup online pendente" |
58
+ | `run-start` / `run-finish` / vault guard | "rodei `run-start`" | omitir; protegido por "ponto de restauração" |
59
+
60
+ ## Bypass Técnico (Nunca Em UX Pública)
61
+
62
+ | Interno | Não dizer | Dizer |
63
+ |---|---|---|
64
+ | `MEDNOTES_ALLOW_DEV_ESCAPE` | nunca em UX pública | nunca em UX pública |
65
+ | `--skip-prompt-eval` | nunca em UX pública | nunca em UX pública |
66
+ | `--force-diagnose` | nunca em UX pública | nunca em UX pública |
67
+
68
+ ## Eval E Avaliação
69
+
70
+ | Interno | Não dizer | Dizer |
71
+ |---|---|---|
72
+ | `eval-curator-batch` / evaluator | "evaluator devolveu needs_review" | "a verificação automática marcou itens para revisão" |
73
+ | `needs_review` | "needs_review" | "preciso revisar antes de aplicar" |
74
+ | `prompt-eval` / curator-prompt-eval.json | "curator-prompt-eval" | omitir; preferir "verificação do plano" |
75
+
76
+ ## Agentes E Subagentes
77
+
78
+ | Interno | Não dizer | Dizer |
79
+ |---|---|---|
80
+ | `med-link-graph-curator` | nome do agente | "etapa de curadoria de vocabulário" |
81
+ | `med-knowledge-architect` | nome do agente | "etapa de reescrita" |
82
+ | `med-chat-triager` | nome do agente | "etapa de triagem do chat" |
83
+ | `med-publish-guard` | nome do agente | "verificação antes de publicar" |
84
+ | `med-flashcard-maker` | nome do agente | "etapa de geração de cards" |
85
+ | `@generalist` / subagent genérico | mencionar | nunca (rota oficial não usa) |
86
+
87
+ ## Quando Internals Podem Aparecer
88
+
89
+ - Sempre em `<details>` recolhido com cabeçalho "Detalhes técnicos" (camada
90
+ visível padrão continua humana).
91
+ - Em `/mednotes:status`, `/mednotes:setup`, `/mednotes:telemetry`,
92
+ `/mednotes:history` no resumo principal quando o usuário pediu inspeção.
93
+ - Em debug explícito (usuário pediu "mostre o JSON", "rode com `--json`",
94
+ "explique o erro técnico").
95
+
96
+ ## Anti-Padrão Recorrente (Run Real)
97
+
98
+ Em `/mednotes:fix-wiki`, foi exposto ao usuário: "batch de curadoria",
99
+ "plano v5", "schema drift", "hash mismatch", "uv run", "manifest",
100
+ "needs_review" e "skip-prompt-eval". Tradução correta:
101
+
102
+ > "Fiz uma prévia da Wiki. Encontrei um conflito de versão e preciso da sua
103
+ > decisão antes de continuar. Nada foi alterado ainda. Próxima ação:
104
+ > <frase curta>."
@@ -0,0 +1,141 @@
1
+ ---
2
+ name: med-auto-linker
3
+ description: Contrato compacto do /mednotes:link: diagnostico, desambiguacao contextual e apply auditavel do grafo da Wiki.
4
+ ---
5
+
6
+ # Semantic Linker Contract
7
+
8
+ No workflow público `/mednotes:link`, use a CLI pública `wiki/cli.py run-linker`.
9
+ `/mednotes:link-body` usa o mesmo `run-linker` com `--no-related-notes`.
10
+ `/mednotes:link-related` usa `wiki/cli.py related-notes-sync`, cujo output
11
+ público é `medical-notes-workbench.link-related-fsm-result.v1`. O payload
12
+ operacional antigo de Related Notes é detalhe interno: consumidores leem
13
+ `progress_view_model`, `state_machine_snapshot`, `decision`, `receipt`,
14
+ `artifacts`, `diagnostic_context` e `error_context`. O linker cuida só de
15
+ `knowledge_graph`: WikiLinks, aliases, vocabulary DB, meanings, body linker,
16
+ Related Notes, backlinks e validação do grafo. Não corrige estilo, YAML,
17
+ publicação, conteúdo didático, taxonomia nem índice Dataview.
18
+ `/mednotes:link` é o dono de todo reparo de grafo; curadoria semântica é fase
19
+ interna de /mednotes:link, não tarefa manual final para o usuário.
20
+
21
+ Fonte operacional: `~/.gemini/medical-notes-workbench/vocabulary.sqlite`.
22
+ YAML `aliases` é projeção humana do DB, não autorização suficiente para linkar
23
+ corpo. `CATALOGO_WIKI.json`, quando existir, é legado/apoio; não é fonte
24
+ primária de decisão semântica.
25
+
26
+ Contrato público: `run-linker --diagnose --json` lê Wiki/Git/DB/aliases/links,
27
+ export do Related Notes e estado do grafo, salva `link-diagnosis.json` e não
28
+ muta Markdown. `run-linker --diagnose --no-related-notes --json` pula
29
+ `related_notes_sync` para o comando body-only. Workflows que mudaram notas
30
+ passam `--trigger-context <json>`. `run-linker --apply --diagnosis <json>
31
+ --json` consome o diagnóstico salvo, revalida snapshot/hash/Git e bloqueia se
32
+ estiver stale. Se o diagnóstico contém `wiki_dir`, `catalog_path` e
33
+ `vocabulary_db_path`, o apply usa esses caminhos quando overrides explícitos não
34
+ forem passados. `--receipt` nunca sobrescreve arquivo existente; nesse caso o
35
+ workflow bloqueia com `receipt_path_exists`. Apply nunca chama LLM.
36
+ O diagnóstico grava `last_diagnosis_attempt` em `link-state.v2`; repetição sem
37
+ mudança pode retornar `skipped_reason=redundant_diagnosis_without_state_change`.
38
+ Se o vocabulary DB ainda não existe, o diagnóstico registra
39
+ `vocabulary_bootstrap.status=planned` e bloqueia `body_term_linker` com
40
+ `vocabulary_bootstrap_required` quando houver notas a ingerir; criar SQLite,
41
+ limpar aliases/WikiLinks antigos e enfileirar notas é responsabilidade de um
42
+ apply workflow-aware do próprio `/mednotes:link` ou de um workflow que o chama,
43
+ como `/mednotes:fix-wiki`.
44
+ No apply, `vocabulary_semantic_repair` resolve a fila simples com meanings por
45
+ título/nota, policy direta só para título e aliases contextuais; depois força
46
+ novo diagnóstico e aplica. Só bloqueia em decisão humana, conflito ou erro real.
47
+
48
+ Fases fixas:
49
+
50
+ 1. `reference_repair`
51
+ 2. `contextual_alias_disambiguation`
52
+ 3. `body_term_linker`
53
+ 4. `related_notes_sync`
54
+ 5. `graph_validation`
55
+
56
+ Regras semânticas:
57
+
58
+ - `1 meaning canônico = 1 nota Wiki`.
59
+ - Atomicidade/split segue `atomicity-splitting-policy.md`: o DB decide a partir
60
+ de `semantic_signal` do corpo, nunca de title-only signal; só
61
+ `split_required` vira `deferred_work_items.status=pending`.
62
+ - Várias notas para o mesmo meaning é duplicata/merge.
63
+ - `direct` só linka quando uma surface tem um meaning e uma nota canônica.
64
+ - `requires_context` exige decisão por ocorrência. Exemplo: `PCR` pode ser
65
+ Proteína C Reativa, Parada Cardiorrespiratória ou Reação em Cadeia da
66
+ Polimerase, mesmo se o vault ainda só tiver uma candidata.
67
+ - Matches seguros de único alvo canônico são resolvidos pelo script. Ambiguidades
68
+ médicas reais exigem orquestração oficial por agente/subagent; o script não
69
+ abre `gemini -p` escondido. Alvo inventado, confiança baixa ou contexto
70
+ insuficiente vira `defer`/`no_link`.
71
+
72
+ Body linker usa scanner Aho-Corasick, preserva YAML, headings, code, imagens,
73
+ embeds, footer e `## 🔗 Notas Relacionadas`, exceto quando a fase dela roda.
74
+ Qualidade do body linker é medida por `evaluate-body-linker` com fixtures
75
+ redigidas; falso positivo deve bloquear o gate.
76
+
77
+ `reference_repair` usa trigger context ou Git para `created`, `modified`,
78
+ `deleted`, `renamed`, `moved` e `merged`. Rename/move/merge validado reescreve
79
+ links entrantes; delete sem substituto vira `structural_deleted`.
80
+
81
+ Related Notes é seção gerenciada pelo linker: remover só o bloco abaixo de
82
+ `## 🔗 Notas Relacionadas`, preservar as demais seções finais e reescrever a partir do export
83
+ estável do plugin (`score >= 0.78`, teto configurado, ordem de relevância).
84
+ O recovery oficial do export tenta primeiro o comando do plugin via Obsidian
85
+ CLI. Se a CLI não existir, mas o plugin estiver instalado no vault, o Workbench
86
+ pode reconstruir `index.json` e `medical-notes-export.json` pela rota headless
87
+ compatível com o plugin, lendo a chave do `data.json` sem expor segredo. O
88
+ export público nunca carrega API key, embeddings, cache interno, Markdown bruto
89
+ ou conteúdo clínico; falha de quota vira
90
+ `related_notes_headless_quota_exhausted`. Execução longa demais vira
91
+ `related_notes_headless_time_budget_exhausted`, com índice parcial salvo e
92
+ retomada oficial. A rota headless impõe no mínimo 10s entre chamadas externas
93
+ de embedding, mesmo se `embeddingRequestDelayMs` vier menor, zero ou ausente.
94
+ O orçamento padrão de execução headless é 120s e pode ser ajustado por
95
+ `MEDNOTES_RELATED_NOTES_HEADLESS_MAX_SECONDS` em testes/automação.
96
+ Quando a rota headless já salvou parte do índice, o blocker deve carregar
97
+ payload tipado de progresso Related Notes com total, restante, janela de retry e
98
+ `resume_supported=true`. Se o bloqueio for quota externa ou orçamento de tempo,
99
+ o plano deve deixar claro que a retomada é posterior (`executable_now=false`),
100
+ não continuação imediata; isso não é decisão humana nem instrução para o usuário
101
+ editar Related Notes manualmente.
102
+ O linker não mantém índice Dataview. Notas operacionais marcadas com
103
+ `indice`/`índice` são ignoradas no grafo/linker e devem preservar queries,
104
+ code blocks e forma operacional própria.
105
+
106
+ Proveniência não é Related Notes: `chats[]` é metadata consultável da fonte e
107
+ `## 🧬 Fontes Consolidadas` é a seção visível final, gerenciada pelos workflows
108
+ de publicação/fix-wiki. O linker não cria nem apaga `chats[]`.
109
+ Export stale usa `related-notes-sync --recover-export --mode auto --json`.
110
+ Se Related Notes for o único blocker e body/reference estiverem seguros,
111
+ `run-linker --diagnose` inclui `body_only_fallback.safe=true`; caso contrário,
112
+ `safe=false`.
113
+ Quando `fix-wiki --apply` não consegue recuperar o export, mas os blockers de
114
+ grafo estão dentro da seção gerenciada, ele pode registrar
115
+ `related-notes-safety-cleanup.v1`: remove apenas WikiLinks inválidos já
116
+ presentes em `## 🔗 Notas Relacionadas`, preserva links existentes que ainda
117
+ resolvem para uma única nota e mantém `related_notes_blocked` até o plugin gerar
118
+ um export fresco. Essa limpeza não calcula embeddings nem novas relações.
119
+
120
+ Recibos/diagnósticos não gravam Markdown clínico bruto nem diff textual. O
121
+ `med-link-graph-curator` mantém meanings, aliases, policies e work items; ele
122
+ não edita Markdown diretamente e não chama outro subagente.
123
+ Para `deferred_work_items[].reason=non_atomic_note`, use
124
+ `atomicity-splitting-policy.md`: `semantic_signal` deve trazer evidência do
125
+ corpo, relação/fragmento e estimativa dos filhos; sem isso o apply bloqueia como
126
+ `semantic_ingestion.atomicity_signal_required`.
127
+ O parent passa `agent-work-packet.v1`: path/hash/DB, ações, stop conditions,
128
+ `difficulty_route`, rubrica e contrato. `simple_atomic` é curto;
129
+ `complex_semantic_review` classifica/defer riscos; `blocked_preflight` para
130
+ antes de gastar tokens. `plan_hash` é corpus-only sem runtime; `prompt_identity`
131
+ valida no apply.
132
+ Quando o diagnóstico emitir `vocabulary_curator_batch_plan_path`, o apply ainda
133
+ deve tentar `vocabulary_semantic_repair`; se sobrar pendência humana, continue a
134
+ cadeia dentro do `/mednotes:link` e não encerre como próximo passo manual.
135
+ Depois dos outputs, gere manifest com `collect-curator-outputs`; não escreva
136
+ manual. Rode `eval-curator-batch --report <report> --json`.
137
+ O gate emite `curator-prompt-eval.v1` e bloqueia alias amplo, vazamento, rota
138
+ complexa sem defer/split, orçamento excedido ou falta de `agent_metrics`.
139
+ Apply real exige `--prompt-eval <report.json>`; `--skip-prompt-eval` exige
140
+ `MEDNOTES_ALLOW_DEV_ESCAPE=1` e `--skip-prompt-eval-reason`, e registra
141
+ `agent.curator_prompt_eval_skip`.
@@ -0,0 +1,90 @@
1
+ # Política Canônica de Taxonomia
2
+
3
+ Este contrato governa apenas a hierarquia de pastas da `Wiki_Medicina`.
4
+ A fonte executável de verdade é
5
+ `bundle/scripts/mednotes/wiki/taxonomy/policy.py`; este documento é a
6
+ projeção humana distribuída com a extensão.
7
+
8
+ ## Hierarquia
9
+
10
+ - Nível 1: cinco grandes áreas numeradas, em conjunto fechado.
11
+ - Nível 2: especialidades canônicas sob cada grande área, em conjunto fechado.
12
+ - Nível 3: subcategoria opcional sob uma especialidade canônica.
13
+ - Nível 4+: leaf ou pasta de nota.
14
+
15
+ `schema.py` e os subcomandos `taxonomy-*` derivam áreas, especialidades e
16
+ aliases de `policy.py`. Subcategorias/leaves continuam governadas por
17
+ `allow_new_leaf=True` e bloqueio de similaridade próxima.
18
+
19
+ ## Grandes Áreas
20
+
21
+ - `1. Clínica Médica`
22
+ - `2. Cirurgia`
23
+ - `3. Ginecologia e Obstetrícia`
24
+ - `4. Pediatria`
25
+ - `5. Medicina Preventiva`
26
+
27
+ ## Ginecologia E Obstetrícia
28
+
29
+ A grande área canônica é `3. Ginecologia e Obstetrícia`.
30
+
31
+ Especialidades canônicas:
32
+
33
+ - `Ginecologia`
34
+ - `Obstetrícia`
35
+
36
+ Aliases legados preservados por compatibilidade:
37
+
38
+ - `#. Ginecologia e Obstetricia` -> `3. Ginecologia e Obstetrícia`
39
+ - `3. Ginecologia e Obstetricia` -> `3. Ginecologia e Obstetrícia`
40
+ - `Ginecologia_Obstetricia` -> `3. Ginecologia e Obstetrícia`
41
+ - `Ginecologia e Obstetricia` -> `3. Ginecologia e Obstetrícia`
42
+ - `Ginecologia e Obstetrícia` -> `3. Ginecologia e Obstetrícia`
43
+ - `Obstetricia` -> `3. Ginecologia e Obstetrícia/Obstetrícia`
44
+
45
+ ## Versão Da Política
46
+
47
+ A versão executável atual é `2026-05-15.taxonomy-v1`. Planos e recibos de
48
+ migração registram essa versão e não devem ser aplicados quando a versão atual
49
+ for diferente.
50
+
51
+ ## Status Humano
52
+
53
+ Use `taxonomy-status` para entender o estado da árvore real antes de aplicar
54
+ migração. O comando emite JSON e pode escrever relatório Markdown com
55
+ `--report-output`.
56
+
57
+ ## Criação De Leaf Nova
58
+
59
+ Dry-run pode sugerir `taxonomy_new_dirs`. Publish real só cria diretórios novos
60
+ quando o recibo de dry-run para o mesmo manifest autorizou exatamente esses
61
+ diretórios.
62
+
63
+ ## Decisão Operacional
64
+
65
+ - Preservar caminhos que já estão sob área e especialidade canônicas.
66
+ - Resolver aliases conhecidos para o destino canônico antes de publicar ou
67
+ migrar.
68
+ - Criar leaf nova somente sob pai canônico coerente e sem similaridade fuzzy
69
+ bloqueadora.
70
+ - Bloquear para decisão humana quando a área, especialidade, similaridade ou
71
+ destino for ambíguo.
72
+ - Mover pastas somente via `taxonomy-migrate`, com plano, recibo e rollback.
73
+
74
+ ## Comandos
75
+
76
+ - `taxonomy-canonical`
77
+ - `taxonomy-tree`
78
+ - `taxonomy-audit`
79
+ - `taxonomy-status`
80
+ - `taxonomy-resolve`
81
+ - `taxonomy-plan`
82
+ - `taxonomy-apply`
83
+ - `taxonomy-rollback`
84
+ - `taxonomy-migrate`
85
+
86
+ `fix-wiki` pode auditar e planejar taxonomia, mas migração de pastas continua
87
+ passando pelo mecanismo de plano/aplicação/rollback de `taxonomy-migrate`.
88
+ `taxonomy-plan`, `taxonomy-apply` e `taxonomy-rollback` são nomes mais claros
89
+ para o mesmo fluxo. `taxonomy-migrate --dry-run|--apply|--rollback` permanece
90
+ compatível.
@@ -0,0 +1,187 @@
1
+ # Triage Policy
2
+
3
+ Política editorial para o `med-chat-triager`. Define como dividir um único
4
+ raw chat em unidades semânticas duráveis sem decidir nada sobre a Wiki
5
+ existente. Pareado com `agent-role-contracts.md` e `merge-policy.md`.
6
+
7
+ Regra-âncora:
8
+
9
+ > 1 meaning canônico = 1 nota Wiki. O triager declara meanings; ele não
10
+ > decide se eles já existem.
11
+
12
+ ## Ações Permitidas (`triage-note-plan.v2`)
13
+
14
+ ### `planned_meaning`
15
+
16
+ Use para cada unidade médica durável que merece virar trabalho downstream
17
+ (nota nova, rewrite canônico ou merge candidato — quem decide é o planner,
18
+ não o triager).
19
+
20
+ Critérios:
21
+
22
+ - representa um conceito médico atômico, com escopo definível em uma frase;
23
+ - o raw chat fornece evidência suficiente para descrever esse escopo;
24
+ - a unidade tem `meaning_claim` com `label`, `scope`, `boundaries`, `kind` e
25
+ `evidence_summary` redigido;
26
+ - `staged_title` é um nome de arquivo limpo em pt-BR (sem path separators,
27
+ caracteres proibidos Windows, controle, ponto/espaço final).
28
+
29
+ Granularidade:
30
+
31
+ - não fragmente abaixo da unidade semântica (ex.: não emita
32
+ `Mecanismo de ação dos ISRS` separado de `ISRS` quando o raw discute apenas
33
+ ISRS como um todo);
34
+ - não infle granularidade (ex.: não emita uma nota por critério de
35
+ diagnóstico isolado quando o raw discute o quadro completo);
36
+ - preferir uma unidade ampla com `attach_to_planned_meaning` em vez de
37
+ várias unidades pequenas mal sustentadas.
38
+
39
+ ### `attach_to_planned_meaning`
40
+
41
+ Use para informação útil subordinada a outra unidade do mesmo raw chat.
42
+ Requer `target_item_id` apontando para uma `planned_meaning` válida do mesmo
43
+ plano.
44
+
45
+ `reason_code` fechado:
46
+
47
+ - `supporting_detail`: detalhe clínico/farmacológico que reforça a unidade
48
+ alvo;
49
+ - `boundary_clarification`: discussão que ajuda a delimitar o escopo da
50
+ unidade alvo;
51
+ - `example_or_case`: exemplo/caso que ilustra a unidade alvo;
52
+ - `cross_reference`: menção breve que aponta a unidade alvo para outra
53
+ unidade do mesmo raw.
54
+
55
+ `attach_to_planned_meaning` não vira nota separada. Ele é dica para o
56
+ architect agregar conteúdo dentro da unidade alvo.
57
+
58
+ ### `not_a_note`
59
+
60
+ Use para conteúdo do raw chat que não deve virar nota.
61
+
62
+ `reason_code` fechado:
63
+
64
+ - `administrative_chatter`: pedido operacional, metacomentário, saudação;
65
+ - `repetition_no_new_information`: repete unidade já planejada sem novidade;
66
+ - `out_of_scope_for_medical_wiki`: assunto fora do escopo da Wiki médica;
67
+ - `low_value_fragment`: fragmento sem conteúdo médico aproveitável.
68
+
69
+ `reason` em texto livre é obrigatório e deve ser redigido e curto.
70
+
71
+ ### `needs_context`
72
+
73
+ Use quando o raw chat **não permite segmentação semântica segura** para a
74
+ unidade em questão. Não é dúvida sobre cobertura existente: é dúvida sobre
75
+ identidade da unidade no próprio raw.
76
+
77
+ `reason_code` fechado:
78
+
79
+ - `evidence_insufficient`: o raw chat não traz texto suficiente para
80
+ sustentar `meaning_claim.scope`/`boundaries`;
81
+ - `multiple_topics_undifferentiated`: o raw mistura múltiplas unidades sem
82
+ que o triager consiga separá-las com segurança a partir do texto;
83
+ - `clinical_ambiguity`: contradição clínica no próprio raw que precisa de
84
+ revisão humana antes de virar nota;
85
+ - `language_or_encoding_blocker`: o raw está corrompido, truncado ou em
86
+ formato que o triager não consegue ler.
87
+
88
+ `needs_context` exige `reason` redigido. Pode existir junto de
89
+ `planned_meaning`/`attach_to_planned_meaning` (planos mistos são permitidos);
90
+ um plano inteiro só com `needs_context` é também válido e cabe ao planner
91
+ decidir entre re-triagem manual e bloqueio.
92
+
93
+ ## Proibições
94
+
95
+ - Não declarar que uma nota já existe na Wiki. Isso é decisão do planner
96
+ contra Wiki/vocabulary DB.
97
+ - Não emitir `winner_path`, `merge_target` ou similar.
98
+ - Não consultar vocabulary DB como autoridade.
99
+ - Não usar título de nota Wiki existente como identidade — `meaning_claim`
100
+ vive em texto, não em filename.
101
+ - Não pedir decisão humana genérica. Se a dúvida é editorial, usar
102
+ `needs_context` com `reason_code` específico.
103
+
104
+ ## Forma De `meaning_claim`
105
+
106
+ ```json
107
+ {
108
+ "label": "Uso de ISRS em gestantes",
109
+ "scope": "seguranca, contraindicacoes e conduta clinica na gestacao",
110
+ "boundaries": [
111
+ "nao cobre mecanismo geral dos ISRS",
112
+ "nao cobre depressao puerperal como entidade separada"
113
+ ],
114
+ "kind": "clinical_concept",
115
+ "evidence_summary": "O chat discute risco e conduta de ISRS na gestacao."
116
+ }
117
+ ```
118
+
119
+ Campos:
120
+
121
+ - `label`: nome humano da unidade. Curto.
122
+ - `scope`: o que está dentro da unidade. Uma frase.
123
+ - `boundaries`: 1–3 itens em lista descrevendo o que parece relacionado mas
124
+ fica fora. Lista vazia é permitida apenas quando a unidade não tem vizinho
125
+ próximo no raw.
126
+ - `kind`: tipo operacional fechado:
127
+ - `clinical_concept` (entidades clínicas, síndromes, manifestações);
128
+ - `drug_concept` (fármaco/classe);
129
+ - `diagnostic_criterion` (critério/escore);
130
+ - `management_strategy` (conduta/protocolo);
131
+ - `procedure` (procedimento);
132
+ - `physiology_or_mechanism` (mecanismo/fisiologia);
133
+ - `epidemiology_or_definition` (definição/epidemiologia).
134
+ - `evidence_summary`: resumo operacional **redigido** do que no raw sustenta
135
+ a unidade. Sem conteúdo clínico bruto longo, sem citação direta extensa.
136
+
137
+ ## Critérios Editoriais Curtos
138
+
139
+ - Se o raw aborda dois assuntos vizinhos com escopo claro e evidência
140
+ separada → duas `planned_meaning` com `boundaries` apontando uma para a
141
+ outra.
142
+ - Se o raw aborda um assunto com vários detalhes que enriquecem aquela
143
+ unidade → uma `planned_meaning` + N `attach_to_planned_meaning`.
144
+ - Se o raw é principalmente operacional ou administrativo → o plano só
145
+ contém `not_a_note`. Plano todo `not_a_note` é válido e marca o raw como
146
+ descarte editorial.
147
+ - Se o raw é claramente médico mas o triager não consegue separar com
148
+ segurança → uma ou mais entradas `needs_context` com `reason_code` exato.
149
+
150
+ ## O Que A Triagem Não Decide
151
+
152
+ - Existência prévia na Wiki.
153
+ - Path canônico ou taxonomia final.
154
+ - Quem é "winner" entre dois meanings parecidos.
155
+ - Se duas unidades de raws diferentes representam o mesmo meaning.
156
+
157
+ Tudo isso é responsabilidade do planner Python e/ou curator.
158
+
159
+ ## Exemplos Curtos
160
+
161
+ Correto — granularidade ampla com anexos:
162
+
163
+ ```text
164
+ T001 planned_meaning ISRS na gestação
165
+ T002 attach_to_planned_meaning → T001 (supporting_detail) farmacocinética
166
+ T003 attach_to_planned_meaning → T001 (boundary_clarification) puerpério não cobre
167
+ ```
168
+
169
+ Errado — fragmento abaixo da unidade:
170
+
171
+ ```text
172
+ T001 planned_meaning Mecanismo de ação dos ISRS
173
+ T002 planned_meaning Meia-vida dos ISRS
174
+ T003 planned_meaning Recaptação de serotonina pelos ISRS
175
+ ```
176
+
177
+ Correto — descarte editorial:
178
+
179
+ ```text
180
+ T001 not_a_note (administrative_chatter) Pedido operacional sem conteúdo médico.
181
+ ```
182
+
183
+ Correto — raw insuficiente:
184
+
185
+ ```text
186
+ T001 needs_context (evidence_insufficient) Discussão fragmentada sobre HAS sem fechamento de escopo.
187
+ ```