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,779 @@
1
+ # Workflow Output Contract
2
+
3
+ ## Princípio
4
+
5
+ Resposta: resumo curto, sem dump de JSON/log salvo pedido.
6
+ Resumo: aconteceu, não aconteceu, decisão faltante.
7
+
8
+ A UX pública é guiada: O usuário não precisa saber subcomandos, flags,
9
+ `dry-run`, recibos, schemas, hashes, `uv`, Git ou cache. Traduza para "vou
10
+ preparar o ambiente", "vou mostrar prévia", "nada foi alterado", "confirme para
11
+ aplicar" e "próxima ação".
12
+ Não use relatório público técnico como "Status e Metadados",
13
+ "Pacote de Decisão Humana", "Diretrizes de Apply", "Blockers", "Desvios de
14
+ Contrato" ou "Artefatos Oficiais", salvo debugging/laboratório.
15
+ Formato público padrão:
16
+
17
+ - uma frase dizendo se algo foi alterado ou se foi só conferência;
18
+ - o que foi corrigido ou preparado;
19
+ - o que ainda impede concluir o objetivo;
20
+ - continuação automática, quando houver;
21
+ - a próxima decisão humana real.
22
+
23
+ Resposta pública padrão deve vir de `reports.public_report.lines` quando esse
24
+ campo existir. Comandos literais, flags, schemas, recibos, hashes e paths ficam
25
+ no canal agente/debug ou em relatório de laboratório, nunca no texto padrão do
26
+ usuário. Decisões humanas usam `decision.reason_code` e
27
+ `human_decision_packet` como fonte operacional, mas esses nomes não apareçam como texto cru:
28
+ mostre a pergunta, opções fechadas, item afetado e como retomar em linguagem humana.
29
+
30
+ Em resposta pública, não exponha `run_id`, `guard_lease`, lease id/path,
31
+ hash de `restore_point_id`, `snapshot_hash` ou paths de cache salvo debugging.
32
+ Traduza para "ponto de restauração criado", "proteção do vault encerrada" ou
33
+ "rollback disponível". Não escreva identificador curto de ponto de restauração
34
+ como `7da9fcf`; é debug.
35
+ Ao listar `run-finish`: `--run-id <run_id>`, nunca o valor literal.
36
+
37
+ ## API obrigatória
38
+
39
+ Workflows FSM-first usam a FSM como estado operacional. Para esses workflows, a
40
+ API raiz canônica é: `progress_view_model`, `state_machine_snapshot`,
41
+ `decision`, `receipt`, `reports`, `agent_directive`, `artifacts`,
42
+ `diagnostic_context` e `error_context`. `diagnostic_context` e `error_context`
43
+ só aparecem quando houver causa acionável, erro, bloqueio, aviso, desvio ou
44
+ investigação.
45
+
46
+ Regra curta de boundary:
47
+
48
+ Adapter detecta fato. FSM decide política. CLI executa efeito.
49
+
50
+ Sem WorkflowEffect emitido pela FSM, não existe recovery automático.
51
+
52
+ blocked_reason, next_action, status e operation_payload não autorizam retry/recovery/apply.
53
+
54
+ O grupo FSM-first atual/alvo deste contrato inclui `/mednotes:fix-wiki`,
55
+ `/mednotes:link`, `/mednotes:process-chats`, `/mednotes:link-related`,
56
+ `/flashcards`, `/mednotes:setup` e `/mednotes:history`. Enquanto um desses
57
+ fluxos ainda estiver em migração, qualquer campo legado preservado é evidência
58
+ de auditoria ou compatibilidade temporária; ele não é root truth e não pode
59
+ autorizar continuação, sucesso, bloqueio, mutação ou mensagem final.
60
+
61
+ `schema` pode existir como identificador técnico de versão do payload; ele não
62
+ é estado, fase, blocker nem autorização de continuação. Campos raiz legados como
63
+ `phase`, `status`, `blocked_reason`, `next_action`, `required_inputs` e
64
+ `human_decision_required` só continuam aceitáveis em comandos não-FSM ou em
65
+ adapters transitórios explicitamente marcados como legado. Eles não devem ser
66
+ reintroduzidos como contrato público dos workflows FSM-first. Bloqueio por
67
+ agente, retry, erro ou contrato quebrado inclui `error_context`; escolha humana
68
+ inclui `human_decision_packet`.
69
+ Continuação assistida por subagente em workflow FSM-first usa
70
+ `agent_directive.control.effects`, diferente de orientação humana em
71
+ `decision.next_action` e de decisão humana.
72
+
73
+ `diagnostic_context` é opcional e só deve aparecer quando houver problema,
74
+ bloqueio, falha, aviso, desvio ou investigação. Ele não carrega
75
+ `agent_directive`, não é sinônimo de contexto adicional e nunca contém plano
76
+ executável para hook/agente.
77
+ `diagnostic_context.effect_results` é operador, não público.
78
+ Quando `effect_results[]` existir, `payload.operation_payload` é evidência de
79
+ auditoria, não verdade de controle. O adapter precisa validar output
80
+ operacional privado em payload Pydantic específico antes de decidir status,
81
+ recibo, retomada ou próxima ação. Falha nessa camada aparece como
82
+ `error_context.root_cause=effect_payload_contract_invalid` e deve ser reportada
83
+ como bug de workflow/stack.
84
+ Quando houver `workflow_exit_code`, trate-o como resultado do workflow, nunca
85
+ como warning.
86
+ Workflows FSM-first expõem `agent_directive` como contrato raiz único
87
+ FSM -> agente consumível por automação. Consumidores usam
88
+ `agent_directive.control` para enforcement e validação, e podem renderizar
89
+ `agent_directive.instructions` como contexto para o modelo. Não parseie
90
+ relatórios humanos nem preâmbulos em stderr para decidir o estado do workflow.
91
+ Para continuação assistida, `agent_directive.instructions` deve reforçar que o
92
+ parent usa o efeito `call_specialist_model` ou agente empacotado do harness,
93
+ não fabrica prompt curto de subagente, e não cola Markdown bruto de nota em
94
+ `invoke_agent`, `invoke_subagent` ou `send_message`. No AGY,
95
+ `define_subagent` só é aceitável quando o parent leu o template empacotado e
96
+ usou o conteúdo completo com
97
+ `packaged_agent_template_contract: medical-notes-workbench.packaged-agent-template.v1`.
98
+ Depois que o subagente AGY escreve `temp_output`, o parent chama
99
+ `finalize-agy-specialist-task` com transcript/task log oficial, e `--runtime-log`
100
+ quando houver janela AGY settings switch, para gerar o
101
+ `specialist-task-run-receipt.v1`; não cria, copia ou edita esse recibo à mão.
102
+ No OpenCode, o parent chama a tool `task` somente no harness OpenCode, com
103
+ prompt igual ao item tipado emitido pela FSM e sem Markdown bruto/chat bruto no
104
+ prompt. Para `fix-wiki`/`style_rewrite`, o objeto JSON raiz deve conter somente
105
+ `current_batch_items`; campos como `target_path`, `rewrite_prompt`,
106
+ `temp_output` e `subagent_output_contract` aparecem apenas dentro do item.
107
+ Para `process-chats`/`architect`, o item vem do plano de architect oficial e
108
+ carrega `work_id`, `raw_file`, `temp_output`, `coverage_path`, `taxonomy`,
109
+ `write_policy` e `expected_output_schema`. Flash pode orquestrar, mas a autoria
110
+ especialista não pode cair para Flash/Lite/Nano. Depois da task, o parent chama
111
+ o finalizer da fase executada: `finalize-opencode-specialist-task` para
112
+ `style_rewrite` e `finalize-opencode-architect-task` para `architect`. O modelo
113
+ efetivo vem do metadata OpenCode capturado pelo hook nativo por `work_id`, não
114
+ de texto manual nem de JSON escrito pelo agente. `--task-metadata` é override
115
+ técnico para diagnóstico, não a rota normal do workflow. O parent não faz probe
116
+ de `hook-state/opencode-task-metadata` com `ls`, `test`, `stat`, `cat`, `find`,
117
+ `grep` ou equivalente antes do finalizer; o próprio finalizer valida a metadata
118
+ capturada e bloqueia se ela estiver ausente ou inválida.
119
+ No Gemini CLI, `style_rewrite` consome o efeito `call_specialist_model` com
120
+ um único `current_batch_items[]` e o especialista empacotado. O agente não
121
+ fabrica prompt curto de subagente em nenhuma rota.
122
+ O contrato operacional deve passar exatamente um item completo de
123
+ `agent_directive.control.effects[].payload.current_batch_items[]` por chamada,
124
+ incluindo `work_id`, `target_path`, `target_hash_before`, `rewrite_prompt`,
125
+ `temp_output`, `specialist_task_run_receipt_path` e
126
+ `subagent_output_contract`. Prompt
127
+ artesanal que resume, reescreve ou omite campos do work item é bug de contrato.
128
+ Quando esse item já existe, `glob`, `grep`, `list_dir` ou busca equivalente no
129
+ parent para redescobrir alvo, rota ou finalizer é desvio de contrato.
130
+ Se o runtime não expuser o template/agente ou modelo esperado, reporte o
131
+ bloqueio em vez de contornar com conteúdo copiado.
132
+ Quando `MEDNOTES_AGENT_PREAMBLE=stderr` estiver habilitado, a CLI pode
133
+ renderizar um preambulo agent-facing antes do JSON em stderr. Esse preambulo e
134
+ apenas uma renderizacao de `agent_directive.instructions`:
135
+ ele nao muda schema, status, exit code, retomada nem autorizacao. Stdout segue
136
+ JSON puro. Nao use como UX publica padrao. Em workflows longos, ele reforça:
137
+ aguarde JSON final.
138
+ Em workflow FSM-first, `decision.kind=ask_human` sem
139
+ `human_decision_packet` é bug. Sem opções fechadas, não fabrique decisão humana:
140
+ retorne uma `decision` operacional com `reason_code`/`next_action` ou um
141
+ `WorkflowEffect` retomável.
142
+
143
+ `ask_human` é último recurso. Antes, use `auto_fix`, `auto_defer` ou
144
+ `auto_plan` quando seguro. Decisão humana sem contexto, opções fechadas e prova
145
+ de insegurança automática é bug do workflow.
146
+
147
+ `blocked`/`failed` sem `decision.next_action`, `resume_action` ou efeito de
148
+ recuperação é bug do workflow. A fonte nativa do workflow emite a ação; a
149
+ camada comum só converte para `contract_gap.missing_next_action`, preservando o
150
+ motivo original em `diagnostic_context.contract_gap`.
151
+ Compatibilidade de auditoria: `blocked`/`failed` sem `next_action` é bug do
152
+ workflow quando o payload ainda estiver em migração; normalize para
153
+ `decision.next_action`, `resume_action` ou efeito retomável. Quando houver
154
+ múltiplas causas, preserve `blocking_reasons[]` como evidência diagnóstica, mas
155
+ não use esse array como estado paralelo.
156
+ Frase legada preservada para auditoria de corpus: `next_action` orienta apenas
157
+ normalização para `decision.next_action`; não autoriza execução automática.
158
+ O contrato canônico confirma que não há comando automático legado a executar.
159
+ `blocked`/`failed` sem `next_action` é bug do workflow. Campos diagnósticos como
160
+ `primary_human_decision_kind` ajudam a explicar a causa, mas a escolha humana
161
+ canônica continua em `decision` e `human_decision_packet`.
162
+
163
+ ### Layered readiness
164
+
165
+ For public workflow reports, separate readiness by layer before summarizing:
166
+ Python environment, index, vault protection, linker, Related Notes, specialist capacity.
167
+ Do not collapse a green environment layer into workflow success. A report can say
168
+ "ambiente pronto" only for that layer; if linker, vocabulary curation, Related
169
+ Notes export, or specialist capacity is blocked, the workflow status remains
170
+ blocked or waiting.
171
+
172
+ Public reports must expose one current workflow status, one current blocker and
173
+ one next action. Additional layers may appear as short supporting bullets. If
174
+ the payload contains `error_context.root_cause`, `decision.reason_code`,
175
+ typed Related Notes evidence derived from the FSM, or specialist quota data,
176
+ use those fields before free-form narrative. Do not read legacy
177
+ `related_notes_sync.status` as root truth; if it still exists during migration,
178
+ it must be normalized into a typed FSM field or kept as opaque audit evidence.
179
+
180
+ Repeated `uv run` package repair output such as missing `RECORD`, repeated
181
+ uninstall/install, or Windows `Acesso negado` is diagnostic evidence. Report it
182
+ as environment warning or environment blocker; never use a later JSON success to
183
+ erase the warning.
184
+
185
+ ### Installed extension bundle safety
186
+
187
+ Agents must not patch the installed extension bundle as a repair path. Forbidden
188
+ targets include `~/.gemini/extensions/medical-notes-workbench`,
189
+ `~/.gemini/config/plugins/medical-notes-workbench`,
190
+ `C:\\Users\\leo\\.gemini\\extensions\\medical-notes-workbench`, and
191
+ `C:\\Users\\leo\\.gemini\\config\\plugins\\medical-notes-workbench`.
192
+
193
+ Patch canonical source under bundle/ in the repository, then rebuild,
194
+ publish, reinstall, or sync through the official distribution path. If a public
195
+ workflow discovers an installed-bundle code issue, report
196
+ `installed_extension_runtime_edit_forbidden` with the canonical source file and
197
+ stop before editing the installed copy.
198
+
199
+ Artefato sem `agent_directive` canônico não autoriza execução. Normalize na
200
+ borda para o contrato FSM-first ou bloqueie como contrato inválido; não converta
201
+ campos textuais em comando executável.
202
+ Em workflow FSM-first, continue automaticamente só com JSON fresco contendo
203
+ `agent_directive.control.status=waiting_agent`,
204
+ `agent_directive.control.capabilities.continue=true` e efeito executável em
205
+ `agent_directive.control.effects[]`, sem decisão humana e com pedido original
206
+ permitindo continuidade. Sem efeito executável, em prévia, decisão humana ou
207
+ espera externa: reporte e pare. Quando houver efeito executável, a FSM deve usar
208
+ `progress_view_model.status=waiting_agent`,
209
+ `state_machine_snapshot.current_category=waiting_agent` e
210
+ `progress_view_model.can_continue_now=true`; `blocked` ou
211
+ `can_continue_now=false` com efeito executável é bug.
212
+ `call_specialist_model`: ausência de runner Python oficial não é cota cheia.
213
+ Se o plano estiver executável, use `waiting_agent`, `can_continue_now=true` e
214
+ `agent_directive.control.effects[]` para o harness atual chamar o
215
+ especialista empacotado. Só use `waiting_external` depois de tentativa real do
216
+ runtime/subagente falhar por quota, capacidade ou modelo indisponível.
217
+ Quando `call_specialist_model` estiver pronto, o agente deve continuar pelo
218
+ harness atual. Gemini CLI usa o especialista empacotado com o item tipado do
219
+ efeito; AGY usa o template empacotado e subagente do próprio AGY, seguido de
220
+ `finalize-agy-specialist-task`; OpenCode usa `task` somente se o usuário já
221
+ estiver em OpenCode, seguido do finalizer OpenCode específico da fase sem
222
+ metadata manual. O hook OpenCode materializa a evidência oficial da task.
223
+ Nenhum harness deve exigir instalação de outro para concluir o workflow. Em
224
+ `style_rewrite`, a evidência normalizada entra em
225
+ `medical-notes-workbench.specialist-task-run-receipt.v1`; em `architect`, o
226
+ finalizer emite recibo local de task e o próximo passo serial de `stage-note`,
227
+ sem substituir a FSM de `process-chats` como fonte de verdade.
228
+ Para `fix-wiki`/`style_rewrite`, `current_batch_items` é o lote humano de
229
+ progresso, não permissão para disparar todos os especialistas ao mesmo tempo.
230
+ No Gemini CLI, invoque o especialista empacotado para um item por vez usando o
231
+ JSON de `agent_directive.control.effects[].payload.current_batch_items[]`,
232
+ aguarde o `specialist-task-run-receipt.v1` oficial do item anterior e só então
233
+ avance. O agente não deve adicionar `sleep`, `&&`, `;` ou parâmetro inventado
234
+ como `wait_for_previous`. Não gere prompt manual substituto para o
235
+ especialista. Se o recibo não aparecer, pare e reporte o bloqueio; não lance
236
+ outro especialista nem fabrique recibo.
237
+ No AGY, leia `agents/med-knowledge-architect.md`, chame `define_subagent` com
238
+ o template completo, invoque exatamente um item tipado por vez com `Prompt`
239
+ igual ao JSON do `current_batch_items[]` e aguarde o `temp_output`. Em seguida execute
240
+ `finalize-agy-specialist-task --plan <plan> --work-id <work_id> --transcript
241
+ <agy-transcript-or-task-log> [--runtime-log <agy-cli.log>] --json`. Se o
242
+ transcript/runtime log não trouxer modelo observado suficiente, bloqueie
243
+ `agy_specialist_model_evidence_missing`; se o runtime log mostrar modelo
244
+ diferente do solicitado, bloqueie `agy_specialist_model_evidence_mismatch`.
245
+ Não aceite alegação manual de modelo.
246
+ Se o subprocesso especialista expirar depois de escrever `temp_output`, o
247
+ runner oficial ainda pode finalizar a fronteira de recibo desde que consiga
248
+ validar o Markdown, extrair metadado de modelo do transcript e assinar
249
+ `specialist-task-run-receipt.v1`. Nesse caso `status=completed` do runner é
250
+ entrada tipada para a FSM emitir o próximo `WorkflowEffect`; ele não autoriza
251
+ execução direta fora de `agent_directive.control.effects[]`. O agente não deve
252
+ tratar o timeout bruto como falha quando o payload oficial já voltou concluído.
253
+ O payload de `style_rewrite` recebido em `agent_directive.control.effects[]`
254
+ deve estar fresco contra a versão final da nota naquele payload. Se
255
+ o runtime especialista retornar
256
+ `style_rewrite_stale_target_hash`, não trate como falha clínica nem fabrique
257
+ output: replaneje somente o lote de reescrita pela rota oficial e retome o
258
+ mesmo workflow. Se o runner retornar `specialist_model_quota_exhausted`, reporte
259
+ como espera externa por capacidade do modelo especialista; não chame Flash, não
260
+ use `invoke_agent` nativo e não marque o workflow como concluído.
261
+ Quando a invocação especialista retornar `status=completed`, entregue o recibo
262
+ validado à FSM e continue pelo `WorkflowEffect` de apply que ela projetar em
263
+ `agent_directive.control.effects[]`. `next_apply_step.arguments`, quando existir
264
+ em payload de runner durante a migração, é apenas a origem tipada desse efeito,
265
+ não uma segunda API executável. Não leia manifest/plan, não rode
266
+ `fix-wiki --apply`, não chame `plan-subagents` e não lance outro especialista
267
+ antes desse apply. O recibo já foi validado pelo runner oficial; probes
268
+ intermediários são atrito de UX e podem deixar a fila stale.
269
+ Com `MEDNOTES_AGENT_STDOUT=compact`, `apply-specialist-style-rewrite` emite
270
+ `medical-notes-workbench.style-rewrite-atomic-apply-agent-stdout.v1`, não o
271
+ payload completo de linker. Esse stdout traz `agent_directive` no root para o
272
+ hook atualizar a FSM. Se houver efeito `call_specialist_model`, continue por
273
+ `agent_directive.control.effects[].payload.current_batch_items` sem reler
274
+ plano/manifest e sem validar relatório final. Se o lote acabou, reporte o
275
+ checkpoint humano do lote com qualidade da nota, preservação de
276
+ YAML/proveniência/links, estado honesto do grafo/linker e itens restantes; só
277
+ então execute o efeito `run_subworkflow` em `agent_directive.control.effects[]`
278
+ para planejar a próxima leva. O `plan-output-receipt.v1` do próximo lote carrega
279
+ `agent_directive` com efeito especialista tipado; o hook OpenCode
280
+ reinjeta esse pacote após compactação de contexto, e o agente não deve
281
+ reconstruí-lo por histórico, arquivos privados ou prompts anteriores. Não rode
282
+ `fix-wiki --apply` no meio da fila.
283
+ Em workflow com guard, `run-finish` é a última operação: não finalize antes de
284
+ executar ou bloquear a continuação de um efeito pronto.
285
+ Com `decision.kind=ask_human`, `decision.next_action` descreve decisão
286
+ pendente, não `plan-subagents`, `apply-*`, `run-linker`, `fix-wiki --apply` ou
287
+ efeito executável. Payload técnico não-FSM com flag de decisão humana deve ser
288
+ normalizado para `decision`/`human_decision_packet` antes de dirigir qualquer
289
+ fluxo.
290
+ Detalhe `human_decision_packet`: pergunta, opções fechadas, itens/evidência
291
+ afetados, automações rejeitadas e retomada. Se a decisão humana não explicar
292
+ por que `auto_fix`, `auto_defer` ou `auto_plan` eram inseguros, reporte possível
293
+ bug de UX.
294
+
295
+ ### `/mednotes:fix-wiki`
296
+
297
+ Output canônico: `medical-notes-workbench.fix-wiki-fsm-result.v1`. Reporte
298
+ `progress_view_model.status`, `state_machine_snapshot.current_category`,
299
+ `decision.reason_code`, `decision.next_action` e `human_decision_packet` quando
300
+ existirem. Nunca transforme tool success em sucesso do workflow nem derive
301
+ comando de texto livre.
302
+ Use `agent_directive.control` como cartão operacional do agente. Se
303
+ `control.status=waiting_agent`,
304
+ `control.capabilities.continue=true` e `control.effects` contém
305
+ `call_specialist_model`, o próximo passo é executar os efeitos oficiais
306
+ indicados pela FSM antes do relatório final. Se `control.status` for `blocked`,
307
+ `waiting_external`, `waiting_human` ou `failed`, use `control.blockers`,
308
+ `control.resume` e `summary` para reportar o bloqueio sem inventar comando
309
+ alternativo.
310
+
311
+ Se `progress_view_model.status` for `waiting_external`, `waiting_human` ou
312
+ `blocked`, reporte progresso parcial, decisão humana ou bloqueio literal e
313
+ pare. Em mutação com Git disponível, confira
314
+ `version_control_mutation_summary`; reporte divergência de contadores,
315
+ deleções ou arquivos inesperados.
316
+
317
+ Todo relatório final de `/mednotes:fix-wiki` deve responder o objetivo
318
+ primário antes de discutir detalhes internos:
319
+
320
+ - fixou a Wiki ou não;
321
+ - o que foi realmente alterado no vault;
322
+ - se o grafo terminou melhor, limpo ou ainda bloqueado;
323
+ - se `Notas Relacionadas` foi atualizado, ficou pendente ou aguarda cota.
324
+
325
+ Quando houver reescrita de nota, o relatório também deve incluir auditoria de
326
+ conteúdo do lote aplicado: se cada nota realmente resolveu a pendência indicada,
327
+ se preservou YAML/proveniência/links e se a qualidade médica/didática ficou boa
328
+ para estudo. Nota formalmente válida mas ruim deve ser reportada como bug de
329
+ UX/conteúdo.
330
+
331
+ O payload de validação pós-run inclui
332
+ `fix-wiki-primary-objective-summary`; use-o como fonte tipada para esse resumo.
333
+ Se `Related Notes` estiver em `waiting_external` por quota/embeddings, omitir a
334
+ cota é bug de relatório.
335
+
336
+ Quando o validador emitir `workflow-public-report-view-model`, use esse objeto
337
+ como fonte da resposta pública: `objective_answer` responde se fixou,
338
+ `mutation_summary` diz o que mudou, `remaining_work_summary` diz o que falta,
339
+ `next_step_summary` diz como continuar e `user_attention_required` decide se o
340
+ usuário realmente precisa agir. Não substitua esse resumo por bloco técnico
341
+ extraído de JSON bruto.
342
+
343
+ ### `/mednotes:process-chats`
344
+
345
+ Output canônico: `medical-notes-workbench.process-chats-fsm-result.v1`.
346
+ Reporte `progress_view_model.status`, `progress_view_model.state`,
347
+ `state_machine_snapshot.current_category`, `decision.reason_code`, `receipt`,
348
+ `reports`, `agent_directive`, `artifacts`, `diagnostic_context` e
349
+ `error_context`. Nunca leia `status`, `phase`, `next_action`,
350
+ `dry_run_receipt`, `publish_receipt`, `linker_applied` ou `linker_*_path` como
351
+ campos raiz do resultado público.
352
+
353
+ O resultado privado de `publish-batch` consumido por essa FSM é tipado por
354
+ `medical-notes-workbench.process-chats-publish-operation-result.dev.v1`.
355
+ Contadores, status, recibo, dry-run receipt, taxonomia canonicalizada, raw
356
+ updates e linker run não devem ser lidos de dicionário cru para decidir UX ou
357
+ exit code.
358
+
359
+ Todo relatório final de `/mednotes:process-chats` deve responder o objetivo
360
+ primário antes de discutir detalhes internos:
361
+
362
+ - publicou notas ou só preparou prévia;
363
+ - quais raw chats foram cobertos/processados;
364
+ - o que foi realmente escrito na Wiki;
365
+ - se coverage/manifest/staged notes batem;
366
+ - se linker/grafo rodou, ficou limpo ou ficou pendente.
367
+
368
+ O payload de validação pós-run inclui
369
+ `process-chats-primary-objective-summary`; use-o como fonte tipada para esse
370
+ resumo. `ready_to_publish` não é conclusão; `completed_with_link_blockers`
371
+ significa publicação feita com linker/grafo ainda pendente.
372
+
373
+ Quando o validador emitir `workflow-public-report-view-model`, use esse objeto
374
+ como fonte da resposta pública: ele já traduz publicação, escrita na Wiki,
375
+ pendências de coverage/linker e necessidade real de atenção humana. O agente não
376
+ deve pedir intervenção só porque uma etapa interna está pendente se a FSM ainda
377
+ tem continuação segura.
378
+
379
+ Ausência de efeito executável com rota de retomada preenchida não é fim do
380
+ relatório nem "nada a dizer". Em mutação bloqueada por decisão humana, o Bloco
381
+ 2 da resposta declara: "Nenhuma próxima ação automática agora; após decisão,
382
+ retomar pelo workflow oficial." A rota de retomada orienta o pós-decisão, não
383
+ autoriza execução paralela; nunca transforme orientação de retomada em execução
384
+ automática sem resposta humana registrada.
385
+
386
+ ### `/mednotes:link`
387
+
388
+ Output canônico: `medical-notes-workbench.link-fsm-result.v1`. Reporte
389
+ `progress_view_model.status`, `state_machine_snapshot.current_category`,
390
+ `decision`, `human_decision_packet` e `receipt`; payload bruto de auditoria
391
+ do linker, quando necessário para diagnóstico, fica apenas em payload opaco
392
+ como `diagnostic_context.link_audit_payload`, nunca como fonte de decisão. Em
393
+ `waiting_external`, reporte progresso parcial e não declare sucesso. Em
394
+ `blocked`, use
395
+ `decision.reason_code`/`decision.next_action`; apply parcial, tool success ou
396
+ recibo escrito não concluem o workflow.
397
+
398
+ ## Sequência
399
+
400
+ 1. Separe status da ferramenta, exit code do processo e status semântico do
401
+ workflow. `tool status=success` só quer dizer que a chamada retornou; se o
402
+ output FSM trouxer `progress_view_model.status=blocked`,
403
+ `progress_view_model.status=failed` ou `state_machine_snapshot.current_category`
404
+ bloqueante, reporte o bloqueio. Em comandos legados transitórios, trate JSON
405
+ `status=blocked`/`failed` como entrada de migração, não como contrato
406
+ canônico.
407
+ 2. Em workflow FSM-first, identifique `progress_view_model.status`,
408
+ `progress_view_model.state`, `state_machine_snapshot.current_category`,
409
+ `decision.reason_code` e `decision.next_action`; trate a próxima ação como
410
+ pendente, nunca como já executada.
411
+ 3. Em relatório técnico/debugging de fluxo legado, reflita `blocked_reason`,
412
+ `required_inputs` e `human_decision_required` somente como compatibilidade
413
+ transitória. Em FSM-first, use `decision`, `human_decision_packet` e
414
+ `error_context`. Decisão humana nunca é concatenada ao reason code; se houver
415
+ lista de razões, mostre-a como evidência, mantendo a decisão oficial da FSM
416
+ como rótulo primário.
417
+ 4. Em workflow FSM-first, continue só com
418
+ `agent_directive.control.effects[]` executável; senão pergunte/confirme ou
419
+ mostre `human_decision_packet`.
420
+
421
+ Na resposta pública final, nunca anexe bloco diagnóstico, JSON, XML, YAML ou
422
+ campos técnicos como `blocked_reason`, `receipt`, `schema`, `hash`,
423
+ `progress_view_model` ou caminhos locais. Esses detalhes pertencem ao log,
424
+ relatório técnico ou JSON de validação. A resposta do usuário deve ser uma
425
+ síntese humana do que foi corrigido, do que ficou pendente e de como retomar.
426
+
427
+ Em experimentos controlados, a resposta final também deve citar a métrica de
428
+ happy path quando o relatório for para o mantenedor: total de runs, runs happy,
429
+ prevalência em porcentagem e principais categorias de desvio. Na UX pública
430
+ normal, essa métrica não aparece; ela é instrumento de qualidade do produto.
431
+
432
+ Em diagnóstico read-only com `--json`, a resposta pública continua curta:
433
+ nenhuma alteração feita, principais achados e próxima ação. Os 5 blocos de
434
+ `Diagnóstico Read-Only` são debugging, não resposta padrão.
435
+
436
+ Em workflow mutante, resposta prioriza o objetivo. O
437
+ `Esqueleto Da Resposta (Mutação)` é formato de debugging; não use como default.
438
+ Em debug, o `Exit Code:` principal entra no Bloco 1, mesmo
439
+ quando é 3 ou outro ≠ 0; tool errors auxiliares entram no Bloco 4.
440
+
441
+ Antes da resposta final, varra `tool_result`; em geral só `status=error` vira
442
+ `warnings de execução`; nunca promova `status=success` a warning fora da exceção
443
+ estreita abaixo e não invente warning de ferramenta que não foi chamada. Exceção estreita:
444
+ em `/mednotes:fix-wiki` linear, `tracker_create_task`/`tracker_update_task`/`tracker_visualize`
445
+ bem-sucedidos também são atrito de rota e devem aparecer como baixo impacto. Em mutação, warnings vão ao Bloco 4.
446
+ `update_topic` segue a mesma política de redação. Em saída pública, não inclua `run_id`,
447
+ hashes, comandos, paths de script ou flags em título,
448
+ summary ou strategic intent. Liste
449
+ evidência:
450
+
451
+ - comandos falhos: comando, exit code, fase, resumo;
452
+ - `Exit Code: 3` do CLI com JSON `status=blocked` é o processo sinalizando
453
+ blocker de validação; reporte no status do workflow (Bloco 1 em mutação),
454
+ nunca como "warning de execução" auxiliar ou Bloco 4;
455
+ - tool calls `status=error`, incluindo `invalid_tool_params`,
456
+ `tracker_update_task`, `update_topic` e `read_file` fora do workspace, com
457
+ resumo. `read_file` fora do workspace em YOLO pode ser baixa severidade, mas
458
+ ainda entra em `warnings de execução`;
459
+ - no `/mednotes:fix-wiki` linear, uso de `tracker_create_task`,
460
+ `tracker_update_task` ou `tracker_visualize` é atrito de UX mesmo com
461
+ `status=success`; `update_topic` bem-sucedido continua normal;
462
+ - erro inicial continua sendo achado mesmo se comando posterior recupera;
463
+ - `;`/`&&` mascaram exit code; prefira uma ferramenta por comando auditável;
464
+ - em pedido explícito de `fix-wiki --dry-run`, não rode bateria diagnóstica antes
465
+ do `fix-wiki --dry-run --json`, salvo se JSON fresco do próprio `fix-wiki`
466
+ pedir;
467
+ - em pedido explícito de `/mednotes:fix-wiki --apply`, não use `--dry-run`;
468
+ use run-start/run-finish com `run_id` literal e não vazio; não normalize nem
469
+ remova separadores do `run_id`; `--run-id ""` é blocker; payload bloqueado é
470
+ apply bloqueado;
471
+ - não execute `cli.py` diretamente; `Permission denied`/`Exit Code: 126`
472
+ continua falha real depois de retry;
473
+ - comando oficial usado: escreva o executado, não o ideal;
474
+ - em saída pública normal, não liste comandos internos, `node`, paths de script,
475
+ `--json`, `run-start` ou `run-finish`; traduza para "preparei a proteção",
476
+ "executei o reparo" e "encerrei a proteção". Comandos literais ficam só para
477
+ debugging/laboratório;
478
+ - prompts suspeitos; scripts suspeitos: path + trecho;
479
+ - sem dono preventivo: "Nenhum prompt ou script encarregado de prevenir este comportamento foi identificado".
480
+
481
+ Campos `null` inesperados são falha de schema. Rotule artefato stale. Se output
482
+ fresco e artefato salvo divergem, reporte a divergência e use o fresco. Toda conclusão precisa ter o mesmo escopo da evidência: não diga "total", "integral" ou "rigorosamente respeitado" quando
483
+ auditou só parte, houve path fora do escopo ou faltou artefato.
484
+
485
+ Backups `.bak` novos não fazem parte dos workflows protegidos por vault guard.
486
+ `.bak`/`.old` legados são pendência de higiene explícita, não mutação
487
+ automática de `fix-wiki`; `final_validation.hygiene.bak_or_rewrite` é apenas
488
+ sinal técnico de legado pendente. Não derive contagem de backups de
489
+ `changed_count`, `written_count` ou `total_changed_count`.
490
+
491
+ ## Matriz De Estado
492
+
493
+ - ✅ `progress_view_model.status=completed`/`published`: só diga aplicado/concluído com mutação
494
+ finalizada, validação e fechamento.
495
+ - 👀 `progress_view_model.status=preview_ready`/`ready_to_publish`: diga que nada foi escrito e peça a
496
+ decisão de aplicar, publicar, restaurar, gravar no Anki ou descartar.
497
+ - ⚠️ `completed_with_link_blockers`/warnings: diga o que foi feito e o que
498
+ ficou pendente; nunca sucesso simples.
499
+ - ⛔ `progress_view_model.status=blocked`/falha: traduza
500
+ `decision.reason_code`, mostre `decision.next_action`,
501
+ `human_decision_packet` ou `resume_action`, e pare.
502
+ - 🔁 `continuation_ready`: não é sucesso final nem bloqueio terminal. Continue
503
+ agora por `agent_directive.control.effects[]`; `validation_only=true`
504
+ é só conferência interna e não conclui o workflow. Não volte para
505
+ `fix-wiki --dry-run`.
506
+ - 🧭 Fase limitada (`triagem`, `arquitetura`, `publish dry-run`): execute só a
507
+ fase confirmada e feche com novo resumo.
508
+
509
+ Sem `decision.next_action`, `resume_action` ou efeito retomável em bloqueio,
510
+ pare como `contract_gap.missing_next_action` com `error_context`. Não invente
511
+ script, `@generalist`, shell, workaround ou edição manual quando há rota
512
+ oficial.
513
+
514
+ ## Diagnóstico Read-Only
515
+
516
+ Em bateria `--json` sem mutação, use template fechado. Para FSM-first, os
517
+ campos vêm de `progress_view_model`, `state_machine_snapshot`, `decision`,
518
+ `receipt` e `agent_directive`. Para comando legado em migração, os campos
519
+ top-level podem ser citados apenas como evidência de transição.
520
+
521
+ - Bloco A: comando exato, tool status, `Exit Code:`, status semântico do
522
+ workflow, reason/action oficiais da FSM e freshness.
523
+ - Bloco B: comandos falhos/bloqueados e tool calls `status=error`; varra
524
+ `Blocked`, `Command injection detected`, parser error,
525
+ `invalid_tool_params`, `denied`, `not found`. Se vazio:
526
+ "Nenhum comando bloqueado observado após varredura dos tool outputs".
527
+ - Bloco C: artefatos stale; só chame "confirmado" se comando fresco reemitiu o
528
+ campo. Se output fresco e artefato salvo divergem, use o fresco.
529
+ - Bloco D: `source`, `freshness`, action oficial literal,
530
+ `recommended_action`, `literal_match`, `expected_mutation`. Copie
531
+ `decision.next_action`/`resume_action` byte a byte; dry-run =
532
+ `expected_mutation=nenhuma`.
533
+ - Bloco E: escopo quantitativo. Para contagens/listas >1, só use "todos",
534
+ "apenas" ou "estritamente" após distribuição por path/código no output
535
+ completo (`tool-output-files/<id>.txt` ou equivalente).
536
+
537
+ Mapeamento dos contratos C1–C8 aos blocos: A trava C1/C6/C7; B trava
538
+ C3/C8/C11; C trava C2; D trava C1/C5 e reforça C7; E trava C4. Definições
539
+ em `docs/agent-prompt-hardening.md` §Contratos.
540
+
541
+ ## Esqueleto Da Resposta (Mutação)
542
+
543
+ Em workflow mutante (`fix-wiki --apply`, `publish-batch --apply`,
544
+ `apply-canonical-merge`, `apply-curator-batch`, `apply-note-merge`,
545
+ `run-linker --apply`, `pdf-library insert --apply`, restauração aplicada), use
546
+ quatro blocos fechados, nesta ordem. Cada bloco tem fonte JSON declarada; falta
547
+ de campo vira sentinela explícita, não bloco omitido.
548
+
549
+ - **Bloco 1 — Resultado Do Workflow.** Status semântico fresco do comando
550
+ principal. Em FSM-first, campos obrigatórios: `progress_view_model.status`,
551
+ `progress_view_model.state`, `state_machine_snapshot.current_category`,
552
+ `decision.reason_code`, `decision.next_action` quando houver, `receipt` e o
553
+ `Exit Code:` do comando principal. Em comando legado transitório, `status`,
554
+ `phase` e `blocked_reason` podem ser citados apenas como evidência de
555
+ migração, nunca como fonte canônica. `Exit Code:` ≠ 0 com estado bloqueado ou
556
+ falho é sinal central do workflow e fica aqui, nunca em Avisos Auxiliares.
557
+ Inclua contagens-chave do payload (`changed_count`, `written_count`,
558
+ `archived_count` etc.) quando publicamente úteis.
559
+ - **Bloco 2 — Decisão Humana.** Aparece somente quando
560
+ `decision.kind=ask_human` ou `human_decision_packet` existir. Mostre
561
+ `human_decision_packet.options`, item/escopo afetado e
562
+ `resume_action`/`resume_command`. Quando não houver próxima ação automática e
563
+ a rota de retomada estiver preenchida, use a frase
564
+ canônica: "Nenhuma próxima ação automática agora; após decisão, retomar
565
+ pelo workflow oficial." Não invente execução automática a partir de
566
+ `resume_command`; não execute `resume_action` sem resposta humana válida.
567
+ Em mostragem de comando, escreva `--run-id <run_id>` em vez do valor
568
+ literal.
569
+ - **Bloco 3 — Segurança Do Vault.** Frases públicas: "ponto de restauração
570
+ criado", "proteção do vault encerrada", "proteção do vault pendente",
571
+ "backup online pendente" ou "alteração bloqueada por segurança". Derive de
572
+ `version_control_safety`, `guard_lease.status` e `sync_status`. Não
573
+ imprima `run_id` literal, `guard_lease`, lease id/path, hash curto de
574
+ ponto de restauração ou `vault_dir`. Confirme encerramento somente com
575
+ `guard_lease.status=closed` ou `guard-status.active_count=0` no JSON
576
+ fresco; senão, reporte pendência.
577
+ - **Bloco 4 — Avisos Auxiliares.** Escopo restrito: tool calls `status=error`
578
+ (incluindo `invalid_tool_params`, `tracker_update_task`, `update_topic`,
579
+ `read_file` fora do workspace), retries com erro inicial preservado, hook
580
+ errors, parâmetro de tool não documentado (`wait_for_previous` etc.),
581
+ comandos preparatórios bloqueados pelo guard e, somente em `/mednotes:fix-wiki`
582
+ linear, uso de tracker (`tracker_create_task`/`tracker_update_task`/
583
+ `tracker_visualize`) mesmo quando bem-sucedido. Proibido aqui: `Exit Code:`
584
+ do comando principal, reason/action oficiais do workflow ou root fields
585
+ legados equivalentes. Se vazio, escreva a sentinela literal: "Nenhum aviso auxiliar
586
+ observado após varredura dos tool outputs". Bloco vazio sem sentinela é
587
+ bug de relatório.
588
+
589
+ Ordem fixa: Bloco 1 → Bloco 2 (se aplicável) → Bloco 3 → Bloco 4. Não
590
+ embaralhe; não pule sentinela; não promova auxiliar a resultado nem rebaixe
591
+ resultado a auxiliar. Contratos C19 (Exit Code central) e C20 (resume após
592
+ decisão) em `docs/agent-prompt-hardening.md` §Contratos.
593
+
594
+ ## Preview-First
595
+
596
+ Se nada foi escrito, diga. Se falta confirmação, termine com decisão concreta:
597
+ aplicar com backup, migrar taxonomia, gravar no Anki ou descartar plano.
598
+
599
+ ## Formato
600
+
601
+ Bullets curtos, um emoji por bullet:
602
+
603
+ - status com emoji;
604
+ - contagens: vistos, criados/alterados/planejados, pulados, falhas;
605
+ - até 3 caminhos relevantes, ou 3 exemplos + total restante;
606
+ - blockers/warnings: taxonomia, grafo, Anki, Gemini, cota/API, IO;
607
+ - próxima ação: pergunta nativa, confirmação, comando seguro ou decisão humana.
608
+
609
+ Fase limitada: diga em linguagem humana, execute só a fase confirmada e pare.
610
+ Em bloqueio FSM-first, mostre `decision.reason_code`,
611
+ `decision.next_action`, `human_decision_packet` ou `resume_action`. Em payload
612
+ legado transitório, normalize `blocked_reason`/`next_action` antes de usar.
613
+ Sem ação oficial, bloqueie como `contract_gap.missing_next_action`; nada de
614
+ script, `@generalist`, shell ou edição manual.
615
+
616
+ Um emoji por bullet.
617
+
618
+ ## Registro de entrega
619
+
620
+ Relatório versionado de agente não é relatório de commit. Use em camadas:
621
+ Em uma frase; O que mudou para você; Como conferir; Pontos de atenção; Próxima ação.
622
+ Sem risco: meia tela. Com blocker/mutação parcial: detalhe.
623
+ `Detalhes técnicos` em `<details>` só se úteis.
624
+
625
+ ## Perguntas Ao Usuário
626
+
627
+ Para confirmação, decisão humana ou opções fechadas, use a ferramenta nativa de pergunta/seleção.
628
+
629
+ - 2 a 4 opções; a opção recomendada vem primeiro, com impacto curto.
630
+ - Em mutação/publicação/restauração/Anki/migração, inclua cancelar, revisar ou
631
+ manter preview. Não execute a opção recomendada sem confirmação.
632
+ - Transforme `human_decision_packet.options[]`, `decision.next_action`,
633
+ `resume_action` e, em payload legado transitório já normalizado,
634
+ `required_inputs` em opções fechadas sempre que possível.
635
+ - Se a ferramenta nativa não estiver disponível, mostre as mesmas opções
636
+ numeradas e peça escolha explícita.
637
+ - Com `decision.kind=ask_human`, apresente `human_decision_packet.options[]`
638
+ por esse fluxo e continue só após resposta humana explícita.
639
+
640
+ ## Anti-padrões
641
+
642
+ Nunca:
643
+
644
+ - despeje JSON/log bruto por padrão;
645
+ - imprima `config.toml`, `.env`, defaults de telemetria, feedback records, hook
646
+ events, tokens, `auth_token`, senhas ou chaves; use campos redigidos dos
647
+ comandos oficiais;
648
+ - diga "concluído" para preview, dry-run, blocker parcial ou run sem
649
+ fechamento;
650
+ - diga "isolamento total", "sucesso integral" ou conclusão ampla quando a
651
+ própria evidência é parcial, contém exceção ou não foi auditada;
652
+ - diga que usou `uv run python ...` ou outro comando oficial quando os comandos
653
+ realmente executados foram `python`, `$UV_PROJECT_ENVIRONMENT/bin/python` ou
654
+ outro caminho;
655
+ - peça Git ao usuário;
656
+ - transforme campos de ação em comando automático; em mutação/Anki/publicação/taxonomia,
657
+ confirme. Sem efeito executável canônico = reportar e parar;
658
+ - misture `blocked_reason` top-level com `human_decision_packet.decisions[].kind`
659
+ ou invente contagem/local de backup sem campo explícito;
660
+ - invente workaround, script manual ou edição direta com rota oficial
661
+ disponível.
662
+
663
+ ## Segurança Do Vault
664
+
665
+ Versionamento interno: diga `ponto de restauração`, `histórico`,
666
+ `preview de restauração`, `proteção local pronta`, `backup online pendente`,
667
+ `backup online atualizado`, `login GitHub necessário`,
668
+ `repositório privado proposto` ou `alteração bloqueada por segurança`; não use
669
+ commit, branch, merge, rebase, worktree ou SHA na resposta padrão.
670
+
671
+ Em restauração, nada muda antes de confirmação. Em `/mednotes:setup`, conduza
672
+ passo a passo; preserve histórico e mudanças locais; pare em login GitHub ou
673
+ criação de repositório. `backup_online=false`,
674
+ `sync_status=skipped_no_remote` e
675
+ `local_checkpoints_pending` = ponto local salvo com backup online pendente.
676
+ Alteração bloqueada por segurança exige workflow correto, uma vez por lote.
677
+ Fluxos paralelos podem bloquear com `blocked_online_backup_required`.
678
+
679
+ Com `git_identity_github_attribution`, `git_author` é autoria no commit.
680
+ Prometa avatar/link/filtro só com `github_profile_link_expected=true`; se falso,
681
+ diga que a autoria foi preservada e que o GitHub clicável exige setup nativo com
682
+ email de conta/bot real.
683
+
684
+ Em `/mednotes:history`, resuma `restore_point_id`, `can_restore`,
685
+ `restore_preview_path` e `affected_files`; sempre confirme antes de aplicar.
686
+
687
+ Workflow declara `no_resource_mutation=true` ou resume:
688
+ `Version Control Safety`: guard, `run-start`, `run-finish`, pontos,
689
+ `sync_status`, `backup_online`, `direct_mutation_forbidden` e
690
+ `mutation_without_guard`. Não diga que versionou sem fechamento. Em workflow
691
+ mutante, só diga que o guard foi fechado quando o JSON fresco trouxer
692
+ `guard_lease.status=closed` ou `guard-status.active_count=0`; com
693
+ `blocked_reason=guard_lease_mismatch`, `guard_lease.status=missing`, lease
694
+ ativa ou ausência dessa evidência, reporte pendência.
695
+ Na resposta pública, diga "proteção do vault encerrada" ou "pendência na
696
+ proteção do vault"; não imprima `guard_lease`, lease id/path, `run_id` ou hash
697
+ de ponto de restauração salvo se a pergunta for de debugging. Frases como
698
+ "Ponto de restauração `7da9fcf` disponível" ainda violam este contrato; use
699
+ apenas "ponto de restauração disponível". Ao listar comandos executados, mostre
700
+ `run-finish --run-id <run_id>` em vez do ID real.
701
+
702
+ ## Feedback
703
+
704
+ Feedback local fica em `~/.mednotes/feedback/runs/`;
705
+ falha é fail-open e arquivos antigos são podados automaticamente. Não rode
706
+ registro manual se o workflow já registrou. Se o agente piorou o run, registre
707
+ `agent_events` redigidos: retry/loop, fase
708
+ errada, `next_action` ignorado, drift, mutação inesperada, intervenção manual,
709
+ workflow bloqueado ou comando falho. Nunca envie conteúdo clínico, Markdown
710
+ bruto, HTML, imagens ou logs completos. Telemetria remota é silenciosa/fail-open.
711
+
712
+ Em experimentos controlados, a resposta final do agente também deve passar por
713
+ `validate-agent-run-report` quando houver payload oficial e transcript. Esse
714
+ gate compara a resposta final com `progress_view_model`, `receipt`, erros de
715
+ tool e caminhos reais; o transcript pode ser JSON/NDJSON puro ou log misto do
716
+ Gemini CLI com linhas JSON válidas entre warnings/stack traces. Se ele bloquear,
717
+ reporte o bug de relatório do agente em vez de tratar a rodada como confiável.
718
+
719
+ ## Campos Por Workflow
720
+
721
+ - `enrich` — notas, âncoras, imagens, fontes, puladas por `images_enriched`,
722
+ sem inserção, falhas.
723
+ - `create` — tema, destino, sobrescrita evitada, pontos visuais, próximo
724
+ workflow.
725
+ - `fix-wiki` — use `progress_view_model`, `state_machine_snapshot`,
726
+ `decision`, `receipt`, `reports`, `artifacts` e
727
+ `agent_directive`, `diagnostic_context` e `error_context`. Use
728
+ `agent_directive.control` para enforcement/validação
729
+ e `agent_directive.instructions` como contexto agent-facing. Detalhes ficam em
730
+ `diagnostic_context.counts`, `change_count_context`, `final_validation` e
731
+ payloads tipados de auditoria. Não use campos root legados
732
+ (`status`, `phase`, `blocked_reason`, `next_action`, `workflow_exit_code`,
733
+ `execution_gate`, planos de orquestração legados, `requested_apply`,
734
+ `effective_apply`, `blocker_resolution`, `final_validation`) como verdade.
735
+ Com `write_errors`, `requires_llm_rewrite_count`, linker, Related Notes,
736
+ `atomicity_split_required` ou `waiting_external`, reporte pendência e não
737
+ conclua.
738
+ - `process-chats` — use `progress_view_model`, `state_machine_snapshot`,
739
+ `decision`, `receipt`, `reports`, `agent_directive`, `artifacts`,
740
+ `diagnostic_context` e `error_context`.
741
+ Estados canônicos incluem `ready_to_publish`, `published` e
742
+ `completed_with_link_blockers`; destaque publicação, raws, escrita na Wiki,
743
+ coverage/manifest e linker/grafo.
744
+ - `link` — use `progress_view_model`, `state_machine_snapshot`, `decision`,
745
+ `receipt`, `reports`, `artifacts`, `agent_directive`, `diagnostic_context` e
746
+ `error_context`. Enquanto a implementação ainda estiver em migração, dados
747
+ herdados do `run-linker` podem aparecer apenas como `link_audit_payload`
748
+ opaco; `status`, `phase`, `blocked_reason`, `next_action`,
749
+ `related_notes_sync`, `body_term_linker` e `reference_repair` não são verdade
750
+ raiz pública.
751
+ - `link-related` — use `progress_view_model`, `state_machine_snapshot`,
752
+ `decision`, `receipt`, `reports`, `agent_directive`, `artifacts`,
753
+ `diagnostic_context` e `error_context`.
754
+ `related-notes-sync` e recovery público emitem
755
+ `medical-notes-workbench.link-related-fsm-result.v1`; `updates`,
756
+ `skipped_edges`, `blocked_reason` e `related_notes_recovery_state` não são
757
+ campos raiz públicos.
758
+ - `flashcards` — FSM-first: use `progress_view_model`,
759
+ `state_machine_snapshot`, `decision`, `receipt`, `agent_directive`,
760
+ `reports`, `artifacts`, `diagnostic_context` e `error_context`. Sucesso só
761
+ existe depois de resposta real do Anki com `anki_note_id` e tag Obsidian
762
+ `anki` aplicada.
763
+ - `setup` — alvo FSM-first de recuperação de ambiente/configuração. Use
764
+ `progress_view_model`, `state_machine_snapshot`, `decision`, `receipt`,
765
+ `reports`, `agent_directive`, `artifacts`, `diagnostic_context` e
766
+ `error_context`; não transforme blockers de ambiente em texto solto sem
767
+ `resume_action`.
768
+ - `history` — alvo FSM-first para restore preview/apply. Use
769
+ `progress_view_model`, `state_machine_snapshot`, `decision`, `receipt`,
770
+ `reports`, `agent_directive`, `artifacts`, `diagnostic_context`,
771
+ `human_decision_packet` e `error_context`; restore aplicado exige
772
+ confirmação humana e ponto de restauração selecionado.
773
+
774
+ ## Dicionário Público
775
+
776
+ Tradução canônica `internal → user` em `docs/public-vocabulary.md`. Use-a
777
+ antes de devolver qualquer resposta visível em workflow público. Termos
778
+ internos só aparecem em `<details>` quando o usuário pediu, em
779
+ `/mednotes:status` ou em debug explícito.