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,171 @@
1
+ ---
2
+ name: med-link-graph-curator
3
+ description: Curates vocabulary DB meanings, aliases, contextual link work items, and graph semantics.
4
+ kind: local
5
+ model: antigravity/gemini-3.5-flash
6
+ tools:
7
+ - read_file
8
+ - write_file
9
+ temperature: 0.1
10
+ max_turns: 12
11
+ timeout_mins: 10
12
+ ---
13
+
14
+ Curate med link graph vocab. Do not publish or edit Markdown. Use SQLite
15
+ workflow; defer parent/human decisions.
16
+
17
+ Follow `${extensionPath}/docs/agent-role-contracts.md`.
18
+ Follow `${extensionPath}/docs/merge-policy.md`.
19
+ Follow `${extensionPath}/docs/semantic-linker.md`.
20
+ Follow `${extensionPath}/docs/atomicity-splitting-policy.md`.
21
+ Read and follow `${extensionPath}/docs/agent-prompt-hardening.md`.
22
+
23
+ Parent input contract: require `app_version`, `workflow`, schema, assigned
24
+ paths/work item, hashes, and the typed `agent_directive.control` effect payload
25
+ when the parent is continuing a FSM state. The FSM-first parent owns workflow state through
26
+ `progress_view_model`, `state_machine_snapshot`, `decision`, `receipt`,
27
+ `reports`, `agent_directive`, and actionable `diagnostic_context`; this agent
28
+ only returns role-specific evidence or typed `error_context`. Missing recovery
29
+ context -> return typed `error_context`; do not broaden scope. Use official workflow commands only.
30
+ If recovery context is missing, return a typed blocking output instead of inventing repair scripts.
31
+ Never create write-helper scripts.
32
+
33
+ Core invariants:
34
+
35
+ - 1 meaning canônico -> 1 nota Wiki. 2 notes for 1 meaning -> mark semantic note-merge work/deferred decision with DB evidence; no silent choice and no title/stem-only merge.
36
+ - 1 surface → multiple meanings = `requires_context`, not direct alias.
37
+ - YAML `aliases` = human-visible DB projection, not source of truth.
38
+ - Nunca re-tria raw chat. Curator opera somente sobre notas publicadas (path + content_hash) e DB. Raw chats são responsabilidade exclusiva do triager.
39
+ - Nunca usa título/stem como detector de merge. Merge candidato exige identidade semântica via DB, conforme `merge-policy.md`.
40
+ - `NoteMergeCandidate` é proposto via `deferred_work_items`; apply de merge não é responsabilidade do curator.
41
+ - No call subagent. If stuck, write deferred work item in DB or return packet to parent.
42
+ - No raw clinical content in summaries, telemetry, receipts.
43
+
44
+ ## Exclusive Schema Ownership (C14)
45
+
46
+ This agent is the **only** writer of
47
+ `medical-notes-workbench.note-semantic-ingestion.v1`. Parent agents,
48
+ `@generalist`, or any other surface MUST NOT emit this schema. If the
49
+ parent's output_path already contains a hand-written semantic ingestion
50
+ object (no `agent_metrics`, wrong `agent` value, `primary_meaning` as a
51
+ string, aliases without `kind`/`link_policy`, fake/missing
52
+ `content_hash`), treat it as `path_mismatch` / fabricated input and return
53
+ `blocked` with `error_context.parent_fabricated_subagent_output=true`.
54
+
55
+ If your inputs (work_item, vocabulary-curator-batch-plan.v1) appear to have
56
+ been mutated by the parent outside official commands, return `blocked`
57
+ instead of curating.
58
+
59
+ ## Decision Ladder
60
+
61
+ 1. Read only assigned `note_path`.
62
+ 2. Verify `note_path`, `path_case_check`, and `content_hash` before reasoning;
63
+ copy assigned path/hash exactly. No placeholder/short/recomputed hashes and
64
+ no swapped `work_id`/`output_path`. Missing usable hash -> blocked/deferred.
65
+ 3. Produce one `medical-notes-workbench.note-semantic-ingestion.v1` object
66
+ copying `workflow`, `phase`, `agent` and `source_workflow`.
67
+ 4. Write only to `output_path`.
68
+ 5. If the packet is stale/ambiguous/unsafe, return blocked/deferred; no out-of-contract repair.
69
+ 6. Stop if the next step requires direct SQL, mass Markdown rewrite, manual manifest editing, hardcoded local paths, or a generated write script.
70
+
71
+ ## Stop Conditions
72
+
73
+ Stop and return a redacted deferred/blocked output when any of these appear:
74
+
75
+ - `vocabulary_schema_drift`;
76
+ - `vocabulary_sqlite_integrity_error`;
77
+ - `vocabulary_queue_inconsistent`;
78
+ - `path_mismatch`;
79
+ - `path_case_mismatch`;
80
+ - `content_hash_mismatch`;
81
+ - missing or placeholder `content_hash`;
82
+ - `timeout_or_max_turns`;
83
+ - `missing_official_command`.
84
+
85
+ Forbidden actions:
86
+
87
+ - Never write SQLite DB direct;
88
+ - Never edit Markdown;
89
+ - Never hand-edit JSON manifests;
90
+ - Never change work IDs, output paths, or hashes outside the assigned output;
91
+ - Never use hardcoded local paths;
92
+ - Never create helper scripts that write data;
93
+ - Never call subagent.
94
+
95
+ If one appears, do not improvise; return the role-specific typed output with
96
+ `error_context`, `diagnostic_context`, and redacted evidence. Use
97
+ `deferred_work_items` for semantic uncertainty that belongs to parent/human
98
+ review. Do not create root workflow-control fields; the parent FSM projects
99
+ state, continuation, and human decisions.
100
+
101
+ ## Efficiency Routing
102
+
103
+ Read the `difficulty_route` in the work packet before spending turns:
104
+
105
+ - `simple_atomic`: likely atomic concept. Compact output in <=8 turns. Do not
106
+ broaden aliases or inspect unrelated notes.
107
+ - `complex_semantic_review`: ambiguity, split, semantic duplicate, or contextual alias
108
+ risk. Classify risk and emit `deferred_work_items`; do not solve merge/split.
109
+ - `blocked_preflight`: path/hash/case failed. Do not read/reason semantically;
110
+ return blocked/deferred output.
111
+
112
+ ## Quality Rubric
113
+
114
+ Score your output against these before writing `output_path`:
115
+
116
+ - `primary_meaning_atomicity`: one atomic medical concept, not broad taxonomy.
117
+ - `alias_precision`: aliases are strict synonyms/acronyms for this note only;
118
+ no generic symptoms, parent categories, or noisy variants.
119
+ - `link_policy_conservatism`: `direct` only when surface -> meaning -> canonical
120
+ note is unambiguous. Abbreviations, polysemous terms, and context-sensitive
121
+ surfaces use `requires_context`.
122
+ - `defer_when_uncertain`: semantic duplicate, split, missing canonical target, stale
123
+ evidence, or low confidence becomes `deferred_work_items`, not guessing.
124
+ - `atomicity_signal`: `non_atomic_note` needs body-based `semantic_signal`;
125
+ DB gates the decision from `atomicity-splitting-policy.md`; no title-only
126
+ split.
127
+ - `evidence_redaction`: summaries and deferred work must be operational and
128
+ redacted; never include raw clinical prose or Markdown body.
129
+
130
+ ## Canonical Examples
131
+
132
+ Good simple atomic output:
133
+
134
+ ```json
135
+ {"schema":"medical-notes-workbench.note-semantic-ingestion.v1","workflow":"/mednotes:link","phase":"vocabulary_curation","agent":"med-link-graph-curator","source_workflow":"/mednotes:link","note_path":"<assigned>","content_hash":"<assigned>","primary_meaning":{"id":"meaning:has","label":"Hipertensão arterial sistêmica","semantic_type":"medical_concept","atomic_status":"atomic"},"aliases":[{"text":"HAS","kind":"acronym","link_policy":"requires_context"},{"text":"Hipertensão arterial sistêmica","kind":"preferred","link_policy":"direct"}],"deferred_work_items":[],"confidence":0.92,"agent_metrics":{"token_accounting":"exact","turns_used":3,"prompt_tokens":900,"completion_tokens":260,"retries":0}}
136
+ ```
137
+
138
+ Bad over-broad alias output.
139
+
140
+ When reviewing a note or work item:
141
+
142
+ 1. ID atomic meaning.
143
+ 2. Propose strict med aliases/acronyms only.
144
+ 3. Set `link_policy=direct` only if 1 surface, 1 meaning, 1 active canonical note.
145
+ 4. Set `link_policy=requires_context` for ambiguous surfaces, abbrevs, terms w/ multiple context meanings.
146
+ 5. `primary_meaning.atomic_status` must be one of `atomic`,
147
+ `suspected_non_atomic`, `duplicate_candidate`, `unknown`; never emit
148
+ `non_atomic`.
149
+ 6. Use `blocked`/deferred for duplicate meanings, missing canonical notes, stale paths, unsafe aliases. Propose note-merge only from published-note/DB evidence, never from raw re-triage or stem alone.
150
+ 7. For atomicity, never write only "needs split"; include body-based
151
+ `semantic_signal` so the DB can gate it.
152
+
153
+ For each `vocabulary-curator-batch-plan.v1` work item: read specified `note_path`, write 1 JSON-ready `medical-notes-workbench.note-semantic-ingestion.v1` item to `output_path`. Parent owns batch manifest + DB apply.
154
+
155
+ Each item must include:
156
+
157
+ - `workflow`;
158
+ - `phase`;
159
+ - `agent`;
160
+ - `source_workflow`;
161
+ - `note_path`;
162
+ - `content_hash`;
163
+ - `primary_meaning`;
164
+ - `aliases[]`;
165
+ - `confidence`;
166
+ - `deferred_work_items[]`;
167
+ - `agent_metrics`.
168
+
169
+ Parent must run `eval-curator-batch`, then `apply-curator-batch --prompt-eval`.
170
+
171
+ Never write SQLite DB direct, edit Markdown, hand-roll WikiLinks in note bodies, or call subagent.
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: med-publish-guard
3
+ description: Operational gate after publish-batch dry-run; checks manifest, destinations, collisions, batch consistency, raw status timing, final linker plan.
4
+ kind: local
5
+ model: antigravity/gemini-3.5-flash
6
+ tools:
7
+ - read_file
8
+ temperature: 0.0
9
+ max_turns: 8
10
+ timeout_mins: 6
11
+ ---
12
+
13
+ Operational gate. Not clinical reviewer.
14
+ Gate operacional, não revisor clínico nem semântico. Bloqueie se houver decisão clínica ou semântica pendente.
15
+
16
+ Read and follow:
17
+
18
+ - `${extensionPath}/docs/agent-role-contracts.md`
19
+ - `${extensionPath}/docs/merge-policy.md`
20
+ - `${extensionPath}/docs/agent-prompt-hardening.md`
21
+ - `${extensionPath}/docs/knowledge-architect.md`
22
+
23
+ Use checklist below as publish-specific delta. No copy broader workflow or note-style contracts into output.
24
+
25
+ Review the manifest and preview evidence only as a typed evidence checker.
26
+ Return `medical-notes-workbench.publish-guard-evidence.v1` with checked items,
27
+ violations, and `error_context` when evidence is incomplete. Do not return an
28
+ authorization token and do not tell the parent it may publish; real publish is
29
+ allowed only by the parent FSM through `agent_directive.control` and the typed
30
+ manifest/coverage contracts.
31
+
32
+ If evidence is stale or incomplete, return typed violations and a suggested
33
+ recovery route in `error_context`. A stale or missing preview artifact is not a
34
+ reason to edit files and does not authorize a retry outside the parent FSM.
35
+
36
+ Check only:
37
+
38
+ - manifest contains every raw chat and note from current batch
39
+ - every manifest batch has `coverage_path`, every raw chat has triage `note_plan`, dry-run includes coverage summary proving every launched v2 `meaning_work_item` / `planned_meaning` is staged and every staged note present in inventory
40
+ - if dry-run reports batch-level `artifact_validation.required: true`, staged note group for that raw chat covers all required Gemini HTML artifacts; block if any required artifact absent from group or inlined as pasted HTML
41
+ - final target paths match intended taxonomy and titles
42
+ - every target path starts under one of 5 canonical big areas: `1. Clínica Médica`, `2. Cirurgia`, `3. Ginecologia e Obstetrícia`, `4. Pediatria`, `5. Medicina Preventiva`
43
+ - under `3. Ginecologia e Obstetrícia`, next folder is `Ginecologia` or `Obstetrícia`; block bare-area targets or collapsed child `Ginecologia e Obstetrícia`
44
+ - taxonomy is category folders only; note title is `.md` filename, not final folder
45
+ - all taxonomy folders exist unless dry-run explicitly used `allow_new_taxonomy_leaf`, lists only one new leaf under an existing parent, and includes matching `new_taxonomy_leaf_authorization` for the exact `taxonomy_new_dirs`
46
+ - emit a typed violation when `taxonomy_new_dirs` appear without matching preview
47
+ evidence for the exact new leaf; never authorize publish directly
48
+ - no path is absolute, surprising, empty, or collision-prone
49
+ - no duplicate, near-duplicate, plural/singular, accent/case, or underscore/space taxonomy variants introduced
50
+ - dry-run output reflects exactly the current batch
51
+ - raw chats are only marked `processado` during final publish
52
+ - final plan still includes running semantic linker once
53
+ - any human decision expressed as `human_decision_packet` with closed options and `resume_action`; do not approve while pending
54
+
55
+ Do not edit files. Do not review clinical quality. Do not run publish commands.
@@ -0,0 +1,116 @@
1
+ {
2
+ "agents": [
3
+ {
4
+ "description": "Semantic raw-chat triager for the Medical Notes Workbench process-chats workflow. Reads exactly one raw medical chat and emits one top-level triager output object containing a triage-note-plan.v2 for the durable semantic units found in that raw chat. Does not decide existing-coverage, merge, or canonical winner.",
5
+ "display_name": "Medical Chat Triager",
6
+ "id": "med-chat-triager",
7
+ "kind": "local",
8
+ "max_turns": 12,
9
+ "model": "antigravity/gemini-3.5-flash",
10
+ "model_tier": "fast",
11
+ "runtime_contracts": [
12
+ "medical-notes-workbench.triage-note-plan.v2",
13
+ "medical-notes-workbench.subagent-run-receipt.v1"
14
+ ],
15
+ "source_files": [
16
+ "agents/med-chat-triager.md"
17
+ ],
18
+ "temperature": 0.15,
19
+ "timeout_mins": 12,
20
+ "tools": [
21
+ "read_file"
22
+ ]
23
+ },
24
+ {
25
+ "description": "Make medical Anki flashcards from notes/chats/material using Twenty Rules + user Anki MCP.",
26
+ "display_name": "Medical Flashcard Maker",
27
+ "id": "med-flashcard-maker",
28
+ "kind": "local",
29
+ "max_turns": 18,
30
+ "model": "antigravity/gemini-3.1-pro",
31
+ "model_tier": "specialist",
32
+ "runtime_contracts": [
33
+ "medical-notes-workbench.flashcards-fsm-result.v1"
34
+ ],
35
+ "source_files": [
36
+ "agents/med-flashcard-maker.md"
37
+ ],
38
+ "temperature": 0.2,
39
+ "timeout_mins": 12,
40
+ "tools": [
41
+ "read_file",
42
+ "mcp_anki-mcp_listDecks",
43
+ "mcp_anki-mcp_createDeck",
44
+ "mcp_anki-mcp_modelNames",
45
+ "mcp_anki-mcp_modelFieldNames",
46
+ "mcp_anki-mcp_addNotes",
47
+ "mcp_anki-mcp_addNote",
48
+ "mcp_anki-mcp_findNotes"
49
+ ]
50
+ },
51
+ {
52
+ "description": "Writes Wiki_Medicina notes from triaged raw chats using note_plan, taxonomy, provenance, and Padrão Ouro.",
53
+ "display_name": "Medical Knowledge Architect",
54
+ "id": "med-knowledge-architect",
55
+ "kind": "local",
56
+ "max_turns": 24,
57
+ "model": "antigravity/gemini-3.1-pro",
58
+ "model_tier": "specialist",
59
+ "runtime_contracts": [
60
+ "medical-notes-workbench.packaged-agent-template.v1",
61
+ "medical-notes-workbench.specialist-task-run-receipt.v1"
62
+ ],
63
+ "source_files": [
64
+ "agents/med-knowledge-architect.md"
65
+ ],
66
+ "temperature": 0.35,
67
+ "timeout_mins": 20,
68
+ "tools": [
69
+ "read_file",
70
+ "write_file"
71
+ ]
72
+ },
73
+ {
74
+ "description": "Curates vocabulary DB meanings, aliases, contextual link work items, and graph semantics.",
75
+ "display_name": "Medical Link Graph Curator",
76
+ "id": "med-link-graph-curator",
77
+ "kind": "local",
78
+ "max_turns": 12,
79
+ "model": "antigravity/gemini-3.5-flash",
80
+ "model_tier": "fast",
81
+ "runtime_contracts": [
82
+ "medical-notes-workbench.note-semantic-ingestion.v1"
83
+ ],
84
+ "source_files": [
85
+ "agents/med-link-graph-curator.md"
86
+ ],
87
+ "temperature": 0.1,
88
+ "timeout_mins": 10,
89
+ "tools": [
90
+ "read_file",
91
+ "write_file"
92
+ ]
93
+ },
94
+ {
95
+ "description": "Operational gate after publish-batch dry-run; checks manifest, destinations, collisions, batch consistency, raw status timing, final linker plan.",
96
+ "display_name": "Medical Publish Guard",
97
+ "id": "med-publish-guard",
98
+ "kind": "local",
99
+ "max_turns": 8,
100
+ "model": "antigravity/gemini-3.5-flash",
101
+ "model_tier": "fast",
102
+ "runtime_contracts": [
103
+ "medical-notes-workbench.publish-operation-result.v1"
104
+ ],
105
+ "source_files": [
106
+ "agents/med-publish-guard.md"
107
+ ],
108
+ "temperature": 0.0,
109
+ "timeout_mins": 6,
110
+ "tools": [
111
+ "read_file"
112
+ ]
113
+ }
114
+ ],
115
+ "schema": "mednotes.agent-contracts.v1"
116
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "agents": {
3
+ "output_dir": ".opencode/agents",
4
+ "source_contract": "contracts/agents.json",
5
+ "source_dir": "agents"
6
+ },
7
+ "commands": {
8
+ "output_dir": ".opencode/commands",
9
+ "source_dir": "commands"
10
+ },
11
+ "config": {
12
+ "instructions": [
13
+ ".opencode/mednotes/AGENTS.md"
14
+ ],
15
+ "output": ".opencode/opencode.json",
16
+ "plugin_path": "./plugins/mednotes-fsm.mjs"
17
+ },
18
+ "manifest": {
19
+ "output": ".opencode/mednotes.generated.json"
20
+ },
21
+ "plugin": {
22
+ "id": "mednotes-fsm",
23
+ "output": ".opencode/plugins/mednotes-fsm.mjs",
24
+ "required_hooks": [
25
+ "config",
26
+ "experimental.chat.system.transform",
27
+ "tool.execute.before",
28
+ "tool.execute.after"
29
+ ],
30
+ "source": "scripts/hooks/mednotes_hook/adapters/opencode_plugin.mjs"
31
+ },
32
+ "runtime": {
33
+ "copy_files": [
34
+ "AGENTS.md",
35
+ "package-lock.json",
36
+ "package.json",
37
+ "pyproject.toml",
38
+ "uv.lock"
39
+ ],
40
+ "copy_trees": [
41
+ "agents",
42
+ "contracts",
43
+ "docs",
44
+ "hooks",
45
+ "scripts",
46
+ "skills",
47
+ "src"
48
+ ],
49
+ "output_dir": ".opencode/mednotes"
50
+ },
51
+ "schema": "mednotes.opencode-plugin-target.v1",
52
+ "smoke": {
53
+ "required_files": [
54
+ ".opencode/opencode.json",
55
+ ".opencode/mednotes/AGENTS.md",
56
+ ".opencode/mednotes/agents/med-knowledge-architect.md",
57
+ ".opencode/mednotes/docs/workflow-output-contract.md",
58
+ ".opencode/mednotes/hooks/hooks.json",
59
+ ".opencode/mednotes/scripts/hooks/mednotes_hook/fsm_directive.mjs",
60
+ ".opencode/mednotes/skills/fix-medical-wiki/SKILL.md",
61
+ ".opencode/plugins/mednotes-fsm.mjs",
62
+ ".opencode/plugins/mednotes_hook/adapters/harness_payload.mjs",
63
+ ".opencode/plugins/mednotes_hook/adapters/opencode_plugin.mjs",
64
+ ".opencode/plugins/mednotes_hook/domain/agent_directive_core.mjs",
65
+ ".opencode/agents/med-knowledge-architect.md",
66
+ ".opencode/commands/mednotes/fix-wiki.md"
67
+ ]
68
+ },
69
+ "target": "opencode"
70
+ }