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.
- package/.opencode/agents/med-chat-triager.md +204 -0
- package/.opencode/agents/med-flashcard-maker.md +63 -0
- package/.opencode/agents/med-knowledge-architect.md +230 -0
- package/.opencode/agents/med-link-graph-curator.md +177 -0
- package/.opencode/agents/med-publish-guard.md +62 -0
- package/.opencode/commands/flashcards.md +25 -0
- package/.opencode/commands/mednotes/create.md +25 -0
- package/.opencode/commands/mednotes/enrich.md +27 -0
- package/.opencode/commands/mednotes/fix-wiki.md +27 -0
- package/.opencode/commands/mednotes/history.md +22 -0
- package/.opencode/commands/mednotes/link-body.md +25 -0
- package/.opencode/commands/mednotes/link-related.md +27 -0
- package/.opencode/commands/mednotes/link.md +27 -0
- package/.opencode/commands/mednotes/pdf-library.md +27 -0
- package/.opencode/commands/mednotes/process-chats.md +23 -0
- package/.opencode/commands/mednotes/setup.md +21 -0
- package/.opencode/commands/mednotes/status.md +27 -0
- package/.opencode/commands/mednotes/telemetry.md +27 -0
- package/.opencode/commands/report.md +26 -0
- package/.opencode/mednotes/AGENTS.md +57 -0
- package/.opencode/mednotes/agents/med-chat-triager.md +197 -0
- package/.opencode/mednotes/agents/med-flashcard-maker.md +56 -0
- package/.opencode/mednotes/agents/med-knowledge-architect.md +224 -0
- package/.opencode/mednotes/agents/med-link-graph-curator.md +171 -0
- package/.opencode/mednotes/agents/med-publish-guard.md +55 -0
- package/.opencode/mednotes/contracts/.gitkeep +1 -0
- package/.opencode/mednotes/contracts/agents.json +116 -0
- package/.opencode/mednotes/contracts/opencode-plugin.json +70 -0
- package/.opencode/mednotes/docs/agent-prompt-hardening.md +567 -0
- package/.opencode/mednotes/docs/agent-role-contracts.md +94 -0
- package/.opencode/mednotes/docs/anki-mcp-twenty-rules.md +214 -0
- package/.opencode/mednotes/docs/anki-templates/README.md +39 -0
- package/.opencode/mednotes/docs/anki-templates/cloze.back.html +23 -0
- package/.opencode/mednotes/docs/anki-templates/cloze.front.html +14 -0
- package/.opencode/mednotes/docs/anki-templates/qa.back.html +24 -0
- package/.opencode/mednotes/docs/anki-templates/qa.front.html +14 -0
- package/.opencode/mednotes/docs/anki-templates/style.css +182 -0
- package/.opencode/mednotes/docs/atomicity-splitting-policy.md +113 -0
- package/.opencode/mednotes/docs/extension-docs.md +40 -0
- package/.opencode/mednotes/docs/flashcard-ingestion.md +278 -0
- package/.opencode/mednotes/docs/knowledge-architect.md +208 -0
- package/.opencode/mednotes/docs/merge-policy.md +110 -0
- package/.opencode/mednotes/docs/public-vocabulary.md +104 -0
- package/.opencode/mednotes/docs/semantic-linker.md +141 -0
- package/.opencode/mednotes/docs/taxonomy-policy.md +90 -0
- package/.opencode/mednotes/docs/triage-policy.md +187 -0
- package/.opencode/mednotes/docs/vault-version-control.md +758 -0
- package/.opencode/mednotes/docs/vocabulary-db-recovery.md +58 -0
- package/.opencode/mednotes/docs/workflow-output-contract.md +779 -0
- package/.opencode/mednotes/hooks/hooks.json +79 -0
- package/.opencode/mednotes/package-lock.json +6361 -0
- package/.opencode/mednotes/package.json +15 -0
- package/.opencode/mednotes/pyproject.toml +48 -0
- package/.opencode/mednotes/scripts/bootstrap_windows_python_uv.cmd +13 -0
- package/.opencode/mednotes/scripts/bootstrap_windows_python_uv.ps1 +172 -0
- package/.opencode/mednotes/scripts/enrich_notes.py +23 -0
- package/.opencode/mednotes/scripts/full_reset_windows_python_uv.cmd +13 -0
- package/.opencode/mednotes/scripts/hooks/antigravity_hook_status.mjs +212 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/antigravity.mjs +169 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/harness_payload.mjs +103 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/opencode_plugin.mjs +341 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/opencode_user_config_sync.mjs +177 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/anki_preflight.mjs +214 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/cli.mjs +143 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/diagnostics.mjs +11 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/domain/agent_directive_core.mjs +160 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/fsm_directive.mjs +1470 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/hook_errors.mjs +120 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/retention.mjs +114 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/runtime.mjs +174 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/telemetry_capture.mjs +511 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/vault_guard.mjs +624 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook.mjs +5 -0
- package/.opencode/mednotes/scripts/mednotes/_runtime_paths.py +24 -0
- package/.opencode/mednotes/scripts/mednotes/anki_model_validator.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/capture_extension_diff.py +1562 -0
- package/.opencode/mednotes/scripts/mednotes/feedback_report.py +16 -0
- package/.opencode/mednotes/scripts/mednotes/flashcard_index.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/flashcard_pipeline.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/flashcard_report.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/flashcard_sources.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/obsidian/README.md +6 -0
- package/.opencode/mednotes/scripts/mednotes/obsidian_note_utils.py +20 -0
- package/.opencode/mednotes/scripts/mednotes/pdf_library/cli.py +16 -0
- package/.opencode/mednotes/scripts/mednotes/project_fsm.py +229 -0
- package/.opencode/mednotes/scripts/mednotes/setup_telemetry_email.py +404 -0
- package/.opencode/mednotes/scripts/mednotes/sync_anki_twenty_rules.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/sync_opencode_user_config.py +36 -0
- package/.opencode/mednotes/scripts/mednotes/wiki/cli.py +20 -0
- package/.opencode/mednotes/scripts/mednotes/wiki_graph.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/wiki_tree.py +134 -0
- package/.opencode/mednotes/scripts/reset_windows_python_uv.ps1 +625 -0
- package/.opencode/mednotes/scripts/run_python.mjs +109 -0
- package/.opencode/mednotes/scripts/vault/vault_commit.ps1 +19 -0
- package/.opencode/mednotes/scripts/vault/vault_commit.sh +18 -0
- package/.opencode/mednotes/scripts/vault/vault_git.ps1 +19 -0
- package/.opencode/mednotes/scripts/vault/vault_git.py +3107 -0
- package/.opencode/mednotes/scripts/vault/vault_git.sh +18 -0
- package/.opencode/mednotes/scripts/vault/vault_precommit.ps1 +19 -0
- package/.opencode/mednotes/scripts/vault/vault_precommit.sh +18 -0
- package/.opencode/mednotes/skills/THIRD_PARTY_NOTICES.md +45 -0
- package/.opencode/mednotes/skills/create-medical-flashcards/SKILL.md +113 -0
- package/.opencode/mednotes/skills/create-medical-note/SKILL.md +90 -0
- package/.opencode/mednotes/skills/enrich-medical-note/SKILL.md +120 -0
- package/.opencode/mednotes/skills/fix-medical-wiki/SKILL.md +559 -0
- package/.opencode/mednotes/skills/link-medical-wiki/SKILL.md +224 -0
- package/.opencode/mednotes/skills/obsidian-cli/SKILL.md +118 -0
- package/.opencode/mednotes/skills/obsidian-markdown/SKILL.md +207 -0
- package/.opencode/mednotes/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
- package/.opencode/mednotes/skills/obsidian-markdown/references/EMBEDS.md +63 -0
- package/.opencode/mednotes/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
- package/.opencode/mednotes/skills/obsidian-ops/SKILL.md +136 -0
- package/.opencode/mednotes/skills/pdf-library/SKILL.md +45 -0
- package/.opencode/mednotes/skills/process-medical-chats/SKILL.md +246 -0
- package/.opencode/mednotes/skills/workflow-report/SKILL.md +100 -0
- package/.opencode/mednotes/src/mednotes/__init__.py +5 -0
- package/.opencode/mednotes/src/mednotes/domains/__init__.py +5 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/README.md +26 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/__init__.py +2 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/build_demo_apkg.py +177 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/contracts.py +385 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/flashcards_machine.py +522 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/fsm.py +817 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/index.py +630 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/install_models.py +445 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/model.py +359 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/obsidian_links.py +135 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/obsidian_note_utils.py +546 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/pipeline.py +580 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/report.py +510 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/sources.py +682 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/sync_rules.py +184 -0
- package/.opencode/mednotes/src/mednotes/domains/history/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/history/history_fsm.py +852 -0
- package/.opencode/mednotes/src/mednotes/domains/history/history_machine.py +453 -0
- package/.opencode/mednotes/src/mednotes/domains/setup/__init__.py +7 -0
- package/.opencode/mednotes/src/mednotes/domains/setup/setup_fsm.py +808 -0
- package/.opencode/mednotes/src/mednotes/domains/setup/setup_machine.py +973 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/README.md +64 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/api.py +668 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/batch_state.py +102 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/atomicity/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/atomicity/atomicity.py +877 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/body_link/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/body_link/body_linker.py +1562 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/effect_adapters.py +949 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/fix_wiki_runtime_adapters.py +433 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/coverage.py +413 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/graph.py +396 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/graph_fixes.py +161 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/hygiene/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/hygiene/hygiene.py +483 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/__init__.py +2 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/anchors.py +185 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/__init__.py +0 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/cache.py +223 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/config.py +131 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/download.py +224 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/frontmatter.py +59 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/insert.py +227 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/local_import.py +54 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/__init__.py +42 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/web_profiles.py +99 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/web_search.py +203 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/wikimedia.py +102 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_db_adapter.mjs +434 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_node_runtime.py +274 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_query.py +227 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/artifacts.py +605 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/canonical_merge.py +277 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/markdown_zones.py +85 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/meaning_planner.py +307 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_iter.py +67 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_merge.py +278 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_plan.py +409 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_policy.py +22 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/__init__.py +79 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/fixes.py +264 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/frontmatter.py +435 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/models.py +208 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/prompts.py +37 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/tables.py +236 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/validate.py +404 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/provenance.py +478 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/raw_chats.py +273 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/sources_backfill.py +235 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/__init__.py +10 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/anchors.py +16 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/captions.py +47 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/cli.py +179 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/cloud.py +52 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/config.py +196 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/context_packets.py +76 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/db.py +81 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/doctor.py +102 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/figure_ids.py +42 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/ingest.py +326 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/insert.py +316 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/mentions.py +57 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/ocr.py +71 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/paths.py +35 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/pdf_engine.py +77 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/schema.py +155 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/search.py +188 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/app.py +89 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/image_backend.py +29 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/state.py +65 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish.py +1139 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish_receipts.py +365 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish_recovery.py +240 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_behavior_corpus.py +2069 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_report_validation.py +4448 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_run_audit.py +852 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/architect_prompt_eval.py +341 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/body_linker_eval.py +240 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/curator_output_validation.py +175 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/curator_prompt_eval.py +865 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/triager_prompt_eval.py +1295 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/related_notes.py +1920 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/related_notes_headless.py +1186 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/plan_attestation.py +148 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_receipts.py +360 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_runtime.py +52 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_task_runner.py +2470 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/style/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/style/style.py +1952 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/subagents/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/subagents/agents.py +1767 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/alias_projection.py +331 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/link_terms.py +151 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/llm_disambiguation.py +182 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/__init__.py +116 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/audit.py +201 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/migration.py +314 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/normalize.py +72 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/policy.py +135 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/resolve.py +413 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/schema.py +157 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/status.py +137 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_bootstrap.py +509 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_curator_batch.py +1115 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_ingestion.py +632 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_map.py +930 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_recovery.py +1388 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/cli.py +6665 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/common.py +69 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/config.py +210 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/__init__.py +74 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agent_report.py +242 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agent_run_audit.py +196 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agents.py +601 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/curator.py +256 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/effect_payloads.py +519 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/happy_path.py +190 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/link_git.py +110 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/link_runtime_artifact.py +52 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/note_plan.py +75 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/paths.py +114 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/public_report.py +53 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/publish.py +111 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/raw_coverage.py +217 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes.py +136 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes_headless.py +153 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes_runtime.py +395 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/schema_registry.py +637 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/specialist.py +432 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/status.py +62 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/style_rewrite.py +568 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/vocabulary_ingestion.py +223 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_blockers.py +510 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_guardrails.py +637 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_outcomes.py +121 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_receipts.py +100 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/__main__.py +4 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/cli.py +275 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/__init__.py +2 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/candidates.py +193 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/cli.py +189 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/gemini.py +220 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/inputs.py +120 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/models.py +34 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/parsing.py +48 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/prompts.py +216 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/quality.py +54 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/reporting.py +24 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/runner.py +433 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/utils.py +39 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/vault_guard_bridge.py +17 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_context_packets.py +454 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_decision_projection.py +133 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_effects.py +1260 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_fsm.py +2768 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_machine.py +1588 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_plan.py +306 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_primary_objective.py +316 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_problem.py +153 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_receipt_evidence.py +306 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_states.py +290 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_user_report.py +342 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/health.py +6332 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_fsm.py +1119 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_git.py +638 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_machine.py +1106 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_retry_governance.py +374 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_runtime_result.py +485 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_triggers.py +183 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/linking.py +2758 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/reference_repair.py +718 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/related_notes_fsm.py +1855 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link_related/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link_related/link_related_machine.py +834 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_fsm.py +1592 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_machine.py +3097 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_primary_objective.py +28 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_runtime_result.py +185 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/performance.py +97 -0
- package/.opencode/mednotes/src/mednotes/kernel/__init__.py +6 -0
- package/.opencode/mednotes/src/mednotes/kernel/agent_directive.py +336 -0
- package/.opencode/mednotes/src/mednotes/kernel/base.py +51 -0
- package/.opencode/mednotes/src/mednotes/kernel/blockers.py +39 -0
- package/.opencode/mednotes/src/mednotes/kernel/effect_executor.py +55 -0
- package/.opencode/mednotes/src/mednotes/kernel/effect_intent.py +69 -0
- package/.opencode/mednotes/src/mednotes/kernel/effects.py +160 -0
- package/.opencode/mednotes/src/mednotes/kernel/errors.py +38 -0
- package/.opencode/mednotes/src/mednotes/kernel/fsm_event.py +35 -0
- package/.opencode/mednotes/src/mednotes/kernel/fsm_model.py +55 -0
- package/.opencode/mednotes/src/mednotes/kernel/fsm_transition_result.py +75 -0
- package/.opencode/mednotes/src/mednotes/kernel/guardrails.py +188 -0
- package/.opencode/mednotes/src/mednotes/kernel/progress.py +319 -0
- package/.opencode/mednotes/src/mednotes/kernel/public_report.py +346 -0
- package/.opencode/mednotes/src/mednotes/kernel/state_machine.py +164 -0
- package/.opencode/mednotes/src/mednotes/kernel/workflow.py +619 -0
- package/.opencode/mednotes/src/mednotes/platform/__init__.py +5 -0
- package/.opencode/mednotes/src/mednotes/platform/backup_policy.py +382 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/__init__.py +62 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/cli.py +275 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/contracts.py +83 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/core.py +4168 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/integrity.py +989 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/operational_contract.py +2293 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/telemetry.py +875 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/telemetry_config.py +65 -0
- package/.opencode/mednotes/src/mednotes/platform/opencode_runtime_config.py +182 -0
- package/.opencode/mednotes/src/mednotes/platform/paths/__init__.py +1560 -0
- package/.opencode/mednotes/src/mednotes/platform/secrets.py +89 -0
- package/.opencode/mednotes/src/mednotes/platform/user_config.py +103 -0
- package/.opencode/mednotes/src/mednotes/platform/vault_guard.py +214 -0
- package/.opencode/mednotes/uv.lock +932 -0
- package/.opencode/mednotes.generated.json +395 -0
- package/.opencode/opencode.json +31 -0
- package/.opencode/plugins/mednotes-fsm.mjs +7 -0
- package/.opencode/plugins/mednotes_hook/adapters/antigravity.mjs +169 -0
- package/.opencode/plugins/mednotes_hook/adapters/harness_payload.mjs +103 -0
- package/.opencode/plugins/mednotes_hook/adapters/opencode_plugin.mjs +341 -0
- package/.opencode/plugins/mednotes_hook/adapters/opencode_user_config_sync.mjs +177 -0
- package/.opencode/plugins/mednotes_hook/anki_preflight.mjs +214 -0
- package/.opencode/plugins/mednotes_hook/cli.mjs +143 -0
- package/.opencode/plugins/mednotes_hook/diagnostics.mjs +11 -0
- package/.opencode/plugins/mednotes_hook/domain/agent_directive_core.mjs +160 -0
- package/.opencode/plugins/mednotes_hook/fsm_directive.mjs +1470 -0
- package/.opencode/plugins/mednotes_hook/hook_errors.mjs +120 -0
- package/.opencode/plugins/mednotes_hook/retention.mjs +114 -0
- package/.opencode/plugins/mednotes_hook/runtime.mjs +174 -0
- package/.opencode/plugins/mednotes_hook/telemetry_capture.mjs +511 -0
- package/.opencode/plugins/mednotes_hook/vault_guard.mjs +624 -0
- package/AGENTS.md +57 -0
- package/README.md +194 -0
- package/adapters/antigravity/agents.json +80 -0
- package/adapters/antigravity/templates/med-chat-triager.md +214 -0
- package/adapters/antigravity/templates/med-flashcard-maker.md +72 -0
- package/adapters/antigravity/templates/med-knowledge-architect.md +241 -0
- package/adapters/antigravity/templates/med-link-graph-curator.md +187 -0
- package/adapters/antigravity/templates/med-publish-guard.md +71 -0
- package/adapters/gemini-cli/gemini-extension.json +14 -0
- package/adapters/gemini-cli/package.json +15 -0
- package/adapters/gemini-cli/pyproject.toml +48 -0
- package/bin/mednotes-opencode.mjs +155 -0
- package/contracts/agents.json +116 -0
- package/core/agents/med-chat-triager.md +197 -0
- package/core/agents/med-flashcard-maker.md +56 -0
- package/core/agents/med-knowledge-architect.md +224 -0
- package/core/agents/med-link-graph-curator.md +171 -0
- package/core/agents/med-publish-guard.md +55 -0
- package/core/commands/flashcards.toml +22 -0
- package/core/commands/mednotes/create.toml +22 -0
- package/core/commands/mednotes/enrich.toml +24 -0
- package/core/commands/mednotes/fix-wiki.toml +24 -0
- package/core/commands/mednotes/history.toml +19 -0
- package/core/commands/mednotes/link-body.toml +22 -0
- package/core/commands/mednotes/link-related.toml +24 -0
- package/core/commands/mednotes/link.toml +24 -0
- package/core/commands/mednotes/pdf-library.toml +24 -0
- package/core/commands/mednotes/process-chats.toml +20 -0
- package/core/commands/mednotes/setup.toml +18 -0
- package/core/commands/mednotes/status.toml +24 -0
- package/core/commands/mednotes/telemetry.toml +24 -0
- package/core/commands/report.toml +23 -0
- package/core/skills/THIRD_PARTY_NOTICES.md +45 -0
- package/core/skills/create-medical-flashcards/SKILL.md +113 -0
- package/core/skills/create-medical-note/SKILL.md +90 -0
- package/core/skills/enrich-medical-note/SKILL.md +120 -0
- package/core/skills/fix-medical-wiki/SKILL.md +559 -0
- package/core/skills/link-medical-wiki/SKILL.md +224 -0
- package/core/skills/obsidian-cli/SKILL.md +118 -0
- package/core/skills/obsidian-markdown/SKILL.md +207 -0
- package/core/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
- package/core/skills/obsidian-markdown/references/EMBEDS.md +63 -0
- package/core/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
- package/core/skills/obsidian-ops/SKILL.md +136 -0
- package/core/skills/pdf-library/SKILL.md +45 -0
- package/core/skills/process-medical-chats/SKILL.md +246 -0
- package/core/skills/workflow-report/SKILL.md +100 -0
- 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.
|