izanagi-ai 3.19.0 → 3.21.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 (196) hide show
  1. package/.manifest +21 -21
  2. package/AGENTS.md +4 -4
  3. package/CHANGELOG.md +98 -0
  4. package/README.md +7 -3
  5. package/ROADMAP.md +66 -1
  6. package/RULES.md +1 -1
  7. package/SYSTEM.md +4 -4
  8. package/dist/cli/commands/benchmark.d.ts.map +1 -1
  9. package/dist/cli/commands/benchmark.js +154 -6
  10. package/dist/cli/commands/benchmark.js.map +1 -1
  11. package/dist/cli/commands/explain.d.ts.map +1 -1
  12. package/dist/cli/commands/explain.js +31 -0
  13. package/dist/cli/commands/explain.js.map +1 -1
  14. package/dist/cli/commands/run.d.ts +41 -0
  15. package/dist/cli/commands/run.d.ts.map +1 -1
  16. package/dist/cli/commands/run.js +101 -2
  17. package/dist/cli/commands/run.js.map +1 -1
  18. package/dist/cli/commands/trace.js +2 -0
  19. package/dist/cli/commands/trace.js.map +1 -1
  20. package/dist/cli/index.js +10 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/installer.d.ts +19 -0
  23. package/dist/installer.d.ts.map +1 -1
  24. package/dist/installer.js +160 -7
  25. package/dist/installer.js.map +1 -1
  26. package/dist/runtime/artifacts/registry.d.ts +152 -0
  27. package/dist/runtime/artifacts/registry.d.ts.map +1 -1
  28. package/dist/runtime/artifacts/registry.js +207 -0
  29. package/dist/runtime/artifacts/registry.js.map +1 -1
  30. package/dist/runtime/benchmarks/arena.d.ts +52 -0
  31. package/dist/runtime/benchmarks/arena.d.ts.map +1 -1
  32. package/dist/runtime/benchmarks/arena.js +24 -0
  33. package/dist/runtime/benchmarks/arena.js.map +1 -1
  34. package/dist/runtime/benchmarks/registry.d.ts +39 -2
  35. package/dist/runtime/benchmarks/registry.d.ts.map +1 -1
  36. package/dist/runtime/benchmarks/registry.js +167 -12
  37. package/dist/runtime/benchmarks/registry.js.map +1 -1
  38. package/dist/runtime/benchmarks/runner.d.ts +41 -1
  39. package/dist/runtime/benchmarks/runner.d.ts.map +1 -1
  40. package/dist/runtime/benchmarks/runner.js +96 -15
  41. package/dist/runtime/benchmarks/runner.js.map +1 -1
  42. package/dist/runtime/contracts/acceptance.d.ts +66 -0
  43. package/dist/runtime/contracts/acceptance.d.ts.map +1 -0
  44. package/dist/runtime/contracts/acceptance.js +179 -0
  45. package/dist/runtime/contracts/acceptance.js.map +1 -0
  46. package/dist/runtime/contracts/artifacts.d.ts.map +1 -1
  47. package/dist/runtime/contracts/artifacts.js +18 -1
  48. package/dist/runtime/contracts/artifacts.js.map +1 -1
  49. package/dist/runtime/contracts/task-contract.d.ts +14 -0
  50. package/dist/runtime/contracts/task-contract.d.ts.map +1 -1
  51. package/dist/runtime/contracts/task-contract.js.map +1 -1
  52. package/dist/runtime/execute.d.ts +26 -0
  53. package/dist/runtime/execute.d.ts.map +1 -1
  54. package/dist/runtime/execute.js +32 -2
  55. package/dist/runtime/execute.js.map +1 -1
  56. package/dist/runtime/memory/decisions.d.ts +56 -0
  57. package/dist/runtime/memory/decisions.d.ts.map +1 -1
  58. package/dist/runtime/memory/decisions.js +77 -0
  59. package/dist/runtime/memory/decisions.js.map +1 -1
  60. package/dist/runtime/memory/store.d.ts +27 -1
  61. package/dist/runtime/memory/store.d.ts.map +1 -1
  62. package/dist/runtime/memory/store.js +64 -0
  63. package/dist/runtime/memory/store.js.map +1 -1
  64. package/dist/runtime/notify/webhook.d.ts +8 -0
  65. package/dist/runtime/notify/webhook.d.ts.map +1 -1
  66. package/dist/runtime/notify/webhook.js +8 -0
  67. package/dist/runtime/notify/webhook.js.map +1 -1
  68. package/dist/runtime/orchestration/commander.d.ts +127 -0
  69. package/dist/runtime/orchestration/commander.d.ts.map +1 -1
  70. package/dist/runtime/orchestration/commander.js +254 -8
  71. package/dist/runtime/orchestration/commander.js.map +1 -1
  72. package/dist/runtime/orchestration/context-resolver.d.ts +35 -0
  73. package/dist/runtime/orchestration/context-resolver.d.ts.map +1 -1
  74. package/dist/runtime/orchestration/context-resolver.js +85 -33
  75. package/dist/runtime/orchestration/context-resolver.js.map +1 -1
  76. package/dist/runtime/orchestration/delivery.d.ts.map +1 -1
  77. package/dist/runtime/orchestration/delivery.js +4 -1
  78. package/dist/runtime/orchestration/delivery.js.map +1 -1
  79. package/dist/runtime/orchestration/test-gate.d.ts +46 -0
  80. package/dist/runtime/orchestration/test-gate.d.ts.map +1 -0
  81. package/dist/runtime/orchestration/test-gate.js +88 -0
  82. package/dist/runtime/orchestration/test-gate.js.map +1 -0
  83. package/dist/runtime/orchestrator.d.ts +59 -1
  84. package/dist/runtime/orchestrator.d.ts.map +1 -1
  85. package/dist/runtime/orchestrator.js +296 -9
  86. package/dist/runtime/orchestrator.js.map +1 -1
  87. package/dist/runtime/recovery/healing.d.ts +15 -1
  88. package/dist/runtime/recovery/healing.d.ts.map +1 -1
  89. package/dist/runtime/recovery/healing.js +23 -6
  90. package/dist/runtime/recovery/healing.js.map +1 -1
  91. package/dist/runtime/security/policy.d.ts +21 -0
  92. package/dist/runtime/security/policy.d.ts.map +1 -1
  93. package/dist/runtime/security/policy.js +38 -0
  94. package/dist/runtime/security/policy.js.map +1 -1
  95. package/dist/runtime/tests/acceptance.test.d.ts +10 -0
  96. package/dist/runtime/tests/acceptance.test.d.ts.map +1 -0
  97. package/dist/runtime/tests/acceptance.test.js +160 -0
  98. package/dist/runtime/tests/acceptance.test.js.map +1 -0
  99. package/dist/runtime/tests/arena.test.js +48 -3
  100. package/dist/runtime/tests/arena.test.js.map +1 -1
  101. package/dist/runtime/tests/artifact-reuse.test.d.ts +13 -0
  102. package/dist/runtime/tests/artifact-reuse.test.d.ts.map +1 -0
  103. package/dist/runtime/tests/artifact-reuse.test.js +192 -0
  104. package/dist/runtime/tests/artifact-reuse.test.js.map +1 -0
  105. package/dist/runtime/tests/benchmark.test.js +18 -0
  106. package/dist/runtime/tests/benchmark.test.js.map +1 -1
  107. package/dist/runtime/tests/critique-loop.test.js +1 -0
  108. package/dist/runtime/tests/critique-loop.test.js.map +1 -1
  109. package/dist/runtime/tests/decision-journal.test.d.ts +10 -0
  110. package/dist/runtime/tests/decision-journal.test.d.ts.map +1 -0
  111. package/dist/runtime/tests/decision-journal.test.js +104 -0
  112. package/dist/runtime/tests/decision-journal.test.js.map +1 -0
  113. package/dist/runtime/tests/human-required.test.d.ts +10 -0
  114. package/dist/runtime/tests/human-required.test.d.ts.map +1 -0
  115. package/dist/runtime/tests/human-required.test.js +126 -0
  116. package/dist/runtime/tests/human-required.test.js.map +1 -0
  117. package/dist/runtime/tests/installer-consumer-docs.test.d.ts +22 -0
  118. package/dist/runtime/tests/installer-consumer-docs.test.d.ts.map +1 -0
  119. package/dist/runtime/tests/installer-consumer-docs.test.js +198 -0
  120. package/dist/runtime/tests/installer-consumer-docs.test.js.map +1 -0
  121. package/dist/runtime/tests/judge.test.js +33 -4
  122. package/dist/runtime/tests/judge.test.js.map +1 -1
  123. package/dist/runtime/tests/lineage.test.d.ts +9 -0
  124. package/dist/runtime/tests/lineage.test.d.ts.map +1 -0
  125. package/dist/runtime/tests/lineage.test.js +113 -0
  126. package/dist/runtime/tests/lineage.test.js.map +1 -0
  127. package/dist/runtime/tests/plan-candidates.test.d.ts +10 -0
  128. package/dist/runtime/tests/plan-candidates.test.d.ts.map +1 -0
  129. package/dist/runtime/tests/plan-candidates.test.js +107 -0
  130. package/dist/runtime/tests/plan-candidates.test.js.map +1 -0
  131. package/dist/runtime/tests/policy-external-tool.test.d.ts +10 -0
  132. package/dist/runtime/tests/policy-external-tool.test.d.ts.map +1 -0
  133. package/dist/runtime/tests/policy-external-tool.test.js +116 -0
  134. package/dist/runtime/tests/policy-external-tool.test.js.map +1 -0
  135. package/dist/runtime/tests/project-test.test.d.ts +10 -0
  136. package/dist/runtime/tests/project-test.test.d.ts.map +1 -0
  137. package/dist/runtime/tests/project-test.test.js +177 -0
  138. package/dist/runtime/tests/project-test.test.js.map +1 -0
  139. package/dist/runtime/tests/replan.test.js +1 -0
  140. package/dist/runtime/tests/replan.test.js.map +1 -1
  141. package/dist/runtime/tests/semantic-memory.test.d.ts +9 -0
  142. package/dist/runtime/tests/semantic-memory.test.d.ts.map +1 -0
  143. package/dist/runtime/tests/semantic-memory.test.js +105 -0
  144. package/dist/runtime/tests/semantic-memory.test.js.map +1 -0
  145. package/dist/runtime/tests/skill-metadata.test.d.ts +14 -0
  146. package/dist/runtime/tests/skill-metadata.test.d.ts.map +1 -0
  147. package/dist/runtime/tests/skill-metadata.test.js +97 -0
  148. package/dist/runtime/tests/skill-metadata.test.js.map +1 -0
  149. package/dist/runtime/tests/subgraph.test.js +1 -0
  150. package/dist/runtime/tests/subgraph.test.js.map +1 -1
  151. package/dist/runtime/tests/tool-node.test.js +1 -0
  152. package/dist/runtime/tests/tool-node.test.js.map +1 -1
  153. package/dist/runtime/tests/trajectories.test.js +1 -1
  154. package/dist/runtime/tests/trajectories.test.js.map +1 -1
  155. package/dist/runtime/tools/project-test.d.ts +132 -0
  156. package/dist/runtime/tools/project-test.d.ts.map +1 -0
  157. package/dist/runtime/tools/project-test.js +253 -0
  158. package/dist/runtime/tools/project-test.js.map +1 -0
  159. package/dist/runtime/tools/registry.d.ts +20 -1
  160. package/dist/runtime/tools/registry.d.ts.map +1 -1
  161. package/dist/runtime/tools/registry.js +44 -1
  162. package/dist/runtime/tools/registry.js.map +1 -1
  163. package/dist/runtime/types.d.ts +52 -1
  164. package/dist/runtime/types.d.ts.map +1 -1
  165. package/dist/runtime/verification/engine.d.ts.map +1 -1
  166. package/dist/runtime/verification/engine.js +23 -1
  167. package/dist/runtime/verification/engine.js.map +1 -1
  168. package/dist/sdk.d.ts +70 -3
  169. package/dist/sdk.d.ts.map +1 -1
  170. package/dist/sdk.js +31 -7
  171. package/dist/sdk.js.map +1 -1
  172. package/docs/HANDOFF.md +47 -8
  173. package/docs/RUNTIME-PENDING.md +122 -176
  174. package/package.json +1 -1
  175. package/skills/animation-web/SKILL.md +11 -0
  176. package/skills/anti-ai-slop/SKILL.md +10 -0
  177. package/skills/conversion-copywriting/SKILL.md +73 -64
  178. package/skills/deep-research/SKILL.md +9 -0
  179. package/skills/design-directions/SKILL.md +11 -0
  180. package/skills/editorial-layout/SKILL.md +94 -85
  181. package/skills/frontend/SKILL.md +12 -0
  182. package/skills/graphql/SKILL.md +11 -0
  183. package/skills/iac-terraform/SKILL.md +10 -0
  184. package/skills/logging-expert/SKILL.md +9 -0
  185. package/skills/memoria-projeto/SKILL.md +10 -0
  186. package/skills/motion-design/SKILL.md +11 -0
  187. package/skills/observability-expert/SKILL.md +11 -0
  188. package/skills/parallel-agents/SKILL.md +9 -0
  189. package/skills/payments-billing/SKILL.md +100 -89
  190. package/skills/qa/SKILL.md +14 -0
  191. package/skills/security-privacy/SKILL.md +11 -0
  192. package/skills/software-architect/SKILL.md +12 -0
  193. package/skills/tdd/SKILL.md +10 -0
  194. package/skills/ui-ux-pro-max/SKILL.md +12 -0
  195. package/skills/web-perf-seo/SKILL.md +12 -0
  196. package/skills/webgl-3d/SKILL.md +10 -0
package/.manifest CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "izanagi-ai",
3
- "version": "3.19.0",
3
+ "version": "3.21.0",
4
4
  "description": "Izanagi AI - Modular Skill-Oriented AI Prompt & Agent Framework for Autonomous Software Engineering",
5
5
  "author": "Pedro Henrique Sanches Leal",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/pedrohenriquesanchesleal4-debug/izanagi-ai#readme",
8
- "generatedAt": "2026-09-04T12:48:45.274Z",
8
+ "generatedAt": "2026-09-08T13:31:23.174Z",
9
9
  "agents": [
10
10
  {
11
11
  "id": "adversarial-critic",
@@ -541,7 +541,7 @@
541
541
  },
542
542
  {
543
543
  "id": "ai-slop",
544
- "name": "Anti AI-Slop (Zero \"Cara de IA\")",
544
+ "name": "anti-ai-slop",
545
545
  "version": "1.0.0",
546
546
  "path": "skills/anti-ai-slop/SKILL.md"
547
547
  },
@@ -565,7 +565,7 @@
565
565
  },
566
566
  {
567
567
  "id": "architect",
568
- "name": "Software Architect",
568
+ "name": "software-architect",
569
569
  "version": "1.0.0",
570
570
  "path": "skills/software-architect/SKILL.md"
571
571
  },
@@ -619,7 +619,7 @@
619
619
  },
620
620
  {
621
621
  "id": "billing",
622
- "name": "Skill Payments & Billing — Izanagi",
622
+ "name": "payments-billing",
623
623
  "version": "1.0.0",
624
624
  "path": "skills/payments-billing/SKILL.md"
625
625
  },
@@ -703,7 +703,7 @@
703
703
  },
704
704
  {
705
705
  "id": "conversion-copywriting",
706
- "name": "Skill Conversion Copywriting — Izanagi",
706
+ "name": "conversion-copywriting",
707
707
  "version": "1.0.0",
708
708
  "path": "skills/conversion-copywriting/SKILL.md"
709
709
  },
@@ -739,7 +739,7 @@
739
739
  },
740
740
  {
741
741
  "id": "deep-research",
742
- "name": "Deep Research — Pesquisa Multi-Fonte com Síntese",
742
+ "name": "deep-research",
743
743
  "version": "1.0.0",
744
744
  "path": "skills/deep-research/SKILL.md"
745
745
  },
@@ -751,7 +751,7 @@
751
751
  },
752
752
  {
753
753
  "id": "design-directions",
754
- "name": "Design Directions (Style Selector por Indústria)",
754
+ "name": "design-directions",
755
755
  "version": "1.0.0",
756
756
  "path": "skills/design-directions/SKILL.md"
757
757
  },
@@ -763,7 +763,7 @@
763
763
  },
764
764
  {
765
765
  "id": "design-system",
766
- "name": "UI/UX Pro Max — Design Intelligence",
766
+ "name": "ui-ux-pro-max",
767
767
  "version": "1.0.0",
768
768
  "path": "skills/ui-ux-pro-max/SKILL.md"
769
769
  },
@@ -793,7 +793,7 @@
793
793
  },
794
794
  {
795
795
  "id": "editorial-layout",
796
- "name": "Skill Editorial Layout — Izanagi",
796
+ "name": "editorial-layout",
797
797
  "version": "1.0.0",
798
798
  "path": "skills/editorial-layout/SKILL.md"
799
799
  },
@@ -817,7 +817,7 @@
817
817
  },
818
818
  {
819
819
  "id": "fan-out",
820
- "name": "Parallel Agents (Fan-Out & Swarm Orchestration)",
820
+ "name": "parallel-agents",
821
821
  "version": "1.0.0",
822
822
  "path": "skills/parallel-agents/SKILL.md"
823
823
  },
@@ -835,13 +835,13 @@
835
835
  },
836
836
  {
837
837
  "id": "frontend",
838
- "name": "Skill Frontend — Izanagi",
838
+ "name": "frontend",
839
839
  "version": "1.0.0",
840
840
  "path": "skills/frontend/SKILL.md"
841
841
  },
842
842
  {
843
843
  "id": "graphql",
844
- "name": "Skill GraphQL — Izanagi",
844
+ "name": "graphql",
845
845
  "version": "1.0.0",
846
846
  "path": "skills/graphql/SKILL.md"
847
847
  },
@@ -871,7 +871,7 @@
871
871
  },
872
872
  {
873
873
  "id": "iac-terraform",
874
- "name": "Skill IaC & Terraform — Izanagi",
874
+ "name": "iac-terraform",
875
875
  "version": "1.0.0",
876
876
  "path": "skills/iac-terraform/SKILL.md"
877
877
  },
@@ -883,7 +883,7 @@
883
883
  },
884
884
  {
885
885
  "id": "logging",
886
- "name": "Logging Expert",
886
+ "name": "logging-expert",
887
887
  "version": "1.0.0",
888
888
  "path": "skills/logging-expert/SKILL.md"
889
889
  },
@@ -895,7 +895,7 @@
895
895
  },
896
896
  {
897
897
  "id": "memoria-projeto",
898
- "name": "Memória do projeto",
898
+ "name": "memoria-projeto",
899
899
  "version": "1.0.0",
900
900
  "path": "skills/memoria-projeto/SKILL.md"
901
901
  },
@@ -919,7 +919,7 @@
919
919
  },
920
920
  {
921
921
  "id": "observability",
922
- "name": "Observability Expert (Tracing Distribuído e Logs Estruturados)",
922
+ "name": "observability-expert",
923
923
  "version": "1.0.0",
924
924
  "path": "skills/observability-expert/SKILL.md"
925
925
  },
@@ -961,7 +961,7 @@
961
961
  },
962
962
  {
963
963
  "id": "qa",
964
- "name": "Quality Assurance — Manual Operacional",
964
+ "name": "qa",
965
965
  "version": "1.0.0",
966
966
  "path": "skills/qa/SKILL.md"
967
967
  },
@@ -1015,7 +1015,7 @@
1015
1015
  },
1016
1016
  {
1017
1017
  "id": "security-privacy",
1018
- "name": "Security & Privacy — Manual Operacional",
1018
+ "name": "security-privacy",
1019
1019
  "version": "1.0.0",
1020
1020
  "path": "skills/security-privacy/SKILL.md"
1021
1021
  },
@@ -1069,7 +1069,7 @@
1069
1069
  },
1070
1070
  {
1071
1071
  "id": "tdd",
1072
- "name": "TDD — Test-Driven Development (Iron Law)",
1072
+ "name": "tdd",
1073
1073
  "version": "1.0.0",
1074
1074
  "path": "skills/tdd/SKILL.md"
1075
1075
  },
@@ -1129,7 +1129,7 @@
1129
1129
  },
1130
1130
  {
1131
1131
  "id": "web-perf-engineer",
1132
- "name": "Web Performance & SEO — Manual Operacional",
1132
+ "name": "web-perf-seo",
1133
1133
  "version": "1.0.0",
1134
1134
  "path": "skills/web-perf-seo/SKILL.md"
1135
1135
  },
package/AGENTS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # AGENTS.md: Izanagi AI Framework Reference
2
2
 
3
- > Version 3.19.0
3
+ > Version 3.21.0
4
4
  > Modular Skill-Oriented AI Prompt & Agent Framework for Autonomous Software Engineering
5
5
  > Multi-CLI: Opencode · Claude Code · Codex · Cursor · Copilot · Kimi (Smart Auto-Detection & Selective Generation)
6
6
 
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## 1. Visão Geral do Framework
10
10
 
11
- Izanagi AI é um **framework meta** para engenharia de software autônoma orientada a agentes: arquitetura em camadas (Routing → Orchestration → Evaluation → Healing → Memory), biblioteca de skills especializadas (catálogo v2 em `.skills/` convivendo com o legado `skills/`), **Skill Composer** (16 composições de skills encadeadas por domínio), **22 agentes especializados core + gerados**, **Memória Persistente Anti-Repetição** (`.agents/memoria/`), **Curadoria de Referências** (`references/`), **Checkpoint & Self-Healing Swarm Engine**, uma **CLI executável (`izanagi`)** publicada no npm (`izanagi-ai`) e uma **topologia poliglota** (Rust · Go · Python · TS — seção 3). Este repositório É o framework (não um app que o usa).
11
+ Izanagi AI é um **framework meta** para engenharia de software autônoma orientada a agentes: arquitetura em camadas (Routing → Orchestration → Evaluation → Healing → Memory), biblioteca de skills especializadas (catálogo v2 em `.skills/` convivendo com o legado `skills/`), **Skill Composer** (16 composições de skills encadeadas por domínio), **22 agentes especializados core + gerados**, **Memória Persistente Anti-Repetição** (`.agents/memoria/`), **Curadoria de Referências** (`references/`), **Checkpoint & Self-Healing Swarm Engine**, uma **CLI executável (`izanagi`)** publicada no npm (`izanagi-ai`) e uma **topologia poliglota** (Rust · Go · Python · TS).<!-- izanagi:source-only --> A topologia está detalhada na seção 3. Este repositório É o framework (não um app que o usa).<!-- /izanagi:source-only -->
12
12
 
13
13
  ---
14
14
 
@@ -73,7 +73,7 @@ Coexistência **Strangler Fig** (ADR-001): o legado npm (`src/`, CLI `izanagi`)
73
73
  # Legado npm (raiz)
74
74
  npm install # instala deps
75
75
  npm run build # tsc && node dist/scripts/generate-manifest.js
76
- npm test # build + node --test dist/runtime/tests/*.test.js (764 testes)
76
+ npm test # build + node --test dist/runtime/tests/*.test.js (849 testes)
77
77
  npm run verify # build + teste de instalação em sandbox (passa todos os pack IDs)
78
78
  npm run doctor # node bin/izanagi.js doctor [--deep]: auditoria de integridade
79
79
  npm run bump:patch # npm version patch --no-git-tag-version (também minor/major)
@@ -97,7 +97,7 @@ node packages/skill-migrator/cli.mjs --dry-run # valida migração skil
97
97
  **Gotchas críticos:**
98
98
  - `dist/` é gitignored e `bin/izanagi.js` importa de `../dist/cli/index.js`: **rode `npm run build` antes de qualquer comando CLI local** (`doctor`, `polyglot status`, `export`...), senão roda código obsoleto ou quebra. O mesmo vale para `packages/*/dist`: rode o build do package antes de consumir SDK/CLI-next.
99
99
  - `doctor`: instalação completa do usuário = `.agents/agents/` contendo agentes em **JSON** (formato distribuído); os YAMLs derivados do repo-fonte não caracterizam instalação.
100
- - Há test runner real (`node:test`, 764 testes em `src/runtime/tests/`). Verificação = `npm test` + `npm run verify` + `npm run doctor` + suítes poliglotas da seção 3.
100
+ - Há test runner real (`node:test`, 849 testes em `src/runtime/tests/`, 848 verdes no Windows: o vermelho `polyglot` depende de shebang). Verificação = `npm test` + `npm run verify` + `npm run doctor` + suítes poliglotas da seção 3.
101
101
  - Padrão de commit do repo: `chore: bump to vX.Y.Z` para bumps e `feat:`/`fix:`/`docs:` descritivos em PT-BR para mudanças.
102
102
 
103
103
  ---
package/CHANGELOG.md CHANGED
@@ -4,6 +4,104 @@
4
4
 
5
5
  ---
6
6
 
7
+ ## [3.21.0]: 2026-09-08
8
+
9
+ ### Fixed
10
+ - **`izanagi init` entregava a autodescrição do framework como se descrevesse o projeto de destino.** `installer.ts` copiava `AGENTS.md`, `SYSTEM.md` e `RULES.md` LITERALMENTE do pacote para a raiz do projeto do consumidor, e esses três são os documentos de desenvolvimento do repositório-fonte: o `AGENTS.md` manda rodar `cargo test --workspace`, `npm run build` e `(cd packages/sdk && npm test)`, e descreve a árvore `src/`/`crates/`/`packages/`. Num projeto que só instala o pacote nada disso tem referente, e a instância de IA seguinte lê comandos que não rodam e procura pastas que não estão lá. O caminho era automático: `postinstall` chama `installToProject` com todos os packs em todo `npm install izanagi-ai`, então o documento errado não dependia de ninguém digitar `izanagi init`. Encontrado rodando `/init` do Claude Code num workspace consumidor.
11
+ - **A raiz do projeto passa a receber um `AGENTS.md` com a forma DELE.** `buildConsumerAgentsDoc()` deriva da fonte por SELEÇÃO de seções (1, 2, 6, 7, 8 valem em qualquer projeto) e omite as que descrevem o repo-fonte (3 Arquitetura Poliglota, 4 Comandos de Desenvolvimento, 5 Estrutura do Framework, 9 Release Flow), acrescentando só o que a fonte não pode saber: que este projeto consome o framework, e quais comandos existem aqui (`npx izanagi doctor|list|skill search|agent inspect|export|run`). Derivar em vez de reescrever é deliberado: prosa duplicada é prosa para divergir, que é o defeito que a correção fecha. O espelho fiel continua em `.agents/`, que é onde `resolveFrameworkRoot` o procura.
12
+ - **Seção universal podia carregar afirmação que só vale no repo-fonte.** A seção 1 dizia "Este repositório É o framework (não um app que o usa)" e apontava para a seção 3, ausente na versão de consumidor: uma frase falsa dentro de uma seção correta, contradizendo o próprio documento três parágrafos acima. O mecanismo é declarativo (`<!-- izanagi:source-only -->` na fonte, removido pelo builder) porque heurística de frase removeria prosa correta e deixaria passar a errada.
13
+ - **`init` destruía documento de raiz escrito à mão.** O `copyFileSync` sobrescrevia `AGENTS.md`/`SYSTEM.md`/`RULES.md` existentes sem uma linha de aviso. Agora arquivo sem o `GENERATED_MARKER` é de quem o escreveu e não é tocado (a CLI diz que manteve); arquivo com o marcador é regenerado, que é a mesma regra que o `izanagi export` já seguia.
14
+ - **Rodar `init` dentro do próprio checkout do framework não toca mais os documentos de raiz.** `isFrameworkRepo()` reconhece o repo-fonte pelo nome no `package.json`. Sem isso a correção seria pior que o bug: a versão de consumidor apagaria as seções 3/4/5/9, que ali descrevem o projeto de verdade.
15
+ - **`references/` ia no tarball e não era instalado em lugar nenhum.** `cli/commands/run.ts` monta `<baseDir>/references/` e injeta as referências curadas no prompt, e `cli/blueprint.ts` faz o mesmo. Com `.agents/` como `baseDir` de projeto inicializado e nenhum pack copiando o diretório, a injeção existia e nunca encontrava arquivo nenhum, em projeto nenhum. Entrou no pack `core`.
16
+ - **`.izanagi/izanagi.config.json` declarava `version: '2.1.0'` fixo no código**, com o framework em 3.20.x: dezoito minors de diferença, num arquivo de configuração de todo projeto. Passa a ler a versão real do pacote. Número que se reporta é número que aconteceu, inclusive quando o número é a versão.
17
+ - **`AGENTS.md` afirmava "764 testes" em dois lugares.** O medido é 849. O arquivo é justamente um dos que iam verbatim para a raiz de todo consumidor: o drift que o `HANDOFF.md` combate estava sendo empacotado e distribuído.
18
+
19
+ ### Added
20
+ - `isFrameworkRepo(root)` e `buildConsumerAgentsDoc(packageDir)` exportados de `installer.ts`.
21
+
22
+ ### Verificação
23
+ - **849 testes, 848 passando** (medido em 2026-09-08, no **Windows**; 11 novos em `installer-consumer-docs.test.ts`). O vermelho segue sendo só `polyglot`, que depende de shebang.
24
+ - `node dist/scripts/verify-build.js`: instalação em sandbox com os 12 packs, `AGENTS.md` da raiz gerado na forma do consumidor.
25
+ - Consumidor de verdade (`package.json` sem relação com o framework, todos os packs, como o `postinstall` faz): `izanagi doctor` sai **PASSED, 0 erros, 0 warnings**, e o `AGENTS.md` gerado tem zero ocorrência de `cargo test`, `packages/sdk` ou "Este repositório É o framework", e zero vazamento do marcador `source-only`.
26
+
27
+ ### Compatibility
28
+ - Nenhuma breaking change de API. Muda o CONTEÚDO do `AGENTS.md` que o `init` escreve na raiz de um projeto consumidor, e passa a preservar os três documentos de raiz quando escritos à mão. Quem versionou o `AGENTS.md` gerado verá um diff na próxima execução de `init`/`postinstall`.
29
+
30
+ ---
31
+
32
+ ## [3.20.1]: 2026-09-08
33
+
34
+ ### Fixed
35
+ - **`project.test` não executava nada no Windows, e a v3.20.0 foi publicada assim.** `spawn('npm.cmd', …, { shell: false })` sai `EINVAL`: desde o CVE-2024-27980 o Node recusa lançar `.cmd`/`.bat` sem shell. O `try/catch` do arquivo transformava o throw em `error` com `passed` ausente, o que é o comportamento correto para "não medi". O efeito, porém, era o item 1 da v3.20.0 (a métrica de teste vinda de um exit code) degradar para "não medi" em toda máquina Windows. Os dois testes de exit code de `project-test.test.ts` falhavam lá e passavam no Linux, e a Verificação da v3.20.0 afirmava "837, 837 passando" a partir de uma medição feita só no Linux, listando um único vermelho conhecido de Windows quando eram três.
36
+ - **O conserto não custa a garantia do arquivo.** As duas saídas óbvias (`shell: true` e `cmd.exe /d /s /c`) recolocariam um interpretador de comandos no caminho, que é exatamente o que `shell: false` remove. A escolhida é outra: `resolveNpmCli()` acha o entrypoint JS do npm (ao lado do `node` no Windows, em `../lib/node_modules` em Unix) e o `spawn` passa a ser `process.execPath` com o npm como argumento de arquivo: sem shell, e com o binário mais confiável disponível, que é o mesmo node que executa o runtime. Se nenhum layout resolver, o chamador fica com o binário `npm` do PATH e o `EINVAL` volta a ser reportado como erro: "não medi" continua sendo ausência de `passed`, nunca reprovação.
37
+ - **`TestRunner` ganhou `execFile`/`execArgs`, e o rótulo continua sendo o comando.** O que vai ao `spawn` e o que vai ao artefato deixaram de ser o mesmo par: `command`/`args` seguem `npm test --silent` nas duas plataformas, porque `node …/npm-cli.js test` diria COMO, não O QUÊ.
38
+
39
+ ### Verificação
40
+ - **838 testes, 837 passando** (medido em 2026-09-08, no **Windows**). O único vermelho é `polyglot: bin Rust presente com --version barato`, anterior à rearquitetura: a fixture escreve um binário falso com shebang bash, e o Windows não honra shebang nem executa arquivo sem extensão conhecida. Continua aberto porque consertá-lo exigiria um condicional de plataforma, e o número deixaria de ser o mesmo nos dois sistemas.
41
+ - O teste novo ("o que vai ao spawn nunca é um `.cmd`, e o rótulo continua sendo o comando") trava o motivo, não só o sintoma: afirma que o binário do `spawn` é `process.execPath` e que nenhum `.cmd` chega lá.
42
+
43
+ ### Compatibility
44
+ - Nenhuma breaking change. `TestRunner.execFile` e `.execArgs` são opcionais, e `command`/`args` mantêm o valor de antes.
45
+
46
+ ---
47
+
48
+ ## [3.20.0]: 2026-09-05
49
+
50
+ ### Rodada de fechamento dos catorze itens abertos (2026-09-05)
51
+
52
+ A auditoria de 2026-09-04 fechou doze tetos sem caller e deixou **catorze itens
53
+ abertos**, cada um com critério de pronto escrito no `RUNTIME-PENDING.md`. Esta
54
+ rodada fecha os catorze. O padrão que eles compartilhavam continua sendo o mesmo
55
+ que o `HANDOFF.md` diz combater, agora numa segunda forma: não é o limite
56
+ declarado que nada aplica, é a **evidência declarada que ninguém produz** —
57
+ métrica de teste vinda de um texto que um agente escreveu, critério de aceite
58
+ que fala da forma e nunca do pedido, memória que se escreve e não se lê, journal
59
+ que se lê e não se consulta.
60
+
61
+ ### Added
62
+ - **`project.test` e o check `exit-zero`: a métrica de teste passa a vir de um exit code.** A camada determinística tinha oito checks e nenhum executava nada; `testResults` vinha de um artefato `test-results` que um AGENTE escreveu, ou seja, do mesmo processo que deveria estar sendo testado. Com `--verify-tests`, o nó `verify-tests` roda o comando de teste do PROJETO no fim do grafo e `passed` é `exitCode === 0`, decidido pelo sistema operacional. **Isto não afrouxa o isolamento do `code.execute`:** a diferença é a fonte do comando. No `code.execute` o código vem do modelo, e por isso roda sem subprocesso, sem env herdado e sem rede confiável; aqui o comando vem do manifesto do projeto, o binário sai de uma allowlist fixa do runtime, o `spawn` é `shell: false` (sem expansão, sem `&&`, sem pipe) e nenhum campo de entrada carrega comando. Opt-in porque executa um processo do projeto com o ambiente herdado: a mesma confiança de digitar `npm test`.
63
+ - **`--acceptance`: o critério do usuário passa a ser cobrado.** Todo critério era derivado do SCHEMA do artefato, então "adicionar paginação em GET /users" não produzia nenhum critério sobre paginação, e não existia flag, campo de SDK ou input para fornecer um. Prefixo conhecido (`contains:`, `not-contains:`, `matches:`, `min-size:`, `file-exists:`, `json-field:`, `references-exist`) vira check determinístico; prosa vira critério semântico, que precisa de juiz e sem juiz fica `UNVERIFIED`. O default é semântico de propósito: transformar uma frase em `contains` da frase inteira reprovaria toda entrega correta escrita com outras palavras, e um check inventado é pior que nenhum porque parece evidência.
64
+ - **`--min-quality`: estratégias comparadas contra um piso.** Não existiam candidatos nem piso configurável (`minQuality`/`qualityFloor` tinham zero ocorrências no código), então "respeitando a qualidade mínima configurada" não tinha o que respeitar. Agora os modos até o sugerido viram candidatos, cada um estimado pelo mesmo caminho de roteamento da execução, e vence o mais barato que atinge o piso. Piso inalcançável **não sobe o modo em silêncio**: o plano segue no modo sugerido e declara que não cumpriu, porque subir seria o orçamento decidindo escopo.
65
+ - **`--reuse-artifacts`: reuso de artefato entre runs.** `readContent` só era chamado por `izanagi explain`; um segundo run do mesmo objetivo refazia tudo. A parte que importa é a invalidação, e ela vem declarada antes do cache: a chave cobre tipo, objetivo, restrições, critérios, agente, papel, checksums dos insumos EM ORDEM e a impressão do projeto; run sem survey é chave DIFERENTE de run com survey; o prazo (7 dias) expira o que a chave não consegue ver. O artefato reaproveitado entra no lugar da CHAMADA e passa pela verificação inteira: o que se economiza é a chamada, não a prova.
66
+ - **`--allow-tool` e `--verify-tests` na CLI.** A allowlist de tools existia no Orchestrator, no SDK e no caso de benchmark, e `izanagi run` não tinha flag para ela.
67
+ - **`HUMAN_REQUIRED`: teto esgotado deixa de se confundir com falha por bug.** Cada abort por teto marca qual (`attempts`/`time`/`tokens`/`cost`) e o status do run muda. O veredito da AVALIAÇÃO continua `FAIL`, porque ela mede a entrega e a entrega não fechou: os dois campos convivem por medirem coisas diferentes. O exit code segue 1, não 2 — o 2 significa "retomável por `izanagi approve`", e um orçamento estourado não é.
68
+ - **`ArtifactRegistry.lineage()` e `.compare()`.** As arestas de dependência estavam gravadas desde sempre e a leitura parava no primeiro vizinho; num grafo de sete nós, um salto nunca responde "de onde veio isto?". A travessia é em largura, com marca de visitado (ciclo termina em vez de girar), e `compare()` diz o que MUDOU entre versões, não só quanto o score caiu.
69
+ - **`ArtifactRecord.checksum` (sha256 completo) e `.metadata` livre.** `hash` continua sha1 truncado em 12 hex porque é o que os registros gravados carregam: 48 bits bastam para "é o mesmo artefato de novo?", não para "este arquivo é exatamente o que eu gravei". `metadata` tem teto de 4KB e é recusado INTEIRO quando estoura.
70
+ - **`EXTERNAL-TOOL-001`: tool registrada em runtime exige aprovação humana.** O default-allow da `PolicyEngine` permanece, com o motivo escrito (a `ToolRegistry` já nega o que o contrato não concedeu, a allowlist já nega o que não foi declarado, e se a política também fosse portão de concessão haveria três lugares decidindo a mesma coisa). O caso em que "não previsto" era perigoso ganhou regra própria. E `PolicyDecision.requiresApproval`, que existia e ninguém lia, virou pausa por `izanagi approve` em vez de falha que o healing retentaria contra uma porta fechada.
71
+ - **`ExecutionEvidence.modelCalls` / `.agentCalls` / `.successRate` e `benchmark run --execute --compare`.** A comparação antigo vs novo cobria três dimensões e só sobre o PLANO. Chamadas contam por TENTATIVA, porque é o que a fatura conta, e nó reaproveitado não conta — é justamente a diferença que a comparação precisa enxergar.
72
+ - **`triggers` e `capabilities` declarados nas 22 skills mais acionadas.** Das 106 skills, ZERO declaravam qualquer um dos dois: o haystack de `rankSkills` incluía dois arrays sempre vazios e o ranking escolhia entre 106 descrições soltas. Escritos à mão: derivar dos títulos de seção produziria "Identidade" e "Processo" como capacidade, e derivar da description colocaria as mesmas palavras duas vezes.
73
+ - **`MemoryStore.appendKnowledge`.** A camada semântica era lida e nunca escrita pelo runtime: `.agents/memoria/semantica.md` só mudava quando uma pessoa o editava, e o que o runtime gravava (`addLearning`) vive numa lista plana que a busca não alcança.
74
+
75
+ ### Changed
76
+ - **O Decision Journal deixa de ser write-only.** Cada decisão leva o objetivo do run; o fim do run carimba o veredito (`recordOutcome`, que não reescreve o que já foi carimbado); o planejamento consulta por semelhança de objetivo (`findRelevant`, só decisões com resultado conhecido). Um agente escolhido duas vezes para um objetivo semelhante, com os dois runs sem fechar e nenhum sucesso no meio, sai da disputa — e a troca vale também nos nós vindos do template do workflow. Duas falhas e não uma: um incidente pode ter sido provider fora do ar.
77
+ - **`MemoryStore.search()` passa a ser consultado DURANTE o run.** Era chamado só pela CLI e pelo benchmark; dentro de um run, a única recuperação era padrão de falha. Agora o Context Resolver busca pelo objetivo de cada tarefa, com teto de 2 entradas e 600 chars, e um store por run. Numa rodada de correção o bloco fica de fora: o que falta ali é a correção, não mais contexto.
78
+ - **`maxCost` vira limite do Healer.** `HealingInput` tinha tempo, tokens e tentativas; o custo só agia por `ExecutionBudget.spend`, ou seja DEPOIS de a chamada acontecer. Curar é decidir gastar mais uma chamada, e essa decisão passa a consultar o dinheiro antes.
79
+ - **A nota de um caso de benchmark passa a incluir os validators.** Era só a razão de artefatos: um caso cujos arquivos apareceram e cujos validators reprovaram TODOS saía com `score: 1.00, passed: false`, e `compareBaselines` rankeia por `avgScore` — o baseline que acertou os nomes de arquivo e errou o conteúdo vencia o que acertou o conteúdo.
80
+
81
+ ### Fixed
82
+ - **O total de tokens do trace saía 60% acima da telemetria do MESMO run.** `addTokens(result.tokens, result.tokens * 0.6)` soma os dois argumentos, e `result.tokens` é o total do provider (`input + output`), não a entrada. É o número que a CLI imprime, que `izanagi trace` mostra, que o dashboard exibe, que o webhook envia e que a Arena soma. Teste novo trava o invariante: trace e telemetria contam o mesmo run.
83
+ - **Validators de um caso de benchmark liam o CAMINHO, não o arquivo.** Num output de diretório, `has-owasp` media se a palavra "owasp" estava no nome da pasta temporária: o validator passava ou reprovava por uma propriedade do diretório de trabalho.
84
+ - **O registry de benchmark aceitava caso pela metade num `catch` vazio.** Um JSON sem `expectedArtifacts` chegava ao runner, estourava dentro do `try` da suíte, e o relatório culpava a execução por um defeito da definição. Caso recusado agora diz o motivo e o arquivo.
85
+ - **Toda métrica declarada por um caso recebia a mesma razão de artefatos.** O relatório salvo mostrava `correctness`, `security` e `architecture` com o mesmo número: três medidas independentes que eram uma medida repetida três vezes. O que não é medido sai em `metricsNotMeasured`.
86
+ - **A varredura anti-stub reprovava a evidência de uma suíte VERDE.** O runner de testes do Node imprime `ℹ todo 0` no resumo, e o artefato `test-run` de uma suíte 100% verde era reprovado por "stub detectado: TODO". A varredura pressupõe texto autoral; schema de saída capturada agora a desliga.
87
+ - **`unmet` misturava reprovado com não-comprovado.** Um critério semântico sem juiz aparecia lado a lado com um check que de fato falhou, e quem lesse a linha (ou a restrição que o replanejamento deriva dali) trataria "não medi" como "está errado". Agora o não-comprovado vem marcado `[sem evidência]`.
88
+ - **Dois objetos git vazios impediam o push.** `src/cli/commands/benchmark.ts` e `src/runtime/types.ts` tinham blobs truncados a zero byte no object store local, referenciados por oito dos nove commits da rodada. Reconstruídos byte a byte a partir dos blobs vizinhos legíveis, com o hash conferido antes de gravar: `git fsck` limpo, e nenhum commit reescrito.
89
+
90
+ ### Compatibility
91
+ - Nenhuma breaking change. As quatro capacidades novas são **opt-in** (`--verify-tests`, `--acceptance`, `--min-quality`, `--reuse-artifacts`): sem elas, o plano, o grafo e o veredito são byte a byte os de antes, e há teste que mede isso.
92
+ - `OrchestrationResult.status` e `IzanagiRunResult.status` ganharam o valor `HUMAN_REQUIRED`. Quem faz `switch` exaustivo sobre o status precisa tratá-lo; quem compara com `'PASS'` não muda. O exit code da CLI é o mesmo de antes.
93
+ - `PlanEstimate.quality` é campo novo e obrigatório no tipo. Quem constrói um `PlanEstimate` à mão (fixtures de teste) precisa declará-lo; quem consome o que o `Commander.estimate` devolve não muda.
94
+ - `ArtifactSchema.capturedOutput`, `ArtifactRecord.checksum`, `.metadata` e `.reuseKey` são opcionais: registro escrito por versão anterior continua legível.
95
+
96
+ ### Verificação
97
+ - **837 testes, 837 passando** (medido em 2026-09-05, Linux). O vermelho conhecido de Windows (`polyglot: bin Rust presente com --version barato`) é anterior e independente. **Esta linha estava errada, e a 3.20.1 diz por quê:** no Windows eram três vermelhos, não um, e os dois extras eram justamente os de `project.test`.
98
+ - `izanagi run "documentar a funcao de soma" --output docs --verify-tests --mode orchestrated` num projeto de fixture: suíte verde → `PASS`, 7/7 VERIFIED, `testResults=1`, score 1.00; suíte vermelha → `BLOCKED`, 6/7 VERIFIED, `testResults=0`, regressão nomeando `npm test --silent` com exit 1.
99
+ - `izanagi run "..." --reuse-artifacts` duas vezes: run 1 gasta 900 tokens com cache 0/3; run 2 gasta **0 tokens** com cache 3/3, e continua `PASS` com 4/4 VERIFIED.
100
+ - `izanagi run "..." --min-quality`: piso 0.4 escolhe `autonomous` ($0.0011, o único que atinge); piso 0.3 escolhe `assisted` ($0.0000, mesmo piso atingido por menos).
101
+ - `izanagi benchmark run security --execute --compare`: tokens -300 (1500 → 1200), model calls -1 (5 → 4), agent calls -1 (3 → 2), latência +50ms, verificação n/a → 100%, sucesso 100% nos dois.
102
+
103
+ ---
104
+
7
105
  ## [3.19.0]: 2026-09-04
8
106
 
9
107
  > **A 3.18.0 nunca chegou ao npm.** Ela foi para o GitHub e o `npm publish` não
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Izanagi AI
2
2
 
3
- > **v3.19.0** · Runtime de execução de trabalho orientado a agentes: **Commander** → contrato de tarefa → roteamento por papel (por TAREFA, não por run) → grafo → verificação por evidência → healing → replan → memória. O run **lê o projeto** antes de decidir e **entrega arquivo** no fim, os dois por nós de tool com permissão declarada. Todo teto declarado (tokens, custo, tempo, retries, agentes, tool calls, concorrência, allowlist de tool) **é aplicado e tem teste que mede o teto**; `Ctrl-C` cancela o run e o `resume` retoma do último batch gravado. 22 agentes especializados, catálogo de skills v2, CLI publicada no npm (`izanagi-ai`), SDK programático e **topologia poliglota** (Rust · Go · Python · TypeScript) ao lado do runtime legado.
3
+ > **v3.21.0** · Runtime de execução de trabalho orientado a agentes: **Commander** → contrato de tarefa → roteamento por papel (por TAREFA, não por run) → grafo → verificação por evidência → healing → replan → memória. O run **lê o projeto** antes de decidir e **entrega arquivo** no fim, os dois por nós de tool com permissão declarada. Todo teto declarado (tokens, custo, tempo, retries, agentes, tool calls, concorrência, allowlist de tool) **é aplicado e tem teste que mede o teto**; `Ctrl-C` cancela o run e o `resume` retoma do último batch gravado. 22 agentes especializados, catálogo de skills v2, CLI publicada no npm (`izanagi-ai`), SDK programático e **topologia poliglota** (Rust · Go · Python · TypeScript) ao lado do runtime legado.
4
4
 
5
5
  **Filosofia:** Arquitetura primeiro. Código depois. Qualidade medida. Evolução contínua. Zero "cara de IA".
6
6
 
@@ -32,6 +32,10 @@ izanagi run "Converta 10 dólares para reais" # modo direct: 1
32
32
  izanagi run "Criar uma landing page de um SaaS de analytics" # modo composto, com verificação
33
33
  izanagi run "..." --mode autonomous --max-cost 0.50 # teto de custo respeitado no plano
34
34
  izanagi run "adicionar paginação em GET /users" --output docs # lê o projeto e entrega o arquivo
35
+ izanagi run "..." --acceptance "o endpoint aceita ?page e ?limit" # o que o usuário pediu, cobrado
36
+ izanagi run "..." --output src --verify-tests # a métrica de teste vem do exit code do projeto
37
+ izanagi run "..." --min-quality 0.3 # a estratégia mais barata que atinge o piso
38
+ izanagi run "..." --reuse-artifacts # segundo run da mesma pergunta não repaga a chamada
35
39
 
36
40
  # 3. Observabilidade, custo e auditoria
37
41
  izanagi trace # spans, healing, graph, avaliação
@@ -66,7 +70,7 @@ Cada tarefa recebe o modelo do seu papel, não o modelo do run: `commander` (tie
66
70
 
67
71
  ### Verificação por evidência
68
72
 
69
- Nenhuma tarefa termina porque o agente disse que terminou. Cada contrato carrega critérios de aceite derivados do schema real do artefato, e a Verification Engine devolve `VERIFIED`, `FAILED` ou `UNVERIFIED`. Critério semântico é julgado por um modelo barato (papel `worker`, artefato resumido); com `--no-judge`, ou sem provider, ele **nunca vira aprovação**: fica `UNVERIFIED`, e o run reporta isso. Juiz que não conseguiu decidir também não reprova.
73
+ Nenhuma tarefa termina porque o agente disse que terminou. Cada contrato carrega critérios de aceite derivados do schema real do artefato **e os que o usuário declarou** (`--acceptance`), e a Verification Engine devolve `VERIFIED`, `FAILED` ou `UNVERIFIED`. Com `--verify-tests`, um dos critérios é o **exit code** do comando de teste do projeto: a única camada do runtime que decide por execução, e não por leitura de texto. Critério semântico é julgado por um modelo barato (papel `worker`, artefato resumido); com `--no-judge`, ou sem provider, ele **nunca vira aprovação**: fica `UNVERIFIED`, e o run reporta isso. Juiz que não conseguiu decidir também não reprova.
70
74
 
71
75
  Com `--prompt-only`, apenas compila `izanagi-prompt.md` para colar manualmente em outra ferramenta, sem executar nada. Nós de aprovação (`human-in-the-loop`) pausam a execução até `izanagi approve <run-id>`.
72
76
 
@@ -165,7 +169,7 @@ CLI legado (`izanagi`, publicada no npm):
165
169
  | Comando | Descrição |
166
170
  |---|---|
167
171
  | `izanagi init [dir] [--packs a,b,c]` | Cria projeto com `.agents/` e seleção de packs de skills. |
168
- | `izanagi run [agent] --task "<task>"` | Commander decide o modo, roteia por papel, executa o grafo, verifica contra os critérios de aceite e persiste trace + telemetria de custo. Flags: `--mode direct\|assisted\|orchestrated\|autonomous`, `--budget N`, `--max-cost N`, `--model <id>`, `--local` (só providers locais, e serializa o pool: GPU única não ganha com paralelismo), `--max-concurrency N` (teto de tarefas em voo), `--cache`, `--output <dir>` (grava a entrega no projeto), `--survey` / `--no-survey` (força ou desliga o levantamento do projeto antes de decidir). **Ctrl-C cancela o run** em vez de matar o processo: o batch em voo é abortado, o progresso já gravado fica no checkpoint e `izanagi resume <run-id>` retoma dali, `--no-commander` (planejamento legado por categoria), `--no-judge` (desliga o juiz semantico), `--prompt-only`. |
172
+ | `izanagi run [agent] --task "<task>"` | Commander decide o modo, roteia por papel, executa o grafo, verifica contra os critérios de aceite e persiste trace + telemetria de custo. Flags: `--mode direct\|assisted\|orchestrated\|autonomous`, `--budget N`, `--max-cost N`, `--model <id>`, `--local` (só providers locais, e serializa o pool: GPU única não ganha com paralelismo), `--max-concurrency N` (teto de tarefas em voo), `--cache`, `--output <dir>` (grava a entrega no projeto), `--survey` / `--no-survey` (força ou desliga o levantamento do projeto antes de decidir), `--acceptance "<critério>"` (repetível: o que a ENTREGA precisa cumprir, além do schema), `--verify-tests` (roda o comando de teste do projeto no fim do grafo e a métrica de teste passa a vir do exit code), `--min-quality 0..1` (compara estratégias e escolhe a mais barata que atinge o piso de VERIFICAÇÃO), `--reuse-artifacts` (reaproveita artefato de run anterior com a mesma pergunta), `--allow-tool <id>` (allowlist de tools do run). **Ctrl-C cancela o run** em vez de matar o processo: o batch em voo é abortado, o progresso já gravado fica no checkpoint e `izanagi resume <run-id>` retoma dali, `--no-commander` (planejamento legado por categoria), `--no-judge` (desliga o juiz semantico), `--prompt-only`. |
169
173
  | `izanagi models [--json]` | Catálogo de modelos, providers configurados e qual modelo cada papel (commander/specialist/worker) receberia agora, com custo por 10k tokens. |
170
174
  | `izanagi budget [run-id] [--json]` | Para onde foi o orçamento daquele run: tokens por fase, custo estimado, cache local e do provider, contexto poupado, escaladas, degradação e verificação por tarefa. |
171
175
  | `izanagi chat` | REPL interativo da CLI. |
package/ROADMAP.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Roadmap
2
2
 
3
- > Versão atual: **3.19.0**. Estado atual e evolução planejada do **Izanagi AI: Adaptive Agent & Skill Runtime**.
3
+ > Versão atual: **3.21.0**. Estado atual e evolução planejada do **Izanagi AI: Adaptive Agent & Skill Runtime**.
4
4
  > Legenda: ✅ Done · 🔧 In progress · 📋 Planned · 💡 Future idea
5
5
  > Histórico linha-a-linha de cada release em `CHANGELOG.md`: este arquivo resume por fase, não duplica o changelog.
6
6
 
@@ -466,6 +466,71 @@ defeitos que este runtime existe para combater.
466
466
  Testes: **764, 763 passando** (69 novos). Cada teto novo tem teste que mede o
467
467
  teto, não a contagem.
468
468
 
469
+ ## Fase 15: A evidência que ninguém produzia (v3.20.0) ✅
470
+
471
+ Os catorze itens que a Fase 14 deixou abertos, fechados com implementação,
472
+ teste e medição. O padrão que eles compartilhavam é o irmão do da fase
473
+ anterior: lá era **um limite declarado que nada aplica**; aqui é **uma
474
+ evidência declarada que ninguém produz**.
475
+
476
+ Quatro exemplos do mesmo defeito, em lugares diferentes do runtime:
477
+
478
+ - a métrica `testResults` da avaliação vinha de um artefato `test-results` que
479
+ um AGENTE escreveu — o runtime afirmava "testes passando" a partir de um
480
+ texto produzido pelo mesmo processo que deveria estar sendo testado;
481
+ - todo critério de aceite era derivado do SCHEMA do artefato, então
482
+ "adicionar paginação em GET /users" não produzia nenhum critério sobre
483
+ paginação, e não havia por onde o usuário fornecer um;
484
+ - a camada semântica da memória era lida e nunca escrita pelo runtime, e o
485
+ Decision Journal era escrito e nunca consultado: uma memória que não aprende
486
+ e um registro que não lembra;
487
+ - das 106 skills, ZERO declaravam `triggers` ou `capabilities`, então o
488
+ ranking escolhia entre 106 descrições soltas com dois arrays sempre vazios
489
+ no haystack.
490
+
491
+ ### O que entrou
492
+
493
+ | Capacidade | O que mudou na execução |
494
+ |---|---|
495
+ | `--verify-tests` | Nó `verify-tests` roda o comando de teste do PROJETO e o check `exit-zero` decide pelo exit code do processo. O comando vem do manifesto, o binário de uma allowlist fixa, `spawn` com `shell: false`, e nenhum campo de entrada carrega comando |
496
+ | `--acceptance` | O critério do usuário entra nos contratos das tarefas terminais. Prefixo conhecido vira determinístico; prosa vira semântico. Entrada malformada é recusada em voz alta |
497
+ | `--min-quality` | Os modos até o sugerido viram candidatos, cada um estimado pelo mesmo caminho de roteamento, e vence o mais barato que atinge o piso de VERIFICAÇÃO |
498
+ | `--reuse-artifacts` | Artefato de run anterior com a mesma pergunta entra no lugar da chamada e passa pela verificação inteira. A invalidação vem declarada antes do cache |
499
+ | `--allow-tool` | A allowlist que existia no Orchestrator, no SDK e no caso de benchmark ganhou flag |
500
+ | `HUMAN_REQUIRED` | Teto esgotado deixa de se confundir com falha por bug. A avaliação continua `FAIL`: ela mede a entrega, o status carrega o fato do processo |
501
+ | Decision Journal | Decisão leva o objetivo, o fim do run carimba o veredito, e o planejamento consulta por semelhança de objetivo. Agente queimado no mesmo objetivo sai da disputa |
502
+ | Memória semântica | `appendKnowledge` escreve conhecimento reutilizável com barra de recorrência, e `search()` passa a ser consultado por tarefa pelo Context Resolver |
503
+ | Linhagem e checksum | Travessia completa dos dois lados, comparação por conteúdo, `checksum` sha256 e `metadata` livre com teto |
504
+ | `EXTERNAL-TOOL-001` | Tool registrada em runtime exige aprovação humana, e `requiresApproval` virou pausa por `izanagi approve` em vez de campo que ninguém lia |
505
+ | Oito dimensões | `benchmark run --execute --compare` mede tokens, custo, latência, model calls, agent calls, retries, sucesso e verificação nos DOIS caminhos |
506
+ | Metadado de skill | As 22 mais acionadas pelas chains declaram `triggers` e `capabilities`, com gate que quebra se o campo esvaziar em massa |
507
+
508
+ ### Compatibilidade
509
+
510
+ As quatro capacidades novas são **opt-in**. Sem elas, o plano, o grafo e o
511
+ veredito são byte a byte os de antes, e há teste que mede isso. A única adição
512
+ ao tipo do resultado é o valor `HUMAN_REQUIRED`; o exit code da CLI não mudou.
513
+
514
+ ### O que esta fase deliberadamente NÃO fechou
515
+
516
+ Nada da lista de gaps ficou aberto. O que continua registrado como **escolha,
517
+ não dívida**, está em [`docs/RUNTIME-PENDING.md`](docs/RUNTIME-PENDING.md), e
518
+ três limitações dali só deixam de ser limitações contra um provider real:
519
+ grounding medido contra a ausência dele, a Arena com números de execução real,
520
+ e o critique loop exercitado por um modelo de verdade.
521
+
522
+ Duas limitações novas entraram na mesma lista, e as duas são de MEDIÇÃO, não de
523
+ implementação: o nó de teste mede a suíte do projeto e não o efeito da entrega
524
+ (quando o `--output` cai fora da árvore testada), e o piso de `--min-quality`
525
+ mede o quanto o plano se compromete a verificar, nunca a qualidade do que vai
526
+ ser entregue.
527
+
528
+ Testes: **838, 837 passando** (74 novos nesta fase; medido no Windows, onde o
529
+ único vermelho é `polyglot`, que passa no Linux). A fase foi publicada dizendo
530
+ "837, 837 passando" a partir de uma medição só no Linux: dois testes de
531
+ `project.test` falhavam no Windows, e o motivo virou linha na seção 3 do
532
+ [`docs/HANDOFF.md`](docs/HANDOFF.md).
533
+
469
534
  ## Critérios de aceite das próximas fases
470
535
 
471
536
  Toda mudança no framework deve provar impacto em pelo menos uma dimensão:
package/RULES.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # IZANAGI AI: Operating Rules
2
2
 
3
- > Version 3.19.0
3
+ > Version 3.21.0
4
4
 
5
5
  ---
6
6
 
package/SYSTEM.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # IZANAGI AI: System Foundation
2
2
 
3
- > Version 3.19.0
3
+ > Version 3.21.0
4
4
  > Codename: "The Architect's Mind"
5
5
 
6
6
  ---
@@ -80,7 +80,7 @@ User Input / Comando CLI
80
80
  | **Context Resolver** (`orchestration/context-resolver.ts`) | Contexto mínimo por tarefa: objetivo, restrições e SÓ os artefatos dos quais ela depende, resumidos (começo + fim preservados) e referenciados por id. |
81
81
  | **Agent Capability Registry** (`registry/capabilities.ts`) | Descoberta de agentes em disco com capacidades, skills, chains, classe de custo, papel e domínios. Matching bilíngue por domínio, no lugar da lista fixa de agentes. |
82
82
  | **Agent-to-Agent Protocol** (`protocol/messages.ts`) | Mensagens tipadas com referência de artefato em vez de cópia de texto; crítica estruturada com parsing tolerante (saída não parseável vira `needs_revision`, nunca aprovação) e correção mínima só dos bloqueantes. |
83
- | **Verification Engine 2.0** (`verification/engine.ts`) | Três camadas: determinística, evidência e semântica. O juiz semântico default (`verification/judge.ts`) vem ligado na CLI e no SDK quando há provider, roda no papel `worker` e recebe o artefato resumido; sem juiz (`--no-judge` ou modo headless) o critério fica `UNVERIFIED` e NUNCA conta como aprovação. Juiz que não respondeu é `inconclusive`, nunca reprovação. Só `VERIFIED` encerra uma tarefa. |
83
+ | **Verification Engine 2.0** (`verification/engine.ts`) | Três camadas: determinística, evidência e semântica. A camada determinística tem nove checks; oito leem o artefato (`artifact-valid`, `min-size`, `contains`, `not-contains`, `matches`, `json-field`, `file-exists`, `references-exist`) e um decide por EXECUÇÃO: `exit-zero`, alimentado pelo nó `verify-tests` (`--verify-tests`), que roda o comando de teste do projeto. Exit code ausente é `unknown`, nunca `pass`: um check de execução que aprova por ausência de evidência seria pior que a métrica derivada de artefato que ele substituiu. O juiz semântico default (`verification/judge.ts`) vem ligado na CLI e no SDK quando há provider, roda no papel `worker` e recebe o artefato resumido; sem juiz (`--no-judge` ou modo headless) o critério fica `UNVERIFIED` e NUNCA conta como aprovação. Juiz que não respondeu é `inconclusive`, nunca reprovação. Só `VERIFIED` encerra uma tarefa. |
84
84
  | **Budget Controller** (`token/execution-budget.ts`) | Custo em USD, tetos de tool call/agente/retry, tempo de parede e escada de degradação (contexto → saída → modelo → paralelismo → tarefas opcionais → aprovação humana). Gasto que estouraria um teto é recusado, e **registrado antes de ser recusado**: gasto recusado por teto ainda aconteceu na fatura. Desde 2026-09-04 `maxRetries` e `maxAgents` de fato BARRAM (antes contavam e o retorno era descartado), e `remainingTokens` alimenta o roteamento por nó. Teto estourado é `non-recoverable` no `Healer`: um teto não se move entre tentativas, então retentar é gastar orçamento numa porta fechada. |
85
85
  | **Response Cache** (`cache/response-cache.ts`) | Cache local por hash de (provider, modelo, system, mensagens, teto, temperatura), com TTL, eviction e versão de esquema. Opt-in (`--cache` / `IZANAGI_CACHE=1`). |
86
86
  | **SDK** (`src/sdk.ts`) | `izanagi.run({ objective })` e `izanagi.plan({ objective })`: mesma engine da CLI, sem saída no terminal, com eventos do run em tempo real. |
@@ -98,7 +98,7 @@ User Input / Comando CLI
98
98
  | **Failure Memory** (`memory/store.ts`) | `recordFailure` + `findRelevantFailures` por categoria: erros reais registrados são injetados como evidência em runs futuros (anti-repetição). |
99
99
  | **Memory Store** (`memory/store.ts`) | Stats por agente, learnings, histórico de runs (JSON em disco). |
100
100
  | **Trace Store** (`observability/tracer.ts`) | Traces de execução em JSON (um arquivo por run em `.izanagi/state/traces/`) com spans, load/close e retry de escrita. |
101
- | **Benchmarks** (`benchmarks/`) | 10 casos builtin executáveis via `izanagi benchmark` + `compare` entre builds, mais o Token Benchmark (`benchmark tokens`): legado vs Commander em chamadas, tokens e custo, de forma determinística. |
101
+ | **Benchmarks** (`benchmarks/`) | 10 casos builtin executáveis via `izanagi benchmark` + `compare` entre builds, mais o Token Benchmark (`benchmark tokens`): legado vs Commander em chamadas, tokens e custo do PLANO, de forma determinística. `benchmark run --execute --compare` roda a mesma suíte pelos dois caminhos de planejamento, com o mesmo teto por caso, e mede oito dimensões de EXECUÇÃO: tokens, custo, latência, model calls, agent calls, retries, taxa de sucesso e taxa de verificação. Plano e execução nunca dividem o mesmo campo. |
102
102
  | **LLM Executor** (`llm/`) | Adapters reais OpenAI/Anthropic/Google com env key, timeout e propagação de erro HTTP. |
103
103
  | **Evidence System** (`research/evidence.ts`) | Claims FACT/ASSUMPTION/INFERENCE/UNKNOWN com fonte, confiança e hierarquia de sourceType (official docs > source code > tests > package metadata > reliable tech > community); relatório de claims críticas. ⚠️ Implementado e testado, mas **nenhum caller em produção** hoje: nem `Orchestrator` nem `planner.ts` o invocam; só o próprio teste do módulo o exercita. Roadmap: ligar à execução do agente `researcher`. |
104
104
  | **Token Budget 2.0** (`token/budget.ts`) | Orçamento por fase (planning/execution/evaluation/recovery) com tetos, pesos por complexidade e abort de fase: retry consome a fase recovery, nunca o execution. |
@@ -221,7 +221,7 @@ O ciclo completo de execução: `Objetivo → Classificação → Modo → Task
221
221
  1. **Understanding & Planning**: `requirements` decomposição de requisitos (artefatos em `contracts/artifacts.ts`), classificação da tarefa em categoria; Product Reasoner rotula claims de produto (FACT/ASSUMPTION/UNKNOWN) com confiança via Evidence System.
222
222
  2. **Execution Graph**: o Orchestrator monta um grafo por categoria (10 templates: fullstack, debugging, security_audit, architecture, automacao, frontend, implementation, database_design, devops_infra, testing) com `parallelBatches` (nós independentes em paralelo, nós dependentes em sequência) e hooks de execução (`produce`: agêntico / LLM / comando).
223
223
  3. **Adaptive Routing**: o resolver pontua skills por relevância + histórico de uso por categoria (scorer com decaimento temporal), nunca lista estática; agents são resolvidos pelo mesmo scoring.
224
- 4. **Verification & Evaluation**: cada artefato é verificado contra os critérios de aceite do contrato (determinística → evidência → semântica) e só `VERIFIED` encerra a tarefa; `UNVERIFIED` é reportado como inconclusivo, nunca como sucesso. O nó em si SEGUE (sem juiz semântico todo critério semântico fica inconclusivo, e derrubar o nó transformaria "não medi" em "está errado"), mas desde 2026-09-04 ele carrega `metadata.unverified` com status, motivo e critérios não comprovados, mais uma mensagem A2A de tipo `evidence`: aprovado sem prova é distinguível de comprovado. A avaliação final agrega métricas ponderadas com thresholds e veredito derivado; sem métricas mensuradas → **UNKNOWN** com recomendação explícita de evidência.
224
+ 4. **Verification & Evaluation**: cada artefato é verificado contra os critérios de aceite do contrato — os derivados do schema do artefato e os que o usuário declarou em `--acceptance` (prefixo conhecido vira check determinístico, prosa vira critério semântico) — (determinística → evidência → semântica) e só `VERIFIED` encerra a tarefa; `UNVERIFIED` é reportado como inconclusivo, nunca como sucesso. O nó em si SEGUE (sem juiz semântico todo critério semântico fica inconclusivo, e derrubar o nó transformaria "não medi" em "está errado"), mas desde 2026-09-04 ele carrega `metadata.unverified` com status, motivo e critérios não comprovados, mais uma mensagem A2A de tipo `evidence`: aprovado sem prova é distinguível de comprovado. A avaliação final agrega métricas ponderadas com thresholds e veredito derivado; sem métricas mensuradas → **UNKNOWN** com recomendação explícita de evidência.
225
225
  5. **Self-Healing & Classification**: healing classificado (retry para transitório, `skill_replacement` para artefato inválido, fallback de modelo, abort por limite); cada healing é registrado com stats por agente.
226
226
  6. **Memory & Evolution**: `recordFailure` + `findRelevantFailures` (memória de falhas por categoria), learnings e traces; a memória curada `.agents/memoria/` é atualizada ao fim do ciclo.
227
227
 
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/benchmark.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CzG"}
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/benchmark.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CzG"}